



  

<!DOCTYPE html>
<html
  lang="en"
  
  data-color-mode="auto" data-light-theme="light" data-dark-theme="dark"
  data-a11y-animated-images="system" data-a11y-link-underlines="true"
  
  >




  <head>
    <meta charset="utf-8">
  <link rel="dns-prefetch" href="https://github.githubassets.com">
  <link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
  <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
  <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
  <link rel="preconnect" href="https://github.githubassets.com" crossorigin>
  <link rel="preconnect" href="https://avatars.githubusercontent.com">

<script type="importmap">{"imports":{"react":"https://github.githubassets.com/assets/react-e27d1b3e03961e68.js","react-dom":"https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js","react-dom/client":"https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js","react-is":"https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js","react-reconciler":"https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js","react/compiler-runtime":"https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js","react/jsx-dev-runtime":"https://github.githubassets.com/assets/react-jsx-dev-runtime-ea55d68667d559e5.js","react/jsx-runtime":"https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js","scheduler":"https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js"}}</script>
<meta name="react-profiling" content="0" data-turbo-transient="true" />
<meta name="react-import-map" content="react,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@777f63f87cd0" data-turbo-track="reload" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-e27d1b3e03961e68.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-compiler-runtime-4610bd6d3de9c049.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/scheduler-58b860b049ca307c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-e5fd46a22d5c4058.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-dom-client-1b4a3ee065998cea.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-is-e0b593954b4706d8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-jsx-runtime-4915cb0f5b3aff04.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-reconciler-8e99e505c4429605.js" />

  


  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-5c4e9fc574bf49f3.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light_high_contrast-fb37c309e0603a69.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-afff6c53aef9b9d1.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark_high_contrast-c409873d7987dffa.css" /><link data-color-theme="light" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light-5c4e9fc574bf49f3.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-fb37c309e0603a69.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-0f910d8806d5761b.css" /><link data-color-theme="light_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind_high_contrast-a7abd4d4c49ac593.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-5fc4c4a9cb41e596.css" /><link data-color-theme="light_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia_high_contrast-ed0cee9214dedabd.css" /><link data-color-theme="dark" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark-afff6c53aef9b9d1.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-c409873d7987dffa.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-78a2491d538dab5a.css" /><link data-color-theme="dark_colorblind_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind_high_contrast-c26b63d7c532d0a2.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-a6f60cea68c08405.css" /><link data-color-theme="dark_tritanopia_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia_high_contrast-f66faf28b2ea18b6.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-6701f6218c53cf5b.css" /><link data-color-theme="dark_dimmed_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed_high_contrast-7037fa46ae124d97.css" />

  <style type="text/css">
    :root {
      --tab-size-preference: 4;
    }

    pre, code {
      tab-size: var(--tab-size-preference);
    }
  </style>

    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-97df7784617ce1ea.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-9be9fe6313f476af.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-62747e27e61258dc.css" />
    <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-b04ca6fccda778e2.css" />
  <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-72bd7d974b5ac1cc.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-4c5c0895f723f870.css" />

  

  <script type="application/json" id="client-env">{"locale":"en","featureFlags":["actions_caches_react_shell","actions_enable_background_steps","actions_new_hosted_runner_image_select_sizes_and_versions","actions_runners_react_shell","agent_author_search_expansion","agent_author_search_expansion_ui_pulls","alternate_user_config_repo","async_conversion_coverage_enabled","billing_billable_licenses_cost_center_bucket_fix","billing_budget_expiration","billing_cost_center_list_assigned_resources","billing_discount_threshold_notification","code_quality_enablement_banner_targeting","code_quality_remove_preview","code_view_raf_sticky_lines","codespaces_prebuild_region_target_update","coding_agent_third_party_model_ui","copilot_agent_snippy","copilot_ahp_tool_call_timing","copilot_api_agentic_issue_marshal_yaml","copilot_automation_repo_mcp_servers","copilot_automations_pagination","copilot_base_model_policy_row","copilot_chat_auto_mode_v2","copilot_chat_clear_model_selection_for_default_change","copilot_chat_early_task_provisioning","copilot_chat_persist_session_drafts","copilot_chat_vision_dotcom_chat_ga_gate","copilot_css_textarea_autosize","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_removal_on_marketplace","copilot_fix_failed_workflows_all_skus","copilot_hide_hovercard","copilot_immersive_task_hyperlinking","copilot_mc_cli_resume_any_users_task","copilot_mission_control_agent_merge_fix_ci","copilot_mission_control_agent_merge_resolve_conflicts","copilot_mission_control_awps_batching","copilot_mission_control_early_stop","copilot_mission_control_managed_sandbox_environments","copilot_mission_control_needs_attention","copilot_mission_control_reasoning_effort","copilot_mission_control_sandbox_remote_bypass","copilot_mission_control_task_alive_updates","copilot_mission_control_task_sharing","copilot_org_policy_page_focus_mode","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_swe_agent_authorization_status_ui","copilot_swe_agent_automation_resource_scoped_writes","copilot_swe_agent_discussion_comment_trigger","copilot_swe_agent_discussion_opened_trigger","copilot_swe_agent_discussion_updated_trigger","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_issue_assigned_trigger","copilot_swe_agent_issue_comment_trigger","copilot_swe_agent_issue_labeled_trigger","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_assigned_trigger","copilot_swe_agent_pull_request_comment_trigger","copilot_swe_agent_pull_request_labeled_trigger","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_ready_for_review_trigger","copilot_swe_agent_pull_request_review_requested_trigger","copilot_swe_agent_pull_request_review_submitted_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_sub_issue_added_trigger","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_task_scoped_alive_channel","copilot_token_based_billing","copilot_unconfigured_is_inherited","copilot_user_can_upgrade_plan_field","copilot_web_integration_cutover","copilot_workbench_sunset_redirect","dashboard_agents_module_auth_token_check","dashboard_indexeddb_caching","fgpat_permissions_selector_redesign","glc_code_quality_repo_settings_workflow_config","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_ubb_individual_budget_banner","issue_fields_multi_select","issue_inline_avatars","issue_pinned_views","issue_pinned_views_team_vs_personal","issue_relative_time_micro","issue_viewer_paved_path","issues_expanded_file_types","issues_hide_closed_sub_issues","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","labels_archiving","labels_archiving_info","landing_pages_ninetailed","lifecycle_label_name_updates","marketing_cookie_consent_banner","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_queue_restricted_pushers_warning","merge_status_header_feedback","milestone_closed_issues_prioritization","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","primer_react_timeline_list_semantics","prs_copilot_app_open_action","prs_css_anchor_positioning","pull_request_copilot_attribution_header","pull_request_overview_merge_control","pull_request_overview_panel_edit_description","pull_request_persister","pull_request_stacks_navigation_shortcuts","pull_request_virtualization_image_estimate","pull_request_virtualization_loader_batching","pull_request_virtualization_scroll_compensation","pull_request_virtualization_scroll_intent","quick_search_lazy_suggestions","react_blob_isolate_code_lines","react_blob_ssr_content_visibility","react_data_router_tanstack_allowed","react_logged_out_repository_header","react_query_props_with_key","react_sandbox_future_tanstack","repo_app_turbo","repo_issues_sidebar_layout","repo_pulls_dashboard_declutter","repo_pulls_dashboard_ga","repo_pulls_dashboard_persistence","repos_contributors_limited_default_range","review_involves_filter","rule_ignored_file_paths","rulesets_actor_list_editor","sample_network_conn_type","security_center_artifact_filters_popover","see_who_reacted","semantic_similarity_duplicate_issue_detection","session_logs_ungroup_reasoning_text","set_sha256_on_repo_creation_form","site_banner_desktop_copilot_app","site_ghca_pixel_mona","site_github_app_ga_page","site_github_app_ga_page_highlight","site_github_app_mobile_native_share","site_global_banner_dev_days_attendee","site_global_nav_spark_models_removed","speculation_rules_ui_service","suggest_custom_property_values_copilot","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","thread_resolution_reason","update_issue_suggestions","viewscreen_sandbox","warn_inaccessible_attachments","webp_support","workstream_plugin_bootstrap"],"githubDomain":"https://github.com","copilotApiOverrideUrl":"https://api.githubcopilot.com","cmcApiUrl":"https://api.github.com/cmc_internal/api"}</script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/high-contrast-cookie-3663bcaacc724f4c.js"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-721126455a2225e3.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-156c6259e31cc551.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-f6ce38f47c2e1d56.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-804a14996977c014.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ser-fb5d13278eb42203.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tp-ea613009a991e211.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-107a7753389a8a2d.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.25915bc98fb322a6.module.css" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/catalyst-52ed81112a548e10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/selector-observer-e8810f64c443fb9b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/relative-time-element-fe7e72f699fdf493.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/by-9da36843ba9d191d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ja9-9a1160b939f2cd52.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3h-55903cf2303047ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hk-0d35a1220587d888.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jz5-c964b1a3671f2a92.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hj-1d800d09e9a8720a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j0-1ad12374da9777f2.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-531d35538b61fd0d.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-bf5e3b2aee197122.js" defer="defer"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/runtime-helpers-5e0b3ae3c4036207.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/aria-live-752acdc868e2da64.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-e87ffadced20a3c9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-75bc55d9971828b7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a9-34620c7b13885011.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ur-643d2814115561a9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4t6-5d0869970ac0aac0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pb0-a5c5ec36d311aeef.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6n-afcf86ccabc4cad2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zj-f08c728cf00018aa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/o6-2a1c68d269710ee9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/h9a-c6405aa090de0e84.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vy6-3c3e6e96629c2ce4.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/js-4eb97d5803e657c0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/g7-baf9e817ae102b01.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/unc-96389cade7bad821.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/nu-65322a6997c6c93c.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-5dd3809b5c8bac3c.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.3792087592bf207a.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-4318f0f4c608f3dd.js" defer="defer"></script>
  
  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-7afef75d393cf294.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/op-acddf38478d45ef9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ncx-461e4b09f2e67ee5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/qmp-c7cfba40cf5a93b0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j6-148a74299e5a01ab.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t7l-a52ba56147f77909.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4u-ec4874f70bfd5d76.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s0-481bd34f90bc2bd7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y5-ed17e73b4c0bd15e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/n4-be595475cdbf7d4b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j8-23a3c5ff8eef412d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/la-27679061f16e1495.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/iu-9806a0291a782cbe.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ftx-39fb490e3c1d778f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zi-32a0c3c081ea5cce.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sg-7a5d50475874c0e1.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pd-6a8710840033e042.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/86g-ec28c25ed7d5de06.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sn-1bab7384818953b7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/iq-6d4ecf6d2fb6993c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p2-7d8e7cee5b46cb45.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7d-2e3cc25d719f3a95.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4d-76d8acdf21a33266.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tsb-e0f6288ab985d9d2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/lf-910ef220ce85c660.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2j-2f19c1afd2ceaf93.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/me-f1476ec44a29f34a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p2u-e654a57b1a70c47d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/5d-d97cc006d4da4d9b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/r5-38f013bc2c0fd298.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/r6s-9039f5619230a653.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/9e-cece06724bf6ea3b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/x9-3e077a3a37a73f9f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pj-87629cb5389d7663.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/eq-3764fd5f66494289.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/13-d889936dff7e5c0f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/44-8193eea4af825ead.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/v4-9c1327d212e52a0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/id-7f39706ba9007db6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ah-271362a1ed227d03.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s1g-d434d712bca59d3a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vz-d7f4a583896f872e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/47-c8c0ce2700acc5be.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-4118a687d0150749.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/pj.75627bfeb9ceb1da.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ah.2623f7c6ecbe2ecd.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/47.78770c57a48a810c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.37656c95a9729fb9.module.css" />


  <title>ruv-drone/docs/security/latentmesh-threat-model.md at main · ruvnet/ruv-drone · GitHub</title>



  <meta name="route-pattern" content="/:user_id/:repository/blob/*name(/*path)" data-turbo-transient>
  <meta name="route-controller" content="blob" data-turbo-transient>
  <meta name="route-action" content="show" data-turbo-transient>
  <meta name="fetch-nonce" content="v2:311db91c-1f2e-bd4e-951c-42c6e3dead24">

    
  <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb">


  <meta name="request-id" content="9A02:24555C:CB1CB11:107B6955:6ACA8A09" data-pjax-transient="true"/><meta name="html-safe-nonce" content="977fc962d2c62ace883c365f00d1c8ec01e89f8acfe35ffb59f53ac864893eaf" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5QTAyOjI0NTU1QzpDQjFDQjExOjEwN0I2OTU1OjZBQ0E4QTA5IiwidmlzaXRvcl9pZCI6IjI2NTg3Mzc5NDIzMTkyMzc2NDEiLCJyZWdpb25fZWRnZSI6ImZyYSIsInJlZ2lvbl9yZW5kZXIiOiJmcmEifQ==" data-pjax-transient="true"/><meta name="visitor-hmac" content="a79c8894aacc8daa4f4e33345cb91692f1484a42e162365b884dc951f345a0cc" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:1271486548" data-turbo-transient>


  <meta name="github-keyboard-shortcuts" content="repository,source-code,file-tree,copilot" data-turbo-transient="true" />
  

  <meta name="selected-link" value="repo_source" data-turbo-transient>
  <link rel="assets" href="https://github.githubassets.com/">

    <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I">

<meta name="octolytics-url" content="https://collector.github.com/github/collect" />





  <meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show" data-turbo-transient="true" />

  




    <meta name="user-login" content="">

  

    <meta name="viewport" content="width=device-width">

    

      <meta name="description" content="Industrial cooperative-UAV fleet coordination in Rust — formation keeping, Raft consensus, cooperative task allocation, RRT-APF collision avoidance &amp; MAPPO navigation for civilian SAR / inspection / agriculture - ruv-drone/docs/security/latentmesh-threat-model.md at main · ruvnet/ruv-drone">

      <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">

    <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
    <meta property="fb:app_id" content="1401488693436528">
    <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/ruvnet/ruv-drone/blob/main/docs/security/latentmesh-threat-model.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/dc3ca7ec6dc370ded80f2d9eca454a9f7762def51dff5f3e02b75e3a575cf990/ruvnet/ruv-drone" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="ruv-drone/docs/security/latentmesh-threat-model.md at main · ruvnet/ruv-drone" /><meta name="twitter:description" content="Industrial cooperative-UAV fleet coordination in Rust — formation keeping, Raft consensus, cooperative task allocation, RRT-APF collision avoidance &amp;amp;amp; MAPPO navigation for civilian SAR / ins..." />
  <meta property="og:image" content="https://opengraph.githubassets.com/dc3ca7ec6dc370ded80f2d9eca454a9f7762def51dff5f3e02b75e3a575cf990/ruvnet/ruv-drone" /><meta property="og:image:alt" content="Industrial cooperative-UAV fleet coordination in Rust — formation keeping, Raft consensus, cooperative task allocation, RRT-APF collision avoidance &amp;amp; MAPPO navigation for civilian SAR / inspect..." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="ruv-drone/docs/security/latentmesh-threat-model.md at main · ruvnet/ruv-drone" /><meta property="og:url" content="https://github.com/ruvnet/ruv-drone/blob/main/docs/security/latentmesh-threat-model.md" /><meta property="og:description" content="Industrial cooperative-UAV fleet coordination in Rust — formation keeping, Raft consensus, cooperative task allocation, RRT-APF collision avoidance &amp;amp; MAPPO navigation for civilian SAR / inspect..." />
  




      <meta name="hostname" content="github.com">



        <meta name="expected-hostname" content="github.com">


  <meta http-equiv="x-pjax-version" content="d05be8f8b6905b6460fc264e80447721dfee1e32cf9e4291c4bf58f160c9f705" data-turbo-track="reload">
  <meta http-equiv="x-pjax-csp-version" content="c4a65e47b0c850e1157ae8e66298070851d7e3b558038de5a3b4ff7a93e630ed" data-turbo-track="reload">
  <meta http-equiv="x-pjax-css-version" content="a80b0545b169f440b929ce2b977c76b6988f014cca6513fb83c5df6581635fb3" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="af51c6f9d659be0324665373df3ee542f817dbd7f66f352a087935f2ceabe545" data-turbo-track="reload">

  <meta name="turbo-cache-control" content="no-preview" data-turbo-transient="">

      <meta name="turbo-cache-control" content="no-cache" data-turbo-transient>

    <meta data-hydrostats="publish">

  <meta name="go-import" content="github.com/ruvnet/ruv-drone git https://github.com/ruvnet/ruv-drone.git">

  <meta name="octolytics-dimension-user_id" content="2934394" /><meta name="octolytics-dimension-user_login" content="ruvnet" /><meta name="octolytics-dimension-repository_id" content="1271486548" /><meta name="octolytics-dimension-repository_nwo" content="ruvnet/ruv-drone" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="1271486548" /><meta name="octolytics-dimension-repository_network_root_nwo" content="ruvnet/ruv-drone" />
  



    

    <meta name="turbo-body-classes" content="logged-out env-production page-responsive">
  <meta name="disable-turbo" content="false">


  <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">


  <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">

  <meta name="release" content="3b1bb5b10f5c7fd1769d56e38b15dfddb34052a8" data-turbo-track="reload">
  <meta name="ui-target" content="full">

  <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000">
  <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png">
  <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon">

<meta name="theme-color" content="#1e2327">
<meta name="color-scheme" content="light dark" />


  <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">

  </head>

  <body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
    <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;" >
      <div id="__primerPortalRoot__" style="z-index: 1000; position: absolute; width: 100%;" data-turbo-permanent></div>
      

    <div class="position-relative header-wrapper js-header-wrapper ">
      <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 tmp-py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a>

      <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
    <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
</span>      
      <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/19-c660652a0a1639be.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-47c5223d8d1af8ef.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.d53d993320d57e14.module.css" />

<react-partial
  partial-name="keyboard-shortcuts-dialog"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>





      

          <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-install-banner-partial-3c87deb7f0f20434.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-install-banner-partial.7b357012e82003e7.module.css" />

<react-partial
  partial-name="app-install-banner-partial"
  data-ssr="false"
  data-attempted-ssr="false"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{}}</script>
  <div data-target="react-partial.reactRoot"></div>
</react-partial>


          

                <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/et9-7eeec247c287fca4.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/94v-e20946127faa8f6e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fz5-892a9e99cc92858d.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jag-441e702bfd4c7904.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hw-8ce7888b57d0a23c.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/rq-0ec82a12cf538a4d.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/1m-a7a4c022483b2713.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/marketing-header-70703fe17422eb58.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-brand-css.fbc35b3d20e988ff.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/1m.fec8b575d0e5234f.module.css" />

