



  

<!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-7a418ea859d1654d.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","activity_diff_file_tree","activity_repos_file_tree","activity_repos_overview_header","activity_repos_overview_sidebar","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_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_workbench_sunset_redirect","dashboard_agents_module_auth_token_check","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","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","issues_dashboard_sso_structured_errors","issues_expanded_file_types","issues_hide_closed_sub_issues","issues_index_data_router","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","milestone_show_data_router","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","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","repo_pulls_dashboard_sidebar_links","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-b752d992928a526c.js"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-81e2b8334c3d06e9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-2f08c823163591a8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-633ad94fa06c334b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-0fb4c544a797ec0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ser-7c872b58ac9f1b39.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tp-7e9817cf5c068979.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-55602924fdf21863.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.bef03fb24bb03be8.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-0417f617ad744a0d.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-f1498fec45311acd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jz5-7aa1ff0a0e750f41.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-9697c1c8f5cbf523.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-e067f5c4473bffff.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-40ea91c5fde7f30c.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-524a06aa946df6fc.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-b1ee53c2200b172a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-7bf7b9d689fe3d10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a9-ca3bc10b816bcc1f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ur-21ec1e439ee2d87c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4t-4c39f7195fc42cc8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pb-53cfff089eaac51b.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-4d9cf83cf08e1643.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wo-6991af5b3829ffe8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/nfv-a6c14301d3ea6d67.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b5-a2fde30ce0c692b9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sw-9d0489dbf9a9c942.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ttf-7d5abe1b447ced2c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sj-c7a44023ee90d468.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0pd-c46d8dfae89c2b64.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-c8ee397a71bcb700.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.255cab819a92f7e1.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-073e7d742fb703f1.js" defer="defer"></script>
  
  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-8503588299651923.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ncx-66e64888bc4615bb.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-a9404625ec30bbc7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4u-8f9f1d6be01d6a22.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s0-68d09e5e8a80cb94.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y5-0cb3f75cec297941.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/n4u-cd9039ad946274ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j8s-00bd469c4017a543.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-2d03f5e6d4fdd54d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gru-2b0fac8887ff8c57.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a0-234e967e7c6d22ce.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gz3-5bdfbfceac967bb6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/15m-64f3034430471048.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/1e-c15441bdb94d54ae.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gzu-6ad9a0527a5d7afd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bi-3a42b8714e06c4d0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tu1-37e16844272ddefa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b1-ac66ededed061993.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gmn-1e5497c041b66231.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0l5-d1b2a63015b5eb6d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/c2-e85522be441acf73.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/f9-baf0a4193779952e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sp-87dce99c82a27004.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zkm-116b01b8485bbe3f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/og-518d12c9e011601d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b9-947db365ea875cfa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/14-8c7b4ad3c845664c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dsj-2e7d883cb843e9e6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ec-38012819307fd539.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/du-6607da3b8b579202.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/20-f43eb09c2be69457.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ql0-107312645ac2b72d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-fa7cdc0f7656d876.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p0l-fe491d943adf7508.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/v1e-d099d9fd21ad25e5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fn-7b298a45c55fb6fb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7cw-6e493a20eaaa04b5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ok-290e4b9465ba9c5b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6d-ca6d584a0fd6368c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y8-e2f18f5a24733f3b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xc-3fd4a2e7dcbad8e2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vjg-2874f95f389c4d3f.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-16afdcf183d11968.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.501e99879e15a48e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/xc.de2b1dde0494f261.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.85de0b1d47e09052.module.css" />


  <title>freecad-mcp/AGENT-DEBUGGING.md at main · blwfish/freecad-mcp · 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:4694e51e-993e-2c3f-9499-3b246c581a45">

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


  <meta name="request-id" content="C61C:50350:13624FA:126DE06:6AC77FE7" data-pjax-transient="true"/><meta name="html-safe-nonce" content="02d02f2cf05416462c4dd889e1068926956c84123455865a5533d51e366124c5" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDNjFDOjUwMzUwOjEzNjI0RkE6MTI2REUwNjo2QUM3N0ZFNyIsInZpc2l0b3JfaWQiOiI1OTgzNzc3MjczOTMyMzQ5MTkiLCJyZWdpb25fZWRnZSI6ImZyYSIsInJlZ2lvbl9yZW5kZXIiOiJmcmEifQ==" data-pjax-transient="true"/><meta name="visitor-hmac" content="a2cee0e71356e10b3fc261de3aadd3e5700bfd8b03a4452c32e27a56cf212895" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:1162318725" 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="MCP server for FreeCAD — 32 tools for AI-assisted 3D CAD modeling - freecad-mcp/AGENT-DEBUGGING.md at main · blwfish/freecad-mcp">

      <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/blwfish/freecad-mcp/blob/main/AGENT-DEBUGGING.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/78a7df38b000646cca21a3093fab7fd2e66f05a4882b0a1b0cc187a0a6347418/blwfish/freecad-mcp" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="freecad-mcp/AGENT-DEBUGGING.md at main · blwfish/freecad-mcp" /><meta name="twitter:description" content="MCP server for FreeCAD — 32 tools for AI-assisted 3D CAD modeling - blwfish/freecad-mcp" />
  <meta property="og:image" content="https://opengraph.githubassets.com/78a7df38b000646cca21a3093fab7fd2e66f05a4882b0a1b0cc187a0a6347418/blwfish/freecad-mcp" /><meta property="og:image:alt" content="MCP server for FreeCAD — 32 tools for AI-assisted 3D CAD modeling - blwfish/freecad-mcp" /><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="freecad-mcp/AGENT-DEBUGGING.md at main · blwfish/freecad-mcp" /><meta property="og:url" content="https://github.com/blwfish/freecad-mcp/blob/main/AGENT-DEBUGGING.md" /><meta property="og:description" content="MCP server for FreeCAD — 32 tools for AI-assisted 3D CAD modeling - blwfish/freecad-mcp" />
  




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



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


  <meta http-equiv="x-pjax-version" content="f705e3cc2e7cb8ce0afdb7b21fc6ff6d7afede52aee40bf0eab14ca8b0d69dd6" 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="1ff3f1d4e1abd61f6f135b47d3b815e2f7169f8dd418f0118c6b1cf4de6cbc86" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="1246934c1e1d4eb010e1cfa4ca517994cfab78ea050086b069045122415a52dd" 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/blwfish/freecad-mcp git https://github.com/blwfish/freecad-mcp.git">

  <meta name="octolytics-dimension-user_id" content="24812846" /><meta name="octolytics-dimension-user_login" content="blwfish" /><meta name="octolytics-dimension-repository_id" content="1162318725" /><meta name="octolytics-dimension-repository_nwo" content="blwfish/freecad-mcp" /><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="1162318725" /><meta name="octolytics-dimension-repository_network_root_nwo" content="blwfish/freecad-mcp" />
  



    

    <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="3ea5e9da9090cfec2f1df3ba60c98d7d544d5137" 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/qc-1bbbe8787ea1cd4b.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-10dbdab24559c7cd.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.4dd73a4e016c1ca2.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-0087e2c1d400f8c6.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-install-banner-partial.b50f287c48a7f94a.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/2l-e468179ba7123a2e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/rwd-069fc3d9814ff9fe.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fz-e662bc3745e171e7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jag-3559ee48016881a2.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3d-7f22b36f29a9dd94.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tua-4998592d21eb16f7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/8i-756d611a52e5f265.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/marketing-header-3c37549fa4cc7814.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-brand-css.05b219cdb8e80c43.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/8i.779dd52a6bc5b0b6.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%2Fblwfish%2Ffreecad-mcp%2Fblob%2Fmain%2FAGENT-DEBUGGING.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=blwfish%2Ffreecad-mcp","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/blwfish/freecad-mcp/blob/main/AGENT-DEBUGGING.md\",\"user_id\":null}}","auth_hydro_click_hmac":"29728d57beef0fc104bfdaa19db4b16434636e1b091a3afc42f06bb212200a34","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%2Fblwfish%2Ffreecad-mcp%2Fblob%2Fmain%2FAGENT-DEBUGGING.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/blwfish/freecad-mcp/blob/main/AGENT-DEBUGGING.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="29728d57beef0fc104bfdaa19db4b16434636e1b091a3afc42f06bb212200a34"><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%2Fblwfish%2Ffreecad-mcp%2Fblob%2Fmain%2FAGENT-DEBUGGING.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/blwfish/freecad-mcp/blob/main/AGENT-DEBUGGING.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="29728d57beef0fc104bfdaa19db4b16434636e1b091a3afc42f06bb212200a34"><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=blwfish%2Ffreecad-mcp" 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/blwfish/freecad-mcp/blob/main/AGENT-DEBUGGING.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="29728d57beef0fc104bfdaa19db4b16434636e1b091a3afc42f06bb212200a34"><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-9f21666c-9b25-4391-85d2-11037413d94e" aria-labelledby="tooltip-2cfd450b-a336-4ee6-be29-d283d4187568" 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-2cfd450b-a336-4ee6-be29-d283d4187568" for="icon-button-9f21666c-9b25-4391-85d2-11037413d94e" 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-1a7ce813a378e1f7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/mn-bb458474353a279e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t5-26d19272bbf73ca3.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2d5-9abb2f6ba5c935d0.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/24-b11e1c4108322883.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/mrn-12afac2ecd2be980.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dgq-bbf7670f9cdba2e0.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7w-740b4e942974ccba.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/we-c9f93392098ad6c9.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/775-5adcc74216a7c5ae.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bn-fcef0645a47703fc.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xgw-6c6cb7b2ed77f52e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ge-ca1c0ba8656f9680.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/9f-e543bc691db8262e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/global-nav-bar-c7f96cdc425f375d.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.501e99879e15a48e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-nav-bar.1943548049515ee8.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":"blwfish","is_root":false,"href":"/blwfish"},{"crumb_type":"repository","label":"freecad-mcp","is_root":false,"href":"/blwfish/freecad-mcp"}],"localNavigation":[{"id":"code","icon":"code","label":"Code","href":"/blwfish/freecad-mcp","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":"/blwfish/freecad-mcp/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":"/blwfish/freecad-mcp/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":"/blwfish/freecad-mcp/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":"/blwfish/freecad-mcp/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":"/blwfish/freecad-mcp/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":"/blwfish/freecad-mcp/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:blwfish/freecad-mcp","current_repo_name":"freecad-mcp","current_repo_nwo":"blwfish/freecad-mcp","user_id":"blwfish"}},"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=6","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="/blwfish" data-discover="true"><span class="">blwfish</span></a></li><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/blwfish/freecad-mcp" data-discover="true"><span class="styles-module__contextCrumbLast__tI2e3">freecad-mcp</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="/blwfish/freecad-mcp" 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="/blwfish/freecad-mcp/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="/blwfish/freecad-mcp/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="/blwfish/freecad-mcp/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="/blwfish/freecad-mcp/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="/blwfish/freecad-mcp/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="/blwfish/freecad-mcp/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_2ktl_"><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="/blwfish/freecad-mcp/blob/main/AGENT-DEBUGGING.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":"FreeCAD MCP — Agent Debugging Guide","anchor":"freecad-mcp--agent-debugging-guide","htmlText":"FreeCAD MCP — Agent Debugging Guide"},{"level":2,"text":"Your Debugging Toolkit","anchor":"your-debugging-toolkit","htmlText":"Your Debugging Toolkit"},{"level":3,"text":"get_debug_logs()","anchor":"get_debug_logs","htmlText":"get_debug_logs()"},{"level":3,"text":"A response's top-level events field","anchor":"a-responses-top-level-events-field","htmlText":"A response's top-level events field"},{"level":3,"text":"view_control(operation=\"get_report_view\", tail=N, filter=\"...\", clear=False)","anchor":"view_controloperationget_report_view-tailn-filter-clearfalse","htmlText":"view_control(operation=\"get_report_view\", tail=N, filter=\"...\", clear=False)"},{"level":3,"text":"manage_connection(action=\"status\")","anchor":"manage_connectionactionstatus","htmlText":"manage_connection(action=\"status\")"},{"level":3,"text":"manage_connection(action=\"clear_recovery\")","anchor":"manage_connectionactionclear_recovery","htmlText":"manage_connection(action=\"clear_recovery\")"},{"level":3,"text":"manage_connection(action=\"validate_fcstd\", filename=\"...\")","anchor":"manage_connectionactionvalidate_fcstd-filename","htmlText":"manage_connection(action=\"validate_fcstd\", filename=\"...\")"},{"level":3,"text":"Crash watcher — /tmp/freecad_mcp_last_op_\u003cpid\u003e.json","anchor":"crash-watcher--tmpfreecad_mcp_last_op_pidjson","htmlText":"Crash watcher — /tmp/freecad_mcp_last_op_\u0026lt;pid\u0026gt;.json"},{"level":2,"text":"1. Operation Returned an Error","anchor":"1-operation-returned-an-error","htmlText":"1. Operation Returned an Error"},{"level":2,"text":"2. FreeCAD Crashed / Disconnected","anchor":"2-freecad-crashed--disconnected","htmlText":"2. FreeCAD Crashed / Disconnected"},{"level":2,"text":"3. FreeCAD Won't Connect At All","anchor":"3-freecad-wont-connect-at-all","htmlText":"3. FreeCAD Won't Connect At All"},{"level":2,"text":"4. Operation Succeeded But Result Looks Wrong","anchor":"4-operation-succeeded-but-result-looks-wrong","htmlText":"4. Operation Succeeded But Result Looks Wrong"},{"level":2,"text":"5. Sketch or Constraint Failure","anchor":"5-sketch-or-constraint-failure","htmlText":"5. Sketch or Constraint Failure"},{"level":2,"text":"6. External Link / Reference Broken","anchor":"6-external-link--reference-broken","htmlText":"6. External Link / Reference Broken"},{"level":2,"text":"7. Topology Naming Warnings (hasher mismatch, ElementMap errors)","anchor":"7-topology-naming-warnings-hasher-mismatch-elementmap-errors","htmlText":"7. Topology Naming Warnings (hasher mismatch, ElementMap errors)"},{"level":2,"text":"8. Document Recompute Failures","anchor":"8-document-recompute-failures","htmlText":"8. Document Recompute Failures"},{"level":2,"text":"9. Diagnosing a Failure That Surfaced Far From Its Cause","anchor":"9-diagnosing-a-failure-that-surfaced-far-from-its-cause","htmlText":"9. Diagnosing a Failure That Surfaced Far From Its Cause"},{"level":2,"text":"General Principles","anchor":"general-principles","htmlText":"General Principles"}]},"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\"\u003eFreeCAD MCP — Agent Debugging Guide\u003c/h1\u003e\u003ca id=\"user-content-freecad-mcp--agent-debugging-guide\" class=\"anchor\" aria-label=\"Permalink: FreeCAD MCP — Agent Debugging Guide\" href=\"#freecad-mcp--agent-debugging-guide\"\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\"\u003eThis file is for you, the AI agent. When something goes wrong with a FreeCAD MCP\noperation, follow the relevant section below. Don't guess — the diagnostic tools\nexist precisely so you don't have to. Read the output carefully; the tools are\ndesigned to give you specific, actionable information rather than generic status.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eYour Debugging Toolkit\u003c/h2\u003e\u003ca id=\"user-content-your-debugging-toolkit\" class=\"anchor\" aria-label=\"Permalink: Your Debugging Toolkit\" href=\"#your-debugging-toolkit\"\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\"\u003eThis MCP exposes diagnostic infrastructure that most FreeCAD users don't know exists\nand that most other MCPs don't provide. These tools are your primary resource when\nsomething goes wrong. Use them before forming hypotheses.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003eget_debug_logs()\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-get_debug_logs\" class=\"anchor\" aria-label=\"Permalink: get_debug_logs()\" href=\"#get_debug_logs\"\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\"\u003eReads the structured operation log at \u003ccode\u003e~/.freecad-mcp/logs/\u003c/code\u003e. Every tool call is\nrecorded as a pair of JSONL entries — COMMAND_START (before execution) and either\nCOMMAND_SUCCESS or COMMAND_FAILURE (after). Each entry includes the tool name,\narguments, duration, and a snapshot of the result or error.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eWhat to look for:\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eThe sequence of operations leading to the failure, not just the failing call itself.\nOften the problem was set up by a previous operation that succeeded but left bad state.\u003c/li\u003e\n\u003cli\u003eDuration anomalies — an operation that normally takes 0.1s taking 30s usually means\nFreeCAD was hung waiting on something (GIL contention, OCCT blocked).\u003c/li\u003e\n\u003cli\u003eCOMMAND_FAILURE entries earlier in the sequence that may have been silently ignored.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eSample output:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"{\u0026quot;timestamp\u0026quot;: \u0026quot;2026-04-18T15:23:42.3\u0026quot;, \u0026quot;operation\u0026quot;: \u0026quot;COMMAND_START\u0026quot;,\n \u0026quot;parameters\u0026quot;: {\u0026quot;tool\u0026quot;: \u0026quot;execute_python_async\u0026quot;, \u0026quot;args\u0026quot;: {\u0026quot;code\u0026quot;: \u0026quot;...\u0026quot;}}}\n{\u0026quot;timestamp\u0026quot;: \u0026quot;2026-04-18T15:23:44.1\u0026quot;, \u0026quot;operation\u0026quot;: \u0026quot;COMMAND_SUCCESS\u0026quot;,\n \u0026quot;parameters\u0026quot;: {\u0026quot;tool\u0026quot;: \u0026quot;poll_job\u0026quot;}, \u0026quot;duration_seconds\u0026quot;: 0.074,\n \u0026quot;result\u0026quot;: \u0026quot;{\\\u0026quot;status\\\u0026quot;: \\\u0026quot;done\\\u0026quot;, \\\u0026quot;result\\\u0026quot;: \\\u0026quot;...\\\u0026quot;}\u0026quot;}\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e{\"timestamp\": \"2026-04-18T15:23:42.3\", \"operation\": \"COMMAND_START\",\n \"parameters\": {\"tool\": \"execute_python_async\", \"args\": {\"code\": \"...\"}}}\n{\"timestamp\": \"2026-04-18T15:23:44.1\", \"operation\": \"COMMAND_SUCCESS\",\n \"parameters\": {\"tool\": \"poll_job\"}, \"duration_seconds\": 0.074,\n \"result\": \"{\\\"status\\\": \\\"done\\\", \\\"result\\\": \\\"...\\\"}\"}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eA response's top-level \u003ccode\u003eevents\u003c/code\u003e field\u003c/h3\u003e\u003ca id=\"user-content-a-responses-top-level-events-field\" class=\"anchor\" aria-label=\"Permalink: A response's top-level events field\" href=\"#a-responses-top-level-events-field\"\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\"\u003eSome tool responses carry a top-level \u003ccode\u003eevents\u003c/code\u003e array even when the call otherwise\nlooks like it succeeded — this is \u003ca href=\"https://github.com/blwfish/mcp-events\"\u003e\u003ccode\u003emcp-events\u003c/code\u003e\u003c/a\u003e,\na structured-signaling package the bridge uses instead of swallowing a soft failure or\nburying it in a free-text log line. Today it fires for things like a FreeCAD response\nthat couldn't be parsed as JSON, an image that couldn't be extracted from a response, or\nspawned-instance metadata that couldn't be enriched — none of which necessarily fail the\ncall outright, but all of which explain a result that's present but incomplete or off.\n\u003cstrong\u003eCheck for an \u003ccode\u003eevents\u003c/code\u003e key before assuming a response with no \u003ccode\u003eerror\u003c/code\u003e field is fully\nclean\u003c/strong\u003e, especially under \"Operation Succeeded But Result Looks Wrong\" below.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003eview_control(operation=\"get_report_view\", tail=N, filter=\"...\", clear=False)\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-view_controloperationget_report_view-tailn-filter-clearfalse\" class=\"anchor\" aria-label=\"Permalink: view_control(operation=\u0026quot;get_report_view\u0026quot;, tail=N, filter=\u0026quot;...\u0026quot;, clear=False)\" href=\"#view_controloperationget_report_view-tailn-filter-clearfalse\"\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\"\u003eReads FreeCAD's Report View — the panel where FreeCAD logs recompute warnings, OCCT\nmessages, link restore failures, sketch solver output, and AICopilot workbench status.\nThis is frequently where the real error is, even when the tool call error message is\nvague or generic.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eParameters:\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003etail=50\u003c/code\u003e — return the last N lines (default 50; increase if the failure happened\na while ago and the log has scrolled)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efilter=\"error\"\u003c/code\u003e — return only lines containing \"error\" (case-insensitive). Also\nuseful: \u003ccode\u003efilter=\"warning\"\u003c/code\u003e, \u003ccode\u003efilter=\"link\"\u003c/code\u003e, \u003ccode\u003efilter=\"sketch\"\u003c/code\u003e, \u003ccode\u003efilter=\"recompute\"\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eclear=True\u003c/code\u003e — clear the Report View after reading. Do this before retrying a\nfailed operation so the next read shows only fresh output.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eWhat to look for:\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eLink not restored\u003c/code\u003e / \u003ccode\u003eLink broken!\u003c/code\u003e — an external reference couldn't be resolved.\nThe message includes the object name and file path. See section 6.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eBRep_API: command not done\u003c/code\u003e — an OCCT boolean operation failed. The geometry fed\ninto it was probably invalid. Check \u003ccode\u003echeck_solid\u003c/code\u003e on the input objects.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eRecomputation required\u003c/code\u003e — a document needs recompute after a parameter change.\nCall \u003ccode\u003eexecute_python(\"FreeCAD.ActiveDocument.recompute()\")\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSketcher: sketch has ... redundant constraint(s)\u003c/code\u003e — over-constrained sketch.\nSee section 5.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehasher mismatch\u003c/code\u003e — topology naming bookkeeping issue when shapes cross document\nboundaries. Usually harmless unless downstream features reference specific faces\nof the affected geometry. See section 7.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ePropertyTopoShape: Recomputation required ... geo element version change\u003c/code\u003e — normal\nwhen opening a document saved with a different FreeCAD version. Trigger a recompute.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003emanage_connection(action=\"status\")\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-manage_connectionactionstatus\" class=\"anchor\" aria-label=\"Permalink: manage_connection(action=\u0026quot;status\u0026quot;)\" href=\"#manage_connectionactionstatus\"\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\"\u003eRuns entirely on the bridge side — does not require FreeCAD to be running or\nresponsive. Reports:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eWhether the socket file exists and whether connections succeed\u003c/li\u003e\n\u003cli\u003eThe contents of the crash watcher's per-PID last-op file (matched via\n\u003ccode\u003e/tmp/freecad_mcp_last_op_*.json\u003c/code\u003e; what the crash watcher recorded as the\nin-flight operation when FreeCAD last crashed, if anything)\u003c/li\u003e\n\u003cli\u003eWhether \u003ccode\u003e.FCStd\u003c/code\u003e recovery files are present and whether they pass basic integrity\nchecks\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThis is the first tool to call when FreeCAD crashes or won't connect.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003emanage_connection(action=\"clear_recovery\")\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-manage_connectionactionclear_recovery\" class=\"anchor\" aria-label=\"Permalink: manage_connection(action=\u0026quot;clear_recovery\u0026quot;)\" href=\"#manage_connectionactionclear_recovery\"\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\"\u003eFinds and removes corrupt FreeCAD recovery files from FreeCAD's recovery directory.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eWhen to use:\u003c/strong\u003e When FreeCAD crashes immediately on startup (crash loop). This happens\nbecause FreeCAD writes recovery files continuously during a session. If it crashes\nmid-write, the recovery file is partially written and structurally invalid. On the\nnext launch, FreeCAD tries to restore it, encounters the corruption, crashes again,\nand the cycle repeats. The socket file may exist briefly before the second crash,\nwhich means \u003ccode\u003echeck_freecad_connection()\u003c/code\u003e may appear to succeed even though FreeCAD\nis not actually usable.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAfter clearing recovery files, ask the user to restart FreeCAD.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003emanage_connection(action=\"validate_fcstd\", filename=\"...\")\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-manage_connectionactionvalidate_fcstd-filename\" class=\"anchor\" aria-label=\"Permalink: manage_connection(action=\u0026quot;validate_fcstd\u0026quot;, filename=\u0026quot;...\u0026quot;)\" href=\"#manage_connectionactionvalidate_fcstd-filename\"\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\"\u003eChecks a \u003ccode\u003e.FCStd\u003c/code\u003e file's ZIP archive integrity before FreeCAD tries to open it. A\n\u003ccode\u003e.FCStd\u003c/code\u003e file is a ZIP containing \u003ccode\u003eDocument.xml\u003c/code\u003e plus shape binary files. If a save\nwas interrupted mid-write (crash during \u003ccode\u003edoc.save()\u003c/code\u003e, power loss, disk full), the\nZIP's central directory may be intact while the file data is truncated, or vice versa.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCall this when a user reports that a file \"won't open\" or \"crashes FreeCAD on open\"\nbefore attempting to open it.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCrash watcher — \u003ccode\u003e/tmp/freecad_mcp_last_op_\u0026lt;pid\u0026gt;.json\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-crash-watcher--tmpfreecad_mcp_last_op_pidjson\" class=\"anchor\" aria-label=\"Permalink: Crash watcher — /tmp/freecad_mcp_last_op_\u0026lt;pid\u0026gt;.json\" href=\"#crash-watcher--tmpfreecad_mcp_last_op_pidjson\"\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\"\u003eWritten atomically by the AICopilot workbench \u003cem\u003einside\u003c/em\u003e FreeCAD immediately before\neach tool call executes. Cleared on successful completion. If FreeCAD crashes during\nan operation, this file survives and contains exactly what was in flight. The path\nis per-PID (\u003ccode\u003eAICopilot/crash_watcher.py\u003c/code\u003e's \u003ccode\u003eLAST_OP_FILE\u003c/code\u003e) so multiple spawned\nFreeCAD instances don't clobber each other's crash state; the bridge-side reader\n(\u003ccode\u003efreecad_crash_report.py\u003c/code\u003e's \u003ccode\u003eLAST_OP_FILE_GLOB\u003c/code\u003e) matches all of them via\n\u003ccode\u003e/tmp/freecad_mcp_last_op_*.json\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eContents:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;tool\u0026quot;: \u0026quot;execute_python\u0026quot;,\n  \u0026quot;args\u0026quot;: {\u0026quot;code\u0026quot;: \u0026quot;import Part\\nresult = shape1.fuse(shape2)\\n…\u0026quot;},\n  \u0026quot;started_at\u0026quot;: 1747123456.789,\n  \u0026quot;pid\u0026quot;: 12345\n}\"\u003e\u003cpre\u003e{\n  \u003cspan class=\"pl-ent\"\u003e\"tool\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eexecute_python\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n  \u003cspan class=\"pl-ent\"\u003e\"args\"\u003c/span\u003e: {\u003cspan class=\"pl-ent\"\u003e\"code\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eimport Part\u003cspan class=\"pl-cce\"\u003e\\n\u003c/span\u003eresult = shape1.fuse(shape2)\u003cspan class=\"pl-cce\"\u003e\\n\u003c/span\u003e…\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e},\n  \u003cspan class=\"pl-ent\"\u003e\"started_at\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1747123456.789\u003c/span\u003e,\n  \u003cspan class=\"pl-ent\"\u003e\"pid\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e12345\u003c/span\u003e\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003emanage_connection(action=\"status\")\u003c/code\u003e reads and reports this automatically. You can\nalso read it directly with \u003ccode\u003eexecute_python\u003c/code\u003e if FreeCAD is still running:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"execute_python(\u0026quot;import glob, json; json.load(open(glob.glob('/tmp/freecad_mcp_last_op_*.json')[0]))\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eexecute_python\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"import glob, json; json.load(open(glob.glob('/tmp/freecad_mcp_last_op_*.json')[0]))\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003chr\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eAlways check connection before anything else:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"check_freecad_connection()\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003echeck_freecad_connection()\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf this fails, FreeCAD is not running or the AICopilot workbench isn't loaded. Tell\nthe user to launch FreeCAD and wait for \"AI Copilot ready\" in the Report View. Do\nnot attempt any other tool calls until connection succeeds — they will all fail and\nthe errors will be misleading.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e1. Operation Returned an Error\u003c/h2\u003e\u003ca id=\"user-content-1-operation-returned-an-error\" class=\"anchor\" aria-label=\"Permalink: 1. Operation Returned an Error\" href=\"#1-operation-returned-an-error\"\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\"\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e A tool call returned an error message or an unexpected result. The\nerror message from the tool itself may be vague (\"operation failed\", \"Python error\")\nor may be a raw OCCT or FreeCAD exception.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 1 — Read the Report View immediately:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;get_report_view\u0026quot;, tail=50, filter=\u0026quot;error\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"get_report_view\", tail=50, filter=\"error\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDo this first, before anything else, because some operations write to the Report View\nand then continue — a subsequent operation may clear or overwrite the relevant lines.\nThe Report View often contains the real error even when the tool call error is generic.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCommon patterns and what they mean:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eBRep_API: command not done\u003c/code\u003e → boolean operation (fuse/cut/common) failed; the\ninput geometry has a problem. Check solid validity on inputs.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eBRep_Builder_MakeWire: wire not done\u003c/code\u003e → a wire construction failed, usually\nbecause edges don't share endpoints within tolerance.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eStandard_ConstructionError\u003c/code\u003e → OCCT couldn't build the requested shape; geometry\ninputs are inconsistent.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSketcher ... redundant constraint\u003c/code\u003e → sketch is over-constrained; the solver\nrejected it.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ePart.OCCError\u003c/code\u003e → generic OCCT failure; check the full message for specifics.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 2 — Read the operation logs:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"get_debug_logs()\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eget_debug_logs()\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLook at the sequence of calls leading up to the failure. Check whether an earlier\noperation produced a result that was silently bad — for example, a sketch that closed\nbut was under-constrained, which then produced degenerate geometry when padded.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 3 — Inspect document state:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;list_objects\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"list_objects\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eVerify every object you expect exists. Check visibility (hidden objects don't\nparticipate in booleans). Look for objects in error state.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo check object states explicitly:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"execute_python(\u0026quot;\u0026quot;\u0026quot;\n[(o.Name, o.Label, o.TypeId, getattr(o, 'State', 'n/a'))\n for o in FreeCAD.ActiveDocument.Objects]\n\u0026quot;\u0026quot;\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eexecute_python\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e[(o.Name, o.Label, o.TypeId, getattr(o, 'State', 'n/a'))\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e for o in FreeCAD.ActiveDocument.Objects]\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eObjects with \u003ccode\u003eState\u003c/code\u003e containing \u003ccode\u003e'Invalid'\u003c/code\u003e or \u003ccode\u003e'Error'\u003c/code\u003e are broken and need\nattention before anything downstream of them will work.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 4 — If it's a geometry validity failure:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBoolean operations and PartDesign features require valid, non-self-intersecting\nsolid input. Check each input:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"measurement_operations(operation=\u0026quot;check_solid\u0026quot;, object_name=\u0026quot;Body\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emeasurement_operations(operation=\"check_solid\", object_name=\"Body\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA valid solid returns \u003ccode\u003eis_valid: true\u003c/code\u003e. If it returns false, the problem is in how\nthat object was constructed, not in the operation you're trying to run. Fix the input\nfirst.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 5 — Clear state and retry:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;clear\u0026quot;)   # clear Report View\nview_control(operation=\u0026quot;undo\u0026quot;)    # undo the failed operation if it partially executed\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"clear\")   # clear Report View\nview_control(operation=\"undo\")    # undo the failed operation if it partially executed\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThen retry with smaller steps, checking geometry validity between each one.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2. FreeCAD Crashed / Disconnected\u003c/h2\u003e\u003ca id=\"user-content-2-freecad-crashed--disconnected\" class=\"anchor\" aria-label=\"Permalink: 2. FreeCAD Crashed / Disconnected\" href=\"#2-freecad-crashed--disconnected\"\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\"\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e A tool call returned a crash/disconnect error. The MCP bridge detected\nthat the socket connection was lost mid-operation.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 1 — Diagnose immediately:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"manage_connection(action=\u0026quot;status\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emanage_connection(action=\"status\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis reads the crash watcher file and bridge logs. It will tell you:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eWhat operation was in flight when the crash occurred (from the crash watcher)\u003c/li\u003e\n\u003cli\u003eWhether FreeCAD's process is still running\u003c/li\u003e\n\u003cli\u003eWhether the socket file exists\u003c/li\u003e\n\u003cli\u003eWhether recovery files are present\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eReport this information to the user verbatim. It is the most useful thing you can\nprovide at this point.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 2 — Tell the user what crashed and why.\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCommon causes of crashes:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eexecute_python\u003c/code\u003e with a boolean operation on invalid geometry → OCCT kernel crash,\ntypically during \u003ccode\u003efuse()\u003c/code\u003e, \u003ccode\u003ecut()\u003c/code\u003e, or \u003ccode\u003ecommon()\u003c/code\u003e on shapes with self-intersections\u003c/li\u003e\n\u003cli\u003eVery large geometry operations (thousands of faces, complex shells) → memory\nexhaustion or OCCT timeout\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edoc.recompute()\u003c/code\u003e on a document with circular dependencies → stack overflow\u003c/li\u003e\n\u003cli\u003eSetting \u003ccode\u003eLinkedObject = None\u003c/code\u003e on a link that has active clones → reference count\ncrash (this is a known FreeCAD issue)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 3 — Ask the user to restart FreeCAD.\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eDo not attempt any tool calls while FreeCAD is down — they will all fail and the\nerrors will be confusing. Wait for explicit user confirmation that FreeCAD is running\nagain and shows \"AI Copilot ready\" in the Report View.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 4 — Check for a crash loop before the user restarts:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf \u003ccode\u003emanage_connection(action=\"status\")\u003c/code\u003e reports recovery files present, clear them\nfirst or FreeCAD may crash again immediately:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"manage_connection(action=\u0026quot;clear_recovery\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emanage_connection(action=\"clear_recovery\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThen ask the user to restart.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 5 — After reconnection, verify document state:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"check_freecad_connection()\nview_control(operation=\u0026quot;list_objects\u0026quot;)\nview_control(operation=\u0026quot;get_report_view\u0026quot;, tail=30)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003echeck_freecad_connection()\nview_control(operation=\"list_objects\")\nview_control(operation=\"get_report_view\", tail=30)\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDetermine whether the document was restored from a recovery file (it may be in a\npartially-modified state), restored from the last explicit save (changes since then\nare lost), or not open at all. Communicate this clearly to the user before continuing.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 6 — Avoid repeating the crash:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the crash was during a boolean operation, validate geometry before retrying:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"measurement_operations(operation=\u0026quot;check_solid\u0026quot;, object_name=\u0026quot;...\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emeasurement_operations(operation=\"check_solid\", object_name=\"...\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf the crash was during a large \u003ccode\u003eexecute_python\u003c/code\u003e call, break it into smaller steps\nand use \u003ccode\u003eview_control(operation=\"checkpoint\", name=\"before_risky_op\")\u003c/code\u003e before each\nrisky operation so you can roll back without losing everything.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e3. FreeCAD Won't Connect At All\u003c/h2\u003e\u003ca id=\"user-content-3-freecad-wont-connect-at-all\" class=\"anchor\" aria-label=\"Permalink: 3. FreeCAD Won't Connect At All\" href=\"#3-freecad-wont-connect-at-all\"\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\"\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e \u003ccode\u003echeck_freecad_connection()\u003c/code\u003e fails. FreeCAD may appear to be running\n(the window is visible) but the socket is not answering.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 1 — Diagnose the socket state:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"manage_connection(action=\u0026quot;status\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emanage_connection(action=\"status\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis will report whether the socket file exists, whether connection is refused, and\nwhether the crash watcher has a last-op file. The combination tells you what happened:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eSocket file missing → FreeCAD is not running, or the AICopilot workbench never\nstarted (workbench load failure). User needs to launch FreeCAD.\u003c/li\u003e\n\u003cli\u003eSocket file present, connection refused → FreeCAD crashed and left the socket file\nbehind. User needs to quit FreeCAD (force-quit if necessary) and restart.\u003c/li\u003e\n\u003cli\u003eSocket file present, connection hangs → FreeCAD is running but the socket thread\nis blocked. This can happen if a GUI operation is blocking the Qt event loop.\nUser needs to force-quit and restart.\u003c/li\u003e\n\u003cli\u003eLast-op file present → FreeCAD crashed mid-operation. Note what operation it was\nand tell the user.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 2 — Check for crash loop:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf FreeCAD crashes immediately on startup, clear recovery files first:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"manage_connection(action=\u0026quot;clear_recovery\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emanage_connection(action=\"clear_recovery\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 3 — Verify workbench load after restart:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAsk the user to check View → Panels → Report View immediately after FreeCAD starts.\nThe correct startup sequence in the Report View is:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"Starting FreeCAD AI Copilot Service...\nMCP Debug infrastructure loaded\nCrash watcher loaded — op tracking active\nfreecad_mcp_handler vX.X.X validated\nModular handlers loaded successfully\nSocket server started on /tmp/freecad_mcp.sock\nAI Socket Server started - Claude ready\nFreeCAD AI Copilot ready.\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eStarting FreeCAD AI Copilot Service...\nMCP Debug infrastructure loaded\nCrash watcher loaded — op tracking active\nfreecad_mcp_handler vX.X.X validated\nModular handlers loaded successfully\nSocket server started on /tmp/freecad_mcp.sock\nAI Socket Server started - Claude ready\nFreeCAD AI Copilot ready.\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf the Report View is empty or shows only font/Qt warnings with no AICopilot lines,\nthe workbench didn't load. Common causes:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAICopilot not installed in the correct Mod directory (see AGENT-INSTALL.md)\u003c/li\u003e\n\u003cli\u003ePython dependency missing\u003c/li\u003e\n\u003cli\u003eSyntax error in a handler file (if the user has been editing the source)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eAsk the user to check Edit → Preferences → Workbenches and confirm AICopilot is\nin the enabled list. If it's there but not loading, ask them to check the FreeCAD\nstartup log (Help → About → Copy to Clipboard on some platforms, or the terminal\noutput if launched from a terminal).\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e4. Operation Succeeded But Result Looks Wrong\u003c/h2\u003e\u003ca id=\"user-content-4-operation-succeeded-but-result-looks-wrong\" class=\"anchor\" aria-label=\"Permalink: 4. Operation Succeeded But Result Looks Wrong\" href=\"#4-operation-succeeded-but-result-looks-wrong\"\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\"\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e No error reported, but the geometry, placement, or dimensions don't\nmatch what was intended.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 1 — Look at the actual state:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;screenshot\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"screenshot\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDon't assume the model is in the state you expect. Look at it. FreeCAD's 3D view\nshows exactly what's there, including misplacements, wrong orientations, and missing\nfeatures that were supposed to appear.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 2 — List all objects and their visibility:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;list_objects\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"list_objects\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCheck that the objects you intended to create exist and are visible. Invisible objects\ndon't render in the viewport and don't participate in boolean operations. Objects with\n\u003ccode\u003eVisibility: false\u003c/code\u003e need to be shown explicitly.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 3 — Measure what's actually there:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"measurement_operations(operation=\u0026quot;get_bounding_box\u0026quot;, object_name=\u0026quot;...\u0026quot;)\nmeasurement_operations(operation=\u0026quot;get_volume\u0026quot;, object_name=\u0026quot;...\u0026quot;)\nmeasurement_operations(operation=\u0026quot;list_faces\u0026quot;, object_name=\u0026quot;...\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emeasurement_operations(operation=\"get_bounding_box\", object_name=\"...\")\nmeasurement_operations(operation=\"get_volume\", object_name=\"...\")\nmeasurement_operations(operation=\"list_faces\", object_name=\"...\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCompare measured dimensions against intended dimensions. A bounding box tells you\nsize and position; face normals from \u003ccode\u003elist_faces\u003c/code\u003e tell you orientation.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 4 — Check if a previous operation produced bad intermediate state:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"get_debug_logs()\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eget_debug_logs()\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLook for any earlier operations that produced unexpected results. A sketch that was\nunder-constrained will produce geometry that looks reasonable but has wrong dimensions;\na pad on such a sketch inherits the error.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 5 — Undo and rebuild rather than patching:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;undo\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"undo\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse undo as many times as needed to get back to a known good state. Then rebuild with\nexplicit verification steps — check sketch constraints, verify sketch is fully\nconstrained before closing, check solid validity after each boolean.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 6 — If the result still looks wrong with no error to chase, consider\nrepresentation-layer failures:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThere is a class of FreeCAD bugs where the \u003cstrong\u003emodel is semantically correct\nbut the underlying topology has accumulated drift\u003c/strong\u003e that breaks OCCT\nBoolean operations silently — \u003ccode\u003eBRepAlgoAPI_Fuse\u003c/code\u003e returns one operand\nunchanged, \u003ccode\u003ePart::MultiFuse\u003c/code\u003e produces an incomplete shape, no error or\nwarning anywhere. The steps above (\u003ccode\u003eview_control\u003c/code\u003e / \u003ccode\u003elist_objects\u003c/code\u003e /\n\u003ccode\u003emeasurement_operations\u003c/code\u003e / \u003ccode\u003eget_debug_logs\u003c/code\u003e) don't surface these because\nthe symptom is on the OCCT side, not the FreeCAD side.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBefore reaching for an external library, try\n\u003ccode\u003emeasurement_operations(operation=\"find_root_cause\", object_name=\"...\")\u003c/code\u003e —\nit walks the object's own dependency subtree and will already catch a bad\n\u003ccode\u003eFillet\u003c/code\u003e, a \u003ccode\u003eRevolution\u003c/code\u003e silently producing a Shell instead of a Solid, or\na \u003ccode\u003eCompound\u003c/code\u003e whose children only touch at a seam without being fused. See\nsection 9 below for the full walkthrough, including why \u003ccode\u003echeck_solid\u003c/code\u003e\nalone can miss all three.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor diagnosing a deeper, subtler class of failure (silent Boolean drops, edge-coincident\nfuse failures, accumulated-history drift, deprecated-property warnings the\nuser missed, orphaned-feature parametric-link breakage), see\n\u003ca href=\"https://github.com/blwfish/Poirot2\"\u003ePoirot2\u003c/a\u003e — a diagnostic library +\nassistant playbook that runs inside FreeCAD via this MCP bridge and adds\nrepresentation-layer probes (\u003ccode\u003echeck_boolean_health\u003c/code\u003e cross-checks\n\u003ccode\u003eBRepAlgoAPI\u003c/code\u003e against \u003ccode\u003eBOPAlgo_Builder\u003c/code\u003e; \u003ccode\u003efind_recent_orphans\u003c/code\u003e sweeps for\nnull required references; etc.). Its \u003ccode\u003eAGENT-OPERATION.md\u003c/code\u003e is the\ncompanion playbook for this kind of diagnosis.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e5. Sketch or Constraint Failure\u003c/h2\u003e\u003ca id=\"user-content-5-sketch-or-constraint-failure\" class=\"anchor\" aria-label=\"Permalink: 5. Sketch or Constraint Failure\" href=\"#5-sketch-or-constraint-failure\"\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\"\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e A sketch operation fails, the sketch solver reports redundant or\nconflicting constraints, or the padded/pocketed result has wrong geometry.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 1 — Check sketch validity and constraint count:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"sketch_operations(operation=\u0026quot;verify_sketch\u0026quot;, sketch_name=\u0026quot;SketchName\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003esketch_operations(operation=\"verify_sketch\", sketch_name=\"SketchName\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis reports whether the sketch is valid, how many degrees of freedom remain (should\nbe 0 for fully constrained), and any solver issues.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 2 — List all constraints:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"sketch_operations(operation=\u0026quot;list_constraints\u0026quot;, sketch_name=\u0026quot;SketchName\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003esketch_operations(operation=\"list_constraints\", sketch_name=\"SketchName\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLook for:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eRedundant constraints — the same dimension constrained twice, or a geometric\nconstraint that's already implied by another. Remove duplicates.\u003c/li\u003e\n\u003cli\u003eConflicting constraints — two constraints that can't both be satisfied (e.g.,\na horizontal constraint on a line that also has a fixed angle). One must be removed.\u003c/li\u003e\n\u003cli\u003eMissing constraints — degrees of freedom \u0026gt; 0 means the sketch is under-constrained.\nGeometry will be placed at FreeCAD's best guess, which may not be what you want.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 3 — Check the Report View for solver output:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;get_report_view\u0026quot;, tail=20, filter=\u0026quot;sketch\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"get_report_view\", tail=20, filter=\"sketch\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFreeCAD's sketch solver logs detail here when it fails to converge or detects\nredundancy.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 4 — Common constraint mistakes:\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eGeometry IDs are assigned sequentially from 0 as geometry is added. Special IDs:\n\u003ccode\u003e-1\u003c/code\u003e = X axis, \u003ccode\u003e-2\u003c/code\u003e = Y axis. If you add geometry in a different order than\nexpected, the IDs shift.\u003c/li\u003e\n\u003cli\u003ePoint IDs: \u003ccode\u003e0\u003c/code\u003e = on edge (any point), \u003ccode\u003e1\u003c/code\u003e = start vertex, \u003ccode\u003e2\u003c/code\u003e = end vertex,\n\u003ccode\u003e3\u003c/code\u003e = center (for arcs/circles).\u003c/li\u003e\n\u003cli\u003eA rectangle added with \u003ccode\u003eadd_rectangle\u003c/code\u003e creates 4 line segments (geo IDs 0–3) plus\na construction point. Constraints on the rectangle reference these IDs.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e6. External Link / Reference Broken\u003c/h2\u003e\u003ca id=\"user-content-6-external-link--reference-broken\" class=\"anchor\" aria-label=\"Permalink: 6. External Link / Reference Broken\" href=\"#6-external-link--reference-broken\"\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\"\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e On document open, the Report View shows messages like:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"Link not restored\nLinked object: Body\nLinked document: general-windows\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eLink not restored\nLinked object: Body\nLinked document: general-windows\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eor:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"Standard Window Master A: Link broken!\nObject: Body\nFile: ../../../General Parts/general-windows.FCStd\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eStandard Window Master A: Link broken!\nObject: Body\nFile: ../../../General Parts/general-windows.FCStd\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eWhat this means:\u003c/strong\u003e An \u003ccode\u003eApp::Link\u003c/code\u003e object in the current document points to an\nobject by name in an external \u003ccode\u003e.FCStd\u003c/code\u003e file. That named object no longer exists —\neither the file was rebuilt (the object was renamed or replaced), the file was moved,\nor the link was saved pointing to an object that never existed.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNote: the missing object (\u003ccode\u003eBody\u003c/code\u003e in the example) is in the \u003cem\u003eexternal\u003c/em\u003e file, not in\nthe current document. Don't look for it in the current document's object list.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 1 — Identify which links are broken:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"execute_python(\u0026quot;\u0026quot;\u0026quot;\ndoc = FreeCAD.ActiveDocument\nlinks = [o for o in doc.Objects if o.TypeId == 'App::Link']\n[(l.Name, l.Label, str(l.LinkedObject)) for l in links]\n\u0026quot;\u0026quot;\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eexecute_python\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003edoc = FreeCAD.ActiveDocument\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elinks = [o for o in doc.Objects if o.TypeId == 'App::Link']\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e[(l.Name, l.Label, str(l.LinkedObject)) for l in links]\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAny link where \u003ccode\u003eLinkedObject\u003c/code\u003e prints as \u003ccode\u003eNone\u003c/code\u003e is broken.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 2 — Find the external file path:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"execute_python(\u0026quot;\u0026quot;\u0026quot;\nimport FreeCAD\n# Get the source document — it may be open as a partial document\nfor name, doc in FreeCAD.listDocuments().items():\n    print(name, doc.FileName)\n\u0026quot;\u0026quot;\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eexecute_python\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eimport FreeCAD\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e# Get the source document — it may be open as a partial document\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003efor name, doc in FreeCAD.listDocuments().items():\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e    print(name, doc.FileName)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 3 — Check what objects actually exist in the external file:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe external document may be loaded as a \"partial document\" — FreeCAD lazy-loads\nexternal references, so \u003ccode\u003edoc.Objects\u003c/code\u003e may be empty even though the file is open.\nRead the file directly:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"execute_python(\u0026quot;\u0026quot;\u0026quot;\nimport zipfile, re\npath = '/actual/path/to/external.FCStd'\nwith zipfile.ZipFile(path) as z:\n    xml = z.read('Document.xml').decode()\nnames = re.findall(r'\u0026lt;Object name=\u0026quot;([^\u0026quot;]+)\u0026quot;', xml)\nnames\n\u0026quot;\u0026quot;\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eexecute_python\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eimport zipfile, re\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003epath = '/actual/path/to/external.FCStd'\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003ewith zipfile.ZipFile(path) as z:\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e    xml = z.read('Document.xml').decode()\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003enames = re.findall(r'\u0026lt;Object name=\"([^\"]+)\"', xml)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003enames\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis lists every object in the file without triggering a full load.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 4 — Force-load the partial document if needed:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"execute_python(\u0026quot;\u0026quot;\u0026quot;\next_doc = FreeCAD.getDocument('external_doc_name')\next_doc.restore()   # forces full load\n[(o.Name, o.Label, o.TypeId) for o in ext_doc.Objects]\n\u0026quot;\u0026quot;\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eexecute_python\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eext_doc = FreeCAD.getDocument('external_doc_name')\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eext_doc.restore()   # forces full load\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e[(o.Name, o.Label, o.TypeId) for o in ext_doc.Objects]\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 5 — Repair the link:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOnce you know the correct target object name:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"execute_python(\u0026quot;\u0026quot;\u0026quot;\ndoc = FreeCAD.ActiveDocument\next_doc = FreeCAD.getDocument('external_doc_name')\nlnk = doc.getObject('Link002')\ntarget = ext_doc.getObject('Fusion')   # correct object name\nlnk.LinkedObject = target\ndoc.recompute()\nprint('LinkedObject now:', lnk.LinkedObject)\n\u0026quot;\u0026quot;\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eexecute_python\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003edoc = FreeCAD.ActiveDocument\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eext_doc = FreeCAD.getDocument('external_doc_name')\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elnk = doc.getObject('Link002')\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003etarget = ext_doc.getObject('Fusion')   # correct object name\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elnk.LinkedObject = target\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003edoc.recompute()\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eprint('LinkedObject now:', lnk.LinkedObject)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 6 — Save to make the fix permanent:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;save_document\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"save_document\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWithout saving, the fix will be lost if FreeCAD closes or crashes.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e7. Topology Naming Warnings (hasher mismatch, ElementMap errors)\u003c/h2\u003e\u003ca id=\"user-content-7-topology-naming-warnings-hasher-mismatch-elementmap-errors\" class=\"anchor\" aria-label=\"Permalink: 7. Topology Naming Warnings (hasher mismatch, ElementMap errors)\" href=\"#7-topology-naming-warnings-hasher-mismatch-elementmap-errors\"\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\"\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e After a recompute or document open, the Report View contains:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\u0026lt;TopoShape\u0026gt; TopoShapeExpansion.cpp(989): hasher mismatch\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e\u0026lt;TopoShape\u0026gt; TopoShapeExpansion.cpp(989): hasher mismatch\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eor:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"\u0026lt;ElementMap\u0026gt; \u0026lt;string\u0026gt;(1): Invalid element name string id\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e\u0026lt;ElementMap\u0026gt; \u0026lt;string\u0026gt;(1): Invalid element name string id\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eWhat these mean:\u003c/strong\u003e FreeCAD's topology naming system assigns stable string IDs to\nindividual faces, edges, and vertices so that downstream features (fillets, sketch\nattachments) can reference them reliably even when the model changes. These warnings\nfire when shapes from different sources (different documents, different FreeCAD\nversions) have incompatible hashers — the internal ID generators don't match — or\nwhen element name string IDs are malformed.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eDo you need to act on these?\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUsually no. These warnings matter only if something downstream holds a reference to\na specific face or edge of the affected geometry — for example, a fillet that\nreferences a specific edge by name, or a sketch attached to a specific face. If no\ndownstream features reference topology of the affected objects, the warnings are\nnoise and the geometry is correct.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo determine whether to act: check whether any objects report \u003ccode\u003eState: Invalid\u003c/code\u003e or\n\u003ccode\u003eState: Error\u003c/code\u003e after the recompute. If everything recomputes cleanly, the warnings\nare harmless. If objects are invalid, the topology naming issue may be contributing.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e8. Document Recompute Failures\u003c/h2\u003e\u003ca id=\"user-content-8-document-recompute-failures\" class=\"anchor\" aria-label=\"Permalink: 8. Document Recompute Failures\" href=\"#8-document-recompute-failures\"\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\"\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e After creating or modifying objects, some show orange or red icons in\nthe model tree, or \u003ccode\u003eview_control(operation=\"list_objects\")\u003c/code\u003e shows objects with error\nstates.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 1 — Force recompute:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"execute_python(\u0026quot;FreeCAD.ActiveDocument.recompute()\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eexecute_python\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"FreeCAD.ActiveDocument.recompute()\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSome recomputes are deferred. Forcing one often resolves apparent errors.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 2 — Check what's invalid:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"execute_python(\u0026quot;\u0026quot;\u0026quot;\n[(o.Name, o.Label, o.TypeId, getattr(o, 'State', []))\n for o in FreeCAD.ActiveDocument.Objects\n if getattr(o, 'State', []) and 'Invalid' in getattr(o, 'State', [])]\n\u0026quot;\u0026quot;\u0026quot;)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-en\"\u003eexecute_python\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e[(o.Name, o.Label, o.TypeId, getattr(o, 'State', []))\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e for o in FreeCAD.ActiveDocument.Objects\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e if getattr(o, 'State', []) and 'Invalid' in getattr(o, 'State', [])]\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\"\"\"\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 3 — Trace the dependency chain:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eObjects in FreeCAD have dependencies — a Pad depends on a Sketch, a Boolean depends\non its inputs. An invalid object invalidates everything downstream. Find the earliest\ninvalid object in the dependency chain; fixing that one will often fix everything\ndownstream automatically after recompute. \u003ccode\u003emeasurement_operations(operation= \"find_root_cause\", object_name=\"...\")\u003c/code\u003e automates exactly this trace — see section 9\nbelow — so you don't have to walk \u003ccode\u003eOutList\u003c/code\u003e and re-check each object by hand.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 4 — Read the Report View:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;get_report_view\u0026quot;, tail=50, filter=\u0026quot;recompute\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"get_report_view\", tail=50, filter=\"recompute\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFreeCAD logs which objects failed recompute and why.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e9. Diagnosing a Failure That Surfaced Far From Its Cause\u003c/h2\u003e\u003ca id=\"user-content-9-diagnosing-a-failure-that-surfaced-far-from-its-cause\" class=\"anchor\" aria-label=\"Permalink: 9. Diagnosing a Failure That Surfaced Far From Its Cause\" href=\"#9-diagnosing-a-failure-that-surfaced-far-from-its-cause\"\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\"\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e A boolean operation, CAM job, or export fails (or FreeCAD's native\nCheck Geometry reports errors) on an object built from many upstream features —\na \u003ccode\u003ePart::Compound\u003c/code\u003e, a long chain of Fuse/Cut operations, a body assembled from\nseveral sketches and revolves — and \u003ccode\u003echeck_solid\u003c/code\u003e or \u003ccode\u003ediagnose_invalid_shape\u003c/code\u003e\non that object either reports \"fine\" or reports an error without saying which\nupstream feature actually caused it.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 1 — walk the object's own dependency subtree instead of guessing:\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"measurement_operations(operation=\u0026quot;find_root_cause\u0026quot;, object_name=\u0026quot;...\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emeasurement_operations(operation=\"find_root_cause\", object_name=\"...\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis checks every sketch (open/unclosed wires — the same check \u003ccode\u003everify_sketch\u003c/code\u003e\nruns) and every shape-bearing feature in that object's \u003ccode\u003eOutList\u003c/code\u003e subtree\nindependently: null shape, \u003ccode\u003eShape.isValid()\u003c/code\u003e, whether a feature that produced\nFaces actually produced any Solids (a \u003ccode\u003eRevolution\u003c/code\u003e or \u003ccode\u003eExtrusion\u003c/code\u003e with\n\u003ccode\u003eSolid=False\u003c/code\u003e silently produces a Shell instead), and \u003ccode\u003eshape.check(True)\u003c/code\u003e — the\nsame boolean-operation check the native Check Geometry dialog runs, which\ncatches self-intersections and invalid-curve-on-surface defects that\n\u003ccode\u003eShape.isValid()\u003c/code\u003e alone misses. It reports which object(s) actually\n\u003cstrong\u003eintroduced\u003c/strong\u003e each defect versus which ones are only \u003cstrong\u003einheriting/\npropagating\u003c/strong\u003e it from upstream, so you get \"the Fillet produced an invalid\ncurve\" instead of \"the Compound is broken\" — the object where the symptom\nshowed up is rarely where the defect originated.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 2 — know check_solid's blind spot before trusting it alone:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003echeck_solid\u003c/code\u003e (and \u003ccode\u003eShape.isValid()\u003c/code\u003e) on a \u003ccode\u003ePart::Compound\u003c/code\u003e, or any object with\nmultiple children, answers \"does at least one Solid exist somewhere in this\nshape\" — not \"is every child actually a Solid.\" A Compound built from two real\nsolids and one bare Shell (the \u003ccode\u003eSolid=False\u003c/code\u003e case above) will report \u003cstrong\u003e\"Is a\nclosed solid,\"\u003c/strong\u003e because the check only requires \u003cem\u003ea\u003c/em\u003e Solid to be present, not\n\u003cem\u003eall\u003c/em\u003e children to be Solids. The same object can also pass \u003ccode\u003eisClosed()\u003c/code\u003e\ncleanly at the top level while containing a self-intersection that only\nexists at the seam between two touching-but-unfused children — neither defect\nshows up until something downstream assumes \"this is a solid\" and breaks.\n\u003ccode\u003efind_root_cause\u003c/code\u003e doesn't share this blind spot, because it checks each child\nindependently rather than asking whether a Solid exists anywhere in the tree.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStep 3 — if find_root_cause finds nothing, or the failure looks like\nrepresentation-layer drift rather than an obvious topology error:\u003c/strong\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSee the Poirot2 pointer in section 4 above — that's a heavier, separate\ndiagnostic library for a subtler class of failure (silent Boolean drops,\naccumulated-history corruption) than the one \u003ccode\u003efind_root_cause\u003c/code\u003e targets.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGeneral Principles\u003c/h2\u003e\u003ca id=\"user-content-general-principles\" class=\"anchor\" aria-label=\"Permalink: General Principles\" href=\"#general-principles\"\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\"\u003e\u003cstrong\u003eRead before guessing.\u003c/strong\u003e Use \u003ccode\u003eget_report_view\u003c/code\u003e, \u003ccode\u003eget_debug_logs\u003c/code\u003e, and \u003ccode\u003elist_objects\u003c/code\u003e\nbefore forming a hypothesis. The diagnostic tools were built specifically because\nFreeCAD's error reporting is cryptic — use them.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eDon't patch bad state forward.\u003c/strong\u003e If an object is in an invalid state, undo to\nbefore it was created and rebuild it correctly. Trying to fix a broken object in\nplace usually propagates the problem to downstream features.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eValidate geometry after boolean operations.\u003c/strong\u003e After every \u003ccode\u003efuse\u003c/code\u003e, \u003ccode\u003ecut\u003c/code\u003e, or\n\u003ccode\u003ecommon\u003c/code\u003e, call \u003ccode\u003emeasurement_operations(operation=\"check_solid\")\u003c/code\u003e on the result.\nBoolean operations on invalid input silently produce invalid output. Building further\nfeatures on invalid geometry leads to cascading failures that are hard to diagnose.\n\u003cstrong\u003eOn a \u003ccode\u003ePart::Compound\u003c/code\u003e or any result assembled from multiple children,\n\u003ccode\u003echeck_solid\u003c/code\u003e only confirms that \u003cem\u003ea\u003c/em\u003e Solid exists somewhere in the shape — not\nthat every child is one\u003c/strong\u003e (see section 9). Use \u003ccode\u003efind_root_cause\u003c/code\u003e instead of a\nbare \u003ccode\u003echeck_solid\u003c/code\u003e call whenever the object being checked has more than one\nmeaningful child.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eUse checkpoints before risky operations.\u003c/strong\u003e Before any operation that could crash\nor corrupt the document:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;checkpoint\u0026quot;, name=\u0026quot;before_risky_op\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"checkpoint\", name=\"before_risky_op\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf something goes wrong, you can roll back to this state rather than having to start\nover. Call \u003ccode\u003eview_control(operation=\"rollback_to_checkpoint\", name=\"before_risky_op\")\u003c/code\u003e\nto restore.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eBreak large \u003ccode\u003eexecute_python\u003c/code\u003e calls into smaller ones.\u003c/strong\u003e A crash during a long\noperation loses the whole thing. A boolean on large geometry, a complex loft, or a\nlong array generation are all candidates for splitting. Run the expensive geometry\nfirst, verify it, then proceed.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eReport crash details to the user.\u003c/strong\u003e If FreeCAD crashed, tell the user exactly what\n\u003ccode\u003emanage_connection(action=\"status\")\u003c/code\u003e shows — what operation was in flight, what the\ncrash watcher recorded, whether recovery files are present. This is the information\nneeded to file a useful bug report at \u003ca href=\"https://github.com/blwfish/freecad-mcp/issues\"\u003ehttps://github.com/blwfish/freecad-mcp/issues\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eSave after successful fixes.\u003c/strong\u003e After repairing a broken link, fixing invalid\ngeometry, or completing any significant work, save explicitly:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"view_control(operation=\u0026quot;save_document\u0026quot;)\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eview_control(operation=\"save_document\")\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFreeCAD's autosave recovery mechanism is a fallback, not a substitute for saving.\u003c/p\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"FreeCAD MCP — Agent Debugging Guide","fully_qualified_name":"FreeCAD MCP — Agent Debugging Guide","kind":"section_1","ident_start":2,"ident_end":39,"extent_start":0,"extent_end":31221,"ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":37}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":725,"utf16_col":0}}},{"name":"Your Debugging Toolkit","fully_qualified_name":"Your Debugging Toolkit","kind":"section_2","ident_start":375,"ident_end":397,"extent_start":372,"extent_end":7613,"ident_utf16":{"start":{"line_number":9,"utf16_col":3},"end":{"line_number":9,"utf16_col":25}},"extent_utf16":{"start":{"line_number":9,"utf16_col":0},"end":{"line_number":156,"utf16_col":0}}},{"name":"`get_debug_logs()`","fully_qualified_name":"`get_debug_logs()`","kind":"section_3","ident_start":630,"ident_end":648,"extent_start":626,"extent_end":1766,"ident_utf16":{"start":{"line_number":15,"utf16_col":4},"end":{"line_number":15,"utf16_col":22}},"extent_utf16":{"start":{"line_number":15,"utf16_col":0},"end":{"line_number":38,"utf16_col":0}}},{"name":"A response's top-level `events` field","fully_qualified_name":"A response's top-level `events` field","kind":"section_3","ident_start":1770,"ident_end":1807,"extent_start":1766,"extent_end":2587,"ident_utf16":{"start":{"line_number":38,"utf16_col":4},"end":{"line_number":38,"utf16_col":41}},"extent_utf16":{"start":{"line_number":38,"utf16_col":0},"end":{"line_number":50,"utf16_col":0}}},{"name":"`view_control(operation=\"get_report_view\", tail=N, filter=\"...\", clear=False)`","fully_qualified_name":"`view_control(operation=\"get_report_view\", tail=N, filter=\"...\", clear=False)`","kind":"section_3","ident_start":2591,"ident_end":2669,"extent_start":2587,"extent_end":4377,"ident_utf16":{"start":{"line_number":50,"utf16_col":4},"end":{"line_number":50,"utf16_col":82}},"extent_utf16":{"start":{"line_number":50,"utf16_col":0},"end":{"line_number":80,"utf16_col":0}}},{"name":"`manage_connection(action=\"status\")`","fully_qualified_name":"`manage_connection(action=\"status\")`","kind":"section_3","ident_start":4381,"ident_end":4417,"extent_start":4377,"extent_end":4959,"ident_utf16":{"start":{"line_number":80,"utf16_col":4},"end":{"line_number":80,"utf16_col":40}},"extent_utf16":{"start":{"line_number":80,"utf16_col":0},"end":{"line_number":93,"utf16_col":0}}},{"name":"`manage_connection(action=\"clear_recovery\")`","fully_qualified_name":"`manage_connection(action=\"clear_recovery\")`","kind":"section_3","ident_start":4963,"ident_end":5007,"extent_start":4959,"extent_end":5687,"ident_utf16":{"start":{"line_number":93,"utf16_col":4},"end":{"line_number":93,"utf16_col":48}},"extent_utf16":{"start":{"line_number":93,"utf16_col":0},"end":{"line_number":107,"utf16_col":0}}},{"name":"`manage_connection(action=\"validate_fcstd\", filename=\"...\")`","fully_qualified_name":"`manage_connection(action=\"validate_fcstd\", filename=\"...\")`","kind":"section_3","ident_start":5691,"ident_end":5751,"extent_start":5687,"extent_end":6204,"ident_utf16":{"start":{"line_number":107,"utf16_col":4},"end":{"line_number":107,"utf16_col":64}},"extent_utf16":{"start":{"line_number":107,"utf16_col":0},"end":{"line_number":117,"utf16_col":0}}},{"name":"Crash watcher — `/tmp/freecad_mcp_last_op_\u003cpid\u003e.json`","fully_qualified_name":"Crash watcher — `/tmp/freecad_mcp_last_op_\u003cpid\u003e.json`","kind":"section_3","ident_start":6208,"ident_end":6263,"extent_start":6204,"extent_end":7613,"ident_utf16":{"start":{"line_number":117,"utf16_col":4},"end":{"line_number":117,"utf16_col":57}},"extent_utf16":{"start":{"line_number":117,"utf16_col":0},"end":{"line_number":156,"utf16_col":0}}},{"name":"1. Operation Returned an Error","fully_qualified_name":"1. Operation Returned an Error","kind":"section_2","ident_start":7616,"ident_end":7646,"extent_start":7613,"extent_end":10387,"ident_utf16":{"start":{"line_number":156,"utf16_col":3},"end":{"line_number":156,"utf16_col":33}},"extent_utf16":{"start":{"line_number":156,"utf16_col":0},"end":{"line_number":226,"utf16_col":0}}},{"name":"2. FreeCAD Crashed / Disconnected","fully_qualified_name":"2. FreeCAD Crashed / Disconnected","kind":"section_2","ident_start":10390,"ident_end":10423,"extent_start":10387,"extent_end":12999,"ident_utf16":{"start":{"line_number":226,"utf16_col":3},"end":{"line_number":226,"utf16_col":36}},"extent_utf16":{"start":{"line_number":226,"utf16_col":0},"end":{"line_number":292,"utf16_col":0}}},{"name":"3. FreeCAD Won't Connect At All","fully_qualified_name":"3. FreeCAD Won't Connect At All","kind":"section_2","ident_start":13002,"ident_end":13033,"extent_start":12999,"extent_end":15323,"ident_utf16":{"start":{"line_number":292,"utf16_col":3},"end":{"line_number":292,"utf16_col":34}},"extent_utf16":{"start":{"line_number":292,"utf16_col":0},"end":{"line_number":349,"utf16_col":0}}},{"name":"4. Operation Succeeded But Result Looks Wrong","fully_qualified_name":"4. Operation Succeeded But Result Looks Wrong","kind":"section_2","ident_start":15326,"ident_end":15371,"extent_start":15323,"extent_end":18825,"ident_utf16":{"start":{"line_number":349,"utf16_col":3},"end":{"line_number":349,"utf16_col":48}},"extent_utf16":{"start":{"line_number":349,"utf16_col":0},"end":{"line_number":426,"utf16_col":0}}},{"name":"5. Sketch or Constraint Failure","fully_qualified_name":"5. Sketch or Constraint Failure","kind":"section_2","ident_start":18828,"ident_end":18859,"extent_start":18825,"extent_end":20643,"ident_utf16":{"start":{"line_number":426,"utf16_col":3},"end":{"line_number":426,"utf16_col":34}},"extent_utf16":{"start":{"line_number":426,"utf16_col":0},"end":{"line_number":469,"utf16_col":0}}},{"name":"6. External Link / Reference Broken","fully_qualified_name":"6. External Link / Reference Broken","kind":"section_2","ident_start":20646,"ident_end":20681,"extent_start":20643,"extent_end":23304,"ident_utf16":{"start":{"line_number":469,"utf16_col":3},"end":{"line_number":469,"utf16_col":38}},"extent_utf16":{"start":{"line_number":469,"utf16_col":0},"end":{"line_number":561,"utf16_col":0}}},{"name":"7. Topology Naming Warnings (hasher mismatch, ElementMap errors)","fully_qualified_name":"7. Topology Naming Warnings (hasher mismatch, ElementMap errors)","kind":"section_2","ident_start":23307,"ident_end":23371,"extent_start":23304,"extent_end":24699,"ident_utf16":{"start":{"line_number":561,"utf16_col":3},"end":{"line_number":561,"utf16_col":67}},"extent_utf16":{"start":{"line_number":561,"utf16_col":0},"end":{"line_number":593,"utf16_col":0}}},{"name":"8. Document Recompute Failures","fully_qualified_name":"8. Document Recompute Failures","kind":"section_2","ident_start":24702,"ident_end":24732,"extent_start":24699,"extent_end":26043,"ident_utf16":{"start":{"line_number":593,"utf16_col":3},"end":{"line_number":593,"utf16_col":33}},"extent_utf16":{"start":{"line_number":593,"utf16_col":0},"end":{"line_number":631,"utf16_col":0}}},{"name":"9. Diagnosing a Failure That Surfaced Far From Its Cause","fully_qualified_name":"9. Diagnosing a Failure That Surfaced Far From Its Cause","kind":"section_2","ident_start":26046,"ident_end":26102,"extent_start":26043,"extent_end":28848,"ident_utf16":{"start":{"line_number":631,"utf16_col":3},"end":{"line_number":631,"utf16_col":59}},"extent_utf16":{"start":{"line_number":631,"utf16_col":0},"end":{"line_number":680,"utf16_col":0}}},{"name":"General Principles","fully_qualified_name":"General Principles","kind":"section_2","ident_start":28851,"ident_end":28869,"extent_start":28848,"extent_end":31221,"ident_utf16":{"start":{"line_number":680,"utf16_col":3},"end":{"line_number":680,"utf16_col":21}},"extent_utf16":{"start":{"line_number":680,"utf16_col":0},"end":{"line_number":725,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":1162318725,"defaultBranch":"main","name":"freecad-mcp","ownerLogin":"blwfish","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2026-02-20T05:38:17.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/24812846?v=4","public":true,"private":false,"isOrgOwned":false,"isArchived":false},"currentUser":null,"uploadToken":"aBRkRHgJnaT5X_M1v7Tsg8ryKMaUsqXPF8FaC8XmkW14unUm_lNuZDZLWebIoDkpb6-38_5IBzp8x1knOnjOQg","allShortcutsEnabled":false,"treeExpanded":true,"path":"AGENT-DEBUGGING.md","symbolsExpanded":false,"refInfo":{"name":"main","listCacheKey":"v0:1791130545.0","canEdit":false,"currentOid":"00732265e0aa70ef6c85bd465a3049262e6fdb89"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"":{"items":[{"name":".claude-review","path":".claude-review","contentType":"directory"},{"name":".github","path":".github","contentType":"directory"},{"name":"AICopilot","path":"AICopilot","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"fixtures","path":"fixtures","contentType":"directory"},{"name":"helpers","path":"helpers","contentType":"directory"},{"name":"scripts","path":"scripts","contentType":"directory"},{"name":"tests","path":"tests","contentType":"directory"},{"name":".dockerignore","path":".dockerignore","contentType":"file"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"AGENT-DEBUGGING.md","path":"AGENT-DEBUGGING.md","contentType":"file"},{"name":"AGENT-INSTALL.md","path":"AGENT-INSTALL.md","contentType":"file"},{"name":"CHANGELOG.md","path":"CHANGELOG.md","contentType":"file"},{"name":"CODE_OF_CONDUCT.md","path":"CODE_OF_CONDUCT.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"DEFERRED_TESTS.md","path":"DEFERRED_TESTS.md","contentType":"file"},{"name":"Dockerfile","path":"Dockerfile","contentType":"file"},{"name":"KNOWN_ISSUES.md","path":"KNOWN_ISSUES.md","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"SECURITY.md","path":"SECURITY.md","contentType":"file"},{"name":"SPEC-debug-usage-logging.md","path":"SPEC-debug-usage-logging.md","contentType":"file"},{"name":"SPEC-fc-api-drift-detection.md","path":"SPEC-fc-api-drift-detection.md","contentType":"file"},{"name":"SPEC-fc-suite-derived-integration-tests.md","path":"SPEC-fc-suite-derived-integration-tests.md","contentType":"file"},{"name":"SPEC-heavy-op-subprocess-offload.md","path":"SPEC-heavy-op-subprocess-offload.md","contentType":"file"},{"name":"SPEC-varset-operations.md","path":"SPEC-varset-operations.md","contentType":"file"},{"name":"TOOLS.md","path":"TOOLS.md","contentType":"file"},{"name":"cliff.toml","path":"cliff.toml","contentType":"file"},{"name":"deploy.sh","path":"deploy.sh","contentType":"file"},{"name":"docker-entrypoint.sh","path":"docker-entrypoint.sh","contentType":"file"},{"name":"freecad_crash_report.py","path":"freecad_crash_report.py","contentType":"file"},{"name":"freecad_mcp_server.py","path":"freecad_mcp_server.py","contentType":"file"},{"name":"glama.json","path":"glama.json","contentType":"file"},{"name":"mcp_bridge_framing.py","path":"mcp_bridge_framing.py","contentType":"file"},{"name":"pyproject.toml","path":"pyproject.toml","contentType":"file"},{"name":"requirements.txt","path":"requirements.txt","contentType":"file"},{"name":"server.json","path":"server.json","contentType":"file"},{"name":"usage_guidance.py","path":"usage_guidance.py","contentType":"file"},{"name":"uv.lock","path":"uv.lock","contentType":"file"}],"totalCount":40}},"fileTreeProcessingTime":23.376939,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"main","listCacheKey":"v0:1791130545.0","canEdit":false,"refType":"branch","currentOid":"00732265e0aa70ef6c85bd465a3049262e6fdb89","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"AGENT-DEBUGGING.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/blwfish/freecad-mcp/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"AGENT-DEBUGGING.md","displayUrl":"https://github.com/blwfish/freecad-mcp/blob/main/AGENT-DEBUGGING.md?raw=true","headerInfo":{"blobSize":"30.5 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":"502f9bd","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fblwfish%2Ffreecad-mcp%2Fblob%2Fmain%2FAGENT-DEBUGGING.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"725","truncatedSloc":"594"},"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":"/blwfish/freecad-mcp/blob/main/AGENT-DEBUGGING.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/blwfish/freecad-mcp/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/blwfish/freecad-mcp/raw/refs/heads/main/AGENT-DEBUGGING.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":["# FreeCAD MCP — Agent Debugging Guide","","This file is for you, the AI agent. When something goes wrong with a FreeCAD MCP","operation, follow the relevant section below. Don't guess — the diagnostic tools","exist precisely so you don't have to. Read the output carefully; the tools are","designed to give you specific, actionable information rather than generic status.","","---","","## Your Debugging Toolkit","","This MCP exposes diagnostic infrastructure that most FreeCAD users don't know exists","and that most other MCPs don't provide. These tools are your primary resource when","something goes wrong. Use them before forming hypotheses.","","### `get_debug_logs()`","","Reads the structured operation log at `~/.freecad-mcp/logs/`. Every tool call is","recorded as a pair of JSONL entries — COMMAND_START (before execution) and either","COMMAND_SUCCESS or COMMAND_FAILURE (after). Each entry includes the tool name,","arguments, duration, and a snapshot of the result or error.","","**What to look for:**","- The sequence of operations leading to the failure, not just the failing call itself.","  Often the problem was set up by a previous operation that succeeded but left bad state.","- Duration anomalies — an operation that normally takes 0.1s taking 30s usually means","  FreeCAD was hung waiting on something (GIL contention, OCCT blocked).","- COMMAND_FAILURE entries earlier in the sequence that may have been silently ignored.","","**Sample output:**","```","{\"timestamp\": \"2026-04-18T15:23:42.3\", \"operation\": \"COMMAND_START\","," \"parameters\": {\"tool\": \"execute_python_async\", \"args\": {\"code\": \"...\"}}}","{\"timestamp\": \"2026-04-18T15:23:44.1\", \"operation\": \"COMMAND_SUCCESS\","," \"parameters\": {\"tool\": \"poll_job\"}, \"duration_seconds\": 0.074,"," \"result\": \"{\\\"status\\\": \\\"done\\\", \\\"result\\\": \\\"...\\\"}\"}","```","","### A response's top-level `events` field","","Some tool responses carry a top-level `events` array even when the call otherwise","looks like it succeeded — this is [`mcp-events`](https://github.com/blwfish/mcp-events),","a structured-signaling package the bridge uses instead of swallowing a soft failure or","burying it in a free-text log line. Today it fires for things like a FreeCAD response","that couldn't be parsed as JSON, an image that couldn't be extracted from a response, or","spawned-instance metadata that couldn't be enriched — none of which necessarily fail the","call outright, but all of which explain a result that's present but incomplete or off.","**Check for an `events` key before assuming a response with no `error` field is fully","clean**, especially under \"Operation Succeeded But Result Looks Wrong\" below.","","### `view_control(operation=\"get_report_view\", tail=N, filter=\"...\", clear=False)`","","Reads FreeCAD's Report View — the panel where FreeCAD logs recompute warnings, OCCT","messages, link restore failures, sketch solver output, and AICopilot workbench status.","This is frequently where the real error is, even when the tool call error message is","vague or generic.","","**Parameters:**","- `tail=50` — return the last N lines (default 50; increase if the failure happened","  a while ago and the log has scrolled)","- `filter=\"error\"` — return only lines containing \"error\" (case-insensitive). Also","  useful: `filter=\"warning\"`, `filter=\"link\"`, `filter=\"sketch\"`, `filter=\"recompute\"`","- `clear=True` — clear the Report View after reading. Do this before retrying a","  failed operation so the next read shows only fresh output.","","**What to look for:**","- `Link not restored` / `Link broken!` — an external reference couldn't be resolved.","  The message includes the object name and file path. See section 6.","- `BRep_API: command not done` — an OCCT boolean operation failed. The geometry fed","  into it was probably invalid. Check `check_solid` on the input objects.","- `Recomputation required` — a document needs recompute after a parameter change.","  Call `execute_python(\"FreeCAD.ActiveDocument.recompute()\")`.","- `Sketcher: sketch has ... redundant constraint(s)` — over-constrained sketch.","  See section 5.","- `hasher mismatch` — topology naming bookkeeping issue when shapes cross document","  boundaries. Usually harmless unless downstream features reference specific faces","  of the affected geometry. See section 7.","- `PropertyTopoShape: Recomputation required ... geo element version change` — normal","  when opening a document saved with a different FreeCAD version. Trigger a recompute.","","### `manage_connection(action=\"status\")`","","Runs entirely on the bridge side — does not require FreeCAD to be running or","responsive. Reports:","- Whether the socket file exists and whether connections succeed","- The contents of the crash watcher's per-PID last-op file (matched via","  `/tmp/freecad_mcp_last_op_*.json`; what the crash watcher recorded as the","  in-flight operation when FreeCAD last crashed, if anything)","- Whether `.FCStd` recovery files are present and whether they pass basic integrity","  checks","","This is the first tool to call when FreeCAD crashes or won't connect.","","### `manage_connection(action=\"clear_recovery\")`","","Finds and removes corrupt FreeCAD recovery files from FreeCAD's recovery directory.","","**When to use:** When FreeCAD crashes immediately on startup (crash loop). This happens","because FreeCAD writes recovery files continuously during a session. If it crashes","mid-write, the recovery file is partially written and structurally invalid. On the","next launch, FreeCAD tries to restore it, encounters the corruption, crashes again,","and the cycle repeats. The socket file may exist briefly before the second crash,","which means `check_freecad_connection()` may appear to succeed even though FreeCAD","is not actually usable.","","After clearing recovery files, ask the user to restart FreeCAD.","","### `manage_connection(action=\"validate_fcstd\", filename=\"...\")`","","Checks a `.FCStd` file's ZIP archive integrity before FreeCAD tries to open it. A","`.FCStd` file is a ZIP containing `Document.xml` plus shape binary files. If a save","was interrupted mid-write (crash during `doc.save()`, power loss, disk full), the","ZIP's central directory may be intact while the file data is truncated, or vice versa.","","Call this when a user reports that a file \"won't open\" or \"crashes FreeCAD on open\"","before attempting to open it.","","### Crash watcher — `/tmp/freecad_mcp_last_op_\u003cpid\u003e.json`","","Written atomically by the AICopilot workbench *inside* FreeCAD immediately before","each tool call executes. Cleared on successful completion. If FreeCAD crashes during","an operation, this file survives and contains exactly what was in flight. The path","is per-PID (`AICopilot/crash_watcher.py`'s `LAST_OP_FILE`) so multiple spawned","FreeCAD instances don't clobber each other's crash state; the bridge-side reader","(`freecad_crash_report.py`'s `LAST_OP_FILE_GLOB`) matches all of them via","`/tmp/freecad_mcp_last_op_*.json`.","","**Contents:**","```json","{","  \"tool\": \"execute_python\",","  \"args\": {\"code\": \"import Part\\nresult = shape1.fuse(shape2)\\n…\"},","  \"started_at\": 1747123456.789,","  \"pid\": 12345","}","```","","`manage_connection(action=\"status\")` reads and reports this automatically. You can","also read it directly with `execute_python` if FreeCAD is still running:","```python","execute_python(\"import glob, json; json.load(open(glob.glob('/tmp/freecad_mcp_last_op_*.json')[0]))\")","```","","---","","**Always check connection before anything else:**","```","check_freecad_connection()","```","If this fails, FreeCAD is not running or the AICopilot workbench isn't loaded. Tell","the user to launch FreeCAD and wait for \"AI Copilot ready\" in the Report View. Do","not attempt any other tool calls until connection succeeds — they will all fail and","the errors will be misleading.","","---","","## 1. Operation Returned an Error","","**Symptom:** A tool call returned an error message or an unexpected result. The","error message from the tool itself may be vague (\"operation failed\", \"Python error\")","or may be a raw OCCT or FreeCAD exception.","","**Step 1 — Read the Report View immediately:**","```","view_control(operation=\"get_report_view\", tail=50, filter=\"error\")","```","Do this first, before anything else, because some operations write to the Report View","and then continue — a subsequent operation may clear or overwrite the relevant lines.","The Report View often contains the real error even when the tool call error is generic.","","Common patterns and what they mean:","- `BRep_API: command not done` → boolean operation (fuse/cut/common) failed; the","  input geometry has a problem. Check solid validity on inputs.","- `BRep_Builder_MakeWire: wire not done` → a wire construction failed, usually","  because edges don't share endpoints within tolerance.","- `Standard_ConstructionError` → OCCT couldn't build the requested shape; geometry","  inputs are inconsistent.","- `Sketcher ... redundant constraint` → sketch is over-constrained; the solver","  rejected it.","- `Part.OCCError` → generic OCCT failure; check the full message for specifics.","","**Step 2 — Read the operation logs:**","```","get_debug_logs()","```","Look at the sequence of calls leading up to the failure. Check whether an earlier","operation produced a result that was silently bad — for example, a sketch that closed","but was under-constrained, which then produced degenerate geometry when padded.","","**Step 3 — Inspect document state:**","```","view_control(operation=\"list_objects\")","```","Verify every object you expect exists. Check visibility (hidden objects don't","participate in booleans). Look for objects in error state.","","To check object states explicitly:","```python","execute_python(\"\"\"","[(o.Name, o.Label, o.TypeId, getattr(o, 'State', 'n/a'))"," for o in FreeCAD.ActiveDocument.Objects]","\"\"\")","```","Objects with `State` containing `'Invalid'` or `'Error'` are broken and need","attention before anything downstream of them will work.","","**Step 4 — If it's a geometry validity failure:**","","Boolean operations and PartDesign features require valid, non-self-intersecting","solid input. Check each input:","```","measurement_operations(operation=\"check_solid\", object_name=\"Body\")","```","A valid solid returns `is_valid: true`. If it returns false, the problem is in how","that object was constructed, not in the operation you're trying to run. Fix the input","first.","","**Step 5 — Clear state and retry:**","```","view_control(operation=\"clear\")   # clear Report View","view_control(operation=\"undo\")    # undo the failed operation if it partially executed","```","Then retry with smaller steps, checking geometry validity between each one.","","---","","## 2. FreeCAD Crashed / Disconnected","","**Symptom:** A tool call returned a crash/disconnect error. The MCP bridge detected","that the socket connection was lost mid-operation.","","**Step 1 — Diagnose immediately:**","```","manage_connection(action=\"status\")","```","This reads the crash watcher file and bridge logs. It will tell you:","- What operation was in flight when the crash occurred (from the crash watcher)","- Whether FreeCAD's process is still running","- Whether the socket file exists","- Whether recovery files are present","","Report this information to the user verbatim. It is the most useful thing you can","provide at this point.","","**Step 2 — Tell the user what crashed and why.**","","Common causes of crashes:","- `execute_python` with a boolean operation on invalid geometry → OCCT kernel crash,","  typically during `fuse()`, `cut()`, or `common()` on shapes with self-intersections","- Very large geometry operations (thousands of faces, complex shells) → memory","  exhaustion or OCCT timeout","- `doc.recompute()` on a document with circular dependencies → stack overflow","- Setting `LinkedObject = None` on a link that has active clones → reference count","  crash (this is a known FreeCAD issue)","","**Step 3 — Ask the user to restart FreeCAD.**","","Do not attempt any tool calls while FreeCAD is down — they will all fail and the","errors will be confusing. Wait for explicit user confirmation that FreeCAD is running","again and shows \"AI Copilot ready\" in the Report View.","","**Step 4 — Check for a crash loop before the user restarts:**","","If `manage_connection(action=\"status\")` reports recovery files present, clear them","first or FreeCAD may crash again immediately:","```","manage_connection(action=\"clear_recovery\")","```","Then ask the user to restart.","","**Step 5 — After reconnection, verify document state:**","```","check_freecad_connection()","view_control(operation=\"list_objects\")","view_control(operation=\"get_report_view\", tail=30)","```","Determine whether the document was restored from a recovery file (it may be in a","partially-modified state), restored from the last explicit save (changes since then","are lost), or not open at all. Communicate this clearly to the user before continuing.","","**Step 6 — Avoid repeating the crash:**","","If the crash was during a boolean operation, validate geometry before retrying:","```","measurement_operations(operation=\"check_solid\", object_name=\"...\")","```","If the crash was during a large `execute_python` call, break it into smaller steps","and use `view_control(operation=\"checkpoint\", name=\"before_risky_op\")` before each","risky operation so you can roll back without losing everything.","","---","","## 3. FreeCAD Won't Connect At All","","**Symptom:** `check_freecad_connection()` fails. FreeCAD may appear to be running","(the window is visible) but the socket is not answering.","","**Step 1 — Diagnose the socket state:**","```","manage_connection(action=\"status\")","```","This will report whether the socket file exists, whether connection is refused, and","whether the crash watcher has a last-op file. The combination tells you what happened:","","- Socket file missing → FreeCAD is not running, or the AICopilot workbench never","  started (workbench load failure). User needs to launch FreeCAD.","- Socket file present, connection refused → FreeCAD crashed and left the socket file","  behind. User needs to quit FreeCAD (force-quit if necessary) and restart.","- Socket file present, connection hangs → FreeCAD is running but the socket thread","  is blocked. This can happen if a GUI operation is blocking the Qt event loop.","  User needs to force-quit and restart.","- Last-op file present → FreeCAD crashed mid-operation. Note what operation it was","  and tell the user.","","**Step 2 — Check for crash loop:**","","If FreeCAD crashes immediately on startup, clear recovery files first:","```","manage_connection(action=\"clear_recovery\")","```","","**Step 3 — Verify workbench load after restart:**","","Ask the user to check View → Panels → Report View immediately after FreeCAD starts.","The correct startup sequence in the Report View is:","```","Starting FreeCAD AI Copilot Service...","MCP Debug infrastructure loaded","Crash watcher loaded — op tracking active","freecad_mcp_handler vX.X.X validated","Modular handlers loaded successfully","Socket server started on /tmp/freecad_mcp.sock","AI Socket Server started - Claude ready","FreeCAD AI Copilot ready.","```","","If the Report View is empty or shows only font/Qt warnings with no AICopilot lines,","the workbench didn't load. Common causes:","- AICopilot not installed in the correct Mod directory (see AGENT-INSTALL.md)","- Python dependency missing","- Syntax error in a handler file (if the user has been editing the source)","","Ask the user to check Edit → Preferences → Workbenches and confirm AICopilot is","in the enabled list. If it's there but not loading, ask them to check the FreeCAD","startup log (Help → About → Copy to Clipboard on some platforms, or the terminal","output if launched from a terminal).","","---","","## 4. Operation Succeeded But Result Looks Wrong","","**Symptom:** No error reported, but the geometry, placement, or dimensions don't","match what was intended.","","**Step 1 — Look at the actual state:**","```","view_control(operation=\"screenshot\")","```","Don't assume the model is in the state you expect. Look at it. FreeCAD's 3D view","shows exactly what's there, including misplacements, wrong orientations, and missing","features that were supposed to appear.","","**Step 2 — List all objects and their visibility:**","```","view_control(operation=\"list_objects\")","```","Check that the objects you intended to create exist and are visible. Invisible objects","don't render in the viewport and don't participate in boolean operations. Objects with","`Visibility: false` need to be shown explicitly.","","**Step 3 — Measure what's actually there:**","```","measurement_operations(operation=\"get_bounding_box\", object_name=\"...\")","measurement_operations(operation=\"get_volume\", object_name=\"...\")","measurement_operations(operation=\"list_faces\", object_name=\"...\")","```","Compare measured dimensions against intended dimensions. A bounding box tells you","size and position; face normals from `list_faces` tell you orientation.","","**Step 4 — Check if a previous operation produced bad intermediate state:**","```","get_debug_logs()","```","Look for any earlier operations that produced unexpected results. A sketch that was","under-constrained will produce geometry that looks reasonable but has wrong dimensions;","a pad on such a sketch inherits the error.","","**Step 5 — Undo and rebuild rather than patching:**","```","view_control(operation=\"undo\")","```","Use undo as many times as needed to get back to a known good state. Then rebuild with","explicit verification steps — check sketch constraints, verify sketch is fully","constrained before closing, check solid validity after each boolean.","","**Step 6 — If the result still looks wrong with no error to chase, consider","representation-layer failures:**","","There is a class of FreeCAD bugs where the **model is semantically correct","but the underlying topology has accumulated drift** that breaks OCCT","Boolean operations silently — `BRepAlgoAPI_Fuse` returns one operand","unchanged, `Part::MultiFuse` produces an incomplete shape, no error or","warning anywhere. The steps above (`view_control` / `list_objects` /","`measurement_operations` / `get_debug_logs`) don't surface these because","the symptom is on the OCCT side, not the FreeCAD side.","","Before reaching for an external library, try","`measurement_operations(operation=\"find_root_cause\", object_name=\"...\")` —","it walks the object's own dependency subtree and will already catch a bad","`Fillet`, a `Revolution` silently producing a Shell instead of a Solid, or","a `Compound` whose children only touch at a seam without being fused. See","section 9 below for the full walkthrough, including why `check_solid`","alone can miss all three.","","For diagnosing a deeper, subtler class of failure (silent Boolean drops, edge-coincident","fuse failures, accumulated-history drift, deprecated-property warnings the","user missed, orphaned-feature parametric-link breakage), see","[Poirot2](https://github.com/blwfish/Poirot2) — a diagnostic library +","assistant playbook that runs inside FreeCAD via this MCP bridge and adds","representation-layer probes (`check_boolean_health` cross-checks","`BRepAlgoAPI` against `BOPAlgo_Builder`; `find_recent_orphans` sweeps for","null required references; etc.). Its `AGENT-OPERATION.md` is the","companion playbook for this kind of diagnosis.","","---","","## 5. Sketch or Constraint Failure","","**Symptom:** A sketch operation fails, the sketch solver reports redundant or","conflicting constraints, or the padded/pocketed result has wrong geometry.","","**Step 1 — Check sketch validity and constraint count:**","```","sketch_operations(operation=\"verify_sketch\", sketch_name=\"SketchName\")","```","This reports whether the sketch is valid, how many degrees of freedom remain (should","be 0 for fully constrained), and any solver issues.","","**Step 2 — List all constraints:**","```","sketch_operations(operation=\"list_constraints\", sketch_name=\"SketchName\")","```","Look for:","- Redundant constraints — the same dimension constrained twice, or a geometric","  constraint that's already implied by another. Remove duplicates.","- Conflicting constraints — two constraints that can't both be satisfied (e.g.,","  a horizontal constraint on a line that also has a fixed angle). One must be removed.","- Missing constraints — degrees of freedom \u003e 0 means the sketch is under-constrained.","  Geometry will be placed at FreeCAD's best guess, which may not be what you want.","","**Step 3 — Check the Report View for solver output:**","```","view_control(operation=\"get_report_view\", tail=20, filter=\"sketch\")","```","FreeCAD's sketch solver logs detail here when it fails to converge or detects","redundancy.","","**Step 4 — Common constraint mistakes:**","","- Geometry IDs are assigned sequentially from 0 as geometry is added. Special IDs:","  `-1` = X axis, `-2` = Y axis. If you add geometry in a different order than","  expected, the IDs shift.","- Point IDs: `0` = on edge (any point), `1` = start vertex, `2` = end vertex,","  `3` = center (for arcs/circles).","- A rectangle added with `add_rectangle` creates 4 line segments (geo IDs 0–3) plus","  a construction point. Constraints on the rectangle reference these IDs.","","---","","## 6. External Link / Reference Broken","","**Symptom:** On document open, the Report View shows messages like:","```","Link not restored","Linked object: Body","Linked document: general-windows","```","or:","```","Standard Window Master A: Link broken!","Object: Body","File: ../../../General Parts/general-windows.FCStd","```","","**What this means:** An `App::Link` object in the current document points to an","object by name in an external `.FCStd` file. That named object no longer exists —","either the file was rebuilt (the object was renamed or replaced), the file was moved,","or the link was saved pointing to an object that never existed.","","Note: the missing object (`Body` in the example) is in the *external* file, not in","the current document. Don't look for it in the current document's object list.","","**Step 1 — Identify which links are broken:**","```python","execute_python(\"\"\"","doc = FreeCAD.ActiveDocument","links = [o for o in doc.Objects if o.TypeId == 'App::Link']","[(l.Name, l.Label, str(l.LinkedObject)) for l in links]","\"\"\")","```","Any link where `LinkedObject` prints as `None` is broken.","","**Step 2 — Find the external file path:**","```python","execute_python(\"\"\"","import FreeCAD","# Get the source document — it may be open as a partial document","for name, doc in FreeCAD.listDocuments().items():","    print(name, doc.FileName)","\"\"\")","```","","**Step 3 — Check what objects actually exist in the external file:**","","The external document may be loaded as a \"partial document\" — FreeCAD lazy-loads","external references, so `doc.Objects` may be empty even though the file is open.","Read the file directly:","```python","execute_python(\"\"\"","import zipfile, re","path = '/actual/path/to/external.FCStd'","with zipfile.ZipFile(path) as z:","    xml = z.read('Document.xml').decode()","names = re.findall(r'\u003cObject name=\"([^\"]+)\"', xml)","names","\"\"\")","```","This lists every object in the file without triggering a full load.","","**Step 4 — Force-load the partial document if needed:**","```python","execute_python(\"\"\"","ext_doc = FreeCAD.getDocument('external_doc_name')","ext_doc.restore()   # forces full load","[(o.Name, o.Label, o.TypeId) for o in ext_doc.Objects]","\"\"\")","```","","**Step 5 — Repair the link:**","","Once you know the correct target object name:","```python","execute_python(\"\"\"","doc = FreeCAD.ActiveDocument","ext_doc = FreeCAD.getDocument('external_doc_name')","lnk = doc.getObject('Link002')","target = ext_doc.getObject('Fusion')   # correct object name","lnk.LinkedObject = target","doc.recompute()","print('LinkedObject now:', lnk.LinkedObject)","\"\"\")","```","","**Step 6 — Save to make the fix permanent:**","```","view_control(operation=\"save_document\")","```","Without saving, the fix will be lost if FreeCAD closes or crashes.","","---","","## 7. Topology Naming Warnings (hasher mismatch, ElementMap errors)","","**Symptom:** After a recompute or document open, the Report View contains:","```","\u003cTopoShape\u003e TopoShapeExpansion.cpp(989): hasher mismatch","```","or:","```","\u003cElementMap\u003e \u003cstring\u003e(1): Invalid element name string id","```","","**What these mean:** FreeCAD's topology naming system assigns stable string IDs to","individual faces, edges, and vertices so that downstream features (fillets, sketch","attachments) can reference them reliably even when the model changes. These warnings","fire when shapes from different sources (different documents, different FreeCAD","versions) have incompatible hashers — the internal ID generators don't match — or","when element name string IDs are malformed.","","**Do you need to act on these?**","","Usually no. These warnings matter only if something downstream holds a reference to","a specific face or edge of the affected geometry — for example, a fillet that","references a specific edge by name, or a sketch attached to a specific face. If no","downstream features reference topology of the affected objects, the warnings are","noise and the geometry is correct.","","To determine whether to act: check whether any objects report `State: Invalid` or","`State: Error` after the recompute. If everything recomputes cleanly, the warnings","are harmless. If objects are invalid, the topology naming issue may be contributing.","","---","","## 8. Document Recompute Failures","","**Symptom:** After creating or modifying objects, some show orange or red icons in","the model tree, or `view_control(operation=\"list_objects\")` shows objects with error","states.","","**Step 1 — Force recompute:**","```python","execute_python(\"FreeCAD.ActiveDocument.recompute()\")","```","Some recomputes are deferred. Forcing one often resolves apparent errors.","","**Step 2 — Check what's invalid:**","```python","execute_python(\"\"\"","[(o.Name, o.Label, o.TypeId, getattr(o, 'State', []))"," for o in FreeCAD.ActiveDocument.Objects"," if getattr(o, 'State', []) and 'Invalid' in getattr(o, 'State', [])]","\"\"\")","```","","**Step 3 — Trace the dependency chain:**","","Objects in FreeCAD have dependencies — a Pad depends on a Sketch, a Boolean depends","on its inputs. An invalid object invalidates everything downstream. Find the earliest","invalid object in the dependency chain; fixing that one will often fix everything","downstream automatically after recompute. `measurement_operations(operation=","\"find_root_cause\", object_name=\"...\")` automates exactly this trace — see section 9","below — so you don't have to walk `OutList` and re-check each object by hand.","","**Step 4 — Read the Report View:**","```","view_control(operation=\"get_report_view\", tail=50, filter=\"recompute\")","```","FreeCAD logs which objects failed recompute and why.","","---","","## 9. Diagnosing a Failure That Surfaced Far From Its Cause","","**Symptom:** A boolean operation, CAM job, or export fails (or FreeCAD's native","Check Geometry reports errors) on an object built from many upstream features —","a `Part::Compound`, a long chain of Fuse/Cut operations, a body assembled from","several sketches and revolves — and `check_solid` or `diagnose_invalid_shape`","on that object either reports \"fine\" or reports an error without saying which","upstream feature actually caused it.","","**Step 1 — walk the object's own dependency subtree instead of guessing:**","```","measurement_operations(operation=\"find_root_cause\", object_name=\"...\")","```","This checks every sketch (open/unclosed wires — the same check `verify_sketch`","runs) and every shape-bearing feature in that object's `OutList` subtree","independently: null shape, `Shape.isValid()`, whether a feature that produced","Faces actually produced any Solids (a `Revolution` or `Extrusion` with","`Solid=False` silently produces a Shell instead), and `shape.check(True)` — the","same boolean-operation check the native Check Geometry dialog runs, which","catches self-intersections and invalid-curve-on-surface defects that","`Shape.isValid()` alone misses. It reports which object(s) actually","**introduced** each defect versus which ones are only **inheriting/","propagating** it from upstream, so you get \"the Fillet produced an invalid","curve\" instead of \"the Compound is broken\" — the object where the symptom","showed up is rarely where the defect originated.","","**Step 2 — know check_solid's blind spot before trusting it alone:**","","`check_solid` (and `Shape.isValid()`) on a `Part::Compound`, or any object with","multiple children, answers \"does at least one Solid exist somewhere in this","shape\" — not \"is every child actually a Solid.\" A Compound built from two real","solids and one bare Shell (the `Solid=False` case above) will report **\"Is a","closed solid,\"** because the check only requires *a* Solid to be present, not","*all* children to be Solids. The same object can also pass `isClosed()`","cleanly at the top level while containing a self-intersection that only","exists at the seam between two touching-but-unfused children — neither defect","shows up until something downstream assumes \"this is a solid\" and breaks.","`find_root_cause` doesn't share this blind spot, because it checks each child","independently rather than asking whether a Solid exists anywhere in the tree.","","**Step 3 — if find_root_cause finds nothing, or the failure looks like","representation-layer drift rather than an obvious topology error:**","","See the Poirot2 pointer in section 4 above — that's a heavier, separate","diagnostic library for a subtler class of failure (silent Boolean drops,","accumulated-history corruption) than the one `find_root_cause` targets.","","---","","## General Principles","","**Read before guessing.** Use `get_report_view`, `get_debug_logs`, and `list_objects`","before forming a hypothesis. The diagnostic tools were built specifically because","FreeCAD's error reporting is cryptic — use them.","","**Don't patch bad state forward.** If an object is in an invalid state, undo to","before it was created and rebuild it correctly. Trying to fix a broken object in","place usually propagates the problem to downstream features.","","**Validate geometry after boolean operations.** After every `fuse`, `cut`, or","`common`, call `measurement_operations(operation=\"check_solid\")` on the result.","Boolean operations on invalid input silently produce invalid output. Building further","features on invalid geometry leads to cascading failures that are hard to diagnose.","**On a `Part::Compound` or any result assembled from multiple children,","`check_solid` only confirms that *a* Solid exists somewhere in the shape — not","that every child is one** (see section 9). Use `find_root_cause` instead of a","bare `check_solid` call whenever the object being checked has more than one","meaningful child.","","**Use checkpoints before risky operations.** Before any operation that could crash","or corrupt the document:","```","view_control(operation=\"checkpoint\", name=\"before_risky_op\")","```","If something goes wrong, you can roll back to this state rather than having to start","over. Call `view_control(operation=\"rollback_to_checkpoint\", name=\"before_risky_op\")`","to restore.","","**Break large `execute_python` calls into smaller ones.** A crash during a long","operation loses the whole thing. A boolean on large geometry, a complex loft, or a","long array generation are all candidates for splitting. Run the expensive geometry","first, verify it, then proceed.","","**Report crash details to the user.** If FreeCAD crashed, tell the user exactly what","`manage_connection(action=\"status\")` shows — what operation was in flight, what the","crash watcher recorded, whether recovery files are present. This is the information","needed to file a useful bug report at https://github.com/blwfish/freecad-mcp/issues.","","**Save after successful fixes.** After repairing a broken link, fixing invalid","geometry, or completing any significant work, save explicitly:","```","view_control(operation=\"save_document\")","```","FreeCAD's autosave recovery mechanism is a fallback, not a substitute for saving."],"stylingDirectives":[[[0,37,"pl-mh"],[2,37,"pl-en"]],[],[],[],[],[],[],[[0,3,"pl-ms"]],[],[[0,25,"pl-mh"],[3,25,"pl-en"]],[],[],[],[],[],[[0,22,"pl-mh"],[4,22,"pl-en"],[4,5,"pl-s"],[5,21,"pl-c1"],[21,22,"pl-s"]],[],[[38,39,"pl-s"],[39,59,"pl-c1"],[59,60,"pl-s"]],[],[],[],[],[[0,2,"pl-s"],[19,21,"pl-s"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[[0,2,"pl-s"],[16,18,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,68,"pl-c1"]],[[0,73,"pl-c1"]],[[0,70,"pl-c1"]],[[0,63,"pl-c1"]],[[0,57,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,41,"pl-mh"],[4,41,"pl-en"],[27,28,"pl-s"],[28,34,"pl-c1"],[34,35,"pl-s"]],[],[[38,39,"pl-s"],[39,45,"pl-c1"],[45,46,"pl-s"]],[[34,35,"pl-s"],[35,36,"pl-s"],[36,46,"pl-c1"],[46,47,"pl-s"],[47,48,"pl-s"],[48,49,"pl-s"],[49,86,"pl-corl"],[86,87,"pl-s"]],[],[],[],[],[],[[0,2,"pl-s"],[15,16,"pl-s"],[16,22,"pl-c1"],[22,23,"pl-s"],[63,64,"pl-s"],[64,69,"pl-c1"],[69,70,"pl-s"]],[[5,7,"pl-s"]],[],[[0,82,"pl-mh"],[4,82,"pl-en"],[4,5,"pl-s"],[5,81,"pl-c1"],[81,82,"pl-s"]],[],[],[],[],[],[],[[0,2,"pl-s"],[13,15,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"]],[[10,11,"pl-s"],[11,27,"pl-c1"],[27,28,"pl-s"],[30,31,"pl-s"],[31,44,"pl-c1"],[44,45,"pl-s"],[47,48,"pl-s"],[48,63,"pl-c1"],[63,64,"pl-s"],[66,67,"pl-s"],[67,85,"pl-c1"],[85,86,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"]],[],[],[[0,2,"pl-s"],[19,21,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,20,"pl-c1"],[20,21,"pl-s"],[24,25,"pl-s"],[25,37,"pl-c1"],[37,38,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"]],[[38,39,"pl-s"],[39,50,"pl-c1"],[50,51,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,25,"pl-c1"],[25,26,"pl-s"]],[[7,8,"pl-s"],[8,60,"pl-c1"],[60,61,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,51,"pl-c1"],[51,52,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"]],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,75,"pl-c1"],[75,76,"pl-s"]],[],[],[[0,40,"pl-mh"],[4,40,"pl-en"],[4,5,"pl-s"],[5,39,"pl-c1"],[39,40,"pl-s"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[2,3,"pl-s"],[3,34,"pl-c1"],[34,35,"pl-s"]],[],[[0,1,"pl-v"],[10,11,"pl-s"],[11,17,"pl-c1"],[17,18,"pl-s"]],[],[],[],[],[[0,48,"pl-mh"],[4,48,"pl-en"],[4,5,"pl-s"],[5,47,"pl-c1"],[47,48,"pl-s"]],[],[],[],[[0,2,"pl-s"],[14,16,"pl-s"]],[],[],[],[],[[12,13,"pl-s"],[13,39,"pl-c1"],[39,40,"pl-s"]],[],[],[],[],[[0,64,"pl-mh"],[4,64,"pl-en"],[4,5,"pl-s"],[5,63,"pl-c1"],[63,64,"pl-s"]],[],[[9,10,"pl-s"],[10,16,"pl-c1"],[16,17,"pl-s"]],[[0,1,"pl-s"],[1,7,"pl-c1"],[7,8,"pl-s"],[34,35,"pl-s"],[35,47,"pl-c1"],[47,48,"pl-s"]],[[40,41,"pl-s"],[41,51,"pl-c1"],[51,52,"pl-s"]],[],[],[],[],[],[[0,57,"pl-mh"],[4,57,"pl-en"],[20,21,"pl-s"],[21,56,"pl-c1"],[56,57,"pl-s"]],[],[[46,47,"pl-s"],[53,54,"pl-s"]],[],[],[[12,13,"pl-s"],[13,39,"pl-c1"],[39,40,"pl-s"],[43,44,"pl-s"],[44,56,"pl-c1"],[56,57,"pl-s"]],[],[[1,2,"pl-s"],[2,25,"pl-c1"],[25,26,"pl-s"],[29,30,"pl-s"],[30,47,"pl-c1"],[47,48,"pl-s"]],[[0,1,"pl-s"],[1,32,"pl-c1"],[32,33,"pl-s"]],[],[[0,2,"pl-s"],[11,13,"pl-s"]],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[2,8,"pl-ent"],[10,26,"pl-s"],[10,11,"pl-pds"],[25,26,"pl-pds"]],[[2,8,"pl-ent"],[11,17,"pl-ent"],[19,65,"pl-s"],[19,20,"pl-pds"],[31,33,"pl-cce"],[61,63,"pl-cce"],[64,65,"pl-pds"]],[[2,14,"pl-ent"],[16,30,"pl-c1"]],[[2,7,"pl-ent"],[9,14,"pl-c1"]],[],[[0,3,"pl-s"]],[],[[0,1,"pl-s"],[1,35,"pl-c1"],[35,36,"pl-s"]],[[27,28,"pl-s"],[28,42,"pl-c1"],[42,43,"pl-s"]],[[0,3,"pl-s"],[3,9,"pl-en"]],[[15,100,"pl-s"],[15,16,"pl-pds"],[99,100,"pl-pds"]],[[0,3,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,2,"pl-s"],[47,49,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,26,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[],[[0,3,"pl-ms"]],[],[[0,33,"pl-mh"],[3,33,"pl-en"]],[],[[0,2,"pl-s"],[10,12,"pl-s"]],[],[],[],[[0,2,"pl-s"],[44,46,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,66,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,39,"pl-c1"],[39,40,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,36,"pl-c1"],[36,37,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"]],[],[[0,2,"pl-s"],[35,37,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,16,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[[0,2,"pl-s"],[34,36,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,38,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[[0,3,"pl-s"],[3,9,"pl-en"]],[[15,18,"pl-s"],[15,18,"pl-pds"]],[[0,56,"pl-s"]],[[0,41,"pl-s"]],[[0,3,"pl-s"],[0,3,"pl-pds"]],[[0,3,"pl-s"]],[[13,14,"pl-s"],[14,19,"pl-c1"],[19,20,"pl-s"],[32,33,"pl-s"],[33,42,"pl-c1"],[42,43,"pl-s"],[47,48,"pl-s"],[48,55,"pl-c1"],[55,56,"pl-s"]],[],[],[[0,2,"pl-s"],[47,49,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,67,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[[22,23,"pl-s"],[23,37,"pl-c1"],[37,38,"pl-s"]],[],[],[],[[0,2,"pl-s"],[33,35,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,53,"pl-c1"]],[[0,86,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[[0,3,"pl-ms"]],[],[[0,36,"pl-mh"],[3,36,"pl-en"]],[],[[0,2,"pl-s"],[10,12,"pl-s"]],[],[],[[0,2,"pl-s"],[32,34,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,34,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[[0,2,"pl-s"],[46,48,"pl-s"]],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"]],[[19,20,"pl-s"],[20,26,"pl-c1"],[26,27,"pl-s"],[29,30,"pl-s"],[30,35,"pl-c1"],[35,36,"pl-s"],[41,42,"pl-s"],[42,50,"pl-c1"],[50,51,"pl-s"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"]],[[0,1,"pl-v"],[10,11,"pl-s"],[11,30,"pl-c1"],[30,31,"pl-s"]],[],[],[[0,2,"pl-s"],[43,45,"pl-s"]],[],[],[],[],[],[[0,2,"pl-s"],[59,61,"pl-s"]],[],[[3,4,"pl-s"],[4,38,"pl-c1"],[38,39,"pl-s"]],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,42,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[[0,2,"pl-s"],[53,55,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,26,"pl-c1"]],[[0,38,"pl-c1"]],[[0,50,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[[0,2,"pl-s"],[37,39,"pl-s"]],[],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,66,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[[32,33,"pl-s"],[33,47,"pl-c1"],[47,48,"pl-s"]],[[8,9,"pl-s"],[9,69,"pl-c1"],[69,70,"pl-s"]],[],[],[[0,3,"pl-ms"]],[],[[0,34,"pl-mh"],[3,34,"pl-en"]],[],[[0,2,"pl-s"],[10,12,"pl-s"],[13,14,"pl-s"],[14,40,"pl-c1"],[40,41,"pl-s"]],[],[],[[0,2,"pl-s"],[37,39,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,34,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[],[[0,1,"pl-v"]],[],[],[[0,2,"pl-s"],[32,34,"pl-s"]],[],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,42,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,2,"pl-s"],[47,49,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,38,"pl-c1"]],[[0,31,"pl-c1"]],[[0,41,"pl-c1"]],[[0,36,"pl-c1"]],[[0,36,"pl-c1"]],[[0,46,"pl-c1"]],[[0,39,"pl-c1"]],[[0,25,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[],[],[[0,3,"pl-ms"]],[],[[0,48,"pl-mh"],[3,48,"pl-en"]],[],[[0,2,"pl-s"],[10,12,"pl-s"]],[],[],[[0,2,"pl-s"],[36,38,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,36,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[[0,2,"pl-s"],[49,51,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,38,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[[0,1,"pl-s"],[1,18,"pl-c1"],[18,19,"pl-s"]],[],[[0,2,"pl-s"],[41,43,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,71,"pl-c1"]],[[0,65,"pl-c1"]],[[0,65,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[37,38,"pl-s"],[38,48,"pl-c1"],[48,49,"pl-s"]],[],[[0,2,"pl-s"],[73,75,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,16,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[[0,2,"pl-s"],[49,51,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,30,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[[0,2,"pl-s"]],[[30,32,"pl-s"]],[],[[43,45,"pl-s"]],[[49,51,"pl-s"]],[[30,31,"pl-s"],[31,47,"pl-c1"],[47,48,"pl-s"]],[[11,12,"pl-s"],[12,27,"pl-c1"],[27,28,"pl-s"]],[[35,36,"pl-s"],[36,48,"pl-c1"],[48,49,"pl-s"],[52,53,"pl-s"],[53,65,"pl-c1"],[65,66,"pl-s"]],[[0,1,"pl-s"],[1,23,"pl-c1"],[23,24,"pl-s"],[27,28,"pl-s"],[28,42,"pl-c1"],[42,43,"pl-s"]],[],[],[],[[0,1,"pl-s"],[1,71,"pl-c1"],[71,72,"pl-s"]],[],[[0,1,"pl-s"],[1,7,"pl-c1"],[7,8,"pl-s"],[12,13,"pl-s"],[13,23,"pl-c1"],[23,24,"pl-s"]],[[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"]],[[56,57,"pl-s"],[57,68,"pl-c1"],[68,69,"pl-s"]],[],[],[],[],[],[[0,1,"pl-s"],[8,9,"pl-s"],[9,10,"pl-s"],[10,44,"pl-corl"],[44,45,"pl-s"]],[],[[29,30,"pl-s"],[30,50,"pl-c1"],[50,51,"pl-s"]],[[0,1,"pl-s"],[1,12,"pl-c1"],[12,13,"pl-s"],[22,23,"pl-s"],[23,38,"pl-c1"],[38,39,"pl-s"],[41,42,"pl-s"],[42,61,"pl-c1"],[61,62,"pl-s"]],[[37,38,"pl-s"],[38,56,"pl-c1"],[56,57,"pl-s"]],[],[],[[0,3,"pl-ms"]],[],[[0,34,"pl-mh"],[3,34,"pl-en"]],[],[[0,2,"pl-s"],[10,12,"pl-s"]],[],[],[[0,2,"pl-s"],[54,56,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,70,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,2,"pl-s"],[32,34,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,73,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[],[[0,2,"pl-s"],[51,53,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,67,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,2,"pl-s"],[38,40,"pl-s"]],[],[[0,1,"pl-v"]],[[2,3,"pl-s"],[3,5,"pl-c1"],[5,6,"pl-s"],[17,18,"pl-s"],[18,20,"pl-c1"],[20,21,"pl-s"]],[],[[0,1,"pl-v"],[13,14,"pl-s"],[14,15,"pl-c1"],[15,16,"pl-s"],[40,41,"pl-s"],[41,42,"pl-c1"],[42,43,"pl-s"],[60,61,"pl-s"],[61,62,"pl-c1"],[62,63,"pl-s"]],[[2,3,"pl-s"],[3,4,"pl-c1"],[4,5,"pl-s"]],[[0,1,"pl-v"],[25,26,"pl-s"],[26,39,"pl-c1"],[39,40,"pl-s"]],[],[],[[0,3,"pl-ms"]],[],[[0,38,"pl-mh"],[3,38,"pl-en"]],[],[[0,2,"pl-s"],[10,12,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,17,"pl-c1"]],[[0,19,"pl-c1"]],[[0,32,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,38,"pl-c1"]],[[0,12,"pl-c1"]],[[0,50,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,2,"pl-s"],[18,20,"pl-s"],[24,25,"pl-s"],[25,34,"pl-c1"],[34,35,"pl-s"]],[[30,31,"pl-s"],[31,37,"pl-c1"],[37,38,"pl-s"]],[],[],[],[[26,27,"pl-s"],[27,31,"pl-c1"],[31,32,"pl-s"],[59,60,"pl-s"],[68,69,"pl-s"]],[],[],[[0,2,"pl-s"],[43,45,"pl-s"]],[[0,3,"pl-s"],[3,9,"pl-en"]],[[15,18,"pl-s"],[15,18,"pl-pds"]],[[0,28,"pl-s"]],[[0,59,"pl-s"]],[[0,55,"pl-s"]],[[0,3,"pl-s"],[0,3,"pl-pds"]],[[0,3,"pl-s"]],[[15,16,"pl-s"],[16,28,"pl-c1"],[28,29,"pl-s"],[40,41,"pl-s"],[41,45,"pl-c1"],[45,46,"pl-s"]],[],[[0,2,"pl-s"],[39,41,"pl-s"]],[[0,3,"pl-s"],[3,9,"pl-en"]],[[15,18,"pl-s"],[15,18,"pl-pds"]],[[0,14,"pl-s"]],[[0,64,"pl-s"]],[[0,49,"pl-s"]],[[0,29,"pl-s"]],[[0,3,"pl-s"],[0,3,"pl-pds"]],[[0,3,"pl-s"]],[],[[0,2,"pl-s"],[66,68,"pl-s"]],[],[],[[24,25,"pl-s"],[25,36,"pl-c1"],[36,37,"pl-s"]],[],[[0,3,"pl-s"],[3,9,"pl-en"]],[[15,18,"pl-s"],[15,18,"pl-pds"]],[[0,18,"pl-s"]],[[0,39,"pl-s"]],[[0,32,"pl-s"]],[[0,41,"pl-s"]],[[0,50,"pl-s"]],[[0,5,"pl-s"]],[[0,3,"pl-s"],[0,3,"pl-pds"]],[[0,3,"pl-s"]],[],[],[[0,2,"pl-s"],[53,55,"pl-s"]],[[0,3,"pl-s"],[3,9,"pl-en"]],[[15,18,"pl-s"],[15,18,"pl-pds"]],[[0,50,"pl-s"]],[[0,38,"pl-s"]],[[0,54,"pl-s"]],[[0,3,"pl-s"],[0,3,"pl-pds"]],[[0,3,"pl-s"]],[],[[0,2,"pl-s"],[27,29,"pl-s"]],[],[],[[0,3,"pl-s"],[3,9,"pl-en"]],[[15,18,"pl-s"],[15,18,"pl-pds"]],[[0,28,"pl-s"]],[[0,50,"pl-s"]],[[0,30,"pl-s"]],[[0,60,"pl-s"]],[[0,25,"pl-s"]],[[0,15,"pl-s"]],[[0,44,"pl-s"]],[[0,3,"pl-s"],[0,3,"pl-pds"]],[[0,3,"pl-s"]],[],[[0,2,"pl-s"],[42,44,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,39,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[[0,3,"pl-ms"]],[],[[0,67,"pl-mh"],[3,67,"pl-en"]],[],[[0,2,"pl-s"],[10,12,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,56,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,56,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[0,2,"pl-s"],[18,20,"pl-s"]],[],[],[],[],[],[],[[0,2,"pl-s"],[30,32,"pl-s"]],[],[],[],[],[],[],[],[[62,63,"pl-s"],[63,77,"pl-c1"],[77,78,"pl-s"]],[[0,1,"pl-s"],[1,13,"pl-c1"],[13,14,"pl-s"]],[],[],[[0,3,"pl-ms"]],[],[[0,33,"pl-mh"],[3,33,"pl-en"]],[],[[0,2,"pl-s"],[10,12,"pl-s"]],[[19,20,"pl-s"],[20,58,"pl-c1"],[58,59,"pl-s"]],[],[],[[0,2,"pl-s"],[27,29,"pl-s"]],[[0,3,"pl-s"],[3,9,"pl-en"]],[[15,51,"pl-s"],[15,16,"pl-pds"],[50,51,"pl-pds"]],[[0,3,"pl-s"]],[],[],[[0,2,"pl-s"],[32,34,"pl-s"]],[[0,3,"pl-s"],[3,9,"pl-en"]],[[15,18,"pl-s"],[15,18,"pl-pds"]],[[0,53,"pl-s"]],[[0,40,"pl-s"]],[[0,69,"pl-s"]],[[0,3,"pl-s"],[0,3,"pl-pds"]],[[0,3,"pl-s"]],[],[[0,2,"pl-s"],[38,40,"pl-s"]],[],[],[],[],[],[],[[34,35,"pl-s"],[35,42,"pl-c1"],[42,43,"pl-s"]],[],[[0,2,"pl-s"],[32,34,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,70,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[[0,3,"pl-ms"]],[],[[0,59,"pl-mh"],[3,59,"pl-en"]],[],[[0,2,"pl-s"],[10,12,"pl-s"]],[],[[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"]],[[36,37,"pl-s"],[37,48,"pl-c1"],[48,49,"pl-s"],[53,54,"pl-s"],[54,76,"pl-c1"],[76,77,"pl-s"]],[],[],[],[[0,2,"pl-s"],[72,74,"pl-s"]],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,70,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[[63,64,"pl-s"],[64,77,"pl-c1"],[77,78,"pl-s"]],[[55,56,"pl-s"],[56,63,"pl-c1"],[63,64,"pl-s"]],[[27,28,"pl-s"],[28,43,"pl-c1"],[43,44,"pl-s"]],[[38,39,"pl-s"],[39,49,"pl-c1"],[49,50,"pl-s"],[54,55,"pl-s"],[55,64,"pl-c1"],[64,65,"pl-s"]],[[0,1,"pl-s"],[1,12,"pl-c1"],[12,13,"pl-s"],[54,55,"pl-s"],[55,72,"pl-c1"],[72,73,"pl-s"]],[],[],[[0,1,"pl-s"],[1,16,"pl-c1"],[16,17,"pl-s"]],[[0,2,"pl-s"],[12,14,"pl-s"],[54,56,"pl-s"]],[[11,13,"pl-s"]],[],[],[],[[0,2,"pl-s"],[66,68,"pl-s"]],[],[[0,1,"pl-s"],[1,12,"pl-c1"],[12,13,"pl-s"],[19,20,"pl-s"],[20,35,"pl-c1"],[35,36,"pl-s"],[43,44,"pl-s"],[44,58,"pl-c1"],[58,59,"pl-s"]],[],[],[[31,32,"pl-s"],[32,43,"pl-c1"],[43,44,"pl-s"],[69,71,"pl-s"]],[[14,16,"pl-s"],[49,50,"pl-s"],[51,52,"pl-s"]],[[0,1,"pl-s"],[4,5,"pl-s"],[59,60,"pl-s"],[60,70,"pl-c1"],[70,71,"pl-s"]],[],[],[],[[0,1,"pl-s"],[1,16,"pl-c1"],[16,17,"pl-s"]],[],[],[[0,2,"pl-s"]],[[65,67,"pl-s"]],[],[],[],[[45,46,"pl-s"],[46,61,"pl-c1"],[61,62,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,21,"pl-mh"],[3,21,"pl-en"]],[],[[0,2,"pl-s"],[23,25,"pl-s"],[30,31,"pl-s"],[31,46,"pl-c1"],[46,47,"pl-s"],[49,50,"pl-s"],[50,64,"pl-c1"],[64,65,"pl-s"],[71,72,"pl-s"],[72,84,"pl-c1"],[84,85,"pl-s"]],[],[],[],[[0,2,"pl-s"],[32,34,"pl-s"]],[],[],[],[[0,2,"pl-s"],[45,47,"pl-s"],[60,61,"pl-s"],[61,65,"pl-c1"],[65,66,"pl-s"],[68,69,"pl-s"],[69,72,"pl-c1"],[72,73,"pl-s"]],[[0,1,"pl-s"],[1,7,"pl-c1"],[7,8,"pl-s"],[15,16,"pl-s"],[16,63,"pl-c1"],[63,64,"pl-s"]],[],[],[[0,2,"pl-s"],[7,8,"pl-s"],[8,22,"pl-c1"],[22,23,"pl-s"]],[[0,1,"pl-s"],[1,12,"pl-c1"],[12,13,"pl-s"],[33,34,"pl-s"],[35,36,"pl-s"]],[[23,25,"pl-s"],[47,48,"pl-s"],[48,63,"pl-c1"],[63,64,"pl-s"]],[[5,6,"pl-s"],[6,17,"pl-c1"],[17,18,"pl-s"]],[],[],[[0,2,"pl-s"],[42,44,"pl-s"]],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,60,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[[11,12,"pl-s"],[12,84,"pl-c1"],[84,85,"pl-s"]],[],[],[[0,2,"pl-s"],[14,15,"pl-s"],[15,29,"pl-c1"],[29,30,"pl-s"],[55,57,"pl-s"]],[],[],[],[],[[0,2,"pl-s"],[35,37,"pl-s"]],[[0,1,"pl-s"],[1,35,"pl-c1"],[35,36,"pl-s"]],[],[[38,83,"pl-corl"]],[],[[0,2,"pl-s"],[30,32,"pl-s"]],[],[[0,3,"pl-s"],[3,3,"pl-c1"]],[[0,39,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[]],"colorizedLines":null}},"title":"freecad-mcp/AGENT-DEBUGGING.md at main · blwfish/freecad-mcp","appPayload":{},"meta":{"title":"freecad-mcp/AGENT-DEBUGGING.md at main · blwfish/freecad-mcp"}}</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="/blwfish/freecad-mcp" 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="/blwfish/freecad-mcp/tree/main" data-discover="true">freecad-mcp</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">AGENT-DEBUGGING.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="/blwfish/freecad-mcp/commits/main/AGENT-DEBUGGING.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="/blwfish/freecad-mcp/commits/main/AGENT-DEBUGGING.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="30.5 KB" style="--truncate-max-width:100%"><span>725 lines (594 loc) · 30.5 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="/blwfish/freecad-mcp/tree/main" data-discover="true">freecad-mcp</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">AGENT-DEBUGGING.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="30.5 KB" style="--truncate-max-width:100%"><span>725 lines (594 loc) · 30.5 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/blwfish/freecad-mcp/raw/refs/heads/main/AGENT-DEBUGGING.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">FreeCAD MCP — Agent Debugging Guide</h1><a id="user-content-freecad-mcp--agent-debugging-guide" class="anchor" aria-label="Permalink: FreeCAD MCP — Agent Debugging Guide" href="#freecad-mcp--agent-debugging-guide"><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">This file is for you, the AI agent. When something goes wrong with a FreeCAD MCP
operation, follow the relevant section below. Don't guess — the diagnostic tools
exist precisely so you don't have to. Read the output carefully; the tools are
designed to give you specific, actionable information rather than generic status.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Your Debugging Toolkit</h2><a id="user-content-your-debugging-toolkit" class="anchor" aria-label="Permalink: Your Debugging Toolkit" href="#your-debugging-toolkit"><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">This MCP exposes diagnostic infrastructure that most FreeCAD users don't know exists
and that most other MCPs don't provide. These tools are your primary resource when
something goes wrong. Use them before forming hypotheses.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><code>get_debug_logs()</code></h3><a id="user-content-get_debug_logs" class="anchor" aria-label="Permalink: get_debug_logs()" href="#get_debug_logs"><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">Reads the structured operation log at <code>~/.freecad-mcp/logs/</code>. Every tool call is
recorded as a pair of JSONL entries — COMMAND_START (before execution) and either
COMMAND_SUCCESS or COMMAND_FAILURE (after). Each entry includes the tool name,
arguments, duration, and a snapshot of the result or error.</p>
<p dir="auto"><strong>What to look for:</strong></p>
<ul dir="auto">
<li>The sequence of operations leading to the failure, not just the failing call itself.
Often the problem was set up by a previous operation that succeeded but left bad state.</li>
<li>Duration anomalies — an operation that normally takes 0.1s taking 30s usually means
FreeCAD was hung waiting on something (GIL contention, OCCT blocked).</li>
<li>COMMAND_FAILURE entries earlier in the sequence that may have been silently ignored.</li>
</ul>
<p dir="auto"><strong>Sample output:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="{&quot;timestamp&quot;: &quot;2026-04-18T15:23:42.3&quot;, &quot;operation&quot;: &quot;COMMAND_START&quot;,
 &quot;parameters&quot;: {&quot;tool&quot;: &quot;execute_python_async&quot;, &quot;args&quot;: {&quot;code&quot;: &quot;...&quot;}}}
{&quot;timestamp&quot;: &quot;2026-04-18T15:23:44.1&quot;, &quot;operation&quot;: &quot;COMMAND_SUCCESS&quot;,
 &quot;parameters&quot;: {&quot;tool&quot;: &quot;poll_job&quot;}, &quot;duration_seconds&quot;: 0.074,
 &quot;result&quot;: &quot;{\&quot;status\&quot;: \&quot;done\&quot;, \&quot;result\&quot;: \&quot;...\&quot;}&quot;}"><pre class="notranslate"><code>{"timestamp": "2026-04-18T15:23:42.3", "operation": "COMMAND_START",
 "parameters": {"tool": "execute_python_async", "args": {"code": "..."}}}
{"timestamp": "2026-04-18T15:23:44.1", "operation": "COMMAND_SUCCESS",
 "parameters": {"tool": "poll_job"}, "duration_seconds": 0.074,
 "result": "{\"status\": \"done\", \"result\": \"...\"}"}
</code></pre></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">A response's top-level <code>events</code> field</h3><a id="user-content-a-responses-top-level-events-field" class="anchor" aria-label="Permalink: A response's top-level events field" href="#a-responses-top-level-events-field"><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">Some tool responses carry a top-level <code>events</code> array even when the call otherwise
looks like it succeeded — this is <a href="https://github.com/blwfish/mcp-events"><code>mcp-events</code></a>,
a structured-signaling package the bridge uses instead of swallowing a soft failure or
burying it in a free-text log line. Today it fires for things like a FreeCAD response
that couldn't be parsed as JSON, an image that couldn't be extracted from a response, or
spawned-instance metadata that couldn't be enriched — none of which necessarily fail the
call outright, but all of which explain a result that's present but incomplete or off.
<strong>Check for an <code>events</code> key before assuming a response with no <code>error</code> field is fully
clean</strong>, especially under "Operation Succeeded But Result Looks Wrong" below.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><code>view_control(operation="get_report_view", tail=N, filter="...", clear=False)</code></h3><a id="user-content-view_controloperationget_report_view-tailn-filter-clearfalse" class="anchor" aria-label="Permalink: view_control(operation=&quot;get_report_view&quot;, tail=N, filter=&quot;...&quot;, clear=False)" href="#view_controloperationget_report_view-tailn-filter-clearfalse"><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">Reads FreeCAD's Report View — the panel where FreeCAD logs recompute warnings, OCCT
messages, link restore failures, sketch solver output, and AICopilot workbench status.
This is frequently where the real error is, even when the tool call error message is
vague or generic.</p>
<p dir="auto"><strong>Parameters:</strong></p>
<ul dir="auto">
<li><code>tail=50</code> — return the last N lines (default 50; increase if the failure happened
a while ago and the log has scrolled)</li>
<li><code>filter="error"</code> — return only lines containing "error" (case-insensitive). Also
useful: <code>filter="warning"</code>, <code>filter="link"</code>, <code>filter="sketch"</code>, <code>filter="recompute"</code></li>
<li><code>clear=True</code> — clear the Report View after reading. Do this before retrying a
failed operation so the next read shows only fresh output.</li>
</ul>
<p dir="auto"><strong>What to look for:</strong></p>
<ul dir="auto">
<li><code>Link not restored</code> / <code>Link broken!</code> — an external reference couldn't be resolved.
The message includes the object name and file path. See section 6.</li>
<li><code>BRep_API: command not done</code> — an OCCT boolean operation failed. The geometry fed
into it was probably invalid. Check <code>check_solid</code> on the input objects.</li>
<li><code>Recomputation required</code> — a document needs recompute after a parameter change.
Call <code>execute_python("FreeCAD.ActiveDocument.recompute()")</code>.</li>
<li><code>Sketcher: sketch has ... redundant constraint(s)</code> — over-constrained sketch.
See section 5.</li>
<li><code>hasher mismatch</code> — topology naming bookkeeping issue when shapes cross document
boundaries. Usually harmless unless downstream features reference specific faces
of the affected geometry. See section 7.</li>
<li><code>PropertyTopoShape: Recomputation required ... geo element version change</code> — normal
when opening a document saved with a different FreeCAD version. Trigger a recompute.</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><code>manage_connection(action="status")</code></h3><a id="user-content-manage_connectionactionstatus" class="anchor" aria-label="Permalink: manage_connection(action=&quot;status&quot;)" href="#manage_connectionactionstatus"><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">Runs entirely on the bridge side — does not require FreeCAD to be running or
responsive. Reports:</p>
<ul dir="auto">
<li>Whether the socket file exists and whether connections succeed</li>
<li>The contents of the crash watcher's per-PID last-op file (matched via
<code>/tmp/freecad_mcp_last_op_*.json</code>; what the crash watcher recorded as the
in-flight operation when FreeCAD last crashed, if anything)</li>
<li>Whether <code>.FCStd</code> recovery files are present and whether they pass basic integrity
checks</li>
</ul>
<p dir="auto">This is the first tool to call when FreeCAD crashes or won't connect.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><code>manage_connection(action="clear_recovery")</code></h3><a id="user-content-manage_connectionactionclear_recovery" class="anchor" aria-label="Permalink: manage_connection(action=&quot;clear_recovery&quot;)" href="#manage_connectionactionclear_recovery"><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">Finds and removes corrupt FreeCAD recovery files from FreeCAD's recovery directory.</p>
<p dir="auto"><strong>When to use:</strong> When FreeCAD crashes immediately on startup (crash loop). This happens
because FreeCAD writes recovery files continuously during a session. If it crashes
mid-write, the recovery file is partially written and structurally invalid. On the
next launch, FreeCAD tries to restore it, encounters the corruption, crashes again,
and the cycle repeats. The socket file may exist briefly before the second crash,
which means <code>check_freecad_connection()</code> may appear to succeed even though FreeCAD
is not actually usable.</p>
<p dir="auto">After clearing recovery files, ask the user to restart FreeCAD.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><code>manage_connection(action="validate_fcstd", filename="...")</code></h3><a id="user-content-manage_connectionactionvalidate_fcstd-filename" class="anchor" aria-label="Permalink: manage_connection(action=&quot;validate_fcstd&quot;, filename=&quot;...&quot;)" href="#manage_connectionactionvalidate_fcstd-filename"><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">Checks a <code>.FCStd</code> file's ZIP archive integrity before FreeCAD tries to open it. A
<code>.FCStd</code> file is a ZIP containing <code>Document.xml</code> plus shape binary files. If a save
was interrupted mid-write (crash during <code>doc.save()</code>, power loss, disk full), the
ZIP's central directory may be intact while the file data is truncated, or vice versa.</p>
<p dir="auto">Call this when a user reports that a file "won't open" or "crashes FreeCAD on open"
before attempting to open it.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Crash watcher — <code>/tmp/freecad_mcp_last_op_&lt;pid&gt;.json</code></h3><a id="user-content-crash-watcher--tmpfreecad_mcp_last_op_pidjson" class="anchor" aria-label="Permalink: Crash watcher — /tmp/freecad_mcp_last_op_&lt;pid&gt;.json" href="#crash-watcher--tmpfreecad_mcp_last_op_pidjson"><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">Written atomically by the AICopilot workbench <em>inside</em> FreeCAD immediately before
each tool call executes. Cleared on successful completion. If FreeCAD crashes during
an operation, this file survives and contains exactly what was in flight. The path
is per-PID (<code>AICopilot/crash_watcher.py</code>'s <code>LAST_OP_FILE</code>) so multiple spawned
FreeCAD instances don't clobber each other's crash state; the bridge-side reader
(<code>freecad_crash_report.py</code>'s <code>LAST_OP_FILE_GLOB</code>) matches all of them via
<code>/tmp/freecad_mcp_last_op_*.json</code>.</p>
<p dir="auto"><strong>Contents:</strong></p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{
  &quot;tool&quot;: &quot;execute_python&quot;,
  &quot;args&quot;: {&quot;code&quot;: &quot;import Part\nresult = shape1.fuse(shape2)\n…&quot;},
  &quot;started_at&quot;: 1747123456.789,
  &quot;pid&quot;: 12345
}"><pre>{
  <span class="pl-ent">"tool"</span>: <span class="pl-s"><span class="pl-pds">"</span>execute_python<span class="pl-pds">"</span></span>,
  <span class="pl-ent">"args"</span>: {<span class="pl-ent">"code"</span>: <span class="pl-s"><span class="pl-pds">"</span>import Part<span class="pl-cce">\n</span>result = shape1.fuse(shape2)<span class="pl-cce">\n</span>…<span class="pl-pds">"</span></span>},
  <span class="pl-ent">"started_at"</span>: <span class="pl-c1">1747123456.789</span>,
  <span class="pl-ent">"pid"</span>: <span class="pl-c1">12345</span>
}</pre></div>
<p dir="auto"><code>manage_connection(action="status")</code> reads and reports this automatically. You can
also read it directly with <code>execute_python</code> if FreeCAD is still running:</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="execute_python(&quot;import glob, json; json.load(open(glob.glob('/tmp/freecad_mcp_last_op_*.json')[0]))&quot;)"><pre><span class="pl-en">execute_python</span>(<span class="pl-s">"import glob, json; json.load(open(glob.glob('/tmp/freecad_mcp_last_op_*.json')[0]))"</span>)</pre></div>
<hr>
<p dir="auto"><strong>Always check connection before anything else:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="check_freecad_connection()"><pre class="notranslate"><code>check_freecad_connection()
</code></pre></div>
<p dir="auto">If this fails, FreeCAD is not running or the AICopilot workbench isn't loaded. Tell
the user to launch FreeCAD and wait for "AI Copilot ready" in the Report View. Do
not attempt any other tool calls until connection succeeds — they will all fail and
the errors will be misleading.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">1. Operation Returned an Error</h2><a id="user-content-1-operation-returned-an-error" class="anchor" aria-label="Permalink: 1. Operation Returned an Error" href="#1-operation-returned-an-error"><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"><strong>Symptom:</strong> A tool call returned an error message or an unexpected result. The
error message from the tool itself may be vague ("operation failed", "Python error")
or may be a raw OCCT or FreeCAD exception.</p>
<p dir="auto"><strong>Step 1 — Read the Report View immediately:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;get_report_view&quot;, tail=50, filter=&quot;error&quot;)"><pre class="notranslate"><code>view_control(operation="get_report_view", tail=50, filter="error")
</code></pre></div>
<p dir="auto">Do this first, before anything else, because some operations write to the Report View
and then continue — a subsequent operation may clear or overwrite the relevant lines.
The Report View often contains the real error even when the tool call error is generic.</p>
<p dir="auto">Common patterns and what they mean:</p>
<ul dir="auto">
<li><code>BRep_API: command not done</code> → boolean operation (fuse/cut/common) failed; the
input geometry has a problem. Check solid validity on inputs.</li>
<li><code>BRep_Builder_MakeWire: wire not done</code> → a wire construction failed, usually
because edges don't share endpoints within tolerance.</li>
<li><code>Standard_ConstructionError</code> → OCCT couldn't build the requested shape; geometry
inputs are inconsistent.</li>
<li><code>Sketcher ... redundant constraint</code> → sketch is over-constrained; the solver
rejected it.</li>
<li><code>Part.OCCError</code> → generic OCCT failure; check the full message for specifics.</li>
</ul>
<p dir="auto"><strong>Step 2 — Read the operation logs:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="get_debug_logs()"><pre class="notranslate"><code>get_debug_logs()
</code></pre></div>
<p dir="auto">Look at the sequence of calls leading up to the failure. Check whether an earlier
operation produced a result that was silently bad — for example, a sketch that closed
but was under-constrained, which then produced degenerate geometry when padded.</p>
<p dir="auto"><strong>Step 3 — Inspect document state:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;list_objects&quot;)"><pre class="notranslate"><code>view_control(operation="list_objects")
</code></pre></div>
<p dir="auto">Verify every object you expect exists. Check visibility (hidden objects don't
participate in booleans). Look for objects in error state.</p>
<p dir="auto">To check object states explicitly:</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="execute_python(&quot;&quot;&quot;
[(o.Name, o.Label, o.TypeId, getattr(o, 'State', 'n/a'))
 for o in FreeCAD.ActiveDocument.Objects]
&quot;&quot;&quot;)"><pre><span class="pl-en">execute_python</span>(<span class="pl-s">"""</span>
<span class="pl-s">[(o.Name, o.Label, o.TypeId, getattr(o, 'State', 'n/a'))</span>
<span class="pl-s"> for o in FreeCAD.ActiveDocument.Objects]</span>
<span class="pl-s">"""</span>)</pre></div>
<p dir="auto">Objects with <code>State</code> containing <code>'Invalid'</code> or <code>'Error'</code> are broken and need
attention before anything downstream of them will work.</p>
<p dir="auto"><strong>Step 4 — If it's a geometry validity failure:</strong></p>
<p dir="auto">Boolean operations and PartDesign features require valid, non-self-intersecting
solid input. Check each input:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="measurement_operations(operation=&quot;check_solid&quot;, object_name=&quot;Body&quot;)"><pre class="notranslate"><code>measurement_operations(operation="check_solid", object_name="Body")
</code></pre></div>
<p dir="auto">A valid solid returns <code>is_valid: true</code>. If it returns false, the problem is in how
that object was constructed, not in the operation you're trying to run. Fix the input
first.</p>
<p dir="auto"><strong>Step 5 — Clear state and retry:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;clear&quot;)   # clear Report View
view_control(operation=&quot;undo&quot;)    # undo the failed operation if it partially executed"><pre class="notranslate"><code>view_control(operation="clear")   # clear Report View
view_control(operation="undo")    # undo the failed operation if it partially executed
</code></pre></div>
<p dir="auto">Then retry with smaller steps, checking geometry validity between each one.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">2. FreeCAD Crashed / Disconnected</h2><a id="user-content-2-freecad-crashed--disconnected" class="anchor" aria-label="Permalink: 2. FreeCAD Crashed / Disconnected" href="#2-freecad-crashed--disconnected"><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"><strong>Symptom:</strong> A tool call returned a crash/disconnect error. The MCP bridge detected
that the socket connection was lost mid-operation.</p>
<p dir="auto"><strong>Step 1 — Diagnose immediately:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="manage_connection(action=&quot;status&quot;)"><pre class="notranslate"><code>manage_connection(action="status")
</code></pre></div>
<p dir="auto">This reads the crash watcher file and bridge logs. It will tell you:</p>
<ul dir="auto">
<li>What operation was in flight when the crash occurred (from the crash watcher)</li>
<li>Whether FreeCAD's process is still running</li>
<li>Whether the socket file exists</li>
<li>Whether recovery files are present</li>
</ul>
<p dir="auto">Report this information to the user verbatim. It is the most useful thing you can
provide at this point.</p>
<p dir="auto"><strong>Step 2 — Tell the user what crashed and why.</strong></p>
<p dir="auto">Common causes of crashes:</p>
<ul dir="auto">
<li><code>execute_python</code> with a boolean operation on invalid geometry → OCCT kernel crash,
typically during <code>fuse()</code>, <code>cut()</code>, or <code>common()</code> on shapes with self-intersections</li>
<li>Very large geometry operations (thousands of faces, complex shells) → memory
exhaustion or OCCT timeout</li>
<li><code>doc.recompute()</code> on a document with circular dependencies → stack overflow</li>
<li>Setting <code>LinkedObject = None</code> on a link that has active clones → reference count
crash (this is a known FreeCAD issue)</li>
</ul>
<p dir="auto"><strong>Step 3 — Ask the user to restart FreeCAD.</strong></p>
<p dir="auto">Do not attempt any tool calls while FreeCAD is down — they will all fail and the
errors will be confusing. Wait for explicit user confirmation that FreeCAD is running
again and shows "AI Copilot ready" in the Report View.</p>
<p dir="auto"><strong>Step 4 — Check for a crash loop before the user restarts:</strong></p>
<p dir="auto">If <code>manage_connection(action="status")</code> reports recovery files present, clear them
first or FreeCAD may crash again immediately:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="manage_connection(action=&quot;clear_recovery&quot;)"><pre class="notranslate"><code>manage_connection(action="clear_recovery")
</code></pre></div>
<p dir="auto">Then ask the user to restart.</p>
<p dir="auto"><strong>Step 5 — After reconnection, verify document state:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="check_freecad_connection()
view_control(operation=&quot;list_objects&quot;)
view_control(operation=&quot;get_report_view&quot;, tail=30)"><pre class="notranslate"><code>check_freecad_connection()
view_control(operation="list_objects")
view_control(operation="get_report_view", tail=30)
</code></pre></div>
<p dir="auto">Determine whether the document was restored from a recovery file (it may be in a
partially-modified state), restored from the last explicit save (changes since then
are lost), or not open at all. Communicate this clearly to the user before continuing.</p>
<p dir="auto"><strong>Step 6 — Avoid repeating the crash:</strong></p>
<p dir="auto">If the crash was during a boolean operation, validate geometry before retrying:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="measurement_operations(operation=&quot;check_solid&quot;, object_name=&quot;...&quot;)"><pre class="notranslate"><code>measurement_operations(operation="check_solid", object_name="...")
</code></pre></div>
<p dir="auto">If the crash was during a large <code>execute_python</code> call, break it into smaller steps
and use <code>view_control(operation="checkpoint", name="before_risky_op")</code> before each
risky operation so you can roll back without losing everything.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">3. FreeCAD Won't Connect At All</h2><a id="user-content-3-freecad-wont-connect-at-all" class="anchor" aria-label="Permalink: 3. FreeCAD Won't Connect At All" href="#3-freecad-wont-connect-at-all"><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"><strong>Symptom:</strong> <code>check_freecad_connection()</code> fails. FreeCAD may appear to be running
(the window is visible) but the socket is not answering.</p>
<p dir="auto"><strong>Step 1 — Diagnose the socket state:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="manage_connection(action=&quot;status&quot;)"><pre class="notranslate"><code>manage_connection(action="status")
</code></pre></div>
<p dir="auto">This will report whether the socket file exists, whether connection is refused, and
whether the crash watcher has a last-op file. The combination tells you what happened:</p>
<ul dir="auto">
<li>Socket file missing → FreeCAD is not running, or the AICopilot workbench never
started (workbench load failure). User needs to launch FreeCAD.</li>
<li>Socket file present, connection refused → FreeCAD crashed and left the socket file
behind. User needs to quit FreeCAD (force-quit if necessary) and restart.</li>
<li>Socket file present, connection hangs → FreeCAD is running but the socket thread
is blocked. This can happen if a GUI operation is blocking the Qt event loop.
User needs to force-quit and restart.</li>
<li>Last-op file present → FreeCAD crashed mid-operation. Note what operation it was
and tell the user.</li>
</ul>
<p dir="auto"><strong>Step 2 — Check for crash loop:</strong></p>
<p dir="auto">If FreeCAD crashes immediately on startup, clear recovery files first:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="manage_connection(action=&quot;clear_recovery&quot;)"><pre class="notranslate"><code>manage_connection(action="clear_recovery")
</code></pre></div>
<p dir="auto"><strong>Step 3 — Verify workbench load after restart:</strong></p>
<p dir="auto">Ask the user to check View → Panels → Report View immediately after FreeCAD starts.
The correct startup sequence in the Report View is:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Starting FreeCAD AI Copilot Service...
MCP Debug infrastructure loaded
Crash watcher loaded — op tracking active
freecad_mcp_handler vX.X.X validated
Modular handlers loaded successfully
Socket server started on /tmp/freecad_mcp.sock
AI Socket Server started - Claude ready
FreeCAD AI Copilot ready."><pre class="notranslate"><code>Starting FreeCAD AI Copilot Service...
MCP Debug infrastructure loaded
Crash watcher loaded — op tracking active
freecad_mcp_handler vX.X.X validated
Modular handlers loaded successfully
Socket server started on /tmp/freecad_mcp.sock
AI Socket Server started - Claude ready
FreeCAD AI Copilot ready.
</code></pre></div>
<p dir="auto">If the Report View is empty or shows only font/Qt warnings with no AICopilot lines,
the workbench didn't load. Common causes:</p>
<ul dir="auto">
<li>AICopilot not installed in the correct Mod directory (see AGENT-INSTALL.md)</li>
<li>Python dependency missing</li>
<li>Syntax error in a handler file (if the user has been editing the source)</li>
</ul>
<p dir="auto">Ask the user to check Edit → Preferences → Workbenches and confirm AICopilot is
in the enabled list. If it's there but not loading, ask them to check the FreeCAD
startup log (Help → About → Copy to Clipboard on some platforms, or the terminal
output if launched from a terminal).</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">4. Operation Succeeded But Result Looks Wrong</h2><a id="user-content-4-operation-succeeded-but-result-looks-wrong" class="anchor" aria-label="Permalink: 4. Operation Succeeded But Result Looks Wrong" href="#4-operation-succeeded-but-result-looks-wrong"><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"><strong>Symptom:</strong> No error reported, but the geometry, placement, or dimensions don't
match what was intended.</p>
<p dir="auto"><strong>Step 1 — Look at the actual state:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;screenshot&quot;)"><pre class="notranslate"><code>view_control(operation="screenshot")
</code></pre></div>
<p dir="auto">Don't assume the model is in the state you expect. Look at it. FreeCAD's 3D view
shows exactly what's there, including misplacements, wrong orientations, and missing
features that were supposed to appear.</p>
<p dir="auto"><strong>Step 2 — List all objects and their visibility:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;list_objects&quot;)"><pre class="notranslate"><code>view_control(operation="list_objects")
</code></pre></div>
<p dir="auto">Check that the objects you intended to create exist and are visible. Invisible objects
don't render in the viewport and don't participate in boolean operations. Objects with
<code>Visibility: false</code> need to be shown explicitly.</p>
<p dir="auto"><strong>Step 3 — Measure what's actually there:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="measurement_operations(operation=&quot;get_bounding_box&quot;, object_name=&quot;...&quot;)
measurement_operations(operation=&quot;get_volume&quot;, object_name=&quot;...&quot;)
measurement_operations(operation=&quot;list_faces&quot;, object_name=&quot;...&quot;)"><pre class="notranslate"><code>measurement_operations(operation="get_bounding_box", object_name="...")
measurement_operations(operation="get_volume", object_name="...")
measurement_operations(operation="list_faces", object_name="...")
</code></pre></div>
<p dir="auto">Compare measured dimensions against intended dimensions. A bounding box tells you
size and position; face normals from <code>list_faces</code> tell you orientation.</p>
<p dir="auto"><strong>Step 4 — Check if a previous operation produced bad intermediate state:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="get_debug_logs()"><pre class="notranslate"><code>get_debug_logs()
</code></pre></div>
<p dir="auto">Look for any earlier operations that produced unexpected results. A sketch that was
under-constrained will produce geometry that looks reasonable but has wrong dimensions;
a pad on such a sketch inherits the error.</p>
<p dir="auto"><strong>Step 5 — Undo and rebuild rather than patching:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;undo&quot;)"><pre class="notranslate"><code>view_control(operation="undo")
</code></pre></div>
<p dir="auto">Use undo as many times as needed to get back to a known good state. Then rebuild with
explicit verification steps — check sketch constraints, verify sketch is fully
constrained before closing, check solid validity after each boolean.</p>
<p dir="auto"><strong>Step 6 — If the result still looks wrong with no error to chase, consider
representation-layer failures:</strong></p>
<p dir="auto">There is a class of FreeCAD bugs where the <strong>model is semantically correct
but the underlying topology has accumulated drift</strong> that breaks OCCT
Boolean operations silently — <code>BRepAlgoAPI_Fuse</code> returns one operand
unchanged, <code>Part::MultiFuse</code> produces an incomplete shape, no error or
warning anywhere. The steps above (<code>view_control</code> / <code>list_objects</code> /
<code>measurement_operations</code> / <code>get_debug_logs</code>) don't surface these because
the symptom is on the OCCT side, not the FreeCAD side.</p>
<p dir="auto">Before reaching for an external library, try
<code>measurement_operations(operation="find_root_cause", object_name="...")</code> —
it walks the object's own dependency subtree and will already catch a bad
<code>Fillet</code>, a <code>Revolution</code> silently producing a Shell instead of a Solid, or
a <code>Compound</code> whose children only touch at a seam without being fused. See
section 9 below for the full walkthrough, including why <code>check_solid</code>
alone can miss all three.</p>
<p dir="auto">For diagnosing a deeper, subtler class of failure (silent Boolean drops, edge-coincident
fuse failures, accumulated-history drift, deprecated-property warnings the
user missed, orphaned-feature parametric-link breakage), see
<a href="https://github.com/blwfish/Poirot2">Poirot2</a> — a diagnostic library +
assistant playbook that runs inside FreeCAD via this MCP bridge and adds
representation-layer probes (<code>check_boolean_health</code> cross-checks
<code>BRepAlgoAPI</code> against <code>BOPAlgo_Builder</code>; <code>find_recent_orphans</code> sweeps for
null required references; etc.). Its <code>AGENT-OPERATION.md</code> is the
companion playbook for this kind of diagnosis.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">5. Sketch or Constraint Failure</h2><a id="user-content-5-sketch-or-constraint-failure" class="anchor" aria-label="Permalink: 5. Sketch or Constraint Failure" href="#5-sketch-or-constraint-failure"><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"><strong>Symptom:</strong> A sketch operation fails, the sketch solver reports redundant or
conflicting constraints, or the padded/pocketed result has wrong geometry.</p>
<p dir="auto"><strong>Step 1 — Check sketch validity and constraint count:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="sketch_operations(operation=&quot;verify_sketch&quot;, sketch_name=&quot;SketchName&quot;)"><pre class="notranslate"><code>sketch_operations(operation="verify_sketch", sketch_name="SketchName")
</code></pre></div>
<p dir="auto">This reports whether the sketch is valid, how many degrees of freedom remain (should
be 0 for fully constrained), and any solver issues.</p>
<p dir="auto"><strong>Step 2 — List all constraints:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="sketch_operations(operation=&quot;list_constraints&quot;, sketch_name=&quot;SketchName&quot;)"><pre class="notranslate"><code>sketch_operations(operation="list_constraints", sketch_name="SketchName")
</code></pre></div>
<p dir="auto">Look for:</p>
<ul dir="auto">
<li>Redundant constraints — the same dimension constrained twice, or a geometric
constraint that's already implied by another. Remove duplicates.</li>
<li>Conflicting constraints — two constraints that can't both be satisfied (e.g.,
a horizontal constraint on a line that also has a fixed angle). One must be removed.</li>
<li>Missing constraints — degrees of freedom &gt; 0 means the sketch is under-constrained.
Geometry will be placed at FreeCAD's best guess, which may not be what you want.</li>
</ul>
<p dir="auto"><strong>Step 3 — Check the Report View for solver output:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;get_report_view&quot;, tail=20, filter=&quot;sketch&quot;)"><pre class="notranslate"><code>view_control(operation="get_report_view", tail=20, filter="sketch")
</code></pre></div>
<p dir="auto">FreeCAD's sketch solver logs detail here when it fails to converge or detects
redundancy.</p>
<p dir="auto"><strong>Step 4 — Common constraint mistakes:</strong></p>
<ul dir="auto">
<li>Geometry IDs are assigned sequentially from 0 as geometry is added. Special IDs:
<code>-1</code> = X axis, <code>-2</code> = Y axis. If you add geometry in a different order than
expected, the IDs shift.</li>
<li>Point IDs: <code>0</code> = on edge (any point), <code>1</code> = start vertex, <code>2</code> = end vertex,
<code>3</code> = center (for arcs/circles).</li>
<li>A rectangle added with <code>add_rectangle</code> creates 4 line segments (geo IDs 0–3) plus
a construction point. Constraints on the rectangle reference these IDs.</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">6. External Link / Reference Broken</h2><a id="user-content-6-external-link--reference-broken" class="anchor" aria-label="Permalink: 6. External Link / Reference Broken" href="#6-external-link--reference-broken"><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"><strong>Symptom:</strong> On document open, the Report View shows messages like:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Link not restored
Linked object: Body
Linked document: general-windows"><pre class="notranslate"><code>Link not restored
Linked object: Body
Linked document: general-windows
</code></pre></div>
<p dir="auto">or:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="Standard Window Master A: Link broken!
Object: Body
File: ../../../General Parts/general-windows.FCStd"><pre class="notranslate"><code>Standard Window Master A: Link broken!
Object: Body
File: ../../../General Parts/general-windows.FCStd
</code></pre></div>
<p dir="auto"><strong>What this means:</strong> An <code>App::Link</code> object in the current document points to an
object by name in an external <code>.FCStd</code> file. That named object no longer exists —
either the file was rebuilt (the object was renamed or replaced), the file was moved,
or the link was saved pointing to an object that never existed.</p>
<p dir="auto">Note: the missing object (<code>Body</code> in the example) is in the <em>external</em> file, not in
the current document. Don't look for it in the current document's object list.</p>
<p dir="auto"><strong>Step 1 — Identify which links are broken:</strong></p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="execute_python(&quot;&quot;&quot;
doc = FreeCAD.ActiveDocument
links = [o for o in doc.Objects if o.TypeId == 'App::Link']
[(l.Name, l.Label, str(l.LinkedObject)) for l in links]
&quot;&quot;&quot;)"><pre><span class="pl-en">execute_python</span>(<span class="pl-s">"""</span>
<span class="pl-s">doc = FreeCAD.ActiveDocument</span>
<span class="pl-s">links = [o for o in doc.Objects if o.TypeId == 'App::Link']</span>
<span class="pl-s">[(l.Name, l.Label, str(l.LinkedObject)) for l in links]</span>
<span class="pl-s">"""</span>)</pre></div>
<p dir="auto">Any link where <code>LinkedObject</code> prints as <code>None</code> is broken.</p>
<p dir="auto"><strong>Step 2 — Find the external file path:</strong></p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="execute_python(&quot;&quot;&quot;
import FreeCAD
# Get the source document — it may be open as a partial document
for name, doc in FreeCAD.listDocuments().items():
    print(name, doc.FileName)
&quot;&quot;&quot;)"><pre><span class="pl-en">execute_python</span>(<span class="pl-s">"""</span>
<span class="pl-s">import FreeCAD</span>
<span class="pl-s"># Get the source document — it may be open as a partial document</span>
<span class="pl-s">for name, doc in FreeCAD.listDocuments().items():</span>
<span class="pl-s">    print(name, doc.FileName)</span>
<span class="pl-s">"""</span>)</pre></div>
<p dir="auto"><strong>Step 3 — Check what objects actually exist in the external file:</strong></p>
<p dir="auto">The external document may be loaded as a "partial document" — FreeCAD lazy-loads
external references, so <code>doc.Objects</code> may be empty even though the file is open.
Read the file directly:</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="execute_python(&quot;&quot;&quot;
import zipfile, re
path = '/actual/path/to/external.FCStd'
with zipfile.ZipFile(path) as z:
    xml = z.read('Document.xml').decode()
names = re.findall(r'&lt;Object name=&quot;([^&quot;]+)&quot;', xml)
names
&quot;&quot;&quot;)"><pre><span class="pl-en">execute_python</span>(<span class="pl-s">"""</span>
<span class="pl-s">import zipfile, re</span>
<span class="pl-s">path = '/actual/path/to/external.FCStd'</span>
<span class="pl-s">with zipfile.ZipFile(path) as z:</span>
<span class="pl-s">    xml = z.read('Document.xml').decode()</span>
<span class="pl-s">names = re.findall(r'&lt;Object name="([^"]+)"', xml)</span>
<span class="pl-s">names</span>
<span class="pl-s">"""</span>)</pre></div>
<p dir="auto">This lists every object in the file without triggering a full load.</p>
<p dir="auto"><strong>Step 4 — Force-load the partial document if needed:</strong></p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="execute_python(&quot;&quot;&quot;
ext_doc = FreeCAD.getDocument('external_doc_name')
ext_doc.restore()   # forces full load
[(o.Name, o.Label, o.TypeId) for o in ext_doc.Objects]
&quot;&quot;&quot;)"><pre><span class="pl-en">execute_python</span>(<span class="pl-s">"""</span>
<span class="pl-s">ext_doc = FreeCAD.getDocument('external_doc_name')</span>
<span class="pl-s">ext_doc.restore()   # forces full load</span>
<span class="pl-s">[(o.Name, o.Label, o.TypeId) for o in ext_doc.Objects]</span>
<span class="pl-s">"""</span>)</pre></div>
<p dir="auto"><strong>Step 5 — Repair the link:</strong></p>
<p dir="auto">Once you know the correct target object name:</p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="execute_python(&quot;&quot;&quot;
doc = FreeCAD.ActiveDocument
ext_doc = FreeCAD.getDocument('external_doc_name')
lnk = doc.getObject('Link002')
target = ext_doc.getObject('Fusion')   # correct object name
lnk.LinkedObject = target
doc.recompute()
print('LinkedObject now:', lnk.LinkedObject)
&quot;&quot;&quot;)"><pre><span class="pl-en">execute_python</span>(<span class="pl-s">"""</span>
<span class="pl-s">doc = FreeCAD.ActiveDocument</span>
<span class="pl-s">ext_doc = FreeCAD.getDocument('external_doc_name')</span>
<span class="pl-s">lnk = doc.getObject('Link002')</span>
<span class="pl-s">target = ext_doc.getObject('Fusion')   # correct object name</span>
<span class="pl-s">lnk.LinkedObject = target</span>
<span class="pl-s">doc.recompute()</span>
<span class="pl-s">print('LinkedObject now:', lnk.LinkedObject)</span>
<span class="pl-s">"""</span>)</pre></div>
<p dir="auto"><strong>Step 6 — Save to make the fix permanent:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;save_document&quot;)"><pre class="notranslate"><code>view_control(operation="save_document")
</code></pre></div>
<p dir="auto">Without saving, the fix will be lost if FreeCAD closes or crashes.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">7. Topology Naming Warnings (hasher mismatch, ElementMap errors)</h2><a id="user-content-7-topology-naming-warnings-hasher-mismatch-elementmap-errors" class="anchor" aria-label="Permalink: 7. Topology Naming Warnings (hasher mismatch, ElementMap errors)" href="#7-topology-naming-warnings-hasher-mismatch-elementmap-errors"><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"><strong>Symptom:</strong> After a recompute or document open, the Report View contains:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;TopoShape&gt; TopoShapeExpansion.cpp(989): hasher mismatch"><pre class="notranslate"><code>&lt;TopoShape&gt; TopoShapeExpansion.cpp(989): hasher mismatch
</code></pre></div>
<p dir="auto">or:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="&lt;ElementMap&gt; &lt;string&gt;(1): Invalid element name string id"><pre class="notranslate"><code>&lt;ElementMap&gt; &lt;string&gt;(1): Invalid element name string id
</code></pre></div>
<p dir="auto"><strong>What these mean:</strong> FreeCAD's topology naming system assigns stable string IDs to
individual faces, edges, and vertices so that downstream features (fillets, sketch
attachments) can reference them reliably even when the model changes. These warnings
fire when shapes from different sources (different documents, different FreeCAD
versions) have incompatible hashers — the internal ID generators don't match — or
when element name string IDs are malformed.</p>
<p dir="auto"><strong>Do you need to act on these?</strong></p>
<p dir="auto">Usually no. These warnings matter only if something downstream holds a reference to
a specific face or edge of the affected geometry — for example, a fillet that
references a specific edge by name, or a sketch attached to a specific face. If no
downstream features reference topology of the affected objects, the warnings are
noise and the geometry is correct.</p>
<p dir="auto">To determine whether to act: check whether any objects report <code>State: Invalid</code> or
<code>State: Error</code> after the recompute. If everything recomputes cleanly, the warnings
are harmless. If objects are invalid, the topology naming issue may be contributing.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">8. Document Recompute Failures</h2><a id="user-content-8-document-recompute-failures" class="anchor" aria-label="Permalink: 8. Document Recompute Failures" href="#8-document-recompute-failures"><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"><strong>Symptom:</strong> After creating or modifying objects, some show orange or red icons in
the model tree, or <code>view_control(operation="list_objects")</code> shows objects with error
states.</p>
<p dir="auto"><strong>Step 1 — Force recompute:</strong></p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="execute_python(&quot;FreeCAD.ActiveDocument.recompute()&quot;)"><pre><span class="pl-en">execute_python</span>(<span class="pl-s">"FreeCAD.ActiveDocument.recompute()"</span>)</pre></div>
<p dir="auto">Some recomputes are deferred. Forcing one often resolves apparent errors.</p>
<p dir="auto"><strong>Step 2 — Check what's invalid:</strong></p>
<div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="execute_python(&quot;&quot;&quot;
[(o.Name, o.Label, o.TypeId, getattr(o, 'State', []))
 for o in FreeCAD.ActiveDocument.Objects
 if getattr(o, 'State', []) and 'Invalid' in getattr(o, 'State', [])]
&quot;&quot;&quot;)"><pre><span class="pl-en">execute_python</span>(<span class="pl-s">"""</span>
<span class="pl-s">[(o.Name, o.Label, o.TypeId, getattr(o, 'State', []))</span>
<span class="pl-s"> for o in FreeCAD.ActiveDocument.Objects</span>
<span class="pl-s"> if getattr(o, 'State', []) and 'Invalid' in getattr(o, 'State', [])]</span>
<span class="pl-s">"""</span>)</pre></div>
<p dir="auto"><strong>Step 3 — Trace the dependency chain:</strong></p>
<p dir="auto">Objects in FreeCAD have dependencies — a Pad depends on a Sketch, a Boolean depends
on its inputs. An invalid object invalidates everything downstream. Find the earliest
invalid object in the dependency chain; fixing that one will often fix everything
downstream automatically after recompute. <code>measurement_operations(operation= "find_root_cause", object_name="...")</code> automates exactly this trace — see section 9
below — so you don't have to walk <code>OutList</code> and re-check each object by hand.</p>
<p dir="auto"><strong>Step 4 — Read the Report View:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;get_report_view&quot;, tail=50, filter=&quot;recompute&quot;)"><pre class="notranslate"><code>view_control(operation="get_report_view", tail=50, filter="recompute")
</code></pre></div>
<p dir="auto">FreeCAD logs which objects failed recompute and why.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">9. Diagnosing a Failure That Surfaced Far From Its Cause</h2><a id="user-content-9-diagnosing-a-failure-that-surfaced-far-from-its-cause" class="anchor" aria-label="Permalink: 9. Diagnosing a Failure That Surfaced Far From Its Cause" href="#9-diagnosing-a-failure-that-surfaced-far-from-its-cause"><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"><strong>Symptom:</strong> A boolean operation, CAM job, or export fails (or FreeCAD's native
Check Geometry reports errors) on an object built from many upstream features —
a <code>Part::Compound</code>, a long chain of Fuse/Cut operations, a body assembled from
several sketches and revolves — and <code>check_solid</code> or <code>diagnose_invalid_shape</code>
on that object either reports "fine" or reports an error without saying which
upstream feature actually caused it.</p>
<p dir="auto"><strong>Step 1 — walk the object's own dependency subtree instead of guessing:</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="measurement_operations(operation=&quot;find_root_cause&quot;, object_name=&quot;...&quot;)"><pre class="notranslate"><code>measurement_operations(operation="find_root_cause", object_name="...")
</code></pre></div>
<p dir="auto">This checks every sketch (open/unclosed wires — the same check <code>verify_sketch</code>
runs) and every shape-bearing feature in that object's <code>OutList</code> subtree
independently: null shape, <code>Shape.isValid()</code>, whether a feature that produced
Faces actually produced any Solids (a <code>Revolution</code> or <code>Extrusion</code> with
<code>Solid=False</code> silently produces a Shell instead), and <code>shape.check(True)</code> — the
same boolean-operation check the native Check Geometry dialog runs, which
catches self-intersections and invalid-curve-on-surface defects that
<code>Shape.isValid()</code> alone misses. It reports which object(s) actually
<strong>introduced</strong> each defect versus which ones are only <strong>inheriting/
propagating</strong> it from upstream, so you get "the Fillet produced an invalid
curve" instead of "the Compound is broken" — the object where the symptom
showed up is rarely where the defect originated.</p>
<p dir="auto"><strong>Step 2 — know check_solid's blind spot before trusting it alone:</strong></p>
<p dir="auto"><code>check_solid</code> (and <code>Shape.isValid()</code>) on a <code>Part::Compound</code>, or any object with
multiple children, answers "does at least one Solid exist somewhere in this
shape" — not "is every child actually a Solid." A Compound built from two real
solids and one bare Shell (the <code>Solid=False</code> case above) will report <strong>"Is a
closed solid,"</strong> because the check only requires <em>a</em> Solid to be present, not
<em>all</em> children to be Solids. The same object can also pass <code>isClosed()</code>
cleanly at the top level while containing a self-intersection that only
exists at the seam between two touching-but-unfused children — neither defect
shows up until something downstream assumes "this is a solid" and breaks.
<code>find_root_cause</code> doesn't share this blind spot, because it checks each child
independently rather than asking whether a Solid exists anywhere in the tree.</p>
<p dir="auto"><strong>Step 3 — if find_root_cause finds nothing, or the failure looks like
representation-layer drift rather than an obvious topology error:</strong></p>
<p dir="auto">See the Poirot2 pointer in section 4 above — that's a heavier, separate
diagnostic library for a subtler class of failure (silent Boolean drops,
accumulated-history corruption) than the one <code>find_root_cause</code> targets.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">General Principles</h2><a id="user-content-general-principles" class="anchor" aria-label="Permalink: General Principles" href="#general-principles"><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"><strong>Read before guessing.</strong> Use <code>get_report_view</code>, <code>get_debug_logs</code>, and <code>list_objects</code>
before forming a hypothesis. The diagnostic tools were built specifically because
FreeCAD's error reporting is cryptic — use them.</p>
<p dir="auto"><strong>Don't patch bad state forward.</strong> If an object is in an invalid state, undo to
before it was created and rebuild it correctly. Trying to fix a broken object in
place usually propagates the problem to downstream features.</p>
<p dir="auto"><strong>Validate geometry after boolean operations.</strong> After every <code>fuse</code>, <code>cut</code>, or
<code>common</code>, call <code>measurement_operations(operation="check_solid")</code> on the result.
Boolean operations on invalid input silently produce invalid output. Building further
features on invalid geometry leads to cascading failures that are hard to diagnose.
<strong>On a <code>Part::Compound</code> or any result assembled from multiple children,
<code>check_solid</code> only confirms that <em>a</em> Solid exists somewhere in the shape — not
that every child is one</strong> (see section 9). Use <code>find_root_cause</code> instead of a
bare <code>check_solid</code> call whenever the object being checked has more than one
meaningful child.</p>
<p dir="auto"><strong>Use checkpoints before risky operations.</strong> Before any operation that could crash
or corrupt the document:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;checkpoint&quot;, name=&quot;before_risky_op&quot;)"><pre class="notranslate"><code>view_control(operation="checkpoint", name="before_risky_op")
</code></pre></div>
<p dir="auto">If something goes wrong, you can roll back to this state rather than having to start
over. Call <code>view_control(operation="rollback_to_checkpoint", name="before_risky_op")</code>
to restore.</p>
<p dir="auto"><strong>Break large <code>execute_python</code> calls into smaller ones.</strong> A crash during a long
operation loses the whole thing. A boolean on large geometry, a complex loft, or a
long array generation are all candidates for splitting. Run the expensive geometry
first, verify it, then proceed.</p>
<p dir="auto"><strong>Report crash details to the user.</strong> If FreeCAD crashed, tell the user exactly what
<code>manage_connection(action="status")</code> shows — what operation was in flight, what the
crash watcher recorded, whether recovery files are present. This is the information
needed to file a useful bug report at <a href="https://github.com/blwfish/freecad-mcp/issues">https://github.com/blwfish/freecad-mcp/issues</a>.</p>
<p dir="auto"><strong>Save after successful fixes.</strong> After repairing a broken link, fixing invalid
geometry, or completing any significant work, save explicitly:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="view_control(operation=&quot;save_document&quot;)"><pre class="notranslate"><code>view_control(operation="save_document")
</code></pre></div>
<p dir="auto">FreeCAD's autosave recovery mechanism is a fallback, not a substitute for saving.</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>