<react-partial
  partial-name="marketing-header"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2Fruvnet%2Fruv-drone%2Fblob%2Fmain%2Fdocs%2Fsecurity%2Flatentmesh-threat-model.md","signup_path":"/signup?ref_cta=Sign+up\u0026ref_loc=header+logged+out\u0026ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow\u0026source=header-repo\u0026source_repo=ruvnet%2Fruv-drone","signup_enabled":true,"is_signup_controller":false,"show_search_and_nav":true,"hide_search":false,"private_mode_enabled":false,"should_use_dotcom_links":true,"auth_hydro_click":"{\"event_type\":\"authentication.click\",\"payload\":{\"location_in_page\":\"site header menu\",\"repository_id\":null,\"auth_type\":\"SIGN_UP\",\"originating_url\":\"https://github.com/ruvnet/ruv-drone/blob/main/docs/security/latentmesh-threat-model.md\",\"user_id\":null}}","auth_hydro_click_hmac":"8328097a90af194c917fcff5df8b59a91501699f496152cf2b3c4b2a76012a9c","overlay":false,"fixed":false}}</script>
  <div data-target="react-partial.reactRoot"><div data-color-mode="dark" data-light-theme="light" data-dark-theme="dark"><header class="MarketingHeader-module__root__Tk7n3 HeaderMktg header-logged-out" role="banner" data-marketing-header="true" data-color-mode="dark" data-light-theme="light" data-dark-theme="dark" data-is-top="true"><h2 class="MarketingHeader-module__visuallyHidden__sqKsl">Navigation Menu</h2><button type="button" class="MarketingHeader-module__backdrop__sw4RU" aria-label="Close navigation menu"></button><div class="MarketingHeader-module__bar__mBSyE"><div class="MarketingHeader-module__topRow__yeury"><div class="MarketingHeader-module__toggleSlot__hDxbh"><button type="button" class="HeaderMenuToggle-module__toggle__i8EiC" aria-label="Toggle navigation" aria-expanded="false"><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span><span class="HeaderMenuToggle-module__toggleBar__jVN0H"></span></button></div><a href="/" aria-label="Homepage" class="HeaderLogo-module__logo__UFyHI" data-analytics-event="{&quot;action&quot;:&quot;homepage&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;logo&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;homepage_link_logo_header&quot;}"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github" viewBox="0 0 24 24" width="32" height="32" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path></svg></a><div class="AuthCTAs-module__mobileActions__NNzeV"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/login?return_to=https%3A%2F%2Fgithub.com%2Fruvnet%2Fruv-drone%2Fblob%2Fmain%2Fdocs%2Fsecurity%2Flatentmesh-threat-model.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/ruvnet/ruv-drone/blob/main/docs/security/latentmesh-threat-model.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="8328097a90af194c917fcff5df8b59a91501699f496152cf2b3c4b2a76012a9c"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_3dd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_3dd_">Appearance settings</div></div></div><div class="MarketingHeader-module__menu__GIy3y"><div class="MarketingHeader-module__menuWrapper__owstH"><nav class="MarketingNavigation-module__nav__W0KYY" aria-label="Global"><ul class="MarketingNavigation-module__list__tFbMb"><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_nd_">Platform<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5knd_">AI CODE CREATION</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot" data-analytics-event="{&quot;action&quot;:&quot;github_copilot&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>GitHub Copilot</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Write better code with AI</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/ai/github-app" data-analytics-event="{&quot;action&quot;:&quot;github_copilot_app&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_copilot_app_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mark-github NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.766 11.328c-2.063-.25-3.516-1.734-3.516-3.656 0-.781.281-1.625.75-2.188-.203-.515-.172-1.609.063-2.062.625-.078 1.468.25 1.968.703.594-.187 1.219-.281 1.985-.281.765 0 1.39.094 1.953.265.484-.437 1.344-.765 1.969-.687.218.422.25 1.515.046 2.047.5.593.766 1.39.766 2.203 0 1.922-1.453 3.375-3.547 3.64.531.344.89 1.094.89 1.954v1.625c0 .468.391.734.86.547C13.781 14.359 16 11.53 16 8.03 16 3.61 12.406 0 7.984 0 3.563 0 0 3.61 0 8.031a7.88 7.88 0 0 0 5.172 7.422c.422.156.828-.125.828-.547v-1.25c-.219.094-.5.156-.75.156-1.031 0-1.64-.562-2.078-1.609-.172-.422-.36-.672-.719-.719-.187-.015-.25-.093-.25-.187 0-.188.313-.328.625-.328.453 0 .844.281 1.25.86.313.452.64.655 1.031.655s.641-.14 1-.5c.266-.265.47-.5.657-.656"></path></svg>GitHub Copilot app</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Direct agents from issue to merge</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/mcp" data-analytics-event="{&quot;action&quot;:&quot;mcp_registry&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;mcp_registry_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-mcp NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.52 1.12a3.578 3.578 0 0 1 6.078 2.98 3.578 3.578 0 0 1 2.982 6.08l-3.292 3.293a.252.252 0 0 0 0 .354l.843.843a.749.749 0 1 1-1.06 1.06l-.844-.843a1.75 1.75 0 0 1 0-2.474L13.52 9.12a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0L7.731 9.03A.75.75 0 0 1 6.67 7.97l2.85-2.85a2.08 2.08 0 0 0 0-2.94 2.08 2.08 0 0 0-2.94 0l-4.799 4.8A.75.75 0 0 1 .72 5.92Z"></path><path d="M7.52 3.12a.749.749 0 1 1 1.06 1.06L5.731 7.03A2.079 2.079 0 0 0 8.67 9.97l2.85-2.85a.749.749 0 1 1 1.06 1.06l-2.849 2.85A3.578 3.578 0 0 1 4.67 5.97Z"></path></svg>MCP Registry</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Integrate external tools</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9knd_">DEVELOPER WORKFLOWS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9knd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/actions" data-analytics-event="{&quot;action&quot;:&quot;actions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;actions_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-workflow NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path></svg>Actions</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Automate any workflow</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/codespaces" data-analytics-event="{&quot;action&quot;:&quot;codespaces&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;codespaces_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codespaces NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path></svg>Codespaces</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Instant dev environments</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/issues" data-analytics-event="{&quot;action&quot;:&quot;issues&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;issues_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg>Issues</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Plan and track work</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-review" data-analytics-event="{&quot;action&quot;:&quot;code_review&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_review_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg>Code Review</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Manage code changes</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/code-quality" data-analytics-event="{&quot;action&quot;:&quot;code_quality&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_quality_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-codescan-checkmark NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.28 6.28a.75.75 0 1 0-1.06-1.06L6.25 8.19l-.97-.97a.75.75 0 0 0-1.06 1.06l1.5 1.5a.75.75 0 0 0 1.06 0l3.5-3.5Z"></path><path d="M7.5 15a7.5 7.5 0 1 1 5.807-2.754l2.473 2.474a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2.474-2.473A7.472 7.472 0 0 1 7.5 15Zm0-13.5a6 6 0 1 0 4.094 10.386.748.748 0 0 1 .293-.292 6.002 6.002 0 0 0 1.117-6.486A6.002 6.002 0 0 0 7.5 1.5Z"></path></svg>Code Quality</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enforce quality at merge</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dknd_">APPLICATION SECURITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Find and fix vulnerabilities</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/code-security" data-analytics-event="{&quot;action&quot;:&quot;code_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;code_security_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code-square NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>Code security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Secure your code as you build</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security/secret-protection" data-analytics-event="{&quot;action&quot;:&quot;secret_protection&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;secret_protection_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-lock NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M4 4a4 4 0 0 1 8 0v2h.25c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 12.25 15h-8.5A1.75 1.75 0 0 1 2 13.25v-5.5C2 6.784 2.784 6 3.75 6H4Zm8.25 3.5h-8.5a.25.25 0 0 0-.25.25v5.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25ZM10.5 6V4a2.5 2.5 0 1 0-5 0v2Z"></path></svg>Secret protection</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Stop leaks before they start</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ NavGroup-module__hasSeparator__FnMrN"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_hknd_">EXPLORE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_hknd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/why-github" data-analytics-event="{&quot;action&quot;:&quot;why_github&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;why_github_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Why GitHub</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog" data-analytics-event="{&quot;action&quot;:&quot;blog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;blog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Blog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://github.blog/changelog" data-analytics-event="{&quot;action&quot;:&quot;changelog&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;changelog_link_platform_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Changelog</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/marketplace" data-analytics-event="{&quot;action&quot;:&quot;marketplace&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;marketplace_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Marketplace</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/features" data-analytics-event="{&quot;action&quot;:&quot;view_all_features&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;platform&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_features_link_platform_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all features</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_17d_">Solutions<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_17d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5l7d_">BY COMPANY SIZE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprises&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprises_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Enterprises</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/team" data-analytics-event="{&quot;action&quot;:&quot;small_and_medium_teams&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;small_and_medium_teams_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Small and medium teams</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/enterprise/startups" data-analytics-event="{&quot;action&quot;:&quot;startups&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;startups_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Startups</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/nonprofits" data-analytics-event="{&quot;action&quot;:&quot;nonprofits&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;nonprofits_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Nonprofits</span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9l7d_">BY USE CASE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9l7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/app-modernization" data-analytics-event="{&quot;action&quot;:&quot;app_modernization&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;app_modernization_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">App Modernization</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devsecops" data-analytics-event="{&quot;action&quot;:&quot;devsecops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devsecops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevSecOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/use-case/ci-cd" data-analytics-event="{&quot;action&quot;:&quot;ci/cd&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ci/cd_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">CI/CD</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/use-case" data-analytics-event="{&quot;action&quot;:&quot;view_all_use_cases&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_use_cases_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all use cases</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dl7d_">BY INDUSTRY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dl7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/healthcare" data-analytics-event="{&quot;action&quot;:&quot;healthcare&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;healthcare_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Healthcare</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/financial-services" data-analytics-event="{&quot;action&quot;:&quot;financial_services&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;financial_services_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Financial services</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/manufacturing" data-analytics-event="{&quot;action&quot;:&quot;manufacturing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;manufacturing_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Manufacturing</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/industry/government" data-analytics-event="{&quot;action&quot;:&quot;government&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;government_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Government</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions/industry" data-analytics-event="{&quot;action&quot;:&quot;view_all_industries&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_industries_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all industries</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/solutions" data-analytics-event="{&quot;action&quot;:&quot;view_all_solutions&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;solutions&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_solutions_link_solutions_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all solutions</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_1nd_">Resources<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_1nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5lnd_">EXPLORE BY TOPIC</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=ai" data-analytics-event="{&quot;action&quot;:&quot;ai&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ai_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">AI</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=software-development" data-analytics-event="{&quot;action&quot;:&quot;software_development&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;software_development_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Software Development</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=devops" data-analytics-event="{&quot;action&quot;:&quot;devops&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;devops_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">DevOps</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/articles?topic=security" data-analytics-event="{&quot;action&quot;:&quot;security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources/articles" data-analytics-event="{&quot;action&quot;:&quot;view_all_topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_topics_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all topics</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9lnd_">EXPLORE BY TYPE</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9lnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/customer-stories" data-analytics-event="{&quot;action&quot;:&quot;customer_stories&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_stories_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer stories</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/events" data-analytics-event="{&quot;action&quot;:&quot;events__webinars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;events__webinars_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Events &amp; webinars</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/resources/whitepapers" data-analytics-event="{&quot;action&quot;:&quot;ebooks__reports&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;ebooks__reports_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Ebooks &amp; reports</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/solutions/executive-insights" data-analytics-event="{&quot;action&quot;:&quot;business_insights&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;business_insights_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Business insights</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://skills.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_skills&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_skills_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Skills</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dlnd_">SUPPORT &amp; SERVICES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dlnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://docs.github.com" data-analytics-event="{&quot;action&quot;:&quot;documentation&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;documentation_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Documentation</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://support.github.com" data-analytics-event="{&quot;action&quot;:&quot;customer_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;customer_support_link_resources_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Customer support</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/orgs/community/discussions" data-analytics-event="{&quot;action&quot;:&quot;community_forum&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;community_forum_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Community forum</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trust-center" data-analytics-event="{&quot;action&quot;:&quot;trust_center&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trust_center_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trust center</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/partners" data-analytics-event="{&quot;action&quot;:&quot;partners&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;partners_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Partners</span></a></li></ul></div></li></ul><div class="NavDropdown-module__trailingLinkContainer__VgJGL"><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--arrow-end___esdN8" href="https://github.com/resources" data-analytics-event="{&quot;action&quot;:&quot;view_all_resources&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;resources&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;view_all_resources_link_resources_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">View all resources</span><svg class="Primer_Brand__ExpandableArrow-module__ExpandableArrow___aaZs9 Primer_Brand__Link-module__Link-arrow___yd78i" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false"><path fill="currentColor" d="M7.28033 3.21967C6.98744 2.92678 6.51256 2.92678 6.21967 3.21967C5.92678 3.51256 5.92678 3.98744 6.21967 4.28033L7.28033 3.21967ZM11 8L11.5303 8.53033C11.8232 8.23744 11.8232 7.76256 11.5303 7.46967L11 8ZM6.21967 11.7197C5.92678 12.0126 5.92678 12.4874 6.21967 12.7803C6.51256 13.0732 6.98744 13.0732 7.28033 12.7803L6.21967 11.7197ZM6.21967 4.28033L10.4697 8.53033L11.5303 7.46967L7.28033 3.21967L6.21967 4.28033ZM10.4697 7.46967L6.21967 11.7197L7.28033 12.7803L11.5303 8.53033L10.4697 7.46967Z"></path><path class="Primer_Brand__ExpandableArrow-module__ExpandableArrow-stem___0K8Hz" stroke="currentColor" d="M1.75 8H11" stroke-width="1.5" stroke-linecap="round"></path></svg></a></div></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_27d_">Open Source<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_27d_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5m7d_">COMMUNITY</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/open-source/sponsors" data-analytics-event="{&quot;action&quot;:&quot;github_sponsors&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_sponsors_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sponsor-tiers NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.586 1C12.268 1 13.5 2.37 13.5 4.25c0 1.745-.996 3.359-2.622 4.831-.166.15-.336.297-.509.438l1.116 5.584a.75.75 0 0 1-.991.852l-2.409-.876a.25.25 0 0 0-.17 0l-2.409.876a.75.75 0 0 1-.991-.852L5.63 9.519a13.78 13.78 0 0 1-.51-.438C3.497 7.609 2.5 5.995 2.5 4.25 2.5 2.37 3.732 1 5.414 1c.963 0 1.843.403 2.474 1.073L8 2.198l.112-.125a3.385 3.385 0 0 1 2.283-1.068L10.586 1Zm-3.621 9.495-.718 3.594 1.155-.42a1.75 1.75 0 0 1 1.028-.051l.168.051 1.154.42-.718-3.592c-.199.13-.37.235-.505.314l-.169.097a.75.75 0 0 1-.72 0 9.54 9.54 0 0 1-.515-.308l-.16-.105ZM10.586 2.5c-.863 0-1.611.58-1.866 1.459-.209.721-1.231.721-1.44 0C7.025 3.08 6.277 2.5 5.414 2.5 4.598 2.5 4 3.165 4 4.25c0 1.23.786 2.504 2.128 3.719.49.443 1.018.846 1.546 1.198l.325.21.076-.047.251-.163a13.341 13.341 0 0 0 1.546-1.198C11.214 6.754 12 5.479 12 4.25c0-1.085-.598-1.75-1.414-1.75Z"></path></svg>GitHub Sponsors</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Fund open source developers</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9m7d_">PROGRAMS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9m7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://securitylab.github.com" data-analytics-event="{&quot;action&quot;:&quot;security_lab&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;security_lab_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Security Lab</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://maintainers.github.com" data-analytics-event="{&quot;action&quot;:&quot;maintainer_community&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;maintainer_community_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Maintainer Community</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://stars.github.com" data-analytics-event="{&quot;action&quot;:&quot;github_stars&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_stars_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">GitHub Stars</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 Primer_Brand__Link-module__Link--is-external___xsncV" href="https://archiveprogram.github.com" data-analytics-event="{&quot;action&quot;:&quot;archive_program&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;archive_program_link_open_source_navbar&quot;}" target="_blank" rel="noreferrer"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Archive Program</span><svg data-component="Octicon" focusable="false" aria-label="External link" class="octicon octicon-link-external" role="img" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path></svg></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_dm7d_">REPOSITORIES</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_dm7d_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/topics" data-analytics-event="{&quot;action&quot;:&quot;topics&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;topics_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Topics</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/trending" data-analytics-event="{&quot;action&quot;:&quot;trending&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;trending_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Trending</span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0" href="https://github.com/collections" data-analytics-event="{&quot;action&quot;:&quot;collections&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;open_source&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;collections_link_open_source_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty">Collections</span></a></li></ul></div></li></ul></div></div></li><li><div class="NavDropdown-module__container__l2YeI"><button type="button" class="NavDropdown-module__button__PEHWX" aria-expanded="false" aria-controls="_R_2nd_">Enterprise<svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-right NavDropdown-module__buttonIcon__Tkl8_" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m6.427 4.427 3.396 3.396a.25.25 0 0 1 0 .354l-3.396 3.396A.25.25 0 0 1 6 11.396V4.604a.25.25 0 0 1 .427-.177Z"></path></svg></button><div id="_R_2nd_" class="NavDropdown-module__dropdown__xm1jd"><ul class="NavDropdown-module__list__zuCgG"><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_5mnd_">ENTERPRISE SOLUTIONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_5mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise" data-analytics-event="{&quot;action&quot;:&quot;enterprise_platform&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;enterprise_platform_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-stack NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.122.392a1.75 1.75 0 0 1 1.756 0l5.003 2.902c.83.481.83 1.68 0 2.162L8.878 8.358a1.75 1.75 0 0 1-1.756 0L2.119 5.456a1.251 1.251 0 0 1 0-2.162ZM8.125 1.69a.248.248 0 0 0-.25 0l-4.63 2.685 4.63 2.685a.248.248 0 0 0 .25 0l4.63-2.685ZM1.601 7.789a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0L1.874 8.814A.75.75 0 0 1 1.6 7.789Zm0 3.5a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0l-5.248-3.044a.75.75 0 0 1-.273-1.025Z"></path></svg>Enterprise platform</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">AI-powered developer platform</span></span></a></li></ul></div></li><li><div class="NavGroup-module__group__W8SqJ"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--monospace___QXHDQ Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavGroup-module__title__Wzxz2" id="_R_9mnd_">AVAILABLE ADD-ONS</span><ul class="NavGroup-module__list__UCOFy" aria-labelledby="_R_9mnd_"><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/security/advanced-security" data-analytics-event="{&quot;action&quot;:&quot;github_advanced_security&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;github_advanced_security_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield-check NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg>GitHub Advanced Security</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade security features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/features/copilot/copilot-business" data-analytics-event="{&quot;action&quot;:&quot;copilot_for_business&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;copilot_for_business_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copilot NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path></svg>Copilot for Business</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade AI features</span></span></a></li><li><a class="Primer_Brand__Link-module__Link___lF11y Primer_Brand__Link-module__Link--default___VRVW0 NavLink-module__link__EG3d4" href="https://github.com/enterprise/premium-support" data-analytics-event="{&quot;action&quot;:&quot;premium_support&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;enterprise&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;premium_support_link_enterprise_navbar&quot;}"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Link-module__Link--label___jM8Ty"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS Primer_Brand__Text-module__Text--weight-medium___qJKf_ NavLink-module__title__Q7t0p"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-comment-discussion NavLink-module__icon__ltGNM" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path></svg>Premium Support</span><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--muted___rE6mh Primer_Brand__Text-module__Text--200____P1wy Primer_Brand__Text-module__Text--antialiased___TYoXS NavLink-module__subtitle__X4gkW">Enterprise-grade 24/7 support</span></span></a></li></ul></div></li></ul></div></div></li><li><a href="https://github.com/pricing" data-analytics-event="{&quot;action&quot;:&quot;pricing&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;pricing&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;pricing_link_pricing_navbar&quot;}" class="MarketingNavigation-module__navLink__hUomM">Pricing</a></li></ul></nav><div class="MarketingHeader-module__ctaContainer__tBmPz"><div class="HeaderSearch-module__searchSlot__oVOUS"><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderSearch-module__trigger__zsF9q" type="button" aria-haspopup="dialog" aria-expanded="false" aria-label="Search or jump to, type / to search" data-analytics-event="{&quot;action&quot;:&quot;searchbar&quot;,&quot;tag&quot;:&quot;input&quot;,&quot;context&quot;:&quot;global&quot;,&quot;location&quot;:&quot;navbar&quot;,&quot;label&quot;:&quot;searchbar_input_global_navbar&quot;}"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"><span class="HeaderSearch-module__content__kMpxU"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search HeaderSearch-module__icon__wcrHX" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg><span class="HeaderSearch-module__label__d1iWG">Search</span><kbd class="HeaderSearch-module__kbd__HNG0o" aria-hidden="true">/</kbd></span></span></span></button><div class="d-none"></div></div><div class="AuthCTAs-module__signInWrap__q2P60"><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq AuthCTAs-module__desktopActionGap__UZuXT AuthCTAs-module__hiddenBelowLg__BfKBw" href="/login?return_to=https%3A%2F%2Fgithub.com%2Fruvnet%2Fruv-drone%2Fblob%2Fmain%2Fdocs%2Fsecurity%2Flatentmesh-threat-model.md" data-analytics-event="{&quot;action&quot;:&quot;sign_in&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_in_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/ruvnet/ruv-drone/blob/main/docs/security/latentmesh-threat-model.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="8328097a90af194c917fcff5df8b59a91501699f496152cf2b3c4b2a76012a9c"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH">Sign in</span></span></a></div><a class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--secondary___gHnw_ Primer_Brand__Button-module__Button--size-small___zQrEw AuthCTAs-module__cta__WpwQq" href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&amp;source=header-repo&amp;source_repo=ruvnet%2Fruv-drone" data-analytics-event="{&quot;action&quot;:&quot;sign_up&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;context&quot;:&quot;auth_cta&quot;,&quot;location&quot;:&quot;header&quot;,&quot;label&quot;:&quot;sign_up_link_auth_cta_header&quot;}" data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header menu&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/ruvnet/ruv-drone/blob/main/docs/security/latentmesh-threat-model.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="8328097a90af194c917fcff5df8b59a91501699f496152cf2b3c4b2a76012a9c"><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-secondary___eJ0_a">Sign up</span></span></a><button class="Primer_Brand__Button-module__Button___scH9Z Primer_Brand__Button-module__Button--subtle___F7pEE Primer_Brand__Button-module__Button--size-small___zQrEw HeaderAppearanceSettings-module__trigger__hUheK" type="button" aria-haspopup="dialog" aria-labelledby="_R_fbd_"><span class="Primer_Brand__Button-module__Button__leading-visual___jjtTe" data-testid="Button-leading-visual"><svg data-component="Octicon" focusable="false" aria-hidden="true" class="octicon octicon-sliders Primer_Brand__Button-module__Button__icon-visual____qybb" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M15 2.75a.75.75 0 0 1-.75.75h-4a.75.75 0 0 1 0-1.5h4a.75.75 0 0 1 .75.75Zm-8.5.75v1.25a.75.75 0 0 0 1.5 0v-4a.75.75 0 0 0-1.5 0V2H1.75a.75.75 0 0 0 0 1.5H6.5Zm1.25 5.25a.75.75 0 0 0 0-1.5h-6a.75.75 0 0 0 0 1.5h6ZM15 8a.75.75 0 0 1-.75.75H11.5V10a.75.75 0 1 1-1.5 0V6a.75.75 0 0 1 1.5 0v1.25h2.75A.75.75 0 0 1 15 8Zm-9 5.25v-2a.75.75 0 0 0-1.5 0v1.25H1.75a.75.75 0 0 0 0 1.5H4.5v1.25a.75.75 0 0 0 1.5 0v-2Zm9 0a.75.75 0 0 1-.75.75h-6a.75.75 0 0 1 0-1.5h6a.75.75 0 0 1 .75.75Z"></path></svg></span><span class="Primer_Brand__Button-module__Button__text___ED0bX"><span class="Primer_Brand__Text-module__Text___XeGJJ Primer_Brand__Text-module__Text-font--mona-sans___a8XJD Primer_Brand__Text-module__Text--default___GhPh_ Primer_Brand__Text-module__Text--100___B2ueX Primer_Brand__Text-module__Text--weight-medium___qJKf_ Primer_Brand__Button-module__Button--label___qrkyz Primer_Brand__Button-module__Button--label-subtle___8ndWH"></span></span></button><div class="Primer_Brand__Tooltip-module__Tooltip___0Eipx" data-direction="s" aria-hidden="true" id="_R_fbd_">Appearance settings</div></div></div></div></div><div class="MarketingHeader-module__bottomBorder__uZT38" aria-hidden="true"></div></header></div></div>
</react-partial>



      <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full">
  
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
        <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>
        <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span>

    <button id="icon-button-fd9b93e0-9f0a-49fa-87bb-e865aa655285" aria-labelledby="tooltip-a4d4d24d-5112-40fe-ba7a-3d00b9927b2a" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close">  <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
</button><tool-tip id="tooltip-a4d4d24d-5112-40fe-ba7a-3d00b9927b2a" for="icon-button-fd9b93e0-9f0a-49fa-87bb-e865aa655285" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

  <div id="start-of-content" class="show-on-focus"></div>








    <div id="js-flash-container" class="flash-container" data-turbo-replace>






  <template class="js-flash-template">
    
<div class="flash flash-full   {{ className }}">
  <div >
    <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    <div aria-atomic="true" role="alert" class="js-flash-alert">
      
      <div>{{ message }}</div>

    </div>
  </div>
</div>
  </template>
</div>


    






  <div
    class="application-main "
    data-commit-hovercards-enabled
    data-discussion-hovercards-enabled
    data-issue-and-pr-hovercards-enabled
    data-project-hovercards-enabled
  >
        <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
    <main id="js-repo-pjax-container" >
      
      








  

    <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ym-6bc2c9bf8112c038.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sk2-8deeef9351be3911.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ni-3e194d222c7770bf.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7x-71d30cb240cd901f.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wwk-ad869086822937b1.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a1-9f79841ecac1da8e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wzg-40a3213b3e83400b.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/5f-64f8e7d5bcbd4787.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/z5-b53a93078d026f1e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/8h-cef26f68c1331011.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fq-3ce13a77e863807a.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a7-596b507bd20acddc.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xfx-c82d8352413aea0a.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j4-b3a9e87fa7878a98.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/global-nav-bar-29c7aef68ee9db41.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.2d881b4d4a503d1c.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/pj.75627bfeb9ceb1da.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-nav-bar.2f2560cba06ab359.module.css" />

<react-partial
  partial-name="global-nav-bar"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"contextRegion":{"crumbs":[{"crumb_type":"user","label":"ruvnet","is_root":false,"href":"/ruvnet"},{"crumb_type":"repository","label":"ruv-drone","is_root":false,"href":"/ruvnet/ruv-drone"}],"localNavigation":[{"id":"code","icon":"code","label":"Code","href":"/ruvnet/ruv-drone","selectedLinks":["repo_source","repo_downloads","repo_commits","repo_releases","repo_tags","repo_branches","repo_packages","repo_deployments","repo_attestations"],"popoverTarget":false,"commandId":"repositories:go-to-code","reactNav":{"appTarget":"code-view","anchor":"code-view-repo-link"},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"issues","icon":"issue-opened","label":"Issues","href":"/ruvnet/ruv-drone/issues","selectedLinks":["repo_issues","repo_labels","repo_milestones"],"count":1,"popoverTarget":false,"commandId":"repositories:go-to-issues","reactNav":{"appTarget":"repo","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"pull-requests","icon":"git-pull-request","label":"Pull requests","href":"/ruvnet/ruv-drone/pulls","selectedLinks":["repo_pulls","checks"],"count":1,"popoverTarget":false,"commandId":"repositories:go-to-pull-requests","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"actions","icon":"play","label":"Actions","href":"/ruvnet/ruv-drone/actions","selectedLinks":["repo_actions"],"popoverTarget":false,"commandId":"repositories:go-to-actions","reactNav":{"appTarget":"actions-workflows","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"projects","icon":"table","label":"Projects","href":"/ruvnet/ruv-drone/projects","selectedLinks":["repo_projects","new_repo_project","repo_project"],"popoverTarget":false,"commandId":"repositories:go-to-projects","reactNav":{"appTarget":"repo","anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"security-and-quality","icon":"shield","label":"Security and quality","href":"/ruvnet/ruv-drone/security","selectedLinks":["security","overview","alerts","policy","token_scanning","code_scanning"],"count":0,"popoverTarget":false,"commandId":"repositories:go-to-security","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}},{"id":"insights","icon":"graph","label":"Insights","href":"/ruvnet/ruv-drone/pulse","selectedLinks":["repo_graphs","repo_contributors","dependency_graph","dependabot_updates","pulse","people","community"],"popoverTarget":false,"commandId":"repositories:go-to-insights","reactNav":{"appTarget":null,"anchor":null},"turboNav":{"frame":"repo-content-turbo-frame"}}],"localNavigationUpdateChannel":null,"selectedLink":"repo_source"},"owner":null,"headerLogo":{"href":"/","aria-label":"Homepage "},"notifications":{"indicatorMode":"disabled","websocketChannel":null,"fetchIndicatorSrc":"/notifications/indicator","fetchIndicatorEnabled":false},"issues":{"href":"/issues"},"pulls":{"href":"/pulls"},"contributedRepos":{"href":"/repos"},"copilot":{"show":false,"showAgentsButton":false,"showRelaunchAnnouncement":false,"copilotChatUrl":null,"copilotApiUrl":"https://api.githubcopilot.com"},"search":{"show":true,"showCommandPalette":false,"isSearchPage":false,"isJumpToSearch":false,"searchContext":{"scope":"repo:ruvnet/ruv-drone","current_repo_name":"ruv-drone","current_repo_nwo":"ruvnet/ruv-drone","user_id":"ruvnet"}},"commandPalette":null,"enterpriseBar":{"show":false},"globalTransactionalMessage":[],"payloadsUrl":"/_global-navigation/payloads.json?can_toggle_site_admin_and_employee_status=0\u0026is_admin_mode_on=0\u0026is_ui_opted_out=0\u0026show_ui_opt_out=0\u0026v=7","contextRegionUrl":"/_global-navigation/context-region.json"}}</script>
  <div data-target="react-partial.reactRoot"><header aria-label="Global navigation menu" data-component="Stack" class="GlobalNav styles-module__appHeader__YzYWk prc-Stack-Stack-UQ9k6" data-gap="none" data-direction="vertical" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="none"><div data-component="Stack" class="prc-Stack-Stack-UQ9k6" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="center" data-padding="none"><div data-testid="top-nav-center" data-component="Stack" class="styles-module__center__R3QRv styles-module__withLocalNavigation__rjTJ_ GlobalNavBar-module__loggedOut__Jv1rk prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="normal"><nav class="styles-module__contextRegion__VbSp2 prc-Breadcrumbs-BreadcrumbsBase-3Gb-B" aria-label="Breadcrumbs" data-overflow="menu" data-variant="normal" data-component="Breadcrumbs"><ol class="prc-Breadcrumbs-BreadcrumbsList-BKjpe"><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/ruvnet" data-discover="true"><span class="">ruvnet</span></a></li><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/ruvnet/ruv-drone" data-discover="true"><span class="styles-module__contextCrumbLast__tI2e3">ruv-drone</span></a></li></ol></nav></div><div data-testid="top-nav-right" data-component="Stack" class="styles-module__right__mlBQg styles-module__withLocalNavigation__rjTJ_ styles-module__rightWithResponsiveCreateButton__SKn2W prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="start" data-padding="normal"></div></div><h2 class="prc-src-InternalVisuallyHidden-2YaI6">Repository navigation</h2><nav class="prc-components-UnderlineWrapper-eT-Yj prc-UnderlineNav-UnderlineWrapper-GWONT LocalNavigation-module__LocalNavigation__b0Xc0" aria-label="Repository" data-variant="inset" data-overflow-mode="wrap" data-hide-icons-breakpoint="medium"><ul class="prc-UnderlineNav-ItemsList-oj8gN prc-components-UnderlineItemList-xKlKC" role="list"><li role="presentation" aria-hidden="true" class="prc-UnderlineNav-WrapSpacer--aLgz"></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a aria-current="page" data-tab-item="code" data-react-nav="code-view" data-react-nav-anchor="code-view-repo-link" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/ruvnet/ruv-drone" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-code" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text" data-content="Code">Code</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="issues" data-react-nav="repo" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/ruvnet/ruv-drone/issues" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-issue-opened" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path></svg></span><span data-component="text" data-content="Issues">Issues</span><span data-component="counter"><span aria-hidden="true" data-variant="secondary" data-component="CounterLabel" class="prc-CounterLabel-CounterLabel-X-kRU">1</span><span class="prc-VisuallyHidden-VisuallyHidden-Q0qSB"> (<!-- -->1<!-- -->)</span></span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="pull-requests" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/ruvnet/ruv-drone/pulls" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-pull-request" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path></svg></span><span data-component="text" data-content="Pull requests">Pull requests</span><span data-component="counter"><span aria-hidden="true" data-variant="secondary" data-component="CounterLabel" class="prc-CounterLabel-CounterLabel-X-kRU">1</span><span class="prc-VisuallyHidden-VisuallyHidden-Q0qSB"> (<!-- -->1<!-- -->)</span></span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="actions" data-react-nav="actions-workflows" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/ruvnet/ruv-drone/actions" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-play" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path></svg></span><span data-component="text" data-content="Actions">Actions</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="projects" data-react-nav="repo" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/ruvnet/ruv-drone/projects" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-table" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path></svg></span><span data-component="text" data-content="Projects">Projects</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="security-and-quality" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/ruvnet/ruv-drone/security" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-shield" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg></span><span data-component="text" data-content="Security and quality">Security and quality</span></a></li><li class="prc-UnderlineNav-UnderlineNavItem-syRjR"><a data-tab-item="insights" data-turbo-frame="repo-content-turbo-frame" class="prc-components-UnderlineItem-7fP-n" href="/ruvnet/ruv-drone/pulse" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-graph" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg></span><span data-component="text" data-content="Insights">Insights</span></a></li></ul><div class="prc-UnderlineNav-MoreButtonContainer-Dnrq6"><div class="prc-UnderlineNav-MoreButtonDivider-dN0a-"></div><button data-component="overflow-menu-button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk prc-UnderlineNav-MoreButton-Y8soj" data-loading="false" data-size="medium" data-variant="invisible" id="_R_2ktp_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3"><span>More<span class="prc-src-InternalVisuallyHidden-2YaI6"> items</span></span></span></span><span data-component="trailingAction" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></button></div></nav><div class="d-none"></div></header></div>
</react-partial>


  



<turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class="">
    <div id="repo-content-pjax-container" class="repository-content " >
    



    
      
    








<react-app
  app-name="code-view"
  initial-path="/ruvnet/ruv-drone/blob/main/docs/security/latentmesh-threat-model.md"
  style="display: block; min-height: calc(100vh - 64px);"
  data-attempted-ssr="true"
  data-ssr="true"
  data-lazy="false"
  data-alternate="false"
  data-data-router-enabled="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-app.embeddedData">{"payload":{"codeViewBlobRoute":{"csv":null,"csvError":null,"headerInfo":{"toc":[{"level":1,"text":"LatentMesh communications threat model","anchor":"latentmesh-communications-threat-model","htmlText":"LatentMesh communications threat model"},{"level":2,"text":"Executive security decision","anchor":"executive-security-decision","htmlText":"Executive security decision"},{"level":2,"text":"Scope","anchor":"scope","htmlText":"Scope"},{"level":3,"text":"In scope","anchor":"in-scope","htmlText":"In scope"},{"level":3,"text":"Out of scope, but adjacent","anchor":"out-of-scope-but-adjacent","htmlText":"Out of scope, but adjacent"},{"level":2,"text":"System model","anchor":"system-model","htmlText":"System model"},{"level":3,"text":"Data-flow and trust boundaries","anchor":"data-flow-and-trust-boundaries","htmlText":"Data-flow and trust boundaries"},{"level":3,"text":"Assets","anchor":"assets","htmlText":"Assets"},{"level":3,"text":"Threat actors","anchor":"threat-actors","htmlText":"Threat actors"},{"level":2,"text":"Security invariants","anchor":"security-invariants","htmlText":"Security invariants"},{"level":2,"text":"Risk method","anchor":"risk-method","htmlText":"Risk method"},{"level":2,"text":"STRIDE analysis","anchor":"stride-analysis","htmlText":"STRIDE analysis"},{"level":3,"text":"Spoofing","anchor":"spoofing","htmlText":"Spoofing"},{"level":3,"text":"Tampering","anchor":"tampering","htmlText":"Tampering"},{"level":3,"text":"Repudiation","anchor":"repudiation","htmlText":"Repudiation"},{"level":3,"text":"Information disclosure","anchor":"information-disclosure","htmlText":"Information disclosure"},{"level":3,"text":"Denial of service","anchor":"denial-of-service","htmlText":"Denial of service"},{"level":3,"text":"Elevation of privilege","anchor":"elevation-of-privilege","htmlText":"Elevation of privilege"},{"level":2,"text":"Abuse-case walk-throughs","anchor":"abuse-case-walk-throughs","htmlText":"Abuse-case walk-throughs"},{"level":3,"text":"Valid key, malicious velocity command","anchor":"valid-key-malicious-velocity-command","htmlText":"Valid key, malicious velocity command"},{"level":3,"text":"Cross-peer fragment splice","anchor":"cross-peer-fragment-splice","htmlText":"Cross-peer fragment splice"},{"level":3,"text":"Replay after receiver restart","anchor":"replay-after-receiver-restart","htmlText":"Replay after receiver restart"},{"level":3,"text":"Link loss during a cooperative mission","anchor":"link-loss-during-a-cooperative-mission","htmlText":"Link loss during a cooperative mission"},{"level":2,"text":"Required security controls by layer","anchor":"required-security-controls-by-layer","htmlText":"Required security controls by layer"},{"level":2,"text":"Key management requirements","anchor":"key-management-requirements","htmlText":"Key management requirements"},{"level":2,"text":"Privacy and data retention","anchor":"privacy-and-data-retention","htmlText":"Privacy and data retention"},{"level":2,"text":"Security test and release gates","anchor":"security-test-and-release-gates","htmlText":"Security test and release gates"},{"level":2,"text":"Rollback and incident response","anchor":"rollback-and-incident-response","htmlText":"Rollback and incident response"},{"level":2,"text":"Known gaps and residual-risk register","anchor":"known-gaps-and-residual-risk-register","htmlText":"Known gaps and residual-risk register"},{"level":2,"text":"Requirements trace","anchor":"requirements-trace","htmlText":"Requirements trace"},{"level":2,"text":"Source provenance","anchor":"source-provenance","htmlText":"Source provenance"}]},"issueTemplate":null,"discussionTemplate":null,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLatentMesh communications threat model\u003c/h1\u003e\u003ca id=\"user-content-latentmesh-communications-threat-model\" class=\"anchor\" aria-label=\"Permalink: LatentMesh communications threat model\" href=\"#latentmesh-communications-threat-model\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e\u003c/th\u003e\n\u003cth\u003e\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSystem\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eruv-drone\u003c/code\u003e LatentMesh communications and advisory orchestration plane\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eMethod\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eSTRIDE plus aviation authority-boundary analysis\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eDate\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e2026-09-01\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eBaseline\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eruv-drone@cfe8b662bd648e9ea19a4047275dfce2c5c8e699\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eLatentMesh source\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eruvnet/LatentMesh@1ff7332c17798eec3b42da5c6f1c271f355fa806\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eArchitecture\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca href=\"/ruvnet/ruv-drone/blob/main/docs/adr/ADR-173-latentmesh-comms-orchestration.md\"\u003eADR-173\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExecutive security decision\u003c/h2\u003e\u003ca id=\"user-content-executive-security-decision\" class=\"anchor\" aria-label=\"Permalink: Executive security decision\" href=\"#executive-security-decision\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLatentMesh is permitted to carry authenticated deterministic observations and\nbounded advisory orchestration facts. It is prohibited from all actuator,\narming, flight-mode, attitude, velocity-command, geofence, collision-avoidance,\nand onboard fail-safe authority paths.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis is the primary risk control. Cryptography authenticates who made a claim;\nit does not make the claim safe, current, accurate, or authorized. Every valid\nmessage remains untrusted for flight authority. The receiver writes only to a\nshort-lived advisory store whose type and module dependencies expose no flight\ncommand interface.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe release is blocked if any LatentMesh input can call a \u003ccode\u003eFlightController\u003c/code\u003e,\nmutate local \u003ccode\u003eMeshTopology\u003c/code\u003e used for safety distance, alter \u003ccode\u003eGeofence\u003c/code\u003e, drive a\nlocal \u003ccode\u003eFailSafeMachine\u003c/code\u003e, or create an unmanifested mission action.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eScope\u003c/h2\u003e\u003ca id=\"user-content-scope\" class=\"anchor\" aria-label=\"Permalink: Scope\" href=\"#scope\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eIn scope\u003c/h3\u003e\u003ca id=\"user-content-in-scope\" class=\"anchor\" aria-label=\"Permalink: In scope\" href=\"#in-scope\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eOptional \u003ccode\u003elatentmesh-air-core\u003c/code\u003e dependency and the local state, publisher,\nverifier, reassembly, replay, freshness, advisory-store, and policy adapters.\u003c/li\u003e\n\u003cli\u003eWiFi, BLE, and Meshtastic Air profiles from byte ingress to advisory-state\nexpiry.\u003c/li\u003e\n\u003cli\u003eEd25519 identity, peer enrollment, rotation, revocation, sequence state, and\nconfiguration used by the integration.\u003c/li\u003e\n\u003cli\u003eAvailability, integrity, privacy, observability, update, rollout, and\nrollback risks on a companion computer.\u003c/li\u003e\n\u003cli\u003eThe boundary to existing orchestration, topology, local safety, and autopilot\nintegration.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOut of scope, but adjacent\u003c/h3\u003e\u003ca id=\"user-content-out-of-scope-but-adjacent\" class=\"anchor\" aria-label=\"Permalink: Out of scope, but adjacent\" href=\"#out-of-scope-but-adjacent\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRadio firmware, RF jamming prevention, WiFi/BLE/Meshtastic link-layer keying,\nautopilot firmware internals, physical capture, ground-station account\nsecurity, operating-system hardening, and national radio/export compliance are\nowned by their respective deployment controls. They are considered external\ndependencies in abuse cases, not silently assumed secure.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNo live network probing, RF transmission, credential test, or production scan\nwas performed for this document. This is a source-backed architecture threat\nmodel, not a penetration-test report or aviation certification artifact.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSystem model\u003c/h2\u003e\u003ca id=\"user-content-system-model\" class=\"anchor\" aria-label=\"Permalink: System model\" href=\"#system-model\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eData-flow and trust boundaries\u003c/h3\u003e\u003ca id=\"user-content-data-flow-and-trust-boundaries\" class=\"anchor\" aria-label=\"Permalink: Data-flow and trust boundaries\" href=\"#data-flow-and-trust-boundaries\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003csection class=\"js-render-needs-enrichment render-needs-enrichment position-relative\" data-identity=\"60b1c412-ac3c-4b83-a750-6c494bbc5617\" data-host=\"https://viewscreen.githubusercontent.com\" data-src=\"https://viewscreen.githubusercontent.com/markdown/mermaid?docs_host=https%3A%2F%2Fdocs.github.com\" data-type=\"mermaid\" aria-label=\"mermaid rendered output container\"\u003e\n  \u003cdiv class=\"js-render-enrichment-target\" data-json=\"{\u0026quot;data\u0026quot;:\u0026quot;flowchart TB\\n    P[\\\u0026quot;Remote peer\\\u0026quot;] --\u0026gt;|\\\u0026quot;hostile frames\\\u0026quot;| T[\\\u0026quot;Transport adapter\\\u0026quot;]\\n    T --\u0026gt;|\\\u0026quot;TB1: expected source and bytes\\\u0026quot;| R[\\\u0026quot;Bounded per-source reassembly\\\u0026quot;]\\n    R --\u0026gt;|\\\u0026quot;TB2: complete untrusted envelope\\\u0026quot;| V[\\\u0026quot;Signature and semantic admission\\\u0026quot;]\\n    V --\u0026gt;|\\\u0026quot;TB3: authenticated advisory state\\\u0026quot;| A[\\\u0026quot;TTL advisory store\\\u0026quot;]\\n    A --\u0026gt;|\\\u0026quot;TB4: reduced authority facts\\\u0026quot;| O[\\\u0026quot;Local mission policy\\\u0026quot;]\\n    F[\\\u0026quot;Flight and safety interfaces remain separate\\\u0026quot;]\\n\u0026quot;}\" data-plain=\"flowchart TB\n    P[\u0026quot;Remote peer\u0026quot;] --\u0026gt;|\u0026quot;hostile frames\u0026quot;| T[\u0026quot;Transport adapter\u0026quot;]\n    T --\u0026gt;|\u0026quot;TB1: expected source and bytes\u0026quot;| R[\u0026quot;Bounded per-source reassembly\u0026quot;]\n    R --\u0026gt;|\u0026quot;TB2: complete untrusted envelope\u0026quot;| V[\u0026quot;Signature and semantic admission\u0026quot;]\n    V --\u0026gt;|\u0026quot;TB3: authenticated advisory state\u0026quot;| A[\u0026quot;TTL advisory store\u0026quot;]\n    A --\u0026gt;|\u0026quot;TB4: reduced authority facts\u0026quot;| O[\u0026quot;Local mission policy\u0026quot;]\n    F[\u0026quot;Flight and safety interfaces remain separate\u0026quot;]\n\" dir=\"auto\"\u003e\n    \u003cdiv class=\"render-plaintext-hidden\" dir=\"auto\"\u003e\n      \u003cpre lang=\"mermaid\" aria-label=\"Raw mermaid code\"\u003eflowchart TB\n    P[\"Remote peer\"] --\u0026gt;|\"hostile frames\"| T[\"Transport adapter\"]\n    T --\u0026gt;|\"TB1: expected source and bytes\"| R[\"Bounded per-source reassembly\"]\n    R --\u0026gt;|\"TB2: complete untrusted envelope\"| V[\"Signature and semantic admission\"]\n    V --\u0026gt;|\"TB3: authenticated advisory state\"| A[\"TTL advisory store\"]\n    A --\u0026gt;|\"TB4: reduced authority facts\"| O[\"Local mission policy\"]\n    F[\"Flight and safety interfaces remain separate\"]\n\u003c/pre\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n  \u003cspan class=\"js-render-enrichment-loader d-flex flex-justify-center flex-items-center width-full\" style=\"min-height:100px\" role=\"presentation\"\u003e\n    \u003cspan data-view-component=\"true\"\u003e\n  \u003csvg style=\"box-sizing: content-box; color: var(--color-icon-primary);\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" data-view-component=\"true\" class=\"octospinner mx-auto tmp-mx-auto anim-rotate\"\u003e\n    \u003ccircle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" stroke-opacity=\"0.25\" stroke-width=\"2\" vector-effect=\"non-scaling-stroke\" fill=\"none\"\u003e\u003c/circle\u003e\n    \u003cpath d=\"M15 8a7.002 7.002 0 00-7-7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" vector-effect=\"non-scaling-stroke\"\u003e\u003c/path\u003e\n\u003c/svg\u003e    \u003cspan class=\"sr-only\"\u003eLoading\u003c/span\u003e\n\u003c/span\u003e\n  \u003c/span\u003e\n\u003c/section\u003e\n\n\u003cp dir=\"auto\"\u003eTB0, not shown, is the operator/configuration boundary around key material,\npeer/endpoint enrollment, deployment lifecycle, limits, checkpoint persistence,\nand optional audit export. TB1 data is wholly\nhostile. TB2 has passed fixed frame CRC and reassembly but has not passed\nauthentication. TB3 is authenticated and schema-valid but still advisory.\nTB4 permits only locally manifest-bounded orchestration. The flight and safety\nboundary is not crossed.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAssets\u003c/h3\u003e\u003ca id=\"user-content-assets\" class=\"anchor\" aria-label=\"Permalink: Assets\" href=\"#assets\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eAsset\u003c/th\u003e\n\u003cth\u003eRequired property\u003c/th\u003e\n\u003cth\u003eClassification\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eLocal flight and safety authority\u003c/td\u003e\n\u003ctd\u003eNever influenced directly by LatentMesh\u003c/td\u003e\n\u003ctd\u003eSafety authoritative\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAdvisory peer state\u003c/td\u003e\n\u003ctd\u003eAuthentic source, exact symbolic integrity, fresh, bounded\u003c/td\u003e\n\u003ctd\u003eOperational sensitive\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMission manifest and policy\u003c/td\u003e\n\u003ctd\u003eLocal-only integrity and controlled change\u003c/td\u003e\n\u003ctd\u003eSafety related configuration\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSigning private key\u003c/td\u003e\n\u003ctd\u003eConfidential, non-exportable where available, rotatable\u003c/td\u003e\n\u003ctd\u003eSecret\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePeer key registry and replay high-water marks\u003c/td\u003e\n\u003ctd\u003eIntegrity, availability, durable across restart\u003c/td\u003e\n\u003ctd\u003eSecurity state\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLocation, heading, altitude, task and link metadata\u003c/td\u003e\n\u003ctd\u003eConfidentiality and retention minimization\u003c/td\u003e\n\u003ctd\u003eOperational sensitive\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eParser/reassembler resources\u003c/td\u003e\n\u003ctd\u003eBounded memory, CPU, contexts, and time\u003c/td\u003e\n\u003ctd\u003eAvailability critical\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDecision receipts and metrics\u003c/td\u003e\n\u003ctd\u003eComplete enough for incident response, no sensitive payload\u003c/td\u003e\n\u003ctd\u003eInternal audit\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDependency and schema identity\u003c/td\u003e\n\u003ctd\u003eExact provenance and compatibility\u003c/td\u003e\n\u003ctd\u003eSupply-chain control\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eThreat actors\u003c/h3\u003e\u003ca id=\"user-content-threat-actors\" class=\"anchor\" aria-label=\"Permalink: Threat actors\" href=\"#threat-actors\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eAn unauthenticated remote transmitter able to inject, replay, reorder, delay,\ntruncate, or flood link traffic.\u003c/li\u003e\n\u003cli\u003eA passive observer able to collect packets and traffic patterns.\u003c/li\u003e\n\u003cli\u003eA compromised enrolled peer holding a valid signing key and able to lie\nabout its own state.\u003c/li\u003e\n\u003cli\u003eAn operator or local process with configuration access but no intended\nauthority to change flight behavior.\u003c/li\u003e\n\u003cli\u003eA compromised transport adapter, companion-computer process, dependency, CI\njob, or artifact source.\u003c/li\u003e\n\u003cli\u003eNonmalicious radio corruption, clock drift, restart, packet loss, duplicate\ndelivery, schema mismatch, and resource exhaustion.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSecurity invariants\u003c/h2\u003e\u003ca id=\"user-content-security-invariants\" class=\"anchor\" aria-label=\"Permalink: Security invariants\" href=\"#security-invariants\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eID\u003c/th\u003e\n\u003cth\u003eInvariant\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eSI-01\u003c/td\u003e\n\u003ctd\u003eLatentMesh types and modules cannot access actuator, arming, mode, attitude, velocity-command, geofence, collision-avoidance, or local fail-safe mutation interfaces.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSI-02\u003c/td\u003e\n\u003ctd\u003eEvery production envelope is signed and strictly verified against an enrolled source/profile binding. Secure transport alone is insufficient.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSI-03\u003c/td\u003e\n\u003ctd\u003eBounds and CRC are checked before proportional allocation; a hard source cap, per-source contexts/rate, and adapter budgets bound work before signature verification.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSI-04\u003c/td\u003e\n\u003ctd\u003eReplay state commits only after full reassembly and all authentication, binding, freshness, schema, range, and hash checks succeed.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSI-05\u003c/td\u003e\n\u003ctd\u003eCritical state uses canonical deterministic symbols and exact base/result hashes. Unknown, partial, wrong-type, nonfinite, and out-of-range state fails closed.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSI-06\u003c/td\u003e\n\u003ctd\u003eA state envelope containing any learned residual is rejected in full without snapshot or replay change. Residual values never enter orchestration or safety.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSI-07\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eSemanticClass::Control\u003c/code\u003e is forbidden even when signed. Message priority changes scheduling only within resource limits; it never changes authority.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSI-08\u003c/td\u003e\n\u003ctd\u003ePeer-reported battery, link, position, velocity, and fail-safe values can only reduce remote peer eligibility or support observability. They cannot expand local authority.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSI-09\u003c/td\u003e\n\u003ctd\u003eMissing key, verifier, baseline, time health, schema, endpoint enrollment, or replay checkpoint reduces capability. It never enables a permissive mode.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSI-10\u003c/td\u003e\n\u003ctd\u003eDisable and rollback are local operations, require no network, and preserve existing flight and safety behavior.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRisk method\u003c/h2\u003e\u003ca id=\"user-content-risk-method\" class=\"anchor\" aria-label=\"Permalink: Risk method\" href=\"#risk-method\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLikelihood and impact are ordinal estimates from 1 to 5. The pre-control score\nis \u003ccode\u003elikelihood * impact\u003c/code\u003e: 1 to 4 low, 5 to 9 moderate, 10 to 14 high, and 15 to\n25 critical. Residual ratings assume all named controls and tests are present.\nA critical or high residual risk blocks release unless an authorized maintainer\nrecords an owner, compensating control, and deadline.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSTRIDE analysis\u003c/h2\u003e\u003ca id=\"user-content-stride-analysis\" class=\"anchor\" aria-label=\"Permalink: STRIDE analysis\" href=\"#stride-analysis\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSpoofing\u003c/h3\u003e\u003ca id=\"user-content-spoofing\" class=\"anchor\" aria-label=\"Permalink: Spoofing\" href=\"#spoofing\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eID\u003c/th\u003e\n\u003cth\u003eScenario\u003c/th\u003e\n\u003cth align=\"right\"\u003ePre-control\u003c/th\u003e\n\u003cth\u003eRequired controls\u003c/th\u003e\n\u003cth align=\"right\"\u003eResidual\u003c/th\u003e\n\u003cth\u003eVerification / owner\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eS-01\u003c/td\u003e\n\u003ctd\u003eUnenrolled sender forges a peer state or uses another source ID.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 5 = 20\u003c/td\u003e\n\u003ctd\u003eMandatory Ed25519 signature, strict verification, source ID to key binding, no default trust key.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 5 = 5\u003c/td\u003e\n\u003ctd\u003eWrong, absent, random, and altered signatures reject before replay commit. Security owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eS-02\u003c/td\u003e\n\u003ctd\u003eSender changes transport identity or profile to evade per-source policy.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 4 = 12\u003c/td\u003e\n\u003ctd\u003eBind deployment endpoint to expected source, fix the Air profile per receiver, then bind signed source to its key after reassembly; retain aggregate source/rate caps.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 4 = 4\u003c/td\u003e\n\u003ctd\u003eCross-profile and expected-source mismatch tests. Comms owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eS-03\u003c/td\u003e\n\u003ctd\u003eAttacker races a local key cutover or reuses a revoked key.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 5 = 15\u003c/td\u003e\n\u003ctd\u003eOne active built-in key per source, rebuild from replay checkpoint on replacement/removal or use an atomic external lookup, no remote rotation API.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2 x 5 = 10\u003c/td\u003e\n\u003ctd\u003eRotation/revocation integration test and operator runbook. Security owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eS-04\u003c/td\u003e\n\u003ctd\u003eLink encryption is mistaken for sender authentication.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 5 = 15\u003c/td\u003e\n\u003ctd\u003eEnvelope signature remains mandatory on WiFi, BLE, and Meshtastic; channel PSK is defense in depth only.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 5 = 5\u003c/td\u003e\n\u003ctd\u003eSigned-envelope gate tested on every profile. Security owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eS-03 remains high until production key rotation and revocation are exercised on\nthe target deployment. It is a release blocker for fleet advisory mode, though\nnot for loopback or shadow mode with fixture identities.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTampering\u003c/h3\u003e\u003ca id=\"user-content-tampering\" class=\"anchor\" aria-label=\"Permalink: Tampering\" href=\"#tampering\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eID\u003c/th\u003e\n\u003cth\u003eScenario\u003c/th\u003e\n\u003cth align=\"right\"\u003ePre-control\u003c/th\u003e\n\u003cth\u003eRequired controls\u003c/th\u003e\n\u003cth align=\"right\"\u003eResidual\u003c/th\u003e\n\u003cth\u003eVerification / owner\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eT-01\u003c/td\u003e\n\u003ctd\u003eBits, header lengths, class, priority, state tag, or body change in transit.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 4 = 16\u003c/td\u003e\n\u003ctd\u003eFixed bounds, CRC32C for corruption, signed canonical envelope for authenticity, outer/body binding.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 4 = 4\u003c/td\u003e\n\u003ctd\u003eMutation corpus across every byte range. Protocol owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eT-02\u003c/td\u003e\n\u003ctd\u003eFragments from different peers/messages are spliced into one envelope.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 4 = 16\u003c/td\u003e\n\u003ctd\u003eSeparate reassembler per enrolled peer; context metadata consistency; conflicting duplicate rejection; signature after full reassembly.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 4 = 4\u003c/td\u003e\n\u003ctd\u003eCross-peer, out-of-order, duplicate, and conflicting-fragment tests. Protocol owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eT-03\u003c/td\u003e\n\u003ctd\u003eValid envelope contains wrong base hash, result hash, duplicate field, unknown field, or noncanonical order.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 4 = 12\u003c/td\u003e\n\u003ctd\u003eCanonical LMAD decode, exact base/result application, complete local schema, unknown-field rejection.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 4 = 4\u003c/td\u003e\n\u003ctd\u003eHash/schema negative tests. State owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eT-04\u003c/td\u003e\n\u003ctd\u003eCompromised enrolled peer signs false but well-formed telemetry.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 4 = 16\u003c/td\u003e\n\u003ctd\u003eAdvisory-only type, source-scoped effect, plausible ranges, local observations dominate, task eligibility can decrease only, revocation.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 3 = 9\u003c/td\u003e\n\u003ctd\u003eByzantine peer scenario; compare no flight/safety calls. Mission-policy owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eT-05\u003c/td\u003e\n\u003ctd\u003eDependency, lockfile, schema field ID, or golden vector drifts.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 5 = 15\u003c/td\u003e\n\u003ctd\u003eExact git revision, reviewed lockfile, immutable field IDs, upstream golden vectors, dependency and license scan.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 5 = 5\u003c/td\u003e\n\u003ctd\u003eMetadata pin check, golden-vector test, diff review. Release owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eT-06\u003c/td\u003e\n\u003ctd\u003eLocal runtime config is altered to raise limits, accept unsigned state, or enable control.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 5 = 15\u003c/td\u003e\n\u003ctd\u003eNo unsigned option in production type, local file permissions, bounded hard caps, immutable forbidden classes, config provenance audit.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2 x 5 = 10\u003c/td\u003e\n\u003ctd\u003eNegative config tests and deployment permission check. Platform owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eT-04 is fundamental: signatures establish provenance, not truth. T-06 remains\nhigh until the deployment supplies a protected configuration source and an\naudited change path.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRepudiation\u003c/h3\u003e\u003ca id=\"user-content-repudiation\" class=\"anchor\" aria-label=\"Permalink: Repudiation\" href=\"#repudiation\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eID\u003c/th\u003e\n\u003cth\u003eScenario\u003c/th\u003e\n\u003cth align=\"right\"\u003ePre-control\u003c/th\u003e\n\u003cth\u003eRequired controls\u003c/th\u003e\n\u003cth align=\"right\"\u003eResidual\u003c/th\u003e\n\u003cth\u003eVerification / owner\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eR-01\u003c/td\u003e\n\u003ctd\u003ePeer or operator denies a message or admission decision.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 3 = 9\u003c/td\u003e\n\u003ctd\u003eRecord key fingerprint, signed state hash, epoch, sequence, profile, decision, time bucket, and code/config identity; optional append-only export.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2 x 3 = 6\u003c/td\u003e\n\u003ctd\u003eReceipt field and redaction test. Operations owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eR-02\u003c/td\u003e\n\u003ctd\u003eAudit evidence is altered or gaps are hidden during overload.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 4 = 12\u003c/td\u003e\n\u003ctd\u003eMonotonic counters, bounded local queue, explicit dropped-audit counter, remote append-only sink where required, synchronized clock health.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2 x 4 = 8\u003c/td\u003e\n\u003ctd\u003eSaturation test and sink integrity review. Operations owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eReceipts deliberately omit the raw payload. A dispute that requires content\nreconstruction needs a separately authorized flight/mission recorder with its\nown retention and privacy controls.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInformation disclosure\u003c/h3\u003e\u003ca id=\"user-content-information-disclosure\" class=\"anchor\" aria-label=\"Permalink: Information disclosure\" href=\"#information-disclosure\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eID\u003c/th\u003e\n\u003cth\u003eScenario\u003c/th\u003e\n\u003cth align=\"right\"\u003ePre-control\u003c/th\u003e\n\u003cth\u003eRequired controls\u003c/th\u003e\n\u003cth align=\"right\"\u003eResidual\u003c/th\u003e\n\u003cth\u003eVerification / owner\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eI-01\u003c/td\u003e\n\u003ctd\u003ePassive observer learns location, altitude, movement, mission activity, or fleet membership.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 4 = 16\u003c/td\u003e\n\u003ctd\u003eUse transport encryption where legal and available, minimize fields/rate, pseudonymous rotating transport identifiers, profile-specific policy.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 4 = 12\u003c/td\u003e\n\u003ctd\u003ePacket-capture review on deployment transport. Privacy owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eI-02\u003c/td\u003e\n\u003ctd\u003eLogs or metrics expose coordinates, payloads, source IDs, signatures, or keys.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 5 = 15\u003c/td\u003e\n\u003ctd\u003eAllowlisted structured fields, bounded labels, no raw payload, secret scanner, redaction tests.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 5 = 5\u003c/td\u003e\n\u003ctd\u003eObservability privacy acceptance test. Operations owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eI-03\u003c/td\u003e\n\u003ctd\u003eTraffic size and timing reveal task events even when encrypted.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 3 = 12\u003c/td\u003e\n\u003ctd\u003eRate shaping where airtime permits, fixed scheduling classes, batching, no claim that signatures hide metadata.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 3 = 9\u003c/td\u003e\n\u003ctd\u003eTraffic-analysis exercise. Privacy/comms owners.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eI-04\u003c/td\u003e\n\u003ctd\u003eCrash dump or swap captures private signing material.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2 x 5 = 10\u003c/td\u003e\n\u003ctd\u003eInjected key provider, non-exportable hardware key where available, zeroization, core-dump policy, least-privilege process.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2 x 5 = 10\u003c/td\u003e\n\u003ctd\u003ePlatform key-storage review. Security owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eI-01 is the largest unmitigated privacy risk because LatentMesh Air provides\nauthentication but intentionally does not provide protocol-core encryption.\nFleet advisory deployment requires an explicit transport-confidentiality or\ndocumented data-minimization decision.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDenial of service\u003c/h3\u003e\u003ca id=\"user-content-denial-of-service\" class=\"anchor\" aria-label=\"Permalink: Denial of service\" href=\"#denial-of-service\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eID\u003c/th\u003e\n\u003cth\u003eScenario\u003c/th\u003e\n\u003cth align=\"right\"\u003ePre-control\u003c/th\u003e\n\u003cth\u003eRequired controls\u003c/th\u003e\n\u003cth align=\"right\"\u003eResidual\u003c/th\u003e\n\u003cth\u003eVerification / owner\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eD-01\u003c/td\u003e\n\u003ctd\u003eOversized, truncated, pathological length, count, or version consumes memory or panics.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e5 x 4 = 20\u003c/td\u003e\n\u003ctd\u003eFixed bounds before allocation, checked arithmetic, 4,096-byte local message cap, fuzzing, no unsafe code in adapter.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 4 = 4\u003c/td\u003e\n\u003ctd\u003eLength 0 through 8,192 and count 0 through 255 corpus plus fuzzer. Protocol owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eD-02\u003c/td\u003e\n\u003ctd\u003eFragment flood fills all contexts before signature can be checked.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e5 x 4 = 20\u003c/td\u003e\n\u003ctd\u003eFour contexts per source, 32 default sources, 512 KiB default payload ceiling, 256 hard source cap, per-source fixed-window rate, and deterministic absolute expiry.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2 x 4 = 8\u003c/td\u003e\n\u003ctd\u003ePeak-allocation and context saturation test. Comms owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eD-03\u003c/td\u003e\n\u003ctd\u003eAttackers force expensive Ed25519 checks or semantic hashing.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 3 = 12\u003c/td\u003e\n\u003ctd\u003eCheap frame/profile/source/rate checks first, 4,096-byte complete-envelope cap, aggregate bound from source and rate caps, transport backpressure.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2 x 3 = 6\u003c/td\u003e\n\u003ctd\u003eSignature-flood benchmark and backpressure test. Security owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eD-04\u003c/td\u003e\n\u003ctd\u003eReplay, exact duplicates, or reordered fragments amplify work.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e5 x 3 = 15\u003c/td\u003e\n\u003ctd\u003eIdempotent exact in-flight duplicate, bounded reassembly, replay classify/commit only after full verified admission, adapter-level endpoint blocking when abused.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 3 = 3\u003c/td\u003e\n\u003ctd\u003eReplay ordering acceptance test. Protocol owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eD-05\u003c/td\u003e\n\u003ctd\u003eSlow-fragment attack retains contexts for a long locally configured Meshtastic timeout.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 3 = 12\u003c/td\u003e\n\u003ctd\u003eAdapter airtime/byte budget, per-source context cap, absolute first-fragment deadline, reject new contexts when full.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e2 x 3 = 6\u003c/td\u003e\n\u003ctd\u003eFake-clock slow-fragment test. Comms owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eD-06\u003c/td\u003e\n\u003ctd\u003eRF jamming, link outage, adapter crash, or duty-cycle exhaustion removes advisory data.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 3 = 12\u003c/td\u003e\n\u003ctd\u003eNo safety dependence, snapshot TTL, local autonomous behavior, health alert, adapter restart, local disable.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 3 = 3\u003c/td\u003e\n\u003ctd\u003eLink-cut and process-restart scenario. Flight-test owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eD-07\u003c/td\u003e\n\u003ctd\u003ePeer-controlled metric values create cardinality or logging exhaustion.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 3 = 12\u003c/td\u003e\n\u003ctd\u003eBuilt-in metrics retain only fixed aggregate counters; any deployment exporter forbids peer/message labels and bounds optional audit output.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 3 = 3\u003c/td\u003e\n\u003ctd\u003eMetrics/debug redaction test and exporter review. Operations owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eFragment authentication cannot occur until the signed envelope is complete.\nConsequently D-02 controls are mandatory even with perfect signatures. A\ndeployment endpoint binding is not trusted enough to replace aggregate bounds.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eElevation of privilege\u003c/h3\u003e\u003ca id=\"user-content-elevation-of-privilege\" class=\"anchor\" aria-label=\"Permalink: Elevation of privilege\" href=\"#elevation-of-privilege\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eID\u003c/th\u003e\n\u003cth\u003eScenario\u003c/th\u003e\n\u003cth align=\"right\"\u003ePre-control\u003c/th\u003e\n\u003cth\u003eRequired controls\u003c/th\u003e\n\u003cth align=\"right\"\u003eResidual\u003c/th\u003e\n\u003cth\u003eVerification / owner\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eE-01\u003c/td\u003e\n\u003ctd\u003eSigned \u003ccode\u003eControl\u003c/code\u003e or high-priority message reaches a command path.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 5 = 20\u003c/td\u003e\n\u003ctd\u003eReject Control unconditionally; priority affects bounded scheduling only; no command-capable field schema.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 5 = 5\u003c/td\u003e\n\u003ctd\u003eSigned-Control zero-call test. Architecture owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eE-02\u003c/td\u003e\n\u003ctd\u003eA \u003ccode\u003eVerifiedAdvisory\u003c/code\u003e is inserted into authoritative \u003ccode\u003epeer_states\u003c/code\u003e and influences collision or fail-safe logic.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 5 = 20\u003c/td\u003e\n\u003ctd\u003ePrivate-construction wrapper and trust fields, read-only public accessors, separate \u003ccode\u003elatentmesh_advisories\u003c/code\u003e map, reduce-only predicate, no mutable topology/safety handle.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 5 = 5\u003c/td\u003e\n\u003ctd\u003eOrchestrator separation and unchanged-local-safety test. Architecture owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eE-03\u003c/td\u003e\n\u003ctd\u003ePosition, velocity, heading, altitude, or peer fail-safe observation is reinterpreted as a local setpoint/state.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 5 = 20\u003c/td\u003e\n\u003ctd\u003eField-consumer allowlist, observability-only projection, no ROS 2/uXRCE-DDS/MAVLink publisher in LatentMesh module.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 5 = 5\u003c/td\u003e\n\u003ctd\u003eDependency grep plus integration mock. Flight-safety owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eE-04\u003c/td\u003e\n\u003ctd\u003eLearned residual, confidence, or neural output creates or modifies a critical symbol or task.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 5 = 15\u003c/td\u003e\n\u003ctd\u003eReject the whole residual-bearing state envelope; scheduler evidence can yield only an \u003ccode\u003eObserve\u003c/code\u003e delivery treatment and has no decoder/state consumer; suppression metric only.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 5 = 5\u003c/td\u003e\n\u003ctd\u003eMaximal residual rejects with no snapshot/replay change; evidence-gate tests. State owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eE-05\u003c/td\u003e\n\u003ctd\u003eOld epoch, receiver restart, sequence wrap, or clock failure restores stale influence.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e4 x 4 = 16\u003c/td\u003e\n\u003ctd\u003eDeployment-persisted \u003ccode\u003eReplayCheckpoint\u003c/code\u003e, logical high-water, 16-bit per-source/epoch replay window, age/skew checks, mandatory newer keyframe after restore.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 4 = 4\u003c/td\u003e\n\u003ctd\u003eRestart, wrap, old/new epoch, skew tests. Security owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eE-06\u003c/td\u003e\n\u003ctd\u003eCompromised peer invents task coordinates or a new mission objective.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 5 = 15\u003c/td\u003e\n\u003ctd\u003eDefault-empty local manifest allowlist; nonzero opaque ID; local-only approve/revoke; proposal contains only participant/TTL/effort bounds and no coordinates, setpoints, or executable body.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 5 = 5\u003c/td\u003e\n\u003ctd\u003eUnknown, zero, approved, and revoked manifest tests. Mission-policy owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eE-07\u003c/td\u003e\n\u003ctd\u003eRemote message enables the feature, changes keys/limits, unblocks an endpoint, or triggers rollback.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e3 x 5 = 15\u003c/td\u003e\n\u003ctd\u003eConfiguration is local-only and not represented in admitted Air schema; operator capability required.\u003c/td\u003e\n\u003ctd align=\"right\"\u003e1 x 5 = 5\u003c/td\u003e\n\u003ctd\u003eRemote-config negative corpus. Platform owner.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAbuse-case walk-throughs\u003c/h2\u003e\u003ca id=\"user-content-abuse-case-walk-throughs\" class=\"anchor\" aria-label=\"Permalink: Abuse-case walk-throughs\" href=\"#abuse-case-walk-throughs\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eValid key, malicious velocity command\u003c/h3\u003e\u003ca id=\"user-content-valid-key-malicious-velocity-command\" class=\"anchor\" aria-label=\"Permalink: Valid key, malicious velocity command\" href=\"#valid-key-malicious-velocity-command\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAn enrolled peer signs a syntactically valid message and sets class \u003ccode\u003eControl\u003c/code\u003e,\nmaximum priority, and bytes resembling an offboard velocity command. Frame\nbounds and reassembly may succeed. Signature verification proves only the\ncompromised peer created it. The forbidden-class gate rejects the message. It\ndoes not enter the advisory store, replay does not commit, and no flight or\nsafety interface is reachable. Repetition consumes only bounded per-source and\naggregate source/rate budgets.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCross-peer fragment splice\u003c/h3\u003e\u003ca id=\"user-content-cross-peer-fragment-splice\" class=\"anchor\" aria-label=\"Permalink: Cross-peer fragment splice\" href=\"#cross-peer-fragment-splice\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAn attacker sends fragment zero using peer A's transport identity and fragment\none using peer B's identity with the same stream and sequence. Separate\nper-expected-source reassemblers prevent combination. If a deployment misbinds\nendpoints and fragments do combine within one namespace, the complete LMS1\nsignature and source/key binding still fail. The configured source cap prevents\nattacker-chosen bindings from creating unbounded namespaces.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eReplay after receiver restart\u003c/h3\u003e\u003ca id=\"user-content-replay-after-receiver-restart\" class=\"anchor\" aria-label=\"Permalink: Replay after receiver restart\" href=\"#replay-after-receiver-restart\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAn attacker records a valid high-battery report and replays it after receiver\nrestart. The deployer restores the exported \u003ccode\u003e(source_id, sender epoch, logical sequence, timestamp)\u003c/code\u003e \u003ccode\u003eReplayCheckpoint\u003c/code\u003e, which rejects it even if the\nin-memory 16-bit frame window is empty and requires a later signed full\nkeyframe. If the durable store is unavailable or corrupt, release policy keeps\nadvisory admission for that peer disabled; constructing a fresh receiver would\notherwise accept a sequence-zero baseline. Flight safety does not degrade\nbecause the peer report was never a safety input.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLink loss during a cooperative mission\u003c/h3\u003e\u003ca id=\"user-content-link-loss-during-a-cooperative-mission\" class=\"anchor\" aria-label=\"Permalink: Link loss during a cooperative mission\" href=\"#link-loss-during-a-cooperative-mission\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNo valid peer update arrives before the profile TTL. The advisory snapshot\nexpires and orchestration removes the peer from new cooperative assignments or\nuses its existing non-LatentMesh behavior. Local autopilot, collision,\ngeofence, and fail-safe logic continue. A stale position is never held as a\ncollision-avoidance truth.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRequired security controls by layer\u003c/h2\u003e\u003ca id=\"user-content-required-security-controls-by-layer\" class=\"anchor\" aria-label=\"Permalink: Required security controls by layer\" href=\"#required-security-controls-by-layer\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eLayer\u003c/th\u003e\n\u003cth\u003ePreventive\u003c/th\u003e\n\u003cth\u003eDetective\u003c/th\u003e\n\u003cth\u003eRecovery\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eDependency/build\u003c/td\u003e\n\u003ctd\u003eExact commit, lockfile, feature off by default, reviewed schema IDs\u003c/td\u003e\n\u003ctd\u003eMetadata/golden-vector/dependency scan\u003c/td\u003e\n\u003ctd\u003eRevert dependency and lockfile\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKey/config\u003c/td\u003e\n\u003ctd\u003eLocal allowlist, strict verifier, file/hardware access controls, hard caps\u003c/td\u003e\n\u003ctd\u003eKey fingerprint/config identity receipts\u003c/td\u003e\n\u003ctd\u003eRevoke key, disable peer or feature\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTransport\u003c/td\u003e\n\u003ctd\u003eProfile and endpoint/source binding, bounded channel/UDP datagrams, adapter airtime budget\u003c/td\u003e\n\u003ctd\u003eAggregate frame/drop counters plus adapter health\u003c/td\u003e\n\u003ctd\u003eRestart adapter, change profile, disable transmit\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eParser/reassembly\u003c/td\u003e\n\u003ctd\u003eBounds before allocation, checked arithmetic, per-source contexts, absolute expiry\u003c/td\u003e\n\u003ctd\u003eFrame/envelope and aggregate reassembly counters\u003c/td\u003e\n\u003ctd\u003eDrop session to clear contexts; temporarily block endpoint\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSemantic admission\u003c/td\u003e\n\u003ctd\u003eSignature, source binding, class/schema/range/hash/freshness gates\u003c/td\u003e\n\u003ctd\u003eTyped errors and CRC/auth/replay/semantic counters\u003c/td\u003e\n\u003ctd\u003eWait for periodic baseline, replace local key/session, shadow mode\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAdvisory policy\u003c/td\u003e\n\u003ctd\u003ePrivate verified wrapper, distinct store, TTL, manifest and maximum-authority rule\u003c/td\u003e\n\u003ctd\u003eReduce-only integration test and advisory age\u003c/td\u003e\n\u003ctd\u003eClear store, disable consumer\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFlight boundary\u003c/td\u003e\n\u003ctd\u003eNo dependency edge or command publisher\u003c/td\u003e\n\u003ctd\u003eArchitecture check and flight-interface call counters in test\u003c/td\u003e\n\u003ctd\u003eBuild without feature; existing local fail-safe\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eKey management requirements\u003c/h2\u003e\u003ca id=\"user-content-key-management-requirements\" class=\"anchor\" aria-label=\"Permalink: Key management requirements\" href=\"#key-management-requirements\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eProduction has no embedded private key, all-zero key, shared fleet-wide key,\nor automatic trust-on-first-use.\u003c/li\u003e\n\u003cli\u003eSigning and verification keys are domain-separated from MAVLink, TLS,\nMeshtastic channel, and device-management keys.\u003c/li\u003e\n\u003cli\u003eDeployment configuration composes endpoint-to-source binding, the receiver's\nsingle allowed profile, key validity/revocation policy, and source enrollment.\nThe built-in \u003ccode\u003eTrustedPeerKeys\u003c/code\u003e value itself stores only source ID to one active\nEd25519 verification key.\u003c/li\u003e\n\u003cli\u003eA built-in registry cutover reconstructs the receive session from its durable\ncheckpoint after local replacement/removal; a dynamic external\n\u003ccode\u003eTrustedPeerKeyLookup\u003c/code\u003e can implement atomic rotation. Received metadata does\nnot retain a key fingerprint, key, or signature.\u003c/li\u003e\n\u003cli\u003eA revoked key cannot authorize a new sender epoch or baseline.\u003c/li\u003e\n\u003cli\u003eKey loss recovery uses an authenticated operator channel outside LatentMesh.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePrivacy and data retention\u003c/h2\u003e\u003ca id=\"user-content-privacy-and-data-retention\" class=\"anchor\" aria-label=\"Permalink: Privacy and data retention\" href=\"#privacy-and-data-retention\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRaw frames, signatures, residuals, exact coordinates, headings, and task data\nare not application logs. Accepted advisory snapshots live in memory only for\ntheir profile TTL unless a separately authorized mission recorder owns a copy.\nBuilt-in metrics are unlabeled fixed counters. If a deployment adds receipts,\nit may use a keyed or one-way digest of canonical authentication bytes and a\ncoarse time bucket so operators can correlate an incident without exposing the\nfull state; no such receipt store is part of the library implementation.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTransport confidentiality is a deployment decision. If it is absent, the\nprivacy owner must reduce the transmitted schema and frequency or formally\naccept exposure. Signatures do not provide confidentiality, unlinkability, or\ntraffic-flow privacy.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSecurity test and release gates\u003c/h2\u003e\u003ca id=\"user-content-security-test-and-release-gates\" class=\"anchor\" aria-label=\"Permalink: Security test and release gates\" href=\"#security-test-and-release-gates\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe authoritative procedures are AT-001 through AT-012 in\n\u003ca href=\"/ruvnet/ruv-drone/blob/main/docs/adr/ADR-173-latentmesh-comms-orchestration.md#acceptance-tests-and-requirements-trace\"\u003eADR-173\u003c/a\u003e.\nThe security subset must demonstrate all of the following:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eWrong, absent, altered, revoked, cross-source, and cross-profile signatures\nproduce no replay or advisory side effect.\u003c/li\u003e\n\u003cli\u003eReplay commits exactly once and only after complete verified admission.\u003c/li\u003e\n\u003cli\u003eEvery length, count, context, byte, time, and rate cap has a boundary test;\nthe parser and reassembler have malformed-input fuzz coverage.\u003c/li\u003e\n\u003cli\u003eUnknown, partial, wrong-type, nonfinite, out-of-range, stale, wrong-epoch,\nand hash-divergent symbolic state fails closed.\u003c/li\u003e\n\u003cli\u003eMaximum residual data causes a fail-closed rejection and cannot change a\nsnapshot or reach policy.\u003c/li\u003e\n\u003cli\u003eSigned Control and command-shaped data result in zero flight-controller\ncalls and no local geofence, topology, collision, or fail-safe mutation.\u003c/li\u003e\n\u003cli\u003eLink loss, adapter crash, runtime disable, and dependency rollback preserve\nthe existing default behavior.\u003c/li\u003e\n\u003cli\u003eNo secret, signature, payload, exact coordinate, or peer identity appears in\ncaptured metrics, debug output, or committed fixtures.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eBefore a hardware release, rerun the suite on the target architecture with\nsanitizer-equivalent memory checks where supported, dependency advisory scans,\nsecret scanning, and two-peer hardware-in-the-loop transport tests. Record\ntool versions, lockfile hash, advisory-feed time, firmware, radio profile,\nregional configuration, and raw aggregate results. A simulator or one-node\nloopback is not over-the-air evidence.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRollback and incident response\u003c/h2\u003e\u003ca id=\"user-content-rollback-and-incident-response\" class=\"anchor\" aria-label=\"Permalink: Rollback and incident response\" href=\"#rollback-and-incident-response\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhen an invariant fails:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eUse the deployment's local lifecycle control to stop and drop LatentMesh\npublisher, receiver, and adapter tasks.\u003c/li\u003e\n\u003cli\u003eClear incomplete reassembly and advisory snapshots. Do not modify local\nflight, geofence, collision, or fail-safe state.\u003c/li\u003e\n\u003cli\u003eRevoke the suspected peer/key locally and block the transport endpoint when\navailable.\u003c/li\u003e\n\u003cli\u003ePreserve redacted decision receipts, code/config identity, lockfile hash,\nrelevant aggregate metrics, and target firmware identity.\u003c/li\u003e\n\u003cli\u003eReproduce with fixture keys and no live RF. Add the smallest failing test.\u003c/li\u003e\n\u003cli\u003ePatch the smallest boundary, rerun the exact failing test and all ADR-173\nacceptance tests, then restart at shadow stage.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eDisabling LatentMesh must never request a flight-mode change. The onboard\nautopilot and existing local fail-safe decide what the vehicle does during link\nloss.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eKnown gaps and residual-risk register\u003c/h2\u003e\u003ca id=\"user-content-known-gaps-and-residual-risk-register\" class=\"anchor\" aria-label=\"Permalink: Known gaps and residual-risk register\" href=\"#known-gaps-and-residual-risk-register\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eGap\u003c/th\u003e\n\u003cth\u003eRisk\u003c/th\u003e\n\u003cth\u003eRequired disposition before fleet advisory\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eLatentMesh Air core authenticates complete envelopes, not individual fragments.\u003c/td\u003e\n\u003ctd\u003ePre-auth resource exhaustion\u003c/td\u003e\n\u003ctd\u003eKeep source/context/rate caps; add adapter airtime/byte budgets for constrained profiles; pass D-02/D-05 tests.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUpstream reassembler has no clock expiry; the local wrapper uses an absolute deadline from the first fragment, not a sliding progress deadline.\u003c/td\u003e\n\u003ctd\u003eSlow-fragment retention within configured timeout\u003c/td\u003e\n\u003ctd\u003eKeep profile timeout finite, clear expired contexts, and reject new contexts at the cap.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSignatures provide no confidentiality.\u003c/td\u003e\n\u003ctd\u003eLocation and mission disclosure\u003c/td\u003e\n\u003ctd\u003eEnable approved link encryption or document field/rate minimization and risk acceptance.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eA valid enrolled peer can lie.\u003c/td\u003e\n\u003ctd\u003eIncorrect availability or task progress\u003c/td\u003e\n\u003ctd\u003eAdvisory-only, source-scoped, reduce-only policy; local sensing dominates; rapid revocation.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eReplayCheckpoint\u003c/code\u003e persistence is deployer-provided and may be unavailable or corrupt.\u003c/td\u003e\n\u003ctd\u003eReplay after restart\u003c/td\u003e\n\u003ctd\u003eDo not start that peer's receive session without a valid checkpoint or explicit authenticated re-enrollment; require a later full keyframe.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBuilt-in metrics do not expose in-flight byte/context gauges or expiry-specific counters.\u003c/td\u003e\n\u003ctd\u003eReduced DoS diagnosis\u003c/td\u003e\n\u003ctd\u003eDerive aggregate bounds in tests and add bounded deployment instrumentation before fleet advisory if operational evidence requires it.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMeshtastic upstream evidence is real firmware with simulated radio.\u003c/td\u003e\n\u003ctd\u003eUnknown hardware latency/loss/interop\u003c/td\u003e\n\u003ctd\u003eTwo physical peers and regional-compliance evidence before hardware claim.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExact git revision reduces drift but does not prove dependency integrity.\u003c/td\u003e\n\u003ctd\u003eSupply-chain compromise\u003c/td\u003e\n\u003ctd\u003eReview commit, lockfile, checksums, advisories, license, and CI provenance on every update.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCompanion process compromise can bypass in-process type boundaries.\u003c/td\u003e\n\u003ctd\u003eLocal privilege escalation\u003c/td\u003e\n\u003ctd\u003eOS least privilege, separate service/account where deployment warrants it, no autopilot device access for LatentMesh adapter.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eThe largest uncertainty is deployment-time enforcement of the local process\nboundary. In-process Rust types prevent accidental coupling, not a hostile\nroot-level companion compromise. The strongest fix path is to run the\nLatentMesh adapter and advisory store as an unprivileged service without access\nto autopilot serial/UDP devices, uXRCE-DDS command topics, or flight-control\ncredentials, exposing a read-only bounded advisory API to \u003ccode\u003eruv-drone\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRequirements trace\u003c/h2\u003e\u003ca id=\"user-content-requirements-trace\" class=\"anchor\" aria-label=\"Permalink: Requirements trace\" href=\"#requirements-trace\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eThreat-model control\u003c/th\u003e\n\u003cth\u003eADR requirement and evidence\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFlight-authority exclusion\u003c/td\u003e\n\u003ctd\u003eLM-008, LM-009, LM-015; AT-010\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eExact dependency provenance\u003c/td\u003e\n\u003ctd\u003eLM-002; AT-002\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAuthentication and source binding\u003c/td\u003e\n\u003ctd\u003eLM-003; AT-004, AT-005\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBounded parsing/reassembly\u003c/td\u003e\n\u003ctd\u003eLM-004; AT-007, AT-011\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePost-reassembly replay/freshness\u003c/td\u003e\n\u003ctd\u003eLM-005, LM-011; AT-006, AT-008\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDeterministic schema and hashes\u003c/td\u003e\n\u003ctd\u003eLM-006; AT-004, AT-009\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLearned residual isolation\u003c/td\u003e\n\u003ctd\u003eLM-007; AT-009\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTransport separation\u003c/td\u003e\n\u003ctd\u003eLM-010; AT-004, AT-010\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePrivacy/data lifecycle\u003c/td\u003e\n\u003ctd\u003eLM-012; AT-011, AT-012\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eObservability\u003c/td\u003e\n\u003ctd\u003eLM-013; AT-012\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRollout/rollback\u003c/td\u003e\n\u003ctd\u003eLM-001, LM-014; AT-001, AT-011\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSource provenance\u003c/h2\u003e\u003ca id=\"user-content-source-provenance\" class=\"anchor\" aria-label=\"Permalink: Source provenance\" href=\"#source-provenance\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ePrimary local and immutable upstream sources inspected for this model:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"/ruvnet/ruv-drone/blob/main/src/integration/flight_controller.rs\"\u003e\u003ccode\u003eruv-drone\u003c/code\u003e flight-controller boundary\u003c/a\u003e,\n\u003ca href=\"/ruvnet/ruv-drone/blob/main/src/failsafe/mod.rs\"\u003elocal fail-safe\u003c/a\u003e,\n\u003ca href=\"/ruvnet/ruv-drone/blob/main/src/security/geofence.rs\"\u003egeofence\u003c/a\u003e, and\n\u003ca href=\"/ruvnet/ruv-drone/blob/main/src/topology/mesh.rs\"\u003etopology\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eLatentMesh exact commit\n\u003ca href=\"https://github.com/ruvnet/LatentMesh/commit/1ff7332c17798eec3b42da5c6f1c271f355fa806\"\u003e\u003ccode\u003e1ff7332c17798eec3b42da5c6f1c271f355fa806\u003c/code\u003e\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eUpstream \u003ca href=\"https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/SECURITY.md\"\u003esecurity policy\u003c/a\u003e,\n\u003ca href=\"https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/wire.rs\"\u003ewire parser\u003c/a\u003e,\n\u003ca href=\"https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/envelope.rs\"\u003eenvelope\u003c/a\u003e,\n\u003ca href=\"https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/fragment.rs\"\u003efragmentation/reassembly\u003c/a\u003e,\n\u003ca href=\"https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/replay.rs\"\u003ereplay\u003c/a\u003e,\n\u003ca href=\"https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/semantic.rs\"\u003esemantic state\u003c/a\u003e, and\n\u003ca href=\"https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-radio/src/receiver.rs\"\u003ereceive admission\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eOfficial PX4 \u003ca href=\"https://docs.px4.io/main/en/flight_modes/offboard\" rel=\"nofollow\"\u003eOffboard\u003c/a\u003e\nand \u003ca href=\"https://docs.px4.io/main/en/middleware/uxrce_dds\" rel=\"nofollow\"\u003euXRCE-DDS\u003c/a\u003e\ndocumentation establish why setpoint and companion-command interfaces are a\nseparate high-risk boundary.\u003c/li\u003e\n\u003cli\u003eOfficial \u003ca href=\"https://mavlink.io/en/guide/message_signing.html\" rel=\"nofollow\"\u003eMAVLink 2 signing\u003c/a\u003e\ndocumentation is an authentication precedent, not a substitute for the LMS1\nsignature or policy gate.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eNo secret values were read or recorded. Risk scores and deployment controls are\nthis assessment's judgments. Upstream constants and behaviors are source-backed\nat the exact commit above. Hardware, RF, latency, and certification claims\nremain explicitly unverified.\u003c/p\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"LatentMesh communications threat model","fully_qualified_name":"LatentMesh communications threat model","kind":"section_1","ident_start":2,"ident_end":40,"extent_start":0,"extent_end":31873,"ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":40}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":410,"utf16_col":0}}},{"name":"Executive security decision","fully_qualified_name":"Executive security decision","kind":"section_2","ident_start":486,"ident_end":513,"extent_start":483,"extent_end":1348,"ident_utf16":{"start":{"line_number":11,"utf16_col":3},"end":{"line_number":11,"utf16_col":30}},"extent_utf16":{"start":{"line_number":11,"utf16_col":0},"end":{"line_number":28,"utf16_col":0}}},{"name":"Scope","fully_qualified_name":"Scope","kind":"section_2","ident_start":1351,"ident_end":1356,"extent_start":1348,"extent_end":2569,"ident_utf16":{"start":{"line_number":28,"utf16_col":3},"end":{"line_number":28,"utf16_col":8}},"extent_utf16":{"start":{"line_number":28,"utf16_col":0},"end":{"line_number":55,"utf16_col":0}}},{"name":"In scope","fully_qualified_name":"In scope","kind":"section_3","ident_start":1362,"ident_end":1370,"extent_start":1358,"extent_end":1945,"ident_utf16":{"start":{"line_number":30,"utf16_col":4},"end":{"line_number":30,"utf16_col":12}},"extent_utf16":{"start":{"line_number":30,"utf16_col":0},"end":{"line_number":43,"utf16_col":0}}},{"name":"Out of scope, but adjacent","fully_qualified_name":"Out of scope, but adjacent","kind":"section_3","ident_start":1949,"ident_end":1975,"extent_start":1945,"extent_end":2569,"ident_utf16":{"start":{"line_number":43,"utf16_col":4},"end":{"line_number":43,"utf16_col":30}},"extent_utf16":{"start":{"line_number":43,"utf16_col":0},"end":{"line_number":55,"utf16_col":0}}},{"name":"System model","fully_qualified_name":"System model","kind":"section_2","ident_start":2572,"ident_end":2584,"extent_start":2569,"extent_end":5221,"ident_utf16":{"start":{"line_number":55,"utf16_col":3},"end":{"line_number":55,"utf16_col":15}},"extent_utf16":{"start":{"line_number":55,"utf16_col":0},"end":{"line_number":105,"utf16_col":0}}},{"name":"Data-flow and trust boundaries","fully_qualified_name":"Data-flow and trust boundaries","kind":"section_3","ident_start":2590,"ident_end":2620,"extent_start":2586,"extent_end":3528,"ident_utf16":{"start":{"line_number":57,"utf16_col":4},"end":{"line_number":57,"utf16_col":34}},"extent_utf16":{"start":{"line_number":57,"utf16_col":0},"end":{"line_number":77,"utf16_col":0}}},{"name":"Assets","fully_qualified_name":"Assets","kind":"section_3","ident_start":3532,"ident_end":3538,"extent_start":3528,"extent_end":4562,"ident_utf16":{"start":{"line_number":77,"utf16_col":4},"end":{"line_number":77,"utf16_col":10}},"extent_utf16":{"start":{"line_number":77,"utf16_col":0},"end":{"line_number":91,"utf16_col":0}}},{"name":"Threat actors","fully_qualified_name":"Threat actors","kind":"section_3","ident_start":4566,"ident_end":4579,"extent_start":4562,"extent_end":5221,"ident_utf16":{"start":{"line_number":91,"utf16_col":4},"end":{"line_number":91,"utf16_col":17}},"extent_utf16":{"start":{"line_number":91,"utf16_col":0},"end":{"line_number":105,"utf16_col":0}}},{"name":"Security invariants","fully_qualified_name":"Security invariants","kind":"section_2","ident_start":5224,"ident_end":5243,"extent_start":5221,"extent_end":6904,"ident_utf16":{"start":{"line_number":105,"utf16_col":3},"end":{"line_number":105,"utf16_col":22}},"extent_utf16":{"start":{"line_number":105,"utf16_col":0},"end":{"line_number":120,"utf16_col":0}}},{"name":"Risk method","fully_qualified_name":"Risk method","kind":"section_2","ident_start":6907,"ident_end":6918,"extent_start":6904,"extent_end":7293,"ident_utf16":{"start":{"line_number":120,"utf16_col":3},"end":{"line_number":120,"utf16_col":14}},"extent_utf16":{"start":{"line_number":120,"utf16_col":0},"end":{"line_number":128,"utf16_col":0}}},{"name":"STRIDE analysis","fully_qualified_name":"STRIDE analysis","kind":"section_2","ident_start":7296,"ident_end":7311,"extent_start":7293,"extent_end":18609,"ident_utf16":{"start":{"line_number":128,"utf16_col":3},"end":{"line_number":128,"utf16_col":18}},"extent_utf16":{"start":{"line_number":128,"utf16_col":0},"end":{"line_number":211,"utf16_col":0}}},{"name":"Spoofing","fully_qualified_name":"Spoofing","kind":"section_3","ident_start":7317,"ident_end":7325,"extent_start":7313,"extent_end":8882,"ident_utf16":{"start":{"line_number":130,"utf16_col":4},"end":{"line_number":130,"utf16_col":12}},"extent_utf16":{"start":{"line_number":130,"utf16_col":0},"end":{"line_number":143,"utf16_col":0}}},{"name":"Tampering","fully_qualified_name":"Tampering","kind":"section_3","ident_start":8886,"ident_end":8895,"extent_start":8882,"extent_end":11032,"ident_utf16":{"start":{"line_number":143,"utf16_col":4},"end":{"line_number":143,"utf16_col":13}},"extent_utf16":{"start":{"line_number":143,"utf16_col":0},"end":{"line_number":158,"utf16_col":0}}},{"name":"Repudiation","fully_qualified_name":"Repudiation","kind":"section_3","ident_start":11036,"ident_end":11047,"extent_start":11032,"extent_end":11953,"ident_utf16":{"start":{"line_number":158,"utf16_col":4},"end":{"line_number":158,"utf16_col":15}},"extent_utf16":{"start":{"line_number":158,"utf16_col":0},"end":{"line_number":169,"utf16_col":0}}},{"name":"Information disclosure","fully_qualified_name":"Information disclosure","kind":"section_3","ident_start":11957,"ident_end":11979,"extent_start":11953,"extent_end":13506,"ident_utf16":{"start":{"line_number":169,"utf16_col":4},"end":{"line_number":169,"utf16_col":26}},"extent_utf16":{"start":{"line_number":169,"utf16_col":0},"end":{"line_number":183,"utf16_col":0}}},{"name":"Denial of service","fully_qualified_name":"Denial of service","kind":"section_3","ident_start":13510,"ident_end":13527,"extent_start":13506,"extent_end":16066,"ident_utf16":{"start":{"line_number":183,"utf16_col":4},"end":{"line_number":183,"utf16_col":21}},"extent_utf16":{"start":{"line_number":183,"utf16_col":0},"end":{"line_number":199,"utf16_col":0}}},{"name":"Elevation of privilege","fully_qualified_name":"Elevation of privilege","kind":"section_3","ident_start":16070,"ident_end":16092,"extent_start":16066,"extent_end":18609,"ident_utf16":{"start":{"line_number":199,"utf16_col":4},"end":{"line_number":199,"utf16_col":26}},"extent_utf16":{"start":{"line_number":199,"utf16_col":0},"end":{"line_number":211,"utf16_col":0}}},{"name":"Abuse-case walk-throughs","fully_qualified_name":"Abuse-case walk-throughs","kind":"section_2","ident_start":18612,"ident_end":18636,"extent_start":18609,"extent_end":20644,"ident_utf16":{"start":{"line_number":211,"utf16_col":3},"end":{"line_number":211,"utf16_col":27}},"extent_utf16":{"start":{"line_number":211,"utf16_col":0},"end":{"line_number":251,"utf16_col":0}}},{"name":"Valid key, malicious velocity command","fully_qualified_name":"Valid key, malicious velocity command","kind":"section_3","ident_start":18642,"ident_end":18679,"extent_start":18638,"extent_end":19174,"ident_utf16":{"start":{"line_number":213,"utf16_col":4},"end":{"line_number":213,"utf16_col":41}},"extent_utf16":{"start":{"line_number":213,"utf16_col":0},"end":{"line_number":223,"utf16_col":0}}},{"name":"Cross-peer fragment splice","fully_qualified_name":"Cross-peer fragment splice","kind":"section_3","ident_start":19178,"ident_end":19204,"extent_start":19174,"extent_end":19653,"ident_utf16":{"start":{"line_number":223,"utf16_col":4},"end":{"line_number":223,"utf16_col":30}},"extent_utf16":{"start":{"line_number":223,"utf16_col":0},"end":{"line_number":232,"utf16_col":0}}},{"name":"Replay after receiver restart","fully_qualified_name":"Replay after receiver restart","kind":"section_3","ident_start":19657,"ident_end":19686,"extent_start":19653,"extent_end":20271,"ident_utf16":{"start":{"line_number":232,"utf16_col":4},"end":{"line_number":232,"utf16_col":33}},"extent_utf16":{"start":{"line_number":232,"utf16_col":0},"end":{"line_number":243,"utf16_col":0}}},{"name":"Link loss during a cooperative mission","fully_qualified_name":"Link loss during a cooperative mission","kind":"section_3","ident_start":20275,"ident_end":20313,"extent_start":20271,"extent_end":20644,"ident_utf16":{"start":{"line_number":243,"utf16_col":4},"end":{"line_number":243,"utf16_col":42}},"extent_utf16":{"start":{"line_number":243,"utf16_col":0},"end":{"line_number":251,"utf16_col":0}}},{"name":"Required security controls by layer","fully_qualified_name":"Required security controls by layer","kind":"section_2","ident_start":20647,"ident_end":20682,"extent_start":20644,"extent_end":22092,"ident_utf16":{"start":{"line_number":251,"utf16_col":3},"end":{"line_number":251,"utf16_col":38}},"extent_utf16":{"start":{"line_number":251,"utf16_col":0},"end":{"line_number":263,"utf16_col":0}}},{"name":"Key management requirements","fully_qualified_name":"Key management requirements","kind":"section_2","ident_start":22095,"ident_end":22122,"extent_start":22092,"extent_end":23050,"ident_utf16":{"start":{"line_number":263,"utf16_col":3},"end":{"line_number":263,"utf16_col":30}},"extent_utf16":{"start":{"line_number":263,"utf16_col":0},"end":{"line_number":280,"utf16_col":0}}},{"name":"Privacy and data retention","fully_qualified_name":"Privacy and data retention","kind":"section_2","ident_start":23053,"ident_end":23079,"extent_start":23050,"extent_end":23873,"ident_utf16":{"start":{"line_number":280,"utf16_col":3},"end":{"line_number":280,"utf16_col":29}},"extent_utf16":{"start":{"line_number":280,"utf16_col":0},"end":{"line_number":295,"utf16_col":0}}},{"name":"Security test and release gates","fully_qualified_name":"Security test and release gates","kind":"section_2","ident_start":23876,"ident_end":23907,"extent_start":23873,"extent_end":25529,"ident_utf16":{"start":{"line_number":295,"utf16_col":3},"end":{"line_number":295,"utf16_col":34}},"extent_utf16":{"start":{"line_number":295,"utf16_col":0},"end":{"line_number":324,"utf16_col":0}}},{"name":"Rollback and incident response","fully_qualified_name":"Rollback and incident response","kind":"section_2","ident_start":25532,"ident_end":25562,"extent_start":25529,"extent_end":26435,"ident_utf16":{"start":{"line_number":324,"utf16_col":3},"end":{"line_number":324,"utf16_col":33}},"extent_utf16":{"start":{"line_number":324,"utf16_col":0},"end":{"line_number":344,"utf16_col":0}}},{"name":"Known gaps and residual-risk register","fully_qualified_name":"Known gaps and residual-risk register","kind":"section_2","ident_start":26438,"ident_end":26475,"extent_start":26435,"extent_end":28989,"ident_utf16":{"start":{"line_number":344,"utf16_col":3},"end":{"line_number":344,"utf16_col":40}},"extent_utf16":{"start":{"line_number":344,"utf16_col":0},"end":{"line_number":365,"utf16_col":0}}},{"name":"Requirements trace","fully_qualified_name":"Requirements trace","kind":"section_2","ident_start":28992,"ident_end":29010,"extent_start":28989,"extent_end":29681,"ident_utf16":{"start":{"line_number":365,"utf16_col":3},"end":{"line_number":365,"utf16_col":21}},"extent_utf16":{"start":{"line_number":365,"utf16_col":0},"end":{"line_number":381,"utf16_col":0}}},{"name":"Source provenance","fully_qualified_name":"Source provenance","kind":"section_2","ident_start":29684,"ident_end":29701,"extent_start":29681,"extent_end":31873,"ident_utf16":{"start":{"line_number":381,"utf16_col":3},"end":{"line_number":381,"utf16_col":20}},"extent_utf16":{"start":{"line_number":381,"utf16_col":0},"end":{"line_number":410,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":1271486548,"defaultBranch":"main","name":"ruv-drone","ownerLogin":"ruvnet","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2026-06-16T17:58:23.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/2934394?v=4","public":true,"private":false,"isOrgOwned":false,"isArchived":false},"currentUser":null,"uploadToken":"aIYaVuuMy5N98lcJiWNGHFhdiD-0dvcOi85VkKM2uqRdZkzx28BKdjChwF-cQF353D9ndnJwv1zSMNFDN6H7QA","allShortcutsEnabled":false,"treeExpanded":true,"path":"docs/security/latentmesh-threat-model.md","symbolsExpanded":false,"refInfo":{"name":"main","listCacheKey":"v0:1789574398.0","canEdit":false,"currentOid":"eafd7e56fdaae7bde6ae5b1c61ebad220d8bfdd6"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"docs/security":{"items":[{"name":"latentmesh-threat-model.md","path":"docs/security/latentmesh-threat-model.md","contentType":"file"},{"name":"ruforecast-threat-model.md","path":"docs/security/ruforecast-threat-model.md","contentType":"file"}],"totalCount":2},"docs":{"items":[{"name":"adr","path":"docs/adr","contentType":"directory"},{"name":"assets","path":"docs/assets","contentType":"directory"},{"name":"benchmarks","path":"docs/benchmarks","contentType":"directory"},{"name":"security","path":"docs/security","contentType":"directory"},{"name":"latentmesh-user-guide.md","path":"docs/latentmesh-user-guide.md","contentType":"file"},{"name":"ruforecast-user-guide.md","path":"docs/ruforecast-user-guide.md","contentType":"file"}],"totalCount":6},"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"agent-harness","path":"agent-harness","contentType":"directory"},{"name":"benches","path":"benches","contentType":"directory"},{"name":"crates","path":"crates","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"evals","path":"evals","contentType":"directory"},{"name":"examples","path":"examples","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":"viz","path":"viz","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"Cargo.lock","path":"Cargo.lock","contentType":"file"},{"name":"Cargo.toml","path":"Cargo.toml","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"NOTICE","path":"NOTICE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"}],"totalCount":15}},"fileTreeProcessingTime":44.229478,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"main","listCacheKey":"v0:1789574398.0","canEdit":false,"refType":"branch","currentOid":"eafd7e56fdaae7bde6ae5b1c61ebad220d8bfdd6","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"docs/security/latentmesh-threat-model.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/ruvnet/ruv-drone/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"latentmesh-threat-model.md","displayUrl":"https://github.com/ruvnet/ruv-drone/blob/main/docs/security/latentmesh-threat-model.md?raw=true","headerInfo":{"blobSize":"31.1 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"2e3ed9e","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fruvnet%2Fruv-drone%2Fblob%2Fmain%2Fdocs%2Fsecurity%2Flatentmesh-threat-model.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"410","truncatedSloc":"336"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"isIssueTemplate":false,"isDiscussionTemplate":false,"language":"Markdown","languageID":222,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/ruvnet/ruv-drone/blob/main/docs/security/latentmesh-threat-model.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/ruvnet/ruv-drone/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/ruvnet/ruv-drone/raw/refs/heads/main/docs/security/latentmesh-threat-model.md","renderImageOrRaw":false,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null},"copilotInfo":null,"copilotAccessAllowed":false,"copilotSpacesEnabled":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"isMarketplaceEnabled":true},"codeViewBlobLayoutRoute.StyledBlob":{"rawLines":["# LatentMesh communications threat model","","| | |","|---|---|","| **System** | `ruv-drone` LatentMesh communications and advisory orchestration plane |","| **Method** | STRIDE plus aviation authority-boundary analysis |","| **Date** | 2026-09-01 |","| **Baseline** | `ruv-drone@cfe8b662bd648e9ea19a4047275dfce2c5c8e699` |","| **LatentMesh source** | `ruvnet/LatentMesh@1ff7332c17798eec3b42da5c6f1c271f355fa806` |","| **Architecture** | [ADR-173](../adr/ADR-173-latentmesh-comms-orchestration.md) |","","## Executive security decision","","LatentMesh is permitted to carry authenticated deterministic observations and","bounded advisory orchestration facts. It is prohibited from all actuator,","arming, flight-mode, attitude, velocity-command, geofence, collision-avoidance,","and onboard fail-safe authority paths.","","This is the primary risk control. Cryptography authenticates who made a claim;","it does not make the claim safe, current, accurate, or authorized. Every valid","message remains untrusted for flight authority. The receiver writes only to a","short-lived advisory store whose type and module dependencies expose no flight","command interface.","","The release is blocked if any LatentMesh input can call a `FlightController`,","mutate local `MeshTopology` used for safety distance, alter `Geofence`, drive a","local `FailSafeMachine`, or create an unmanifested mission action.","","## Scope","","### In scope","","* Optional `latentmesh-air-core` dependency and the local state, publisher,","  verifier, reassembly, replay, freshness, advisory-store, and policy adapters.","* WiFi, BLE, and Meshtastic Air profiles from byte ingress to advisory-state","  expiry.","* Ed25519 identity, peer enrollment, rotation, revocation, sequence state, and","  configuration used by the integration.","* Availability, integrity, privacy, observability, update, rollout, and","  rollback risks on a companion computer.","* The boundary to existing orchestration, topology, local safety, and autopilot","  integration.","","### Out of scope, but adjacent","","Radio firmware, RF jamming prevention, WiFi/BLE/Meshtastic link-layer keying,","autopilot firmware internals, physical capture, ground-station account","security, operating-system hardening, and national radio/export compliance are","owned by their respective deployment controls. They are considered external","dependencies in abuse cases, not silently assumed secure.","","No live network probing, RF transmission, credential test, or production scan","was performed for this document. This is a source-backed architecture threat","model, not a penetration-test report or aviation certification artifact.","","## System model","","### Data-flow and trust boundaries","","```mermaid","flowchart TB","    P[\"Remote peer\"] --\u003e|\"hostile frames\"| T[\"Transport adapter\"]","    T --\u003e|\"TB1: expected source and bytes\"| R[\"Bounded per-source reassembly\"]","    R --\u003e|\"TB2: complete untrusted envelope\"| V[\"Signature and semantic admission\"]","    V --\u003e|\"TB3: authenticated advisory state\"| A[\"TTL advisory store\"]","    A --\u003e|\"TB4: reduced authority facts\"| O[\"Local mission policy\"]","    F[\"Flight and safety interfaces remain separate\"]","```","","TB0, not shown, is the operator/configuration boundary around key material,","peer/endpoint enrollment, deployment lifecycle, limits, checkpoint persistence,","and optional audit export. TB1 data is wholly","hostile. TB2 has passed fixed frame CRC and reassembly but has not passed","authentication. TB3 is authenticated and schema-valid but still advisory.","TB4 permits only locally manifest-bounded orchestration. The flight and safety","boundary is not crossed.","","### Assets","","| Asset | Required property | Classification |","|---|---|---|","| Local flight and safety authority | Never influenced directly by LatentMesh | Safety authoritative |","| Advisory peer state | Authentic source, exact symbolic integrity, fresh, bounded | Operational sensitive |","| Mission manifest and policy | Local-only integrity and controlled change | Safety related configuration |","| Signing private key | Confidential, non-exportable where available, rotatable | Secret |","| Peer key registry and replay high-water marks | Integrity, availability, durable across restart | Security state |","| Location, heading, altitude, task and link metadata | Confidentiality and retention minimization | Operational sensitive |","| Parser/reassembler resources | Bounded memory, CPU, contexts, and time | Availability critical |","| Decision receipts and metrics | Complete enough for incident response, no sensitive payload | Internal audit |","| Dependency and schema identity | Exact provenance and compatibility | Supply-chain control |","","### Threat actors","","1. An unauthenticated remote transmitter able to inject, replay, reorder, delay,","   truncate, or flood link traffic.","2. A passive observer able to collect packets and traffic patterns.","3. A compromised enrolled peer holding a valid signing key and able to lie","   about its own state.","4. An operator or local process with configuration access but no intended","   authority to change flight behavior.","5. A compromised transport adapter, companion-computer process, dependency, CI","   job, or artifact source.","6. Nonmalicious radio corruption, clock drift, restart, packet loss, duplicate","   delivery, schema mismatch, and resource exhaustion.","","## Security invariants","","| ID | Invariant |","|---|---|","| SI-01 | LatentMesh types and modules cannot access actuator, arming, mode, attitude, velocity-command, geofence, collision-avoidance, or local fail-safe mutation interfaces. |","| SI-02 | Every production envelope is signed and strictly verified against an enrolled source/profile binding. Secure transport alone is insufficient. |","| SI-03 | Bounds and CRC are checked before proportional allocation; a hard source cap, per-source contexts/rate, and adapter budgets bound work before signature verification. |","| SI-04 | Replay state commits only after full reassembly and all authentication, binding, freshness, schema, range, and hash checks succeed. |","| SI-05 | Critical state uses canonical deterministic symbols and exact base/result hashes. Unknown, partial, wrong-type, nonfinite, and out-of-range state fails closed. |","| SI-06 | A state envelope containing any learned residual is rejected in full without snapshot or replay change. Residual values never enter orchestration or safety. |","| SI-07 | `SemanticClass::Control` is forbidden even when signed. Message priority changes scheduling only within resource limits; it never changes authority. |","| SI-08 | Peer-reported battery, link, position, velocity, and fail-safe values can only reduce remote peer eligibility or support observability. They cannot expand local authority. |","| SI-09 | Missing key, verifier, baseline, time health, schema, endpoint enrollment, or replay checkpoint reduces capability. It never enables a permissive mode. |","| SI-10 | Disable and rollback are local operations, require no network, and preserve existing flight and safety behavior. |","","## Risk method","","Likelihood and impact are ordinal estimates from 1 to 5. The pre-control score","is `likelihood * impact`: 1 to 4 low, 5 to 9 moderate, 10 to 14 high, and 15 to","25 critical. Residual ratings assume all named controls and tests are present.","A critical or high residual risk blocks release unless an authorized maintainer","records an owner, compensating control, and deadline.","","## STRIDE analysis","","### Spoofing","","| ID | Scenario | Pre-control | Required controls | Residual | Verification / owner |","|---|---|---:|---|---:|---|","| S-01 | Unenrolled sender forges a peer state or uses another source ID. | 4 x 5 = 20 | Mandatory Ed25519 signature, strict verification, source ID to key binding, no default trust key. | 1 x 5 = 5 | Wrong, absent, random, and altered signatures reject before replay commit. Security owner. |","| S-02 | Sender changes transport identity or profile to evade per-source policy. | 3 x 4 = 12 | Bind deployment endpoint to expected source, fix the Air profile per receiver, then bind signed source to its key after reassembly; retain aggregate source/rate caps. | 1 x 4 = 4 | Cross-profile and expected-source mismatch tests. Comms owner. |","| S-03 | Attacker races a local key cutover or reuses a revoked key. | 3 x 5 = 15 | One active built-in key per source, rebuild from replay checkpoint on replacement/removal or use an atomic external lookup, no remote rotation API. | 2 x 5 = 10 | Rotation/revocation integration test and operator runbook. Security owner. |","| S-04 | Link encryption is mistaken for sender authentication. | 3 x 5 = 15 | Envelope signature remains mandatory on WiFi, BLE, and Meshtastic; channel PSK is defense in depth only. | 1 x 5 = 5 | Signed-envelope gate tested on every profile. Security owner. |","","S-03 remains high until production key rotation and revocation are exercised on","the target deployment. It is a release blocker for fleet advisory mode, though","not for loopback or shadow mode with fixture identities.","","### Tampering","","| ID | Scenario | Pre-control | Required controls | Residual | Verification / owner |","|---|---|---:|---|---:|---|","| T-01 | Bits, header lengths, class, priority, state tag, or body change in transit. | 4 x 4 = 16 | Fixed bounds, CRC32C for corruption, signed canonical envelope for authenticity, outer/body binding. | 1 x 4 = 4 | Mutation corpus across every byte range. Protocol owner. |","| T-02 | Fragments from different peers/messages are spliced into one envelope. | 4 x 4 = 16 | Separate reassembler per enrolled peer; context metadata consistency; conflicting duplicate rejection; signature after full reassembly. | 1 x 4 = 4 | Cross-peer, out-of-order, duplicate, and conflicting-fragment tests. Protocol owner. |","| T-03 | Valid envelope contains wrong base hash, result hash, duplicate field, unknown field, or noncanonical order. | 3 x 4 = 12 | Canonical LMAD decode, exact base/result application, complete local schema, unknown-field rejection. | 1 x 4 = 4 | Hash/schema negative tests. State owner. |","| T-04 | Compromised enrolled peer signs false but well-formed telemetry. | 4 x 4 = 16 | Advisory-only type, source-scoped effect, plausible ranges, local observations dominate, task eligibility can decrease only, revocation. | 3 x 3 = 9 | Byzantine peer scenario; compare no flight/safety calls. Mission-policy owner. |","| T-05 | Dependency, lockfile, schema field ID, or golden vector drifts. | 3 x 5 = 15 | Exact git revision, reviewed lockfile, immutable field IDs, upstream golden vectors, dependency and license scan. | 1 x 5 = 5 | Metadata pin check, golden-vector test, diff review. Release owner. |","| T-06 | Local runtime config is altered to raise limits, accept unsigned state, or enable control. | 3 x 5 = 15 | No unsigned option in production type, local file permissions, bounded hard caps, immutable forbidden classes, config provenance audit. | 2 x 5 = 10 | Negative config tests and deployment permission check. Platform owner. |","","T-04 is fundamental: signatures establish provenance, not truth. T-06 remains","high until the deployment supplies a protected configuration source and an","audited change path.","","### Repudiation","","| ID | Scenario | Pre-control | Required controls | Residual | Verification / owner |","|---|---|---:|---|---:|---|","| R-01 | Peer or operator denies a message or admission decision. | 3 x 3 = 9 | Record key fingerprint, signed state hash, epoch, sequence, profile, decision, time bucket, and code/config identity; optional append-only export. | 2 x 3 = 6 | Receipt field and redaction test. Operations owner. |","| R-02 | Audit evidence is altered or gaps are hidden during overload. | 3 x 4 = 12 | Monotonic counters, bounded local queue, explicit dropped-audit counter, remote append-only sink where required, synchronized clock health. | 2 x 4 = 8 | Saturation test and sink integrity review. Operations owner. |","","Receipts deliberately omit the raw payload. A dispute that requires content","reconstruction needs a separately authorized flight/mission recorder with its","own retention and privacy controls.","","### Information disclosure","","| ID | Scenario | Pre-control | Required controls | Residual | Verification / owner |","|---|---|---:|---|---:|---|","| I-01 | Passive observer learns location, altitude, movement, mission activity, or fleet membership. | 4 x 4 = 16 | Use transport encryption where legal and available, minimize fields/rate, pseudonymous rotating transport identifiers, profile-specific policy. | 3 x 4 = 12 | Packet-capture review on deployment transport. Privacy owner. |","| I-02 | Logs or metrics expose coordinates, payloads, source IDs, signatures, or keys. | 3 x 5 = 15 | Allowlisted structured fields, bounded labels, no raw payload, secret scanner, redaction tests. | 1 x 5 = 5 | Observability privacy acceptance test. Operations owner. |","| I-03 | Traffic size and timing reveal task events even when encrypted. | 4 x 3 = 12 | Rate shaping where airtime permits, fixed scheduling classes, batching, no claim that signatures hide metadata. | 3 x 3 = 9 | Traffic-analysis exercise. Privacy/comms owners. |","| I-04 | Crash dump or swap captures private signing material. | 2 x 5 = 10 | Injected key provider, non-exportable hardware key where available, zeroization, core-dump policy, least-privilege process. | 2 x 5 = 10 | Platform key-storage review. Security owner. |","","I-01 is the largest unmitigated privacy risk because LatentMesh Air provides","authentication but intentionally does not provide protocol-core encryption.","Fleet advisory deployment requires an explicit transport-confidentiality or","documented data-minimization decision.","","### Denial of service","","| ID | Scenario | Pre-control | Required controls | Residual | Verification / owner |","|---|---|---:|---|---:|---|","| D-01 | Oversized, truncated, pathological length, count, or version consumes memory or panics. | 5 x 4 = 20 | Fixed bounds before allocation, checked arithmetic, 4,096-byte local message cap, fuzzing, no unsafe code in adapter. | 1 x 4 = 4 | Length 0 through 8,192 and count 0 through 255 corpus plus fuzzer. Protocol owner. |","| D-02 | Fragment flood fills all contexts before signature can be checked. | 5 x 4 = 20 | Four contexts per source, 32 default sources, 512 KiB default payload ceiling, 256 hard source cap, per-source fixed-window rate, and deterministic absolute expiry. | 2 x 4 = 8 | Peak-allocation and context saturation test. Comms owner. |","| D-03 | Attackers force expensive Ed25519 checks or semantic hashing. | 4 x 3 = 12 | Cheap frame/profile/source/rate checks first, 4,096-byte complete-envelope cap, aggregate bound from source and rate caps, transport backpressure. | 2 x 3 = 6 | Signature-flood benchmark and backpressure test. Security owner. |","| D-04 | Replay, exact duplicates, or reordered fragments amplify work. | 5 x 3 = 15 | Idempotent exact in-flight duplicate, bounded reassembly, replay classify/commit only after full verified admission, adapter-level endpoint blocking when abused. | 1 x 3 = 3 | Replay ordering acceptance test. Protocol owner. |","| D-05 | Slow-fragment attack retains contexts for a long locally configured Meshtastic timeout. | 4 x 3 = 12 | Adapter airtime/byte budget, per-source context cap, absolute first-fragment deadline, reject new contexts when full. | 2 x 3 = 6 | Fake-clock slow-fragment test. Comms owner. |","| D-06 | RF jamming, link outage, adapter crash, or duty-cycle exhaustion removes advisory data. | 4 x 3 = 12 | No safety dependence, snapshot TTL, local autonomous behavior, health alert, adapter restart, local disable. | 1 x 3 = 3 | Link-cut and process-restart scenario. Flight-test owner. |","| D-07 | Peer-controlled metric values create cardinality or logging exhaustion. | 4 x 3 = 12 | Built-in metrics retain only fixed aggregate counters; any deployment exporter forbids peer/message labels and bounds optional audit output. | 1 x 3 = 3 | Metrics/debug redaction test and exporter review. Operations owner. |","","Fragment authentication cannot occur until the signed envelope is complete.","Consequently D-02 controls are mandatory even with perfect signatures. A","deployment endpoint binding is not trusted enough to replace aggregate bounds.","","### Elevation of privilege","","| ID | Scenario | Pre-control | Required controls | Residual | Verification / owner |","|---|---|---:|---|---:|---|","| E-01 | Signed `Control` or high-priority message reaches a command path. | 4 x 5 = 20 | Reject Control unconditionally; priority affects bounded scheduling only; no command-capable field schema. | 1 x 5 = 5 | Signed-Control zero-call test. Architecture owner. |","| E-02 | A `VerifiedAdvisory` is inserted into authoritative `peer_states` and influences collision or fail-safe logic. | 4 x 5 = 20 | Private-construction wrapper and trust fields, read-only public accessors, separate `latentmesh_advisories` map, reduce-only predicate, no mutable topology/safety handle. | 1 x 5 = 5 | Orchestrator separation and unchanged-local-safety test. Architecture owner. |","| E-03 | Position, velocity, heading, altitude, or peer fail-safe observation is reinterpreted as a local setpoint/state. | 4 x 5 = 20 | Field-consumer allowlist, observability-only projection, no ROS 2/uXRCE-DDS/MAVLink publisher in LatentMesh module. | 1 x 5 = 5 | Dependency grep plus integration mock. Flight-safety owner. |","| E-04 | Learned residual, confidence, or neural output creates or modifies a critical symbol or task. | 3 x 5 = 15 | Reject the whole residual-bearing state envelope; scheduler evidence can yield only an `Observe` delivery treatment and has no decoder/state consumer; suppression metric only. | 1 x 5 = 5 | Maximal residual rejects with no snapshot/replay change; evidence-gate tests. State owner. |","| E-05 | Old epoch, receiver restart, sequence wrap, or clock failure restores stale influence. | 4 x 4 = 16 | Deployment-persisted `ReplayCheckpoint`, logical high-water, 16-bit per-source/epoch replay window, age/skew checks, mandatory newer keyframe after restore. | 1 x 4 = 4 | Restart, wrap, old/new epoch, skew tests. Security owner. |","| E-06 | Compromised peer invents task coordinates or a new mission objective. | 3 x 5 = 15 | Default-empty local manifest allowlist; nonzero opaque ID; local-only approve/revoke; proposal contains only participant/TTL/effort bounds and no coordinates, setpoints, or executable body. | 1 x 5 = 5 | Unknown, zero, approved, and revoked manifest tests. Mission-policy owner. |","| E-07 | Remote message enables the feature, changes keys/limits, unblocks an endpoint, or triggers rollback. | 3 x 5 = 15 | Configuration is local-only and not represented in admitted Air schema; operator capability required. | 1 x 5 = 5 | Remote-config negative corpus. Platform owner. |","","## Abuse-case walk-throughs","","### Valid key, malicious velocity command","","An enrolled peer signs a syntactically valid message and sets class `Control`,","maximum priority, and bytes resembling an offboard velocity command. Frame","bounds and reassembly may succeed. Signature verification proves only the","compromised peer created it. The forbidden-class gate rejects the message. It","does not enter the advisory store, replay does not commit, and no flight or","safety interface is reachable. Repetition consumes only bounded per-source and","aggregate source/rate budgets.","","### Cross-peer fragment splice","","An attacker sends fragment zero using peer A's transport identity and fragment","one using peer B's identity with the same stream and sequence. Separate","per-expected-source reassemblers prevent combination. If a deployment misbinds","endpoints and fragments do combine within one namespace, the complete LMS1","signature and source/key binding still fail. The configured source cap prevents","attacker-chosen bindings from creating unbounded namespaces.","","### Replay after receiver restart","","An attacker records a valid high-battery report and replays it after receiver","restart. The deployer restores the exported `(source_id, sender epoch, logical","sequence, timestamp)` `ReplayCheckpoint`, which rejects it even if the","in-memory 16-bit frame window is empty and requires a later signed full","keyframe. If the durable store is unavailable or corrupt, release policy keeps","advisory admission for that peer disabled; constructing a fresh receiver would","otherwise accept a sequence-zero baseline. Flight safety does not degrade","because the peer report was never a safety input.","","### Link loss during a cooperative mission","","No valid peer update arrives before the profile TTL. The advisory snapshot","expires and orchestration removes the peer from new cooperative assignments or","uses its existing non-LatentMesh behavior. Local autopilot, collision,","geofence, and fail-safe logic continue. A stale position is never held as a","collision-avoidance truth.","","## Required security controls by layer","","| Layer | Preventive | Detective | Recovery |","|---|---|---|---|","| Dependency/build | Exact commit, lockfile, feature off by default, reviewed schema IDs | Metadata/golden-vector/dependency scan | Revert dependency and lockfile |","| Key/config | Local allowlist, strict verifier, file/hardware access controls, hard caps | Key fingerprint/config identity receipts | Revoke key, disable peer or feature |","| Transport | Profile and endpoint/source binding, bounded channel/UDP datagrams, adapter airtime budget | Aggregate frame/drop counters plus adapter health | Restart adapter, change profile, disable transmit |","| Parser/reassembly | Bounds before allocation, checked arithmetic, per-source contexts, absolute expiry | Frame/envelope and aggregate reassembly counters | Drop session to clear contexts; temporarily block endpoint |","| Semantic admission | Signature, source binding, class/schema/range/hash/freshness gates | Typed errors and CRC/auth/replay/semantic counters | Wait for periodic baseline, replace local key/session, shadow mode |","| Advisory policy | Private verified wrapper, distinct store, TTL, manifest and maximum-authority rule | Reduce-only integration test and advisory age | Clear store, disable consumer |","| Flight boundary | No dependency edge or command publisher | Architecture check and flight-interface call counters in test | Build without feature; existing local fail-safe |","","## Key management requirements","","* Production has no embedded private key, all-zero key, shared fleet-wide key,","  or automatic trust-on-first-use.","* Signing and verification keys are domain-separated from MAVLink, TLS,","  Meshtastic channel, and device-management keys.","* Deployment configuration composes endpoint-to-source binding, the receiver's","  single allowed profile, key validity/revocation policy, and source enrollment.","  The built-in `TrustedPeerKeys` value itself stores only source ID to one active","  Ed25519 verification key.","* A built-in registry cutover reconstructs the receive session from its durable","  checkpoint after local replacement/removal; a dynamic external","  `TrustedPeerKeyLookup` can implement atomic rotation. Received metadata does","  not retain a key fingerprint, key, or signature.","* A revoked key cannot authorize a new sender epoch or baseline.","* Key loss recovery uses an authenticated operator channel outside LatentMesh.","","## Privacy and data retention","","Raw frames, signatures, residuals, exact coordinates, headings, and task data","are not application logs. Accepted advisory snapshots live in memory only for","their profile TTL unless a separately authorized mission recorder owns a copy.","Built-in metrics are unlabeled fixed counters. If a deployment adds receipts,","it may use a keyed or one-way digest of canonical authentication bytes and a","coarse time bucket so operators can correlate an incident without exposing the","full state; no such receipt store is part of the library implementation.","","Transport confidentiality is a deployment decision. If it is absent, the","privacy owner must reduce the transmitted schema and frequency or formally","accept exposure. Signatures do not provide confidentiality, unlinkability, or","traffic-flow privacy.","","## Security test and release gates","","The authoritative procedures are AT-001 through AT-012 in","[ADR-173](../adr/ADR-173-latentmesh-comms-orchestration.md#acceptance-tests-and-requirements-trace).","The security subset must demonstrate all of the following:","","1. Wrong, absent, altered, revoked, cross-source, and cross-profile signatures","   produce no replay or advisory side effect.","2. Replay commits exactly once and only after complete verified admission.","3. Every length, count, context, byte, time, and rate cap has a boundary test;","   the parser and reassembler have malformed-input fuzz coverage.","4. Unknown, partial, wrong-type, nonfinite, out-of-range, stale, wrong-epoch,","   and hash-divergent symbolic state fails closed.","5. Maximum residual data causes a fail-closed rejection and cannot change a","   snapshot or reach policy.","6. Signed Control and command-shaped data result in zero flight-controller","   calls and no local geofence, topology, collision, or fail-safe mutation.","7. Link loss, adapter crash, runtime disable, and dependency rollback preserve","   the existing default behavior.","8. No secret, signature, payload, exact coordinate, or peer identity appears in","   captured metrics, debug output, or committed fixtures.","","Before a hardware release, rerun the suite on the target architecture with","sanitizer-equivalent memory checks where supported, dependency advisory scans,","secret scanning, and two-peer hardware-in-the-loop transport tests. Record","tool versions, lockfile hash, advisory-feed time, firmware, radio profile,","regional configuration, and raw aggregate results. A simulator or one-node","loopback is not over-the-air evidence.","","## Rollback and incident response","","When an invariant fails:","","1. Use the deployment's local lifecycle control to stop and drop LatentMesh","   publisher, receiver, and adapter tasks.","2. Clear incomplete reassembly and advisory snapshots. Do not modify local","   flight, geofence, collision, or fail-safe state.","3. Revoke the suspected peer/key locally and block the transport endpoint when","   available.","4. Preserve redacted decision receipts, code/config identity, lockfile hash,","   relevant aggregate metrics, and target firmware identity.","5. Reproduce with fixture keys and no live RF. Add the smallest failing test.","6. Patch the smallest boundary, rerun the exact failing test and all ADR-173","   acceptance tests, then restart at shadow stage.","","Disabling LatentMesh must never request a flight-mode change. The onboard","autopilot and existing local fail-safe decide what the vehicle does during link","loss.","","## Known gaps and residual-risk register","","| Gap | Risk | Required disposition before fleet advisory |","|---|---|---|","| LatentMesh Air core authenticates complete envelopes, not individual fragments. | Pre-auth resource exhaustion | Keep source/context/rate caps; add adapter airtime/byte budgets for constrained profiles; pass D-02/D-05 tests. |","| Upstream reassembler has no clock expiry; the local wrapper uses an absolute deadline from the first fragment, not a sliding progress deadline. | Slow-fragment retention within configured timeout | Keep profile timeout finite, clear expired contexts, and reject new contexts at the cap. |","| Signatures provide no confidentiality. | Location and mission disclosure | Enable approved link encryption or document field/rate minimization and risk acceptance. |","| A valid enrolled peer can lie. | Incorrect availability or task progress | Advisory-only, source-scoped, reduce-only policy; local sensing dominates; rapid revocation. |","| `ReplayCheckpoint` persistence is deployer-provided and may be unavailable or corrupt. | Replay after restart | Do not start that peer's receive session without a valid checkpoint or explicit authenticated re-enrollment; require a later full keyframe. |","| Built-in metrics do not expose in-flight byte/context gauges or expiry-specific counters. | Reduced DoS diagnosis | Derive aggregate bounds in tests and add bounded deployment instrumentation before fleet advisory if operational evidence requires it. |","| Meshtastic upstream evidence is real firmware with simulated radio. | Unknown hardware latency/loss/interop | Two physical peers and regional-compliance evidence before hardware claim. |","| Exact git revision reduces drift but does not prove dependency integrity. | Supply-chain compromise | Review commit, lockfile, checksums, advisories, license, and CI provenance on every update. |","| Companion process compromise can bypass in-process type boundaries. | Local privilege escalation | OS least privilege, separate service/account where deployment warrants it, no autopilot device access for LatentMesh adapter. |","","The largest uncertainty is deployment-time enforcement of the local process","boundary. In-process Rust types prevent accidental coupling, not a hostile","root-level companion compromise. The strongest fix path is to run the","LatentMesh adapter and advisory store as an unprivileged service without access","to autopilot serial/UDP devices, uXRCE-DDS command topics, or flight-control","credentials, exposing a read-only bounded advisory API to `ruv-drone`.","","## Requirements trace","","| Threat-model control | ADR requirement and evidence |","|---|---|","| Flight-authority exclusion | LM-008, LM-009, LM-015; AT-010 |","| Exact dependency provenance | LM-002; AT-002 |","| Authentication and source binding | LM-003; AT-004, AT-005 |","| Bounded parsing/reassembly | LM-004; AT-007, AT-011 |","| Post-reassembly replay/freshness | LM-005, LM-011; AT-006, AT-008 |","| Deterministic schema and hashes | LM-006; AT-004, AT-009 |","| Learned residual isolation | LM-007; AT-009 |","| Transport separation | LM-010; AT-004, AT-010 |","| Privacy/data lifecycle | LM-012; AT-011, AT-012 |","| Observability | LM-013; AT-012 |","| Rollout/rollback | LM-001, LM-014; AT-001, AT-011 |","","## Source provenance","","Primary local and immutable upstream sources inspected for this model:","","* [`ruv-drone` flight-controller boundary](../../src/integration/flight_controller.rs),","  [local fail-safe](../../src/failsafe/mod.rs),","  [geofence](../../src/security/geofence.rs), and","  [topology](../../src/topology/mesh.rs).","* LatentMesh exact commit","  [`1ff7332c17798eec3b42da5c6f1c271f355fa806`](https://github.com/ruvnet/LatentMesh/commit/1ff7332c17798eec3b42da5c6f1c271f355fa806).","* Upstream [security policy](https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/SECURITY.md),","  [wire parser](https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/wire.rs),","  [envelope](https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/envelope.rs),","  [fragmentation/reassembly](https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/fragment.rs),","  [replay](https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/replay.rs),","  [semantic state](https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/semantic.rs), and","  [receive admission](https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-radio/src/receiver.rs).","* Official PX4 [Offboard](https://docs.px4.io/main/en/flight_modes/offboard)","  and [uXRCE-DDS](https://docs.px4.io/main/en/middleware/uxrce_dds)","  documentation establish why setpoint and companion-command interfaces are a","  separate high-risk boundary.","* Official [MAVLink 2 signing](https://mavlink.io/en/guide/message_signing.html)","  documentation is an authentication precedent, not a substitute for the LMS1","  signature or policy gate.","","No secret values were read or recorded. Risk scores and deployment controls are","this assessment's judgments. Upstream constants and behaviors are source-backed","at the exact commit above. Hardware, RF, latency, and certification claims","remain explicitly unverified."],"stylingDirectives":[[[0,40,"pl-mh"],[2,40,"pl-en"]],[],[[0,1,"pl-ml"],[2,3,"pl-ml"],[4,5,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[10,12,"pl-s"],[13,14,"pl-ml"],[15,16,"pl-s"],[16,25,"pl-c1"],[25,26,"pl-s"],[86,87,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[10,12,"pl-s"],[13,14,"pl-ml"],[64,65,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[8,10,"pl-s"],[11,12,"pl-ml"],[24,25,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[12,14,"pl-s"],[15,16,"pl-ml"],[17,18,"pl-s"],[18,68,"pl-c1"],[68,69,"pl-s"],[70,71,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[21,23,"pl-s"],[24,25,"pl-ml"],[26,27,"pl-s"],[27,85,"pl-c1"],[85,86,"pl-s"],[87,88,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[16,18,"pl-s"],[19,20,"pl-ml"],[21,22,"pl-s"],[29,30,"pl-s"],[30,31,"pl-s"],[31,79,"pl-corl"],[79,80,"pl-s"],[81,82,"pl-ml"]],[],[[0,30,"pl-mh"],[3,30,"pl-en"]],[],[],[],[],[],[],[],[],[],[],[],[],[[58,59,"pl-s"],[59,75,"pl-c1"],[75,76,"pl-s"]],[[13,14,"pl-s"],[14,26,"pl-c1"],[26,27,"pl-s"],[60,61,"pl-s"],[61,69,"pl-c1"],[69,70,"pl-s"]],[[6,7,"pl-s"],[7,22,"pl-c1"],[22,23,"pl-s"]],[],[[0,8,"pl-mh"],[3,8,"pl-en"]],[],[[0,12,"pl-mh"],[4,12,"pl-en"]],[],[[0,1,"pl-v"],[11,12,"pl-s"],[12,31,"pl-c1"],[31,32,"pl-s"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[],[[0,30,"pl-mh"],[4,30,"pl-en"]],[],[],[],[],[],[],[],[],[],[],[],[[0,15,"pl-mh"],[3,15,"pl-en"]],[],[[0,34,"pl-mh"],[4,34,"pl-en"]],[],[[0,3,"pl-s"],[3,10,"pl-en"],[10,10,"pl-c1"]],[[0,12,"pl-c1"]],[[0,65,"pl-c1"]],[[0,78,"pl-c1"]],[[0,83,"pl-c1"]],[[0,70,"pl-c1"]],[[0,67,"pl-c1"]],[[0,53,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[],[],[],[],[],[[0,10,"pl-mh"],[4,10,"pl-en"]],[],[[0,1,"pl-ml"],[8,9,"pl-ml"],[28,29,"pl-ml"],[45,46,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[12,13,"pl-ml"]],[[0,1,"pl-ml"],[36,37,"pl-ml"],[78,79,"pl-ml"],[101,102,"pl-ml"]],[[0,1,"pl-ml"],[22,23,"pl-ml"],[83,84,"pl-ml"],[107,108,"pl-ml"]],[[0,1,"pl-ml"],[30,31,"pl-ml"],[75,76,"pl-ml"],[106,107,"pl-ml"]],[[0,1,"pl-ml"],[22,23,"pl-ml"],[80,81,"pl-ml"],[89,90,"pl-ml"]],[[0,1,"pl-ml"],[48,49,"pl-ml"],[98,99,"pl-ml"],[115,116,"pl-ml"]],[[0,1,"pl-ml"],[54,55,"pl-ml"],[99,100,"pl-ml"],[123,124,"pl-ml"]],[[0,1,"pl-ml"],[31,32,"pl-ml"],[73,74,"pl-ml"],[97,98,"pl-ml"]],[[0,1,"pl-ml"],[32,33,"pl-ml"],[94,95,"pl-ml"],[111,112,"pl-ml"]],[[0,1,"pl-ml"],[33,34,"pl-ml"],[70,71,"pl-ml"],[93,94,"pl-ml"]],[],[[0,17,"pl-mh"],[4,17,"pl-en"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[],[[0,22,"pl-mh"],[3,22,"pl-en"]],[],[[0,1,"pl-ml"],[5,6,"pl-ml"],[17,18,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[176,177,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[152,153,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[176,177,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[142,143,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[170,171,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[167,168,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[10,11,"pl-s"],[11,33,"pl-c1"],[33,34,"pl-s"],[159,160,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[182,183,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[162,163,"pl-ml"]],[[0,1,"pl-ml"],[8,9,"pl-ml"],[123,124,"pl-ml"]],[],[[0,14,"pl-mh"],[3,14,"pl-en"]],[],[],[[3,4,"pl-s"],[4,23,"pl-c1"],[23,24,"pl-s"]],[],[],[],[],[[0,18,"pl-mh"],[3,18,"pl-en"]],[],[[0,12,"pl-mh"],[4,12,"pl-en"]],[],[[0,1,"pl-ml"],[5,6,"pl-ml"],[16,17,"pl-ml"],[30,31,"pl-ml"],[50,51,"pl-ml"],[61,62,"pl-ml"],[84,85,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[13,14,"pl-ml"],[17,18,"pl-ml"],[22,23,"pl-ml"],[26,27,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[74,75,"pl-ml"],[87,88,"pl-ml"],[187,188,"pl-ml"],[199,200,"pl-ml"],[292,293,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[82,83,"pl-ml"],[95,96,"pl-ml"],[264,265,"pl-ml"],[276,277,"pl-ml"],[341,342,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[69,70,"pl-ml"],[82,83,"pl-ml"],[232,233,"pl-ml"],[245,246,"pl-ml"],[322,323,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[64,65,"pl-ml"],[77,78,"pl-ml"],[184,185,"pl-ml"],[196,197,"pl-ml"],[260,261,"pl-ml"]],[],[],[],[],[],[[0,13,"pl-mh"],[4,13,"pl-en"]],[],[[0,1,"pl-ml"],[5,6,"pl-ml"],[16,17,"pl-ml"],[30,31,"pl-ml"],[50,51,"pl-ml"],[61,62,"pl-ml"],[84,85,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[13,14,"pl-ml"],[17,18,"pl-ml"],[22,23,"pl-ml"],[26,27,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[86,87,"pl-ml"],[99,100,"pl-ml"],[202,203,"pl-ml"],[214,215,"pl-ml"],[273,274,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[80,81,"pl-ml"],[93,94,"pl-ml"],[231,232,"pl-ml"],[243,244,"pl-ml"],[330,331,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[118,119,"pl-ml"],[131,132,"pl-ml"],[235,236,"pl-ml"],[247,248,"pl-ml"],[290,291,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[74,75,"pl-ml"],[87,88,"pl-ml"],[226,227,"pl-ml"],[238,239,"pl-ml"],[319,320,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[73,74,"pl-ml"],[86,87,"pl-ml"],[202,203,"pl-ml"],[214,215,"pl-ml"],[284,285,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[100,101,"pl-ml"],[113,114,"pl-ml"],[251,252,"pl-ml"],[264,265,"pl-ml"],[337,338,"pl-ml"]],[],[],[],[],[],[[0,15,"pl-mh"],[4,15,"pl-en"]],[],[[0,1,"pl-ml"],[5,6,"pl-ml"],[16,17,"pl-ml"],[30,31,"pl-ml"],[50,51,"pl-ml"],[61,62,"pl-ml"],[84,85,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[13,14,"pl-ml"],[17,18,"pl-ml"],[22,23,"pl-ml"],[26,27,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[66,67,"pl-ml"],[78,79,"pl-ml"],[227,228,"pl-ml"],[239,240,"pl-ml"],[293,294,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[71,72,"pl-ml"],[84,85,"pl-ml"],[226,227,"pl-ml"],[238,239,"pl-ml"],[301,302,"pl-ml"]],[],[],[],[],[],[[0,26,"pl-mh"],[4,26,"pl-en"]],[],[[0,1,"pl-ml"],[5,6,"pl-ml"],[16,17,"pl-ml"],[30,31,"pl-ml"],[50,51,"pl-ml"],[61,62,"pl-ml"],[84,85,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[13,14,"pl-ml"],[17,18,"pl-ml"],[22,23,"pl-ml"],[26,27,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[102,103,"pl-ml"],[115,116,"pl-ml"],[261,262,"pl-ml"],[274,275,"pl-ml"],[338,339,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[88,89,"pl-ml"],[101,102,"pl-ml"],[199,200,"pl-ml"],[211,212,"pl-ml"],[270,271,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[73,74,"pl-ml"],[86,87,"pl-ml"],[200,201,"pl-ml"],[212,213,"pl-ml"],[263,264,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[63,64,"pl-ml"],[76,77,"pl-ml"],[202,203,"pl-ml"],[215,216,"pl-ml"],[262,263,"pl-ml"]],[],[],[],[],[],[],[[0,21,"pl-mh"],[4,21,"pl-en"]],[],[[0,1,"pl-ml"],[5,6,"pl-ml"],[16,17,"pl-ml"],[30,31,"pl-ml"],[50,51,"pl-ml"],[61,62,"pl-ml"],[84,85,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[13,14,"pl-ml"],[17,18,"pl-ml"],[22,23,"pl-ml"],[26,27,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[97,98,"pl-ml"],[110,111,"pl-ml"],[230,231,"pl-ml"],[242,243,"pl-ml"],[327,328,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[76,77,"pl-ml"],[89,90,"pl-ml"],[256,257,"pl-ml"],[268,269,"pl-ml"],[328,329,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[71,72,"pl-ml"],[84,85,"pl-ml"],[233,234,"pl-ml"],[245,246,"pl-ml"],[312,313,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[72,73,"pl-ml"],[85,86,"pl-ml"],[249,250,"pl-ml"],[261,262,"pl-ml"],[312,313,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[97,98,"pl-ml"],[110,111,"pl-ml"],[230,231,"pl-ml"],[242,243,"pl-ml"],[288,289,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[97,98,"pl-ml"],[110,111,"pl-ml"],[221,222,"pl-ml"],[233,234,"pl-ml"],[293,294,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[81,82,"pl-ml"],[94,95,"pl-ml"],[237,238,"pl-ml"],[249,250,"pl-ml"],[319,320,"pl-ml"]],[],[],[],[],[],[[0,26,"pl-mh"],[4,26,"pl-en"]],[],[[0,1,"pl-ml"],[5,6,"pl-ml"],[16,17,"pl-ml"],[30,31,"pl-ml"],[50,51,"pl-ml"],[61,62,"pl-ml"],[84,85,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[13,14,"pl-ml"],[17,18,"pl-ml"],[22,23,"pl-ml"],[26,27,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[16,17,"pl-s"],[17,24,"pl-c1"],[24,25,"pl-s"],[75,76,"pl-ml"],[88,89,"pl-ml"],[197,198,"pl-ml"],[209,210,"pl-ml"],[262,263,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[11,12,"pl-s"],[12,28,"pl-c1"],[28,29,"pl-s"],[61,62,"pl-s"],[62,73,"pl-c1"],[73,74,"pl-s"],[120,121,"pl-ml"],[133,134,"pl-ml"],[219,220,"pl-s"],[220,241,"pl-c1"],[241,242,"pl-s"],[306,307,"pl-ml"],[318,319,"pl-ml"],[397,398,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[122,123,"pl-ml"],[135,136,"pl-ml"],[253,254,"pl-ml"],[265,266,"pl-ml"],[327,328,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[103,104,"pl-ml"],[116,117,"pl-ml"],[205,206,"pl-s"],[206,213,"pl-c1"],[213,214,"pl-s"],[294,295,"pl-ml"],[306,307,"pl-ml"],[399,400,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[96,97,"pl-ml"],[109,110,"pl-ml"],[132,133,"pl-s"],[133,149,"pl-c1"],[149,150,"pl-s"],[268,269,"pl-ml"],[280,281,"pl-ml"],[340,341,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[79,80,"pl-ml"],[92,93,"pl-ml"],[284,285,"pl-ml"],[296,297,"pl-ml"],[373,374,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-ml"],[110,111,"pl-ml"],[123,124,"pl-ml"],[227,228,"pl-ml"],[239,240,"pl-ml"],[288,289,"pl-ml"]],[],[[0,27,"pl-mh"],[3,27,"pl-en"]],[],[[0,41,"pl-mh"],[4,41,"pl-en"]],[],[[68,69,"pl-s"],[69,76,"pl-c1"],[76,77,"pl-s"]],[],[],[],[],[],[],[],[[0,30,"pl-mh"],[4,30,"pl-en"]],[],[],[],[],[],[],[],[],[[0,33,"pl-mh"],[4,33,"pl-en"]],[],[],[],[[20,21,"pl-s"],[21,22,"pl-c1"],[22,23,"pl-s"]],[],[],[],[],[],[],[[0,42,"pl-mh"],[4,42,"pl-en"]],[],[],[],[],[],[],[],[[0,38,"pl-mh"],[3,38,"pl-en"]],[],[[0,1,"pl-ml"],[8,9,"pl-ml"],[21,22,"pl-ml"],[33,34,"pl-ml"],[44,45,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[12,13,"pl-ml"],[16,17,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[89,90,"pl-ml"],[130,131,"pl-ml"],[163,164,"pl-ml"]],[[0,1,"pl-ml"],[13,14,"pl-ml"],[90,91,"pl-ml"],[133,134,"pl-ml"],[171,172,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-ml"],[105,106,"pl-ml"],[157,158,"pl-ml"],[209,210,"pl-ml"]],[[0,1,"pl-ml"],[20,21,"pl-ml"],[105,106,"pl-ml"],[156,157,"pl-ml"],[217,218,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[90,91,"pl-ml"],[143,144,"pl-ml"],[212,213,"pl-ml"]],[[0,1,"pl-ml"],[18,19,"pl-ml"],[103,104,"pl-ml"],[151,152,"pl-ml"],[183,184,"pl-ml"]],[[0,1,"pl-ml"],[18,19,"pl-ml"],[60,61,"pl-ml"],[124,125,"pl-ml"],[174,175,"pl-ml"]],[],[[0,30,"pl-mh"],[3,30,"pl-en"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[[15,16,"pl-s"],[16,31,"pl-c1"],[31,32,"pl-s"]],[],[[0,1,"pl-v"]],[],[[2,3,"pl-s"],[3,23,"pl-c1"],[23,24,"pl-s"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,29,"pl-mh"],[3,29,"pl-en"]],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[0,34,"pl-mh"],[3,34,"pl-en"]],[],[],[[0,1,"pl-s"],[8,9,"pl-s"],[9,10,"pl-s"],[10,98,"pl-corl"],[98,99,"pl-s"]],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[],[],[],[],[],[],[],[],[[0,33,"pl-mh"],[3,33,"pl-en"]],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[],[],[],[],[],[[0,40,"pl-mh"],[3,40,"pl-en"]],[],[[0,1,"pl-ml"],[6,7,"pl-ml"],[13,14,"pl-ml"],[58,59,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"],[12,13,"pl-ml"]],[[0,1,"pl-ml"],[82,83,"pl-ml"],[113,114,"pl-ml"],[227,228,"pl-ml"]],[[0,1,"pl-ml"],[146,147,"pl-ml"],[198,199,"pl-ml"],[289,290,"pl-ml"]],[[0,1,"pl-ml"],[41,42,"pl-ml"],[75,76,"pl-ml"],[166,167,"pl-ml"]],[[0,1,"pl-ml"],[33,34,"pl-ml"],[75,76,"pl-ml"],[170,171,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"],[89,90,"pl-ml"],[112,113,"pl-ml"],[254,255,"pl-ml"]],[[0,1,"pl-ml"],[92,93,"pl-ml"],[116,117,"pl-ml"],[253,254,"pl-ml"]],[[0,1,"pl-ml"],[70,71,"pl-ml"],[110,111,"pl-ml"],[187,188,"pl-ml"]],[[0,1,"pl-ml"],[76,77,"pl-ml"],[102,103,"pl-ml"],[196,197,"pl-ml"]],[[0,1,"pl-ml"],[70,71,"pl-ml"],[99,100,"pl-ml"],[227,228,"pl-ml"]],[],[],[],[],[],[],[[58,59,"pl-s"],[59,68,"pl-c1"],[68,69,"pl-s"]],[],[[0,21,"pl-mh"],[3,21,"pl-en"]],[],[[0,1,"pl-ml"],[23,24,"pl-ml"],[54,55,"pl-ml"]],[[0,1,"pl-ml"],[4,5,"pl-ml"],[8,9,"pl-ml"]],[[0,1,"pl-ml"],[29,30,"pl-ml"],[62,63,"pl-ml"]],[[0,1,"pl-ml"],[30,31,"pl-ml"],[47,48,"pl-ml"]],[[0,1,"pl-ml"],[36,37,"pl-ml"],[61,62,"pl-ml"]],[[0,1,"pl-ml"],[29,30,"pl-ml"],[54,55,"pl-ml"]],[[0,1,"pl-ml"],[35,36,"pl-ml"],[68,69,"pl-ml"]],[[0,1,"pl-ml"],[34,35,"pl-ml"],[59,60,"pl-ml"]],[[0,1,"pl-ml"],[29,30,"pl-ml"],[46,47,"pl-ml"]],[[0,1,"pl-ml"],[23,24,"pl-ml"],[48,49,"pl-ml"]],[[0,1,"pl-ml"],[25,26,"pl-ml"],[50,51,"pl-ml"]],[[0,1,"pl-ml"],[16,17,"pl-ml"],[33,34,"pl-ml"]],[[0,1,"pl-ml"],[19,20,"pl-ml"],[52,53,"pl-ml"]],[],[[0,20,"pl-mh"],[3,20,"pl-en"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,4,"pl-s"],[4,13,"pl-c1"],[13,14,"pl-s"],[41,42,"pl-s"],[42,43,"pl-s"],[43,85,"pl-corl"],[85,86,"pl-s"]],[[2,3,"pl-s"],[18,19,"pl-s"],[19,20,"pl-s"],[20,45,"pl-corl"],[45,46,"pl-s"]],[[2,3,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,43,"pl-corl"],[43,44,"pl-s"]],[[2,3,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,39,"pl-corl"],[39,40,"pl-s"]],[[0,1,"pl-v"]],[[2,3,"pl-s"],[3,4,"pl-s"],[4,44,"pl-c1"],[44,45,"pl-s"],[45,46,"pl-s"],[46,47,"pl-s"],[47,131,"pl-corl"],[131,132,"pl-s"]],[[0,1,"pl-v"],[11,12,"pl-s"],[27,28,"pl-s"],[28,29,"pl-s"],[29,123,"pl-corl"],[123,124,"pl-s"]],[[2,3,"pl-s"],[14,15,"pl-s"],[15,16,"pl-s"],[16,137,"pl-corl"],[137,138,"pl-s"]],[[2,3,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,138,"pl-corl"],[138,139,"pl-s"]],[[2,3,"pl-s"],[27,28,"pl-s"],[28,29,"pl-s"],[29,154,"pl-corl"],[154,155,"pl-s"]],[[2,3,"pl-s"],[9,10,"pl-s"],[10,11,"pl-s"],[11,134,"pl-corl"],[134,135,"pl-s"]],[[2,3,"pl-s"],[17,18,"pl-s"],[18,19,"pl-s"],[19,144,"pl-corl"],[144,145,"pl-s"]],[[2,3,"pl-s"],[20,21,"pl-s"],[21,22,"pl-s"],[22,148,"pl-corl"],[148,149,"pl-s"]],[[0,1,"pl-v"],[15,16,"pl-s"],[24,25,"pl-s"],[25,26,"pl-s"],[26,75,"pl-corl"],[75,76,"pl-s"]],[[6,7,"pl-s"],[16,17,"pl-s"],[17,18,"pl-s"],[18,66,"pl-corl"],[66,67,"pl-s"]],[],[],[[0,1,"pl-v"],[11,12,"pl-s"],[29,30,"pl-s"],[30,31,"pl-s"],[31,79,"pl-corl"],[79,80,"pl-s"]],[],[],[],[],[],[],[]],"colorizedLines":null}},"title":"ruv-drone/docs/security/latentmesh-threat-model.md at main · ruvnet/ruv-drone","appPayload":{},"meta":{"title":"ruv-drone/docs/security/latentmesh-threat-model.md at main · ruvnet/ruv-drone"}}</script>
  <div data-target="react-app.reactRoot"><meta name="github-code-view-meta-stats" id="github-code-view-meta-stats" data-hydrostats="publish"/> <!-- --> <a hidden="" id="code-view-repo-link" href="/ruvnet/ruv-drone" data-discover="true"></a> <div class="d-none"></div><div><div style="--spacing:var(--spacing-none)" class="prc-PageLayout-PageLayoutRoot--KH-d" data-component="SplitPageLayout" data-has-sidebar="true"><div class="prc-PageLayout-SidebarWrapper-kLG4B CopilotSidePanelSidebar-module__SidePanel__L3O0C CopilotSidePanelSidebar-module__HiddenSidePanel__TBRGn" style="--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="end" data-sticky="true" data-responsive-variant="fullscreen"><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-SidebarVerticalDivider-0Rl0V" data-component="PageLayout.VerticalDivider" data-variant="line" data-position="end" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="450" aria-valuemax="768" aria-valuenow="544" aria-valuetext="Pane width 544 pixels" tabindex="0"></div></div><div class="prc-PageLayout-Sidebar-iciWg" data-component="SplitPageLayout.Sidebar" data-resizable="true" style="--spacing:var(--spacing-normal);--pane-min-width:450px;--pane-max-width:768px;--pane-width-custom:544px;--pane-width-size:var(--pane-width-custom);--pane-width:544px"><div class="height-full" data-testid="copilot-code-view-side-panel"><div id="copilot-side-panel-content" class="height-full"></div></div></div></div><div class="prc-PageLayout-PageLayoutWrapper-2BhU2" data-width="full"><div class="prc-PageLayout-PageLayoutContent-BneH9"><div id="repos-file-tree-sidebar" class="CodeViewFileTreeLayout-module__sidebar__n_Aau" tabindex="0"><div class="prc-PageLayout-PaneWrapper-pHPop ReposFileTreePane-module__Pane__rBZpI ReposFileTreePane-module__HideTree__AYZnm ReposFileTreePane-module__HidePane__VHAVt" style="--offset-header:0px;--spacing-row:var(--spacing-none);--spacing-column:var(--spacing-none)" data-is-hidden="false" data-position="start" data-sticky="true"><div class="prc-PageLayout-HorizontalDivider-JLVqp prc-PageLayout-PaneHorizontalDivider-9tbnE" data-component="PageLayout.HorizontalDivider" data-variant-regular="none" data-variant-narrow="none" data-position="start" style="--spacing-divider:var(--spacing-none);--spacing:var(--spacing-none)"></div><div class="prc-PageLayout-Pane-AyzHK" data-component="SplitPageLayout.Pane" data-resizable="true" style="--spacing:var(--spacing-none);--pane-min-width:256px;--pane-max-width:calc(100vw - var(--pane-max-width-diff));--pane-width-size:var(--pane-width-large);--pane-width:320px"></div><div class="prc-PageLayout-VerticalDivider-9QRmK prc-PageLayout-PaneVerticalDivider-le57g" data-component="PageLayout.VerticalDivider" data-variant-narrow="none" data-variant-regular="line" data-variant-wide="line" data-position="start" style="--spacing:var(--spacing-none)"><div class="prc-PageLayout-DraggableHandle-9s6B4" data-component="PageLayout.DragHandle" role="slider" aria-label="Draggable pane splitter" aria-valuemin="256" aria-valuemax="600" aria-valuenow="320" aria-valuetext="Pane width 320 pixels" tabindex="0"></div></div></div></div><div data-component="SplitPageLayout.Content" class="prc-PageLayout-ContentWrapper-gR9eG"><div class="prc-PageLayout-Content-xWL-A" data-width="full" style="--spacing:var(--spacing-none)"><div class="SharedPageLayout-module__content__IwGAp" data-selector="repos-split-pane-content" id="repos-split-pane-content" tabindex="0"> <!-- --> <div class="container CodeViewHeader-module__Box__JkPOb"><div class="CodeViewHeader-module__StickyHeader__Qn7UN" id="StickyHeader"><div class="CodeViewHeader-module__Box_1__SbNDV"><div class="CodeViewHeader-module__Box_2__TB46f"><div class="react-code-view-header-wrap--narrow CodeViewHeader-module__Box_3__q1zUL"><div class="CodeViewHeader-module__treeToggleWrapper__RQ__9"><h2 class="use-tree-pane-module__Heading__s4QbZ prc-Heading-Heading-MtWFE" data-component="Heading"><button data-component="Button" type="button" aria-label="Expand file tree" data-testid="expand-file-tree-button-mobile" class="prc-Button-ButtonBase-9n-Xk ExpandFileTreeButton-module__Button_1__Svs95" data-loading="false" data-size="medium" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-left" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M7.78 12.53a.75.75 0 0 1-1.06 0L2.47 8.28a.75.75 0 0 1 0-1.06l4.25-4.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L4.81 7h7.44a.75.75 0 0 1 0 1.5H4.81l2.97 2.97a.75.75 0 0 1 0 1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Files</span></span></button><button data-component="IconButton" type="button" data-testid="expand-file-tree-button" aria-controls="repos-file-tree" class="prc-Button-ButtonBase-9n-Xk position-relative ExpandFileTreeButton-module__expandButton__hDOcv ExpandFileTreeButton-module__filesButtonBreakpoint__zEvz3 fgColor-muted prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-labelledby="_R_4lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-sidebar-collapse" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M6.823 7.823a.25.25 0 0 1 0 .354l-2.396 2.396A.25.25 0 0 1 4 10.396V5.604a.25.25 0 0 1 .427-.177Z"></path><path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25H9.5v-13H1.75a.25.25 0 0 0-.25.25ZM11 14.5h3.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H11Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="se" data-component="Tooltip" aria-hidden="true" id="_R_4lla9lik5_">Expand file tree</span><div class="d-none"></div></h2></div><div class="react-code-view-header-mb--narrow mr-2"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="main branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector-wide"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">main</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="react-code-view-header-mb--narrow CodeViewHeader-module__Box_5__MQ0hL"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__lg__Rjz0A"><nav data-testid="breadcrumbs" aria-labelledby="repos-header-breadcrumb-heading" id="repos-header-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="repos-header-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/ruvnet/ruv-drone/tree/main" data-discover="true">ruv-drone</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/ruvnet/ruv-drone/tree/main/docs" data-discover="true">docs</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/ruvnet/ruv-drone/tree/main/docs/security" data-discover="true">security</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__lg__Rjz0A prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="file-name-id">latentmesh-threat-model.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lla9lik5_">Copy path</span></div></div></div><div class="react-code-view-header-element--wide"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><div><div class="CodeViewHeader-module__FileResultsList__JDzUy"><span class="d-flex FileResultsList-module__FilesSearchBox__ivVkc TextInput-wrapper prc-components-TextInputWrapper-Hpdqi prc-components-TextInputBaseWrapper-wY-n0" data-no-trailing-action="true" data-component="TextInput" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id="_R_1cpla9lik5_" aria-hidden="true" data-component="TextInput.LeadingVisual"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellCheck="false" placeholder="Go to file" aria-describedby="_R_1cpla9lik5_ _R_1cpla9lik5H1_" data-component="input" class="prc-components-Input-IwWrt" value=""/><span class="TextInput-icon" id="_R_1cpla9lik5H1_" aria-hidden="true" data-component="TextInput.TrailingVisual"></span></span></div><div class="d-none"></div></div><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-wide" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_7p9la9lik5_" id="_R_99la9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_7p9la9lik5_">More file actions</span></div></div></div><div class="react-code-view-header-element--narrow"><div class="CodeViewHeader-module__Box_7___0R6c"><div class="d-flex gap-2"><button data-component="Button" type="button" style="display:none" class="prc-Button-ButtonBase-9n-Xk NavigationMenu-module__Button__LpKgm" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Blame</span></span></button><div class="d-none"></div><button data-component="IconButton" type="button" data-testid="more-file-actions-button-nav-menu-narrow" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click NavigationMenu-module__IconButton__HpX3G prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-labelledby="_R_7pdla9lik5_" id="_R_9dla9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_7pdla9lik5_">More file actions</span></div></div></div></div></div></div></div><div class="CodeView-module__contentWrapper__cG2JH"><div class="react-code-view-bottom-padding"><div class="BlobTopBanners-module__Box__v_nvx"></div></div> <div class="d-none"></div><div class="d-flex flex-column border rounded-2 tmp-mb-3 pl-1"><div class="LatestCommit-module__Box__B25ZT"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">History</h2><a data-component="LinkButton" href="/ruvnet/ruv-drone/commits/main/docs/security/latentmesh-threat-model.md" class="prc-Button-ButtonBase-9n-Xk d-none d-lg-flex LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><span class="fgColor-default">History</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><a data-component="LinkButton" aria-label="View commit history for this file." href="/ruvnet/ruv-drone/commits/main/docs/security/latentmesh-threat-model.md" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby="_R_4mlala9lik5_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" role="tooltip" aria-hidden="true" id="_R_4mlala9lik5_">History</span></div></div></div></div></div><div class="d-flex flex-row"><div class="container BlobViewContent-module__blobContainer__DtH2d"><div class="react-code-size-details-banner BlobViewContent-module__codeSizeDetails__e5sUw"><div class="react-code-size-details-banner CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="31.1 KB" style="--truncate-max-width:100%"><span>410 lines (336 loc) · 31.1 KB</span></div></div></div></div><div class="react-blob-view-header-sticky BlobViewContent-module__stickyHeader__VwxB5" id="repos-sticky-header"><div class="BlobViewHeader-module__Box__yhm9u"><div class="react-blob-sticky-header"><div class="FileNameStickyHeader-module__outerWrapper__ZL4Xc FileNameStickyHeader-module__outerWrapperHidden__Zpynk"><div class="FileNameStickyHeader-module__Box_1__Hazu5"><div class="FileNameStickyHeader-module__Box_2__hoolP"><div class="FileNameStickyHeader-module__Box_3__MVKsk"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="main branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">main</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="FileNameStickyHeader-module__Box_4__FLhtt"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__md__Wb1Gs"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/ruvnet/ruv-drone/tree/main" data-discover="true">ruv-drone</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/ruvnet/ruv-drone/tree/main/docs" data-discover="true">docs</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/ruvnet/ruv-drone/tree/main/docs/security" data-discover="true">security</a></li></ol></nav><div data-testid="breadcrumbs-filename" class="Breadcrumb-module__filename__equZR"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><h1 class="Breadcrumb-module__filenameHeading__MNMtw Breadcrumb-module__md__Wb1Gs prc-Heading-Heading-MtWFE" data-component="Heading" tabindex="-1" id="sticky-file-name-id">latentmesh-threat-model.md</h1></div><button data-component="IconButton" type="button" class="prc-Button-ButtonBase-9n-Xk ml-2 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_7lcpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="CopyToClipboardIconButton-module__tooltip__WyiwL prc-TooltipV2-Tooltip-tLeuB" data-direction="s" data-component="Tooltip" aria-label="Copy path" aria-hidden="true" id="_R_7lcpala9lik5_">Copy path</span></div></div></div><button data-component="Button" type="button" class="prc-Button-ButtonBase-9n-Xk FileNameStickyHeader-module__Button__LSEU_ FileNameStickyHeader-module__GoToTopButton__nxAFn" data-loading="false" data-size="small" data-variant="invisible"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-arrow-up" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M3.47 7.78a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018L9 4.81v7.44a.75.75 0 0 1-1.5 0V4.81L4.53 7.78a.75.75 0 0 1-1.06 0Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3">Top</span></span></button></div></div></div><div class="BlobViewHeader-module__Box_1__VEmuQ"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading">File metadata and controls</h2><div class="BlobViewHeader-module__Box_2__icUs2"><ul aria-label="File view" class="prc-SegmentedControl-SegmentedControl-lqIXp BlobTabButtons-module__SegmentedControl__jen2u" data-variant="default" data-size="small" data-component="SegmentedControl"><li class="prc-SegmentedControl-Item-tSCQh" data-selected="" data-component="SegmentedControl.Button"><button aria-pressed="true" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:transparent"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Preview">Preview</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Code">Code</div></span></button></li><li class="prc-SegmentedControl-Item-tSCQh" data-component="SegmentedControl.Button"><button aria-pressed="false" class="prc-SegmentedControl-Button-E48xz" type="button" style="--separator-color:var(--borderColor-default)"><span class="prc-SegmentedControl-Content-1COlk segmentedControl-content"><div class="prc-SegmentedControl-Text-7S2y2 segmentedControl-text" data-text="Blame">Blame</div></span></button></li></ul><div class="d-none"></div><div class="react-code-size-details-in-header CodeSizeDetails-module__Box__VcD6l"><div class="text-mono CodeSizeDetails-module__Box_1__GVxQL"><div data-testid="blob-size" class="CodeSizeDetails-module__Truncate_1__lE93V prc-Truncate-Truncate-2G1eo" data-inline="true" title="31.1 KB" style="--truncate-max-width:100%"><span>410 lines (336 loc) · 31.1 KB</span></div></div></div></div><div class="BlobViewHeader-module__Box_3__ng6v2"><div class="d-none"></div><div class="react-blob-header-edit-and-raw-actions BlobViewHeader-module__Box_4__J4Y4W"><div class="d-none"></div><div class="prc-ButtonGroup-ButtonGroup-vFUrY" data-component="ButtonGroup"><div class="prc-ButtonGroup-Item-PqvDl"><a data-component="LinkButton" href="https://github.com/ruvnet/ruv-drone/raw/refs/heads/main/docs/security/latentmesh-threat-model.md" data-testid="raw-button" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov BlobViewHeader-module__LinkButton__X9kx2" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Raw</span></span></a></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="copy-raw-button" class="prc-Button-ButtonBase-9n-Xk prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_qaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_qaucpala9lik5_">Copy raw file</span></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="download-raw-button" class="prc-Button-ButtonBase-9n-Xk BlobViewHeader-module__downloadButton__ef459 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_eaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_eaucpala9lik5_">Download raw file</span></div></div></div><button data-component="IconButton" type="button" aria-pressed="false" class="prc-Button-ButtonBase-9n-Xk tmp-mr-2 TableOfContents-module__IconButton__jrlNM prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_3ucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_3ucpala9lik5_">Outline</span><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click BlobViewHeader-module__IconButton__XrMQY prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_fkecpala9lik5_" id="_R_kecpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_fkecpala9lik5_">Edit and raw actions</span></div></div></div></div><div></div></div><div class="BlobViewContent-module__blobContentWrapper__JS0W6"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="BlobContent-module__blobContentSection__VOgZq BlobContent-module__blobContentSectionMarkdown__mPLOK" style="margin-top:46px"><div class="js-snippet-clipboard-copy-unpositioned BlobContent-module__markdownBlob__T8jpG" data-hpc="true" containertiming="hpc"><article class="markdown-body entry-content container-lg" itemprop="text"><div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">LatentMesh communications threat model</h1><a id="user-content-latentmesh-communications-threat-model" class="anchor" aria-label="Permalink: LatentMesh communications threat model" href="#latentmesh-communications-threat-model"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>System</strong></td>
<td><code>ruv-drone</code> LatentMesh communications and advisory orchestration plane</td>
</tr>
<tr>
<td><strong>Method</strong></td>
<td>STRIDE plus aviation authority-boundary analysis</td>
</tr>
<tr>
<td><strong>Date</strong></td>
<td>2026-09-01</td>
</tr>
<tr>
<td><strong>Baseline</strong></td>
<td><code>ruv-drone@cfe8b662bd648e9ea19a4047275dfce2c5c8e699</code></td>
</tr>
<tr>
<td><strong>LatentMesh source</strong></td>
<td><code>ruvnet/LatentMesh@1ff7332c17798eec3b42da5c6f1c271f355fa806</code></td>
</tr>
<tr>
<td><strong>Architecture</strong></td>
<td><a href="/ruvnet/ruv-drone/blob/main/docs/adr/ADR-173-latentmesh-comms-orchestration.md">ADR-173</a></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Executive security decision</h2><a id="user-content-executive-security-decision" class="anchor" aria-label="Permalink: Executive security decision" href="#executive-security-decision"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">LatentMesh is permitted to carry authenticated deterministic observations and
bounded advisory orchestration facts. It is prohibited from all actuator,
arming, flight-mode, attitude, velocity-command, geofence, collision-avoidance,
and onboard fail-safe authority paths.</p>
<p dir="auto">This is the primary risk control. Cryptography authenticates who made a claim;
it does not make the claim safe, current, accurate, or authorized. Every valid
message remains untrusted for flight authority. The receiver writes only to a
short-lived advisory store whose type and module dependencies expose no flight
command interface.</p>
<p dir="auto">The release is blocked if any LatentMesh input can call a <code>FlightController</code>,
mutate local <code>MeshTopology</code> used for safety distance, alter <code>Geofence</code>, drive a
local <code>FailSafeMachine</code>, or create an unmanifested mission action.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Scope</h2><a id="user-content-scope" class="anchor" aria-label="Permalink: Scope" href="#scope"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">In scope</h3><a id="user-content-in-scope" class="anchor" aria-label="Permalink: In scope" href="#in-scope"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li>Optional <code>latentmesh-air-core</code> dependency and the local state, publisher,
verifier, reassembly, replay, freshness, advisory-store, and policy adapters.</li>
<li>WiFi, BLE, and Meshtastic Air profiles from byte ingress to advisory-state
expiry.</li>
<li>Ed25519 identity, peer enrollment, rotation, revocation, sequence state, and
configuration used by the integration.</li>
<li>Availability, integrity, privacy, observability, update, rollout, and
rollback risks on a companion computer.</li>
<li>The boundary to existing orchestration, topology, local safety, and autopilot
integration.</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Out of scope, but adjacent</h3><a id="user-content-out-of-scope-but-adjacent" class="anchor" aria-label="Permalink: Out of scope, but adjacent" href="#out-of-scope-but-adjacent"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Radio firmware, RF jamming prevention, WiFi/BLE/Meshtastic link-layer keying,
autopilot firmware internals, physical capture, ground-station account
security, operating-system hardening, and national radio/export compliance are
owned by their respective deployment controls. They are considered external
dependencies in abuse cases, not silently assumed secure.</p>
<p dir="auto">No live network probing, RF transmission, credential test, or production scan
was performed for this document. This is a source-backed architecture threat
model, not a penetration-test report or aviation certification artifact.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">System model</h2><a id="user-content-system-model" class="anchor" aria-label="Permalink: System model" href="#system-model"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Data-flow and trust boundaries</h3><a id="user-content-data-flow-and-trust-boundaries" class="anchor" aria-label="Permalink: Data-flow and trust boundaries" href="#data-flow-and-trust-boundaries"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<section class="js-render-needs-enrichment render-needs-enrichment position-relative" data-identity="60b1c412-ac3c-4b83-a750-6c494bbc5617" data-host="https://viewscreen.githubusercontent.com" data-src="https://viewscreen.githubusercontent.com/markdown/mermaid?docs_host=https%3A%2F%2Fdocs.github.com" data-type="mermaid" aria-label="mermaid rendered output container">
  <div class="js-render-enrichment-target" data-json="{&quot;data&quot;:&quot;flowchart TB\n    P[\&quot;Remote peer\&quot;] --&gt;|\&quot;hostile frames\&quot;| T[\&quot;Transport adapter\&quot;]\n    T --&gt;|\&quot;TB1: expected source and bytes\&quot;| R[\&quot;Bounded per-source reassembly\&quot;]\n    R --&gt;|\&quot;TB2: complete untrusted envelope\&quot;| V[\&quot;Signature and semantic admission\&quot;]\n    V --&gt;|\&quot;TB3: authenticated advisory state\&quot;| A[\&quot;TTL advisory store\&quot;]\n    A --&gt;|\&quot;TB4: reduced authority facts\&quot;| O[\&quot;Local mission policy\&quot;]\n    F[\&quot;Flight and safety interfaces remain separate\&quot;]\n&quot;}" data-plain="flowchart TB
    P[&quot;Remote peer&quot;] --&gt;|&quot;hostile frames&quot;| T[&quot;Transport adapter&quot;]
    T --&gt;|&quot;TB1: expected source and bytes&quot;| R[&quot;Bounded per-source reassembly&quot;]
    R --&gt;|&quot;TB2: complete untrusted envelope&quot;| V[&quot;Signature and semantic admission&quot;]
    V --&gt;|&quot;TB3: authenticated advisory state&quot;| A[&quot;TTL advisory store&quot;]
    A --&gt;|&quot;TB4: reduced authority facts&quot;| O[&quot;Local mission policy&quot;]
    F[&quot;Flight and safety interfaces remain separate&quot;]
" dir="auto">
    <div class="render-plaintext-hidden" dir="auto">
      <pre lang="mermaid" aria-label="Raw mermaid code">flowchart TB
    P["Remote peer"] --&gt;|"hostile frames"| T["Transport adapter"]
    T --&gt;|"TB1: expected source and bytes"| R["Bounded per-source reassembly"]
    R --&gt;|"TB2: complete untrusted envelope"| V["Signature and semantic admission"]
    V --&gt;|"TB3: authenticated advisory state"| A["TTL advisory store"]
    A --&gt;|"TB4: reduced authority facts"| O["Local mission policy"]
    F["Flight and safety interfaces remain separate"]
</pre>
    </div>
  </div>
  <span class="js-render-enrichment-loader d-flex flex-justify-center flex-items-center width-full" style="min-height:100px" role="presentation">
    <span data-view-component="true">
  <svg style="box-sizing: content-box; color: var(--color-icon-primary);" width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" data-view-component="true" class="octospinner mx-auto tmp-mx-auto anim-rotate">
    <circle cx="8" cy="8" r="7" stroke="currentColor" stroke-opacity="0.25" stroke-width="2" vector-effect="non-scaling-stroke" fill="none"></circle>
    <path d="M15 8a7.002 7.002 0 00-7-7" stroke="currentColor" stroke-width="2" stroke-linecap="round" vector-effect="non-scaling-stroke"></path>
</svg>    <span class="sr-only">Loading</span>
</span>
  </span>
</section>

<p dir="auto">TB0, not shown, is the operator/configuration boundary around key material,
peer/endpoint enrollment, deployment lifecycle, limits, checkpoint persistence,
and optional audit export. TB1 data is wholly
hostile. TB2 has passed fixed frame CRC and reassembly but has not passed
authentication. TB3 is authenticated and schema-valid but still advisory.
TB4 permits only locally manifest-bounded orchestration. The flight and safety
boundary is not crossed.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Assets</h3><a id="user-content-assets" class="anchor" aria-label="Permalink: Assets" href="#assets"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Asset</th>
<th>Required property</th>
<th>Classification</th>
</tr>
</thead>
<tbody>
<tr>
<td>Local flight and safety authority</td>
<td>Never influenced directly by LatentMesh</td>
<td>Safety authoritative</td>
</tr>
<tr>
<td>Advisory peer state</td>
<td>Authentic source, exact symbolic integrity, fresh, bounded</td>
<td>Operational sensitive</td>
</tr>
<tr>
<td>Mission manifest and policy</td>
<td>Local-only integrity and controlled change</td>
<td>Safety related configuration</td>
</tr>
<tr>
<td>Signing private key</td>
<td>Confidential, non-exportable where available, rotatable</td>
<td>Secret</td>
</tr>
<tr>
<td>Peer key registry and replay high-water marks</td>
<td>Integrity, availability, durable across restart</td>
<td>Security state</td>
</tr>
<tr>
<td>Location, heading, altitude, task and link metadata</td>
<td>Confidentiality and retention minimization</td>
<td>Operational sensitive</td>
</tr>
<tr>
<td>Parser/reassembler resources</td>
<td>Bounded memory, CPU, contexts, and time</td>
<td>Availability critical</td>
</tr>
<tr>
<td>Decision receipts and metrics</td>
<td>Complete enough for incident response, no sensitive payload</td>
<td>Internal audit</td>
</tr>
<tr>
<td>Dependency and schema identity</td>
<td>Exact provenance and compatibility</td>
<td>Supply-chain control</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Threat actors</h3><a id="user-content-threat-actors" class="anchor" aria-label="Permalink: Threat actors" href="#threat-actors"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ol dir="auto">
<li>An unauthenticated remote transmitter able to inject, replay, reorder, delay,
truncate, or flood link traffic.</li>
<li>A passive observer able to collect packets and traffic patterns.</li>
<li>A compromised enrolled peer holding a valid signing key and able to lie
about its own state.</li>
<li>An operator or local process with configuration access but no intended
authority to change flight behavior.</li>
<li>A compromised transport adapter, companion-computer process, dependency, CI
job, or artifact source.</li>
<li>Nonmalicious radio corruption, clock drift, restart, packet loss, duplicate
delivery, schema mismatch, and resource exhaustion.</li>
</ol>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Security invariants</h2><a id="user-content-security-invariants" class="anchor" aria-label="Permalink: Security invariants" href="#security-invariants"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>ID</th>
<th>Invariant</th>
</tr>
</thead>
<tbody>
<tr>
<td>SI-01</td>
<td>LatentMesh types and modules cannot access actuator, arming, mode, attitude, velocity-command, geofence, collision-avoidance, or local fail-safe mutation interfaces.</td>
</tr>
<tr>
<td>SI-02</td>
<td>Every production envelope is signed and strictly verified against an enrolled source/profile binding. Secure transport alone is insufficient.</td>
</tr>
<tr>
<td>SI-03</td>
<td>Bounds and CRC are checked before proportional allocation; a hard source cap, per-source contexts/rate, and adapter budgets bound work before signature verification.</td>
</tr>
<tr>
<td>SI-04</td>
<td>Replay state commits only after full reassembly and all authentication, binding, freshness, schema, range, and hash checks succeed.</td>
</tr>
<tr>
<td>SI-05</td>
<td>Critical state uses canonical deterministic symbols and exact base/result hashes. Unknown, partial, wrong-type, nonfinite, and out-of-range state fails closed.</td>
</tr>
<tr>
<td>SI-06</td>
<td>A state envelope containing any learned residual is rejected in full without snapshot or replay change. Residual values never enter orchestration or safety.</td>
</tr>
<tr>
<td>SI-07</td>
<td><code>SemanticClass::Control</code> is forbidden even when signed. Message priority changes scheduling only within resource limits; it never changes authority.</td>
</tr>
<tr>
<td>SI-08</td>
<td>Peer-reported battery, link, position, velocity, and fail-safe values can only reduce remote peer eligibility or support observability. They cannot expand local authority.</td>
</tr>
<tr>
<td>SI-09</td>
<td>Missing key, verifier, baseline, time health, schema, endpoint enrollment, or replay checkpoint reduces capability. It never enables a permissive mode.</td>
</tr>
<tr>
<td>SI-10</td>
<td>Disable and rollback are local operations, require no network, and preserve existing flight and safety behavior.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Risk method</h2><a id="user-content-risk-method" class="anchor" aria-label="Permalink: Risk method" href="#risk-method"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Likelihood and impact are ordinal estimates from 1 to 5. The pre-control score
is <code>likelihood * impact</code>: 1 to 4 low, 5 to 9 moderate, 10 to 14 high, and 15 to
25 critical. Residual ratings assume all named controls and tests are present.
A critical or high residual risk blocks release unless an authorized maintainer
records an owner, compensating control, and deadline.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">STRIDE analysis</h2><a id="user-content-stride-analysis" class="anchor" aria-label="Permalink: STRIDE analysis" href="#stride-analysis"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Spoofing</h3><a id="user-content-spoofing" class="anchor" aria-label="Permalink: Spoofing" href="#spoofing"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>ID</th>
<th>Scenario</th>
<th align="right">Pre-control</th>
<th>Required controls</th>
<th align="right">Residual</th>
<th>Verification / owner</th>
</tr>
</thead>
<tbody>
<tr>
<td>S-01</td>
<td>Unenrolled sender forges a peer state or uses another source ID.</td>
<td align="right">4 x 5 = 20</td>
<td>Mandatory Ed25519 signature, strict verification, source ID to key binding, no default trust key.</td>
<td align="right">1 x 5 = 5</td>
<td>Wrong, absent, random, and altered signatures reject before replay commit. Security owner.</td>
</tr>
<tr>
<td>S-02</td>
<td>Sender changes transport identity or profile to evade per-source policy.</td>
<td align="right">3 x 4 = 12</td>
<td>Bind deployment endpoint to expected source, fix the Air profile per receiver, then bind signed source to its key after reassembly; retain aggregate source/rate caps.</td>
<td align="right">1 x 4 = 4</td>
<td>Cross-profile and expected-source mismatch tests. Comms owner.</td>
</tr>
<tr>
<td>S-03</td>
<td>Attacker races a local key cutover or reuses a revoked key.</td>
<td align="right">3 x 5 = 15</td>
<td>One active built-in key per source, rebuild from replay checkpoint on replacement/removal or use an atomic external lookup, no remote rotation API.</td>
<td align="right">2 x 5 = 10</td>
<td>Rotation/revocation integration test and operator runbook. Security owner.</td>
</tr>
<tr>
<td>S-04</td>
<td>Link encryption is mistaken for sender authentication.</td>
<td align="right">3 x 5 = 15</td>
<td>Envelope signature remains mandatory on WiFi, BLE, and Meshtastic; channel PSK is defense in depth only.</td>
<td align="right">1 x 5 = 5</td>
<td>Signed-envelope gate tested on every profile. Security owner.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">S-03 remains high until production key rotation and revocation are exercised on
the target deployment. It is a release blocker for fleet advisory mode, though
not for loopback or shadow mode with fixture identities.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Tampering</h3><a id="user-content-tampering" class="anchor" aria-label="Permalink: Tampering" href="#tampering"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>ID</th>
<th>Scenario</th>
<th align="right">Pre-control</th>
<th>Required controls</th>
<th align="right">Residual</th>
<th>Verification / owner</th>
</tr>
</thead>
<tbody>
<tr>
<td>T-01</td>
<td>Bits, header lengths, class, priority, state tag, or body change in transit.</td>
<td align="right">4 x 4 = 16</td>
<td>Fixed bounds, CRC32C for corruption, signed canonical envelope for authenticity, outer/body binding.</td>
<td align="right">1 x 4 = 4</td>
<td>Mutation corpus across every byte range. Protocol owner.</td>
</tr>
<tr>
<td>T-02</td>
<td>Fragments from different peers/messages are spliced into one envelope.</td>
<td align="right">4 x 4 = 16</td>
<td>Separate reassembler per enrolled peer; context metadata consistency; conflicting duplicate rejection; signature after full reassembly.</td>
<td align="right">1 x 4 = 4</td>
<td>Cross-peer, out-of-order, duplicate, and conflicting-fragment tests. Protocol owner.</td>
</tr>
<tr>
<td>T-03</td>
<td>Valid envelope contains wrong base hash, result hash, duplicate field, unknown field, or noncanonical order.</td>
<td align="right">3 x 4 = 12</td>
<td>Canonical LMAD decode, exact base/result application, complete local schema, unknown-field rejection.</td>
<td align="right">1 x 4 = 4</td>
<td>Hash/schema negative tests. State owner.</td>
</tr>
<tr>
<td>T-04</td>
<td>Compromised enrolled peer signs false but well-formed telemetry.</td>
<td align="right">4 x 4 = 16</td>
<td>Advisory-only type, source-scoped effect, plausible ranges, local observations dominate, task eligibility can decrease only, revocation.</td>
<td align="right">3 x 3 = 9</td>
<td>Byzantine peer scenario; compare no flight/safety calls. Mission-policy owner.</td>
</tr>
<tr>
<td>T-05</td>
<td>Dependency, lockfile, schema field ID, or golden vector drifts.</td>
<td align="right">3 x 5 = 15</td>
<td>Exact git revision, reviewed lockfile, immutable field IDs, upstream golden vectors, dependency and license scan.</td>
<td align="right">1 x 5 = 5</td>
<td>Metadata pin check, golden-vector test, diff review. Release owner.</td>
</tr>
<tr>
<td>T-06</td>
<td>Local runtime config is altered to raise limits, accept unsigned state, or enable control.</td>
<td align="right">3 x 5 = 15</td>
<td>No unsigned option in production type, local file permissions, bounded hard caps, immutable forbidden classes, config provenance audit.</td>
<td align="right">2 x 5 = 10</td>
<td>Negative config tests and deployment permission check. Platform owner.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">T-04 is fundamental: signatures establish provenance, not truth. T-06 remains
high until the deployment supplies a protected configuration source and an
audited change path.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Repudiation</h3><a id="user-content-repudiation" class="anchor" aria-label="Permalink: Repudiation" href="#repudiation"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>ID</th>
<th>Scenario</th>
<th align="right">Pre-control</th>
<th>Required controls</th>
<th align="right">Residual</th>
<th>Verification / owner</th>
</tr>
</thead>
<tbody>
<tr>
<td>R-01</td>
<td>Peer or operator denies a message or admission decision.</td>
<td align="right">3 x 3 = 9</td>
<td>Record key fingerprint, signed state hash, epoch, sequence, profile, decision, time bucket, and code/config identity; optional append-only export.</td>
<td align="right">2 x 3 = 6</td>
<td>Receipt field and redaction test. Operations owner.</td>
</tr>
<tr>
<td>R-02</td>
<td>Audit evidence is altered or gaps are hidden during overload.</td>
<td align="right">3 x 4 = 12</td>
<td>Monotonic counters, bounded local queue, explicit dropped-audit counter, remote append-only sink where required, synchronized clock health.</td>
<td align="right">2 x 4 = 8</td>
<td>Saturation test and sink integrity review. Operations owner.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">Receipts deliberately omit the raw payload. A dispute that requires content
reconstruction needs a separately authorized flight/mission recorder with its
own retention and privacy controls.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Information disclosure</h3><a id="user-content-information-disclosure" class="anchor" aria-label="Permalink: Information disclosure" href="#information-disclosure"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>ID</th>
<th>Scenario</th>
<th align="right">Pre-control</th>
<th>Required controls</th>
<th align="right">Residual</th>
<th>Verification / owner</th>
</tr>
</thead>
<tbody>
<tr>
<td>I-01</td>
<td>Passive observer learns location, altitude, movement, mission activity, or fleet membership.</td>
<td align="right">4 x 4 = 16</td>
<td>Use transport encryption where legal and available, minimize fields/rate, pseudonymous rotating transport identifiers, profile-specific policy.</td>
<td align="right">3 x 4 = 12</td>
<td>Packet-capture review on deployment transport. Privacy owner.</td>
</tr>
<tr>
<td>I-02</td>
<td>Logs or metrics expose coordinates, payloads, source IDs, signatures, or keys.</td>
<td align="right">3 x 5 = 15</td>
<td>Allowlisted structured fields, bounded labels, no raw payload, secret scanner, redaction tests.</td>
<td align="right">1 x 5 = 5</td>
<td>Observability privacy acceptance test. Operations owner.</td>
</tr>
<tr>
<td>I-03</td>
<td>Traffic size and timing reveal task events even when encrypted.</td>
<td align="right">4 x 3 = 12</td>
<td>Rate shaping where airtime permits, fixed scheduling classes, batching, no claim that signatures hide metadata.</td>
<td align="right">3 x 3 = 9</td>
<td>Traffic-analysis exercise. Privacy/comms owners.</td>
</tr>
<tr>
<td>I-04</td>
<td>Crash dump or swap captures private signing material.</td>
<td align="right">2 x 5 = 10</td>
<td>Injected key provider, non-exportable hardware key where available, zeroization, core-dump policy, least-privilege process.</td>
<td align="right">2 x 5 = 10</td>
<td>Platform key-storage review. Security owner.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">I-01 is the largest unmitigated privacy risk because LatentMesh Air provides
authentication but intentionally does not provide protocol-core encryption.
Fleet advisory deployment requires an explicit transport-confidentiality or
documented data-minimization decision.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Denial of service</h3><a id="user-content-denial-of-service" class="anchor" aria-label="Permalink: Denial of service" href="#denial-of-service"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>ID</th>
<th>Scenario</th>
<th align="right">Pre-control</th>
<th>Required controls</th>
<th align="right">Residual</th>
<th>Verification / owner</th>
</tr>
</thead>
<tbody>
<tr>
<td>D-01</td>
<td>Oversized, truncated, pathological length, count, or version consumes memory or panics.</td>
<td align="right">5 x 4 = 20</td>
<td>Fixed bounds before allocation, checked arithmetic, 4,096-byte local message cap, fuzzing, no unsafe code in adapter.</td>
<td align="right">1 x 4 = 4</td>
<td>Length 0 through 8,192 and count 0 through 255 corpus plus fuzzer. Protocol owner.</td>
</tr>
<tr>
<td>D-02</td>
<td>Fragment flood fills all contexts before signature can be checked.</td>
<td align="right">5 x 4 = 20</td>
<td>Four contexts per source, 32 default sources, 512 KiB default payload ceiling, 256 hard source cap, per-source fixed-window rate, and deterministic absolute expiry.</td>
<td align="right">2 x 4 = 8</td>
<td>Peak-allocation and context saturation test. Comms owner.</td>
</tr>
<tr>
<td>D-03</td>
<td>Attackers force expensive Ed25519 checks or semantic hashing.</td>
<td align="right">4 x 3 = 12</td>
<td>Cheap frame/profile/source/rate checks first, 4,096-byte complete-envelope cap, aggregate bound from source and rate caps, transport backpressure.</td>
<td align="right">2 x 3 = 6</td>
<td>Signature-flood benchmark and backpressure test. Security owner.</td>
</tr>
<tr>
<td>D-04</td>
<td>Replay, exact duplicates, or reordered fragments amplify work.</td>
<td align="right">5 x 3 = 15</td>
<td>Idempotent exact in-flight duplicate, bounded reassembly, replay classify/commit only after full verified admission, adapter-level endpoint blocking when abused.</td>
<td align="right">1 x 3 = 3</td>
<td>Replay ordering acceptance test. Protocol owner.</td>
</tr>
<tr>
<td>D-05</td>
<td>Slow-fragment attack retains contexts for a long locally configured Meshtastic timeout.</td>
<td align="right">4 x 3 = 12</td>
<td>Adapter airtime/byte budget, per-source context cap, absolute first-fragment deadline, reject new contexts when full.</td>
<td align="right">2 x 3 = 6</td>
<td>Fake-clock slow-fragment test. Comms owner.</td>
</tr>
<tr>
<td>D-06</td>
<td>RF jamming, link outage, adapter crash, or duty-cycle exhaustion removes advisory data.</td>
<td align="right">4 x 3 = 12</td>
<td>No safety dependence, snapshot TTL, local autonomous behavior, health alert, adapter restart, local disable.</td>
<td align="right">1 x 3 = 3</td>
<td>Link-cut and process-restart scenario. Flight-test owner.</td>
</tr>
<tr>
<td>D-07</td>
<td>Peer-controlled metric values create cardinality or logging exhaustion.</td>
<td align="right">4 x 3 = 12</td>
<td>Built-in metrics retain only fixed aggregate counters; any deployment exporter forbids peer/message labels and bounds optional audit output.</td>
<td align="right">1 x 3 = 3</td>
<td>Metrics/debug redaction test and exporter review. Operations owner.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">Fragment authentication cannot occur until the signed envelope is complete.
Consequently D-02 controls are mandatory even with perfect signatures. A
deployment endpoint binding is not trusted enough to replace aggregate bounds.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Elevation of privilege</h3><a id="user-content-elevation-of-privilege" class="anchor" aria-label="Permalink: Elevation of privilege" href="#elevation-of-privilege"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>ID</th>
<th>Scenario</th>
<th align="right">Pre-control</th>
<th>Required controls</th>
<th align="right">Residual</th>
<th>Verification / owner</th>
</tr>
</thead>
<tbody>
<tr>
<td>E-01</td>
<td>Signed <code>Control</code> or high-priority message reaches a command path.</td>
<td align="right">4 x 5 = 20</td>
<td>Reject Control unconditionally; priority affects bounded scheduling only; no command-capable field schema.</td>
<td align="right">1 x 5 = 5</td>
<td>Signed-Control zero-call test. Architecture owner.</td>
</tr>
<tr>
<td>E-02</td>
<td>A <code>VerifiedAdvisory</code> is inserted into authoritative <code>peer_states</code> and influences collision or fail-safe logic.</td>
<td align="right">4 x 5 = 20</td>
<td>Private-construction wrapper and trust fields, read-only public accessors, separate <code>latentmesh_advisories</code> map, reduce-only predicate, no mutable topology/safety handle.</td>
<td align="right">1 x 5 = 5</td>
<td>Orchestrator separation and unchanged-local-safety test. Architecture owner.</td>
</tr>
<tr>
<td>E-03</td>
<td>Position, velocity, heading, altitude, or peer fail-safe observation is reinterpreted as a local setpoint/state.</td>
<td align="right">4 x 5 = 20</td>
<td>Field-consumer allowlist, observability-only projection, no ROS 2/uXRCE-DDS/MAVLink publisher in LatentMesh module.</td>
<td align="right">1 x 5 = 5</td>
<td>Dependency grep plus integration mock. Flight-safety owner.</td>
</tr>
<tr>
<td>E-04</td>
<td>Learned residual, confidence, or neural output creates or modifies a critical symbol or task.</td>
<td align="right">3 x 5 = 15</td>
<td>Reject the whole residual-bearing state envelope; scheduler evidence can yield only an <code>Observe</code> delivery treatment and has no decoder/state consumer; suppression metric only.</td>
<td align="right">1 x 5 = 5</td>
<td>Maximal residual rejects with no snapshot/replay change; evidence-gate tests. State owner.</td>
</tr>
<tr>
<td>E-05</td>
<td>Old epoch, receiver restart, sequence wrap, or clock failure restores stale influence.</td>
<td align="right">4 x 4 = 16</td>
<td>Deployment-persisted <code>ReplayCheckpoint</code>, logical high-water, 16-bit per-source/epoch replay window, age/skew checks, mandatory newer keyframe after restore.</td>
<td align="right">1 x 4 = 4</td>
<td>Restart, wrap, old/new epoch, skew tests. Security owner.</td>
</tr>
<tr>
<td>E-06</td>
<td>Compromised peer invents task coordinates or a new mission objective.</td>
<td align="right">3 x 5 = 15</td>
<td>Default-empty local manifest allowlist; nonzero opaque ID; local-only approve/revoke; proposal contains only participant/TTL/effort bounds and no coordinates, setpoints, or executable body.</td>
<td align="right">1 x 5 = 5</td>
<td>Unknown, zero, approved, and revoked manifest tests. Mission-policy owner.</td>
</tr>
<tr>
<td>E-07</td>
<td>Remote message enables the feature, changes keys/limits, unblocks an endpoint, or triggers rollback.</td>
<td align="right">3 x 5 = 15</td>
<td>Configuration is local-only and not represented in admitted Air schema; operator capability required.</td>
<td align="right">1 x 5 = 5</td>
<td>Remote-config negative corpus. Platform owner.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Abuse-case walk-throughs</h2><a id="user-content-abuse-case-walk-throughs" class="anchor" aria-label="Permalink: Abuse-case walk-throughs" href="#abuse-case-walk-throughs"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Valid key, malicious velocity command</h3><a id="user-content-valid-key-malicious-velocity-command" class="anchor" aria-label="Permalink: Valid key, malicious velocity command" href="#valid-key-malicious-velocity-command"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">An enrolled peer signs a syntactically valid message and sets class <code>Control</code>,
maximum priority, and bytes resembling an offboard velocity command. Frame
bounds and reassembly may succeed. Signature verification proves only the
compromised peer created it. The forbidden-class gate rejects the message. It
does not enter the advisory store, replay does not commit, and no flight or
safety interface is reachable. Repetition consumes only bounded per-source and
aggregate source/rate budgets.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Cross-peer fragment splice</h3><a id="user-content-cross-peer-fragment-splice" class="anchor" aria-label="Permalink: Cross-peer fragment splice" href="#cross-peer-fragment-splice"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">An attacker sends fragment zero using peer A's transport identity and fragment
one using peer B's identity with the same stream and sequence. Separate
per-expected-source reassemblers prevent combination. If a deployment misbinds
endpoints and fragments do combine within one namespace, the complete LMS1
signature and source/key binding still fail. The configured source cap prevents
attacker-chosen bindings from creating unbounded namespaces.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Replay after receiver restart</h3><a id="user-content-replay-after-receiver-restart" class="anchor" aria-label="Permalink: Replay after receiver restart" href="#replay-after-receiver-restart"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">An attacker records a valid high-battery report and replays it after receiver
restart. The deployer restores the exported <code>(source_id, sender epoch, logical sequence, timestamp)</code> <code>ReplayCheckpoint</code>, which rejects it even if the
in-memory 16-bit frame window is empty and requires a later signed full
keyframe. If the durable store is unavailable or corrupt, release policy keeps
advisory admission for that peer disabled; constructing a fresh receiver would
otherwise accept a sequence-zero baseline. Flight safety does not degrade
because the peer report was never a safety input.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Link loss during a cooperative mission</h3><a id="user-content-link-loss-during-a-cooperative-mission" class="anchor" aria-label="Permalink: Link loss during a cooperative mission" href="#link-loss-during-a-cooperative-mission"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">No valid peer update arrives before the profile TTL. The advisory snapshot
expires and orchestration removes the peer from new cooperative assignments or
uses its existing non-LatentMesh behavior. Local autopilot, collision,
geofence, and fail-safe logic continue. A stale position is never held as a
collision-avoidance truth.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Required security controls by layer</h2><a id="user-content-required-security-controls-by-layer" class="anchor" aria-label="Permalink: Required security controls by layer" href="#required-security-controls-by-layer"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Layer</th>
<th>Preventive</th>
<th>Detective</th>
<th>Recovery</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dependency/build</td>
<td>Exact commit, lockfile, feature off by default, reviewed schema IDs</td>
<td>Metadata/golden-vector/dependency scan</td>
<td>Revert dependency and lockfile</td>
</tr>
<tr>
<td>Key/config</td>
<td>Local allowlist, strict verifier, file/hardware access controls, hard caps</td>
<td>Key fingerprint/config identity receipts</td>
<td>Revoke key, disable peer or feature</td>
</tr>
<tr>
<td>Transport</td>
<td>Profile and endpoint/source binding, bounded channel/UDP datagrams, adapter airtime budget</td>
<td>Aggregate frame/drop counters plus adapter health</td>
<td>Restart adapter, change profile, disable transmit</td>
</tr>
<tr>
<td>Parser/reassembly</td>
<td>Bounds before allocation, checked arithmetic, per-source contexts, absolute expiry</td>
<td>Frame/envelope and aggregate reassembly counters</td>
<td>Drop session to clear contexts; temporarily block endpoint</td>
</tr>
<tr>
<td>Semantic admission</td>
<td>Signature, source binding, class/schema/range/hash/freshness gates</td>
<td>Typed errors and CRC/auth/replay/semantic counters</td>
<td>Wait for periodic baseline, replace local key/session, shadow mode</td>
</tr>
<tr>
<td>Advisory policy</td>
<td>Private verified wrapper, distinct store, TTL, manifest and maximum-authority rule</td>
<td>Reduce-only integration test and advisory age</td>
<td>Clear store, disable consumer</td>
</tr>
<tr>
<td>Flight boundary</td>
<td>No dependency edge or command publisher</td>
<td>Architecture check and flight-interface call counters in test</td>
<td>Build without feature; existing local fail-safe</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Key management requirements</h2><a id="user-content-key-management-requirements" class="anchor" aria-label="Permalink: Key management requirements" href="#key-management-requirements"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li>Production has no embedded private key, all-zero key, shared fleet-wide key,
or automatic trust-on-first-use.</li>
<li>Signing and verification keys are domain-separated from MAVLink, TLS,
Meshtastic channel, and device-management keys.</li>
<li>Deployment configuration composes endpoint-to-source binding, the receiver's
single allowed profile, key validity/revocation policy, and source enrollment.
The built-in <code>TrustedPeerKeys</code> value itself stores only source ID to one active
Ed25519 verification key.</li>
<li>A built-in registry cutover reconstructs the receive session from its durable
checkpoint after local replacement/removal; a dynamic external
<code>TrustedPeerKeyLookup</code> can implement atomic rotation. Received metadata does
not retain a key fingerprint, key, or signature.</li>
<li>A revoked key cannot authorize a new sender epoch or baseline.</li>
<li>Key loss recovery uses an authenticated operator channel outside LatentMesh.</li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Privacy and data retention</h2><a id="user-content-privacy-and-data-retention" class="anchor" aria-label="Permalink: Privacy and data retention" href="#privacy-and-data-retention"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Raw frames, signatures, residuals, exact coordinates, headings, and task data
are not application logs. Accepted advisory snapshots live in memory only for
their profile TTL unless a separately authorized mission recorder owns a copy.
Built-in metrics are unlabeled fixed counters. If a deployment adds receipts,
it may use a keyed or one-way digest of canonical authentication bytes and a
coarse time bucket so operators can correlate an incident without exposing the
full state; no such receipt store is part of the library implementation.</p>
<p dir="auto">Transport confidentiality is a deployment decision. If it is absent, the
privacy owner must reduce the transmitted schema and frequency or formally
accept exposure. Signatures do not provide confidentiality, unlinkability, or
traffic-flow privacy.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Security test and release gates</h2><a id="user-content-security-test-and-release-gates" class="anchor" aria-label="Permalink: Security test and release gates" href="#security-test-and-release-gates"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The authoritative procedures are AT-001 through AT-012 in
<a href="/ruvnet/ruv-drone/blob/main/docs/adr/ADR-173-latentmesh-comms-orchestration.md#acceptance-tests-and-requirements-trace">ADR-173</a>.
The security subset must demonstrate all of the following:</p>
<ol dir="auto">
<li>Wrong, absent, altered, revoked, cross-source, and cross-profile signatures
produce no replay or advisory side effect.</li>
<li>Replay commits exactly once and only after complete verified admission.</li>
<li>Every length, count, context, byte, time, and rate cap has a boundary test;
the parser and reassembler have malformed-input fuzz coverage.</li>
<li>Unknown, partial, wrong-type, nonfinite, out-of-range, stale, wrong-epoch,
and hash-divergent symbolic state fails closed.</li>
<li>Maximum residual data causes a fail-closed rejection and cannot change a
snapshot or reach policy.</li>
<li>Signed Control and command-shaped data result in zero flight-controller
calls and no local geofence, topology, collision, or fail-safe mutation.</li>
<li>Link loss, adapter crash, runtime disable, and dependency rollback preserve
the existing default behavior.</li>
<li>No secret, signature, payload, exact coordinate, or peer identity appears in
captured metrics, debug output, or committed fixtures.</li>
</ol>
<p dir="auto">Before a hardware release, rerun the suite on the target architecture with
sanitizer-equivalent memory checks where supported, dependency advisory scans,
secret scanning, and two-peer hardware-in-the-loop transport tests. Record
tool versions, lockfile hash, advisory-feed time, firmware, radio profile,
regional configuration, and raw aggregate results. A simulator or one-node
loopback is not over-the-air evidence.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Rollback and incident response</h2><a id="user-content-rollback-and-incident-response" class="anchor" aria-label="Permalink: Rollback and incident response" href="#rollback-and-incident-response"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">When an invariant fails:</p>
<ol dir="auto">
<li>Use the deployment's local lifecycle control to stop and drop LatentMesh
publisher, receiver, and adapter tasks.</li>
<li>Clear incomplete reassembly and advisory snapshots. Do not modify local
flight, geofence, collision, or fail-safe state.</li>
<li>Revoke the suspected peer/key locally and block the transport endpoint when
available.</li>
<li>Preserve redacted decision receipts, code/config identity, lockfile hash,
relevant aggregate metrics, and target firmware identity.</li>
<li>Reproduce with fixture keys and no live RF. Add the smallest failing test.</li>
<li>Patch the smallest boundary, rerun the exact failing test and all ADR-173
acceptance tests, then restart at shadow stage.</li>
</ol>
<p dir="auto">Disabling LatentMesh must never request a flight-mode change. The onboard
autopilot and existing local fail-safe decide what the vehicle does during link
loss.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Known gaps and residual-risk register</h2><a id="user-content-known-gaps-and-residual-risk-register" class="anchor" aria-label="Permalink: Known gaps and residual-risk register" href="#known-gaps-and-residual-risk-register"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Gap</th>
<th>Risk</th>
<th>Required disposition before fleet advisory</th>
</tr>
</thead>
<tbody>
<tr>
<td>LatentMesh Air core authenticates complete envelopes, not individual fragments.</td>
<td>Pre-auth resource exhaustion</td>
<td>Keep source/context/rate caps; add adapter airtime/byte budgets for constrained profiles; pass D-02/D-05 tests.</td>
</tr>
<tr>
<td>Upstream reassembler has no clock expiry; the local wrapper uses an absolute deadline from the first fragment, not a sliding progress deadline.</td>
<td>Slow-fragment retention within configured timeout</td>
<td>Keep profile timeout finite, clear expired contexts, and reject new contexts at the cap.</td>
</tr>
<tr>
<td>Signatures provide no confidentiality.</td>
<td>Location and mission disclosure</td>
<td>Enable approved link encryption or document field/rate minimization and risk acceptance.</td>
</tr>
<tr>
<td>A valid enrolled peer can lie.</td>
<td>Incorrect availability or task progress</td>
<td>Advisory-only, source-scoped, reduce-only policy; local sensing dominates; rapid revocation.</td>
</tr>
<tr>
<td><code>ReplayCheckpoint</code> persistence is deployer-provided and may be unavailable or corrupt.</td>
<td>Replay after restart</td>
<td>Do not start that peer's receive session without a valid checkpoint or explicit authenticated re-enrollment; require a later full keyframe.</td>
</tr>
<tr>
<td>Built-in metrics do not expose in-flight byte/context gauges or expiry-specific counters.</td>
<td>Reduced DoS diagnosis</td>
<td>Derive aggregate bounds in tests and add bounded deployment instrumentation before fleet advisory if operational evidence requires it.</td>
</tr>
<tr>
<td>Meshtastic upstream evidence is real firmware with simulated radio.</td>
<td>Unknown hardware latency/loss/interop</td>
<td>Two physical peers and regional-compliance evidence before hardware claim.</td>
</tr>
<tr>
<td>Exact git revision reduces drift but does not prove dependency integrity.</td>
<td>Supply-chain compromise</td>
<td>Review commit, lockfile, checksums, advisories, license, and CI provenance on every update.</td>
</tr>
<tr>
<td>Companion process compromise can bypass in-process type boundaries.</td>
<td>Local privilege escalation</td>
<td>OS least privilege, separate service/account where deployment warrants it, no autopilot device access for LatentMesh adapter.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">The largest uncertainty is deployment-time enforcement of the local process
boundary. In-process Rust types prevent accidental coupling, not a hostile
root-level companion compromise. The strongest fix path is to run the
LatentMesh adapter and advisory store as an unprivileged service without access
to autopilot serial/UDP devices, uXRCE-DDS command topics, or flight-control
credentials, exposing a read-only bounded advisory API to <code>ruv-drone</code>.</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Requirements trace</h2><a id="user-content-requirements-trace" class="anchor" aria-label="Permalink: Requirements trace" href="#requirements-trace"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Threat-model control</th>
<th>ADR requirement and evidence</th>
</tr>
</thead>
<tbody>
<tr>
<td>Flight-authority exclusion</td>
<td>LM-008, LM-009, LM-015; AT-010</td>
</tr>
<tr>
<td>Exact dependency provenance</td>
<td>LM-002; AT-002</td>
</tr>
<tr>
<td>Authentication and source binding</td>
<td>LM-003; AT-004, AT-005</td>
</tr>
<tr>
<td>Bounded parsing/reassembly</td>
<td>LM-004; AT-007, AT-011</td>
</tr>
<tr>
<td>Post-reassembly replay/freshness</td>
<td>LM-005, LM-011; AT-006, AT-008</td>
</tr>
<tr>
<td>Deterministic schema and hashes</td>
<td>LM-006; AT-004, AT-009</td>
</tr>
<tr>
<td>Learned residual isolation</td>
<td>LM-007; AT-009</td>
</tr>
<tr>
<td>Transport separation</td>
<td>LM-010; AT-004, AT-010</td>
</tr>
<tr>
<td>Privacy/data lifecycle</td>
<td>LM-012; AT-011, AT-012</td>
</tr>
<tr>
<td>Observability</td>
<td>LM-013; AT-012</td>
</tr>
<tr>
<td>Rollout/rollback</td>
<td>LM-001, LM-014; AT-001, AT-011</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Source provenance</h2><a id="user-content-source-provenance" class="anchor" aria-label="Permalink: Source provenance" href="#source-provenance"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Primary local and immutable upstream sources inspected for this model:</p>
<ul dir="auto">
<li><a href="/ruvnet/ruv-drone/blob/main/src/integration/flight_controller.rs"><code>ruv-drone</code> flight-controller boundary</a>,
<a href="/ruvnet/ruv-drone/blob/main/src/failsafe/mod.rs">local fail-safe</a>,
<a href="/ruvnet/ruv-drone/blob/main/src/security/geofence.rs">geofence</a>, and
<a href="/ruvnet/ruv-drone/blob/main/src/topology/mesh.rs">topology</a>.</li>
<li>LatentMesh exact commit
<a href="https://github.com/ruvnet/LatentMesh/commit/1ff7332c17798eec3b42da5c6f1c271f355fa806"><code>1ff7332c17798eec3b42da5c6f1c271f355fa806</code></a>.</li>
<li>Upstream <a href="https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/SECURITY.md">security policy</a>,
<a href="https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/wire.rs">wire parser</a>,
<a href="https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/envelope.rs">envelope</a>,
<a href="https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/fragment.rs">fragmentation/reassembly</a>,
<a href="https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/replay.rs">replay</a>,
<a href="https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-core/src/semantic.rs">semantic state</a>, and
<a href="https://github.com/ruvnet/LatentMesh/blob/1ff7332c17798eec3b42da5c6f1c271f355fa806/crates/latentmesh-air-radio/src/receiver.rs">receive admission</a>.</li>
<li>Official PX4 <a href="https://docs.px4.io/main/en/flight_modes/offboard" rel="nofollow">Offboard</a>
and <a href="https://docs.px4.io/main/en/middleware/uxrce_dds" rel="nofollow">uXRCE-DDS</a>
documentation establish why setpoint and companion-command interfaces are a
separate high-risk boundary.</li>
<li>Official <a href="https://mavlink.io/en/guide/message_signing.html" rel="nofollow">MAVLink 2 signing</a>
documentation is an authentication precedent, not a substitute for the LMS1
signature or policy gate.</li>
</ul>
<p dir="auto">No secret values were read or recorded. Risk scores and deployment controls are
this assessment's judgments. Upstream constants and behaviors are source-backed
at the exact commit above. Hardware, RF, latency, and certification claims
remain explicitly unverified.</p>
</article></div><div class="d-none"></div></section></div></div></div> </div> <!-- --> </div></div></div></div></div></div><div class="ScrollMarksContainer-module__scrollMarksContainer__Eu7uU" id="find-result-marks-container"></div><div class="d-none"></div><div class="d-none"></div></div> <!-- --> <!-- --> </div>
</react-app>




  </div>

</turbo-frame>

    </main>
  </div>

  </div>

          <footer class="footer f6 color-fg-muted color-border-subtle tmp-pt-7 tmp-pb-6 p-responsive" role="contentinfo"  >
  <h2 class='sr-only'>Footer</h2>

  


  <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap">
    <div class="d-flex flex-items-center flex-shrink-0 mx-2">
      <a aria-label="GitHub Homepage" class="footer-octicon mr-2" href="https://github.com">
        <svg aria-hidden="true" data-component="Octicon" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github">
    <path d="M10.226 17.284c-2.965-.36-5.054-2.493-5.054-5.256 0-1.123.404-2.336 1.078-3.144-.292-.741-.247-2.314.09-2.965.898-.112 2.111.36 2.83 1.01.853-.269 1.752-.404 2.853-.404 1.1 0 1.999.135 2.807.382.696-.629 1.932-1.1 2.83-.988.315.606.36 2.179.067 2.942.72.854 1.101 2 1.101 3.167 0 2.763-2.089 4.852-5.098 5.234.763.494 1.28 1.572 1.28 2.807v2.336c0 .674.561 1.056 1.235.786 4.066-1.55 7.255-5.615 7.255-10.646C23.5 6.188 18.334 1 11.978 1 5.62 1 .5 6.188.5 12.545c0 4.986 3.167 9.12 7.435 10.669.606.225 1.19-.18 1.19-.786V20.63a2.9 2.9 0 0 1-1.078.224c-1.483 0-2.359-.808-2.987-2.313-.247-.607-.517-.966-1.034-1.033-.27-.023-.359-.135-.359-.27 0-.27.45-.471.898-.471.652 0 1.213.404 1.797 1.235.45.651.921.943 1.483.943.561 0 .92-.202 1.437-.719.382-.381.674-.718.944-.943"></path>
</svg>
</a>
      <span>
        &copy; 2026 GitHub,&nbsp;Inc.
      </span>
    </div>

    <nav aria-label="Footer">
      <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3>

      <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading">


          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a>
          </li>


            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a>
            </li>

            <li class="mx-2">
              <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a>
            </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to community&quot;,&quot;label&quot;:&quot;text:community&quot;}" href="https://github.community/" data-view-component="true" class="Link--secondary Link">Community</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to docs&quot;,&quot;label&quot;:&quot;text:docs&quot;}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a>
          </li>

          <li class="mx-2">
            <a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a>
          </li>

          
<li class="mx-2" >
  <cookie-consent-link>
    <button
      type="button"
      class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent"
      data-action="click:cookie-consent-link#showConsentManagement"
      data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;cookies&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;cookies_link_subfooter_footer&quot;}"
    >
      Manage cookies
    </button>
  </cookie-consent-link>
</li>

  <li class="mx-2">
    <cookie-consent-link>
      <button
        type="button"
        class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent text-left"
        data-action="click:cookie-consent-link#showConsentManagement"
        data-analytics-event="{&quot;location&quot;:&quot;footer&quot;,&quot;action&quot;:&quot;dont_share_info&quot;,&quot;context&quot;:&quot;subfooter&quot;,&quot;tag&quot;:&quot;link&quot;,&quot;label&quot;:&quot;dont_share_info_link_subfooter_footer&quot;}"
      >
        Do not share my personal information
      </button>
    </cookie-consent-link>
  </li>

      </ul>
    </nav>
  </div>
</footer>



    <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999"
      data-locale="en"
      data-initial-cookie-consent-allowed=""
      data-cookie-consent-required="true"
    ></ghcc-consent>




  <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden>
    <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert">
    <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path>
</svg>
    <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
    </button>
    You can’t perform that action at this time.
  </div>

    <template id="site-details-dialog">
  <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open>
    <summary role="button" aria-label="Close dialog"></summary>
    <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
      <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
        <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x">
    <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path>
</svg>
      </button>
      <div class="octocat-spinner tmp-my-6 js-details-dialog-spinner"></div>
    </details-dialog>
  </details>
</template>

    <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;">
  <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;">
  </div>
</div>

    <template id="snippet-clipboard-copy-button">
  <div class="zeroclipboard-container position-absolute right-0 top-0">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2 tmp-m-2">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2 tmp-m-2">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>
<template id="snippet-clipboard-copy-button-unpositioned">
  <div class="zeroclipboard-container">
    <clipboard-copy aria-label="Copy code to clipboard" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w">
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
    <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>
</svg>
      <svg aria-hidden="true" data-component="Octicon" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none">
    <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path>
</svg>
    </clipboard-copy>
  </div>
</template>




    </div>
    <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div>
    <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div>
  </body>
</html>

