



  

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




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

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

  


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

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

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

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

  

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


  <title>mklang/docs/guides/best-practices.md at main · gianlucamazza/mklang · 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:cc1d36dc-025a-b185-e09e-40fbb532425d">

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


  <meta name="request-id" content="B22E:8F14F:B7527BB:EEE73F6:6ACA6DFC" data-pjax-transient="true"/><meta name="html-safe-nonce" content="5320514d68af8e1b29a5e053f3bc336d94c36910eaa6ad76440c79f40fd529be" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCMjJFOjhGMTRGOkI3NTI3QkI6RUVFNzNGNjo2QUNBNkRGQyIsInZpc2l0b3JfaWQiOiI1NDQ2MDE0OTMzOTM3MDU3Mjc2IiwicmVnaW9uX2VkZ2UiOiJmcmEiLCJyZWdpb25fcmVuZGVyIjoiZnJhIn0=" data-pjax-transient="true"/><meta name="visitor-hmac" content="aa0c31ab12d9e3acfa791595e7e0395469f005dceaa5cfae6ce1d7bcf6ead1c9" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:1302812422" 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="A declarative language for LLM-driven state machines - the .mkl document is the program, an LLM is the runtime - mklang/docs/guides/best-practices.md at main · gianlucamazza/mklang">

      <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/gianlucamazza/mklang/blob/main/docs/guides/best-practices.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/d17709f5ff1250608b5cde25382d617ae3abe6ae21474df4ba79440eb629893d/gianlucamazza/mklang" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="mklang/docs/guides/best-practices.md at main · gianlucamazza/mklang" /><meta name="twitter:description" content="A declarative language for LLM-driven state machines - the .mkl document is the program, an LLM is the runtime - gianlucamazza/mklang" />
  <meta property="og:image" content="https://opengraph.githubassets.com/d17709f5ff1250608b5cde25382d617ae3abe6ae21474df4ba79440eb629893d/gianlucamazza/mklang" /><meta property="og:image:alt" content="A declarative language for LLM-driven state machines - the .mkl document is the program, an LLM is the runtime - gianlucamazza/mklang" /><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="mklang/docs/guides/best-practices.md at main · gianlucamazza/mklang" /><meta property="og:url" content="https://github.com/gianlucamazza/mklang/blob/main/docs/guides/best-practices.md" /><meta property="og:description" content="A declarative language for LLM-driven state machines - the .mkl document is the program, an LLM is the runtime - gianlucamazza/mklang" />
  




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



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


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

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

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

    <meta data-hydrostats="publish">

  <meta name="go-import" content="github.com/gianlucamazza/mklang git https://github.com/gianlucamazza/mklang.git">

  <meta name="octolytics-dimension-user_id" content="25006045" /><meta name="octolytics-dimension-user_login" content="gianlucamazza" /><meta name="octolytics-dimension-repository_id" content="1302812422" /><meta name="octolytics-dimension-repository_nwo" content="gianlucamazza/mklang" /><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="1302812422" /><meta name="octolytics-dimension-repository_network_root_nwo" content="gianlucamazza/mklang" />
  



    

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


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


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

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

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

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


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

  </head>

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

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

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

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





      

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

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


          

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

<react-partial
  partial-name="marketing-header"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2Fgianlucamazza%2Fmklang%2Fblob%2Fmain%2Fdocs%2Fguides%2Fbest-practices.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=gianlucamazza%2Fmklang","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/gianlucamazza/mklang/blob/main/docs/guides/best-practices.md\",\"user_id\":null}}","auth_hydro_click_hmac":"73ba46b77030315f4f119c4def972f1721c1eeae95c41ec10af6c08765ce9c9e","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%2Fgianlucamazza%2Fmklang%2Fblob%2Fmain%2Fdocs%2Fguides%2Fbest-practices.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/gianlucamazza/mklang/blob/main/docs/guides/best-practices.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="73ba46b77030315f4f119c4def972f1721c1eeae95c41ec10af6c08765ce9c9e"><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%2Fgianlucamazza%2Fmklang%2Fblob%2Fmain%2Fdocs%2Fguides%2Fbest-practices.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/gianlucamazza/mklang/blob/main/docs/guides/best-practices.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="73ba46b77030315f4f119c4def972f1721c1eeae95c41ec10af6c08765ce9c9e"><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=gianlucamazza%2Fmklang" 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/gianlucamazza/mklang/blob/main/docs/guides/best-practices.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="73ba46b77030315f4f119c4def972f1721c1eeae95c41ec10af6c08765ce9c9e"><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-b7106bc0-fa23-4206-9752-f69b2e68bdb5" aria-labelledby="tooltip-1ad50bee-7412-4e79-a40c-aa223b2d097b" 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-1ad50bee-7412-4e79-a40c-aa223b2d097b" for="icon-button-b7106bc0-fa23-4206-9752-f69b2e68bdb5" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

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








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






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

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


    






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








  

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

<react-partial
  partial-name="global-nav-bar"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"contextRegion":{"crumbs":[{"crumb_type":"user","label":"gianlucamazza","is_root":false,"href":"/gianlucamazza"},{"crumb_type":"repository","label":"mklang","is_root":false,"href":"/gianlucamazza/mklang"}],"localNavigation":[{"id":"code","icon":"code","label":"Code","href":"/gianlucamazza/mklang","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":"/gianlucamazza/mklang/issues","selectedLinks":["repo_issues","repo_labels","repo_milestones"],"count":5,"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":"/gianlucamazza/mklang/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":"/gianlucamazza/mklang/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":"/gianlucamazza/mklang/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":"/gianlucamazza/mklang/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":"/gianlucamazza/mklang/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:gianlucamazza/mklang","current_repo_name":"mklang","current_repo_nwo":"gianlucamazza/mklang","user_id":"gianlucamazza"}},"commandPalette":null,"enterpriseBar":{"show":false},"globalTransactionalMessage":[],"payloadsUrl":"/_global-navigation/payloads.json?can_toggle_site_admin_and_employee_status=0\u0026is_admin_mode_on=0\u0026is_ui_opted_out=0\u0026show_ui_opt_out=0\u0026v=7","contextRegionUrl":"/_global-navigation/context-region.json"}}</script>
  <div data-target="react-partial.reactRoot"><header aria-label="Global navigation menu" data-component="Stack" class="GlobalNav styles-module__appHeader__YzYWk prc-Stack-Stack-UQ9k6" data-gap="none" data-direction="vertical" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="none"><div data-component="Stack" class="prc-Stack-Stack-UQ9k6" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="center" data-padding="none"><div data-testid="top-nav-center" data-component="Stack" class="styles-module__center__R3QRv styles-module__withLocalNavigation__rjTJ_ GlobalNavBar-module__loggedOut__Jv1rk prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="normal"><nav class="styles-module__contextRegion__VbSp2 prc-Breadcrumbs-BreadcrumbsBase-3Gb-B" aria-label="Breadcrumbs" data-overflow="menu" data-variant="normal" data-component="Breadcrumbs"><ol class="prc-Breadcrumbs-BreadcrumbsList-BKjpe"><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/gianlucamazza" data-discover="true"><span class="">gianlucamazza</span></a></li><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/gianlucamazza/mklang" data-discover="true"><span class="styles-module__contextCrumbLast__tI2e3">mklang</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="/gianlucamazza/mklang" 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="/gianlucamazza/mklang/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">5</span><span class="prc-VisuallyHidden-VisuallyHidden-Q0qSB"> (<!-- -->5<!-- -->)</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="/gianlucamazza/mklang/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="/gianlucamazza/mklang/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="/gianlucamazza/mklang/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="/gianlucamazza/mklang/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="/gianlucamazza/mklang/pulse" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-graph" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg></span><span data-component="text" data-content="Insights">Insights</span></a></li></ul><div class="prc-UnderlineNav-MoreButtonContainer-Dnrq6"><div class="prc-UnderlineNav-MoreButtonDivider-dN0a-"></div><button data-component="overflow-menu-button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk prc-UnderlineNav-MoreButton-Y8soj" data-loading="false" data-size="medium" data-variant="invisible" id="_R_2ktp_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3"><span>More<span class="prc-src-InternalVisuallyHidden-2YaI6"> items</span></span></span></span><span data-component="trailingAction" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></button></div></nav><div class="d-none"></div></header></div>
</react-partial>


  



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



    
      
    








<react-app
  app-name="code-view"
  initial-path="/gianlucamazza/mklang/blob/main/docs/guides/best-practices.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":"Best practices","anchor":"best-practices","htmlText":"Best practices"},{"level":2,"text":"1. Layer discipline (do not mix layers)","anchor":"1-layer-discipline-do-not-mix-layers","htmlText":"1. Layer discipline (do not mix layers)"},{"level":2,"text":"2. Authoring checklist (every machine)","anchor":"2-authoring-checklist-every-machine","htmlText":"2. Authoring checklist (every machine)"},{"level":2,"text":"3. Prompt assembly (system vs user)","anchor":"3-prompt-assembly-system-vs-user","htmlText":"3. Prompt assembly (system vs user)"},{"level":2,"text":"4. Gates and reliability","anchor":"4-gates-and-reliability","htmlText":"4. Gates and reliability"},{"level":2,"text":"5. Tools (host contracts)","anchor":"5-tools-host-contracts","htmlText":"5. Tools (host contracts)"},{"level":2,"text":"6. Web, time, and knowledge cutoff","anchor":"6-web-time-and-knowledge-cutoff","htmlText":"6. Web, time, and knowledge cutoff"},{"level":2,"text":"7. Output cutoff and context budgets (anti-cutoff)","anchor":"7-output-cutoff-and-context-budgets-anti-cutoff","htmlText":"7. Output cutoff and context budgets (anti-cutoff)"},{"level":2,"text":"8. Memory and composition","anchor":"8-memory-and-composition","htmlText":"8. Memory and composition"},{"level":2,"text":"9. Budgets and cost","anchor":"9-budgets-and-cost","htmlText":"9. Budgets and cost"},{"level":2,"text":"10. Testing and CI","anchor":"10-testing-and-ci","htmlText":"10. Testing and CI"},{"level":2,"text":"11. Security (SPEC §11) — operational minimum","anchor":"11-security-spec-11--operational-minimum","htmlText":"11. Security (SPEC §11) — operational minimum"},{"level":2,"text":"12. Observability: trace vs events vs process logging","anchor":"12-observability-trace-vs-events-vs-process-logging","htmlText":"12. Observability: trace vs events vs process logging"},{"level":3,"text":"Rules","anchor":"rules","htmlText":"Rules"},{"level":3,"text":"Anti-patterns","anchor":"anti-patterns","htmlText":"Anti-patterns"},{"level":2,"text":"13. Filesystem: four classes, not one tool","anchor":"13-filesystem-four-classes-not-one-tool","htmlText":"13. Filesystem: four classes, not one tool"},{"level":3,"text":"Rules for class 3 (data tools)","anchor":"rules-for-class-3-data-tools","htmlText":"Rules for class 3 (data tools)"},{"level":3,"text":"Large workspace analysis (ADR 0036)","anchor":"large-workspace-analysis-adr-0036","htmlText":"Large workspace analysis (ADR 0036)"},{"level":3,"text":"Memory \u0026 planning mapping","anchor":"memory--planning-mapping","htmlText":"Memory \u0026amp; planning mapping"},{"level":3,"text":"Anti-patterns","anchor":"anti-patterns-1","htmlText":"Anti-patterns"},{"level":2,"text":"14. Surfaces quick reference","anchor":"14-surfaces-quick-reference","htmlText":"14. Surfaces quick reference"},{"level":2,"text":"15. Language vs host: what may become language later","anchor":"15-language-vs-host-what-may-become-language-later","htmlText":"15. Language vs host: what may become language later"}]},"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\"\u003eBest practices\u003c/h1\u003e\u003ca id=\"user-content-best-practices\" class=\"anchor\" aria-label=\"Permalink: Best practices\" href=\"#best-practices\"\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\"\u003eCanonical checklist for writing, running, and hosting mklang machines.\n\u003cstrong\u003eHow to author a correct file:\u003c/strong\u003e \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/authoring.md\"\u003eAuthoring\u003c/a\u003e.\u003cbr\u003e\n\u003cstrong\u003eHow to tune reliability and cost:\u003c/strong\u003e \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/patterns.md\"\u003ePatterns\u003c/a\u003e.\u003cbr\u003e\n\u003cstrong\u003eHost tool contracts:\u003c/strong\u003e \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/reference/tools.md\"\u003eTool reference\u003c/a\u003e.\u003cbr\u003e\n\u003cstrong\u003eWhat the language guarantees:\u003c/strong\u003e \u003ca href=\"/gianlucamazza/mklang/blob/main/SPEC.md\"\u003eSPEC\u003c/a\u003e (cookbook §10, threat model §11).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis page answers: \u003cem\u003ewhat should I always do, never do, and where does each rule live?\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e1. Layer discipline (do not mix layers)\u003c/h2\u003e\u003ca id=\"user-content-1-layer-discipline-do-not-mix-layers\" class=\"anchor\" aria-label=\"Permalink: 1. Layer discipline (do not mix layers)\" href=\"#1-layer-discipline-do-not-mix-layers\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eLayer\u003c/th\u003e\n\u003cth\u003eOwns\u003c/th\u003e\n\u003cth\u003eExamples\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eLanguage (\u003ccode\u003e.mkl\u003c/code\u003e)\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eControl flow, prose contracts, portable structure\u003c/td\u003e\n\u003ctd\u003estates, gates, tiers, \u003ccode\u003etool:\u003c/code\u003e \u003cem\u003enames\u003c/em\u003e, \u003ccode\u003eparse: list\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eHost runtime\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eBindings, budgets, clocks, truncation \u003cem\u003epolicy\u003c/em\u003e, LLM adapters, produce/judge prompt assembly, \u003cstrong\u003eops logging\u003c/strong\u003e, FS data roots for tools\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003etools={…}\u003c/code\u003e, hooks, \u003ccode\u003eon_truncate\u003c/code\u003e, \u003ccode\u003econtext.today\u003c/code\u003e / \u003ccode\u003enow\u003c/code\u003e fill, \u003ccode\u003ellm/prompts.py\u003c/code\u003e, process loggers, plugin FS tools\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eSurface\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eUX, consent, compact observations, chrome vs content rendering, session audit\u003c/td\u003e\n\u003ctd\u003eCLI flags, MCP tools, console brain, Markdown log, transcript/session paths, read-only workspace inspection and \u003ccode\u003e.mkl\u003c/code\u003e authoring\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eRules\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eSide effects live only in \u003cstrong\u003e\u003ccode\u003etool:\u003c/code\u003e states\u003c/strong\u003e (host callables). Never in \u003ccode\u003eexecution\u003c/code\u003e or generative prompts.\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003e.mkl\u003c/code\u003e \u003cstrong\u003enever\u003c/strong\u003e names a provider or model — only \u003ccode\u003etier:\u003c/code\u003e (ADR 0003).\u003c/li\u003e\n\u003cli\u003eHost tools are \u003cstrong\u003eopaque names\u003c/strong\u003e + \u003ccode\u003e(dict) → str\u003c/code\u003e. Do not promote search/bash/FS into language syntax.\u003c/li\u003e\n\u003cli\u003eGeneric \u003cstrong\u003ebash / filesystem\u003c/strong\u003e stay \u003cstrong\u003eout of core\u003c/strong\u003e (console: bounded read-only workspace inspection plus \u003ccode\u003e.mkl\u003c/code\u003e authoring; production I/O = plugins or external host).\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\"\u003e2. Authoring checklist (every machine)\u003c/h2\u003e\u003ca id=\"user-content-2-authoring-checklist-every-machine\" class=\"anchor\" aria-label=\"Permalink: 2. Authoring checklist (every machine)\" href=\"#2-authoring-checklist-every-machine\"\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\"\u003eBefore shipping a \u003ccode\u003e.mkl\u003c/code\u003e:\u003c/p\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Schema header + \u003ccode\u003emklang: \"0.4\"\u003c/code\u003e when using post-0.2 faces (\u003ccode\u003eparse: list\u003c/code\u003e, \u003ccode\u003eparse: json\u003c/code\u003e, \u003ccode\u003emax_visits\u003c/code\u003e, …).\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Every non-terminal state ends with \u003cstrong\u003e\u003ccode\u003ewhen: otherwise\u003c/code\u003e\u003c/strong\u003e (last).\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e At least one path reaches \u003cstrong\u003e\u003ccode\u003eEND\u003c/code\u003e\u003c/strong\u003e; \u003ccode\u003ebudget\u003c/code\u003e ≥ shortest path (+ headroom).\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Every \u003ccode\u003e{{path}}\u003c/code\u003e root is \u003ccode\u003econtext:\u003c/code\u003e, a state \u003ccode\u003eoutput:\u003c/code\u003e, HITL \u003ccode\u003ehuman.*\u003c/code\u003e, or fan-out \u003ccode\u003eitem\u003c/code\u003e/\u003ccode\u003eindex\u003c/code\u003e.\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Exact policy (amounts, allowlists, formats) uses \u003cstrong\u003e\u003ccode\u003ehook:\u003c/code\u003e\u003c/strong\u003e, not prose alone.\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Real I/O uses \u003cstrong\u003e\u003ccode\u003etool:\u003c/code\u003e\u003c/strong\u003e + top-level \u003ccode\u003etools:\u003c/code\u003e declarations for documentation.\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Time-sensitive machines declare \u003cstrong\u003e\u003ccode\u003etoday: \"\"\u003c/code\u003e\u003c/strong\u003e (and \u003cstrong\u003e\u003ccode\u003enow: \"\"\u003c/code\u003e\u003c/strong\u003e for wall-clock) in \u003ccode\u003econtext:\u003c/code\u003e and use \u003ccode\u003eToday is {{today}}\u003c/code\u003e / \u003ccode\u003eCurrent local time is {{now}}\u003c/code\u003e in prompts.\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Irreversible actions sit behind \u003cstrong\u003e\u003ccode\u003eescalate\u003c/code\u003e\u003c/strong\u003e (and HITL in production).\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e \u003ccode\u003emklang check\u003c/code\u003e clean; \u003ccode\u003emklang lint\u003c/code\u003e clean (use \u003ccode\u003e--strict\u003c/code\u003e in CI).\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Scenario tests cover happy path \u003cstrong\u003eand\u003c/strong\u003e escape hatches (\u003ccode\u003emklang test\u003c/code\u003e).\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" id=\"\" disabled=\"\" class=\"task-list-item-checkbox\" aria-label=\"Incomplete task\"\u003e Sticky policy lives in \u003cstrong\u003e\u003ccode\u003eexecution\u003c/code\u003e\u003c/strong\u003e (system channel); turn data and\n\u003ccode\u003e{{…}}\u003c/code\u003e live in \u003cstrong\u003e\u003ccode\u003eprompt\u003c/code\u003e\u003c/strong\u003e (user channel) — see §3.\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\"\u003e3. Prompt assembly (system vs user)\u003c/h2\u003e\u003ca id=\"user-content-3-prompt-assembly-system-vs-user\" class=\"anchor\" aria-label=\"Permalink: 3. Prompt assembly (system vs user)\" href=\"#3-prompt-assembly-system-vs-user\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe reference interpreter builds LLM calls from language faces. There is \u003cstrong\u003eno\u003c/strong\u003e\n\u003ccode\u003esystem:\u003c/code\u003e keyword in the language. Map faces to channels:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFace / artifact\u003c/th\u003e\n\u003cth\u003eLLM channel\u003c/th\u003e\n\u003cth\u003eInterpolated?\u003c/th\u003e\n\u003cth\u003ePut here\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estructure\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003esystem\u003c/strong\u003e (produce)\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eOutput contract / shape for this state\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexecution\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003esystem\u003c/strong\u003e (produce)\u003c/td\u003e\n\u003ctd\u003eNo\u003c/td\u003e\n\u003ctd\u003eSticky operational policy (never side effects)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprompt\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003euser\u003c/strong\u003e (produce)\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eYes\u003c/strong\u003e \u003ccode\u003e{{…}}\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThis turn’s task + data — tainted values arrive \u003ccode\u003e\u0026lt;data-NONCE\u0026gt;\u003c/code\u003e-fenced (SPEC §6)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ewhen:\u003c/code\u003e conditions\u003c/td\u003e\n\u003ctd\u003ejudge \u003cstrong\u003euser\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eNo (prose)\u003c/td\u003e\n\u003ctd\u003eGate selection only — stay bare (author-trusted)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHost \u003ccode\u003eJUDGE_SYSTEM\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ejudge \u003cstrong\u003esystem\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003efixed\u003c/td\u003e\n\u003ctd\u003eChoice protocol \u003ccode\u003e{\"choice\": n}\u003c/code\u003e — not authorable\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eThe judge user payload always presents OUTPUT / REASONING / CONTEXT as fenced\ndata (shared \u003ccode\u003ebuild_judge_user\u003c/code\u003e, ADR 0025); the produce system message gains an\nuntrusted-data rule only when the user message actually carries a fence.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eRules\u003c/strong\u003e\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eDurable vs turn data.\u003c/strong\u003e Role, hard constraints, “never invent search” →\n\u003ccode\u003eexecution\u003c/code\u003e. Instance values (\u003ccode\u003e{{user_message}}\u003c/code\u003e, \u003ccode\u003e{{today}}\u003c/code\u003e, \u003ccode\u003e{{now}}\u003c/code\u003e,\n\u003ccode\u003e{{history}}\u003c/code\u003e, tool notes) → \u003ccode\u003eprompt\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDo not put \u003ccode\u003e{{…}}\u003c/code\u003e in \u003ccode\u003estructure\u003c/code\u003e / \u003ccode\u003eexecution\u003c/code\u003e.\u003c/strong\u003e They are not rendered;\nbraces stay literal.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUntrusted text stays out of system\u003c/strong\u003e (user text, web snippets, history) —\nSPEC §11. System is for host-stable contract + policy. In the user channel\nthe runtime additionally delimits tainted values structurally (SPEC §6) —\ndiscipline and delimiting stack, they do not replace each other.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eexecution\u003c/code\u003e is not a tool.\u003c/strong\u003e Side effects only via \u003ccode\u003etool:\u003c/code\u003e states.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eConsole brain\u003c/strong\u003e follows the same split: policy in \u003ccode\u003eexecution\u003c/code\u003e, clocks and\nconversation in \u003ccode\u003eprompt\u003c/code\u003e (\u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/console.md\"\u003econsole\u003c/a\u003e).\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eAnti-patterns:\u003c/strong\u003e long persona only in \u003ccode\u003eprompt\u003c/code\u003e; search snippets in system;\ninventing a \u003ccode\u003esystem:\u003c/code\u003e field; using \u003ccode\u003eexecution: call the search tool\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e4. Gates and reliability\u003c/h2\u003e\u003ca id=\"user-content-4-gates-and-reliability\" class=\"anchor\" aria-label=\"Permalink: 4. Gates and reliability\" href=\"#4-gates-and-reliability\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eDo\u003c/th\u003e\n\u003cth\u003eDon't\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003ePut \u003cstrong\u003ehooks above\u003c/strong\u003e prose gates; keep \u003ccode\u003ewhen\u003c/code\u003e as the human-readable trace label\u003c/td\u003e\n\u003ctd\u003eAsk the LLM to check \u003ccode\u003eamount \u0026lt;= 100\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCap \u003ccode\u003erepair\u003c/code\u003e at 1–2, then \u003ccode\u003eescalate\u003c/code\u003e or \u003ccode\u003efail\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpen-ended repair-only states\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eGive escalate a \u003cstrong\u003esafe sink\u003c/strong\u003e state (human / fallback)\u003c/td\u003e\n\u003ctd\u003eFail closed only when that is truly required\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRead \u003cstrong\u003etrace\u003c/strong\u003e (gate, \u003ccode\u003ejudge_fallback\u003c/code\u003e, nested \u003ccode\u003ecall\u003c/code\u003e) when debugging\u003c/td\u003e\n\u003ctd\u003eTrust only the final \u003ccode\u003eresult\u003c/code\u003e string\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUse \u003ccode\u003ereason: true\u003c/code\u003e when the \u003cem\u003ewhy\u003c/em\u003e must be auditable\u003c/td\u003e\n\u003ctd\u003eDump chain-of-thought into \u003ccode\u003eoutput\u003c/code\u003e / context\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eQuote any \u003ccode\u003ewhen\u003c/code\u003e that contains \u003ccode\u003e#\u003c/code\u003e / \u003ccode\u003e##\u003c/code\u003e (markdown headings)\u003c/td\u003e\n\u003ctd\u003eBare \u003ccode\u003e## Section\u003c/code\u003e in unquoted \u003ccode\u003ewhen\u003c/code\u003e (YAML truncates)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eBuiltin / parametric hooks\u003c/strong\u003e (no plugin): \u003ccode\u003ealways_true\u003c/code\u003e / \u003ccode\u003ealways_false\u003c/code\u003e,\n\u003ccode\u003ewrite_failed\u003c/code\u003e (write_file observation failed), \u003ccode\u003eeq:key:value\u003c/code\u003e /\n\u003ccode\u003eneq:key:value\u003c/code\u003e (string equality on a top-level context key). Put hooks \u003cstrong\u003eabove\u003c/strong\u003e\nprose batches so control-flow does not depend on a judge fallback.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eGate judging \u003cstrong\u003efollows the state tier\u003c/strong\u003e by default. Use config \u003ccode\u003ejudge:\u003c/code\u003e only when all gates are deliberately cheap classifications (SPEC §2.1). \u003ccode\u003ejudge: jev-latest\u003c/code\u003e is an opt-in Noul-only host adapter (\u003ca href=\"/gianlucamazza/mklang/blob/main/docs/adr/0037-jev-noul-host-judge.md\"\u003eADR 0037\u003c/a\u003e, \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/jev-noul-judge.md\"\u003eguide\u003c/a\u003e) — not the default, not a produce tier, never Choice.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOptional: \u003ccode\u003emklang lint --llm\u003c/code\u003e to probe overlapping prose \u003ccode\u003ewhen\u003c/code\u003e conditions (advisory; not CI-blocking). \u003ccode\u003emklang lint\u003c/code\u003e also flags unquoted \u003ccode\u003e#\u003c/code\u003e inside raw \u003ccode\u003ewhen\u003c/code\u003e lines.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe prose behind each of these rules — and everything else about tuning\nreliability — is in \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/patterns.md#reliability-gates-are-the-safety-net\"\u003ePatterns\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e5. Tools (host contracts)\u003c/h2\u003e\u003ca id=\"user-content-5-tools-host-contracts\" class=\"anchor\" aria-label=\"Permalink: 5. Tools (host contracts)\" href=\"#5-tools-host-contracts\"\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\"\u003eInput/output/enable contracts for the reference host tools (\u003ccode\u003esearch\u003c/code\u003e,\n\u003ccode\u003esearch_kb\u003c/code\u003e, \u003ccode\u003esend_reply\u003c/code\u003e, the \u003ccode\u003elist_files\u003c/code\u003e/\u003ccode\u003eread_file\u003c/code\u003e/\u003ccode\u003ewrite_file\u003c/code\u003e data\ntools, \u003ccode\u003ecalc\u003c/code\u003e), the ADR 0020 observation envelope, and capability policy are\none page: the \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/reference/tools.md\"\u003ehost tool reference\u003c/a\u003e. The rules that\nbelong on this checklist:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eObservations are \u003cstrong\u003euntrusted\u003c/strong\u003e blackboard data (SPEC §11), fenced\nautomatically when interpolated (SPEC §6).\u003c/li\u003e\n\u003cli\u003eSide effects only via \u003cstrong\u003e\u003ccode\u003etool:\u003c/code\u003e\u003c/strong\u003e states; declare expected tools under\ntop-level \u003ccode\u003etools:\u003c/code\u003e; bind production implementations via entry points\n(\u003ccode\u003emklang.tools\u003c/code\u003e / \u003ccode\u003emklang.hooks\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003eA stub \u003ccode\u003esend_reply\u003c/code\u003e is \u003cstrong\u003enot\u003c/strong\u003e delivery: live means \u003ccode\u003esent\u003c/code\u003e true \u003cstrong\u003eand\u003c/strong\u003e\n\u003ccode\u003estub\u003c/code\u003e false. Never ask the model to confirm a side effect.\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. Web, time, and knowledge cutoff\u003c/h2\u003e\u003ca id=\"user-content-6-web-time-and-knowledge-cutoff\" class=\"anchor\" aria-label=\"Permalink: 6. Web, time, and knowledge cutoff\" href=\"#6-web-time-and-knowledge-cutoff\"\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\"\u003eLive or news-like questions fail in predictable ways if the machine relies on\nmodel training data:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eUse \u003ccode\u003etool: search\u003c/code\u003e\u003c/strong\u003e — ready-made as the \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/reference/stdlib.md\"\u003e\u003ccode\u003estd_research\u003c/code\u003e\u003c/a\u003e\nstdlib machine; never “search the web” only in prose.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDeclare \u003ccode\u003etoday: \"\"\u003c/code\u003e\u003c/strong\u003e (and \u003cstrong\u003e\u003ccode\u003enow: \"\"\u003c/code\u003e\u003c/strong\u003e for wall-clock) and prompt with\n\u003ccode\u003eToday is {{today}}\u003c/code\u003e / \u003ccode\u003eCurrent local time is {{now}}\u003c/code\u003e — the host fill\nconvention and key table are in \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/patterns.md\"\u003ePatterns\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGround finalize in notes only\u003c/strong\u003e (titles/URLs/\u003ccode\u003epublished_date\u003c/code\u003e); explicitly\nforbid filling gaps from pre-training; when the stub says search is unbound,\nsay so — do not fabricate hits.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eLanguage note:\u003c/strong\u003e there is no primitive that “disables knowledge cutoff.”\nDiscipline is host clock + tools + prose + gates.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e7. Output cutoff and context budgets (anti-cutoff)\u003c/h2\u003e\u003ca id=\"user-content-7-output-cutoff-and-context-budgets-anti-cutoff\" class=\"anchor\" aria-label=\"Permalink: 7. Output cutoff and context budgets (anti-cutoff)\" href=\"#7-output-cutoff-and-context-budgets-anti-cutoff\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eA produce that hits its length stop is marked \u003ccode\u003etruncated: true\u003c/code\u003e in trace and\nevents (ADR 0018). Default policy \u003ccode\u003ereport\u003c/code\u003e continues with partial text — never\ntreat a partial finalize as complete; use \u003ccode\u003e--on-truncate halt\u003c/code\u003e for strict runs.\u003c/li\u003e\n\u003cli\u003eInterpolation budgets end long values with \u003ccode\u003e…[truncated]\u003c/code\u003e (ADR 0017);\ncompress notes before the next loop (\u003ccode\u003eresearch_compress.mkl\u003c/code\u003e), and put\ncritical facts in \u003cstrong\u003estate output\u003c/strong\u003e, not only deep context.\u003c/li\u003e\n\u003cli\u003eThe full tuning detail (\u003ccode\u003eparse: list\u003c/code\u003e halts on truncation, judge CONTEXT\ncaps, console observation fields) is in \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/patterns.md\"\u003ePatterns\u003c/a\u003e.\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\"\u003e8. Memory and composition\u003c/h2\u003e\u003ca id=\"user-content-8-memory-and-composition\" class=\"anchor\" aria-label=\"Permalink: 8. Memory and composition\" href=\"#8-memory-and-composition\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSituation\u003c/th\u003e\n\u003cth\u003ePractice\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eGrowing \u003ccode\u003eaccumulate\u003c/code\u003e lists\u003c/td\u003e\n\u003ctd\u003eExplicit \u003cstrong\u003ecompress\u003c/strong\u003e generative state; do not rely on silent host summary\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePlan → map\u003c/td\u003e\n\u003ctd\u003ePlanner uses \u003ccode\u003eparse: list\u003c/code\u003e; executor \u003ccode\u003eover: \"{{steps}}\"\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePass lists into \u003ccode\u003ecall\u003c/code\u003e/\u003ccode\u003etool\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eWhole-template \u003ccode\u003einput: { x: \"{{list}}\" }\u003c/code\u003e (0.3 raw resolution)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eReuse architecture\u003c/td\u003e\n\u003ctd\u003ePrefer \u003cstrong\u003e\u003ccode\u003estd_*\u003c/code\u003e\u003c/strong\u003e (\u003ccode\u003ecall: std_refine\u003c/code\u003e, …) over copy-paste\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHost-dependent patterns\u003c/td\u003e\n\u003ctd\u003eReAct / router / hooks stay authored examples, not pure stdlib\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e9. Budgets and cost\u003c/h2\u003e\u003ca id=\"user-content-9-budgets-and-cost\" class=\"anchor\" aria-label=\"Permalink: 9. Budgets and cost\" href=\"#9-budgets-and-cost\"\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\u003ccode\u003ebudget\u003c/code\u003e is steps, \u003ccode\u003e--max-tokens\u003c/code\u003e / \u003ccode\u003ecost_budget\u003c/code\u003e is spend (shared with \u003ccode\u003ecall\u003c/code\u003e\nchildren, partitioned across fan-out). Size the step budget to the worst case —\nloops, repair headroom, fan-out width — and let \u003ccode\u003emklang check\u003c/code\u003e reject the\ninfeasible ones. The sizing rules and the fan-out arithmetic are in\n\u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/patterns.md\"\u003ePatterns\u003c/a\u003e; the normative semantics in SPEC §7.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e10. Testing and CI\u003c/h2\u003e\u003ca id=\"user-content-10-testing-and-ci\" class=\"anchor\" aria-label=\"Permalink: 10. Testing and CI\" href=\"#10-testing-and-ci\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eLayer\u003c/th\u003e\n\u003cth\u003eCommand\u003c/th\u003e\n\u003cth\u003eRole\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eSchema + semantics\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emklang check\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eBlocking shape/graph\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eStatic smells\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emklang lint\u003c/code\u003e (\u003ccode\u003e--strict\u003c/code\u003e in CI)\u003c/td\u003e\n\u003ctd\u003eTypos, dead gates, missing catch-alls\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eProse gate overlap\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emklang lint --llm\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAdvisory only\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePath pinning\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003emklang test … --script …\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eNo API keys; escape hatches\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLanguage contract\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003epytest\u003c/code\u003e + \u003ccode\u003econformance/\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eInterpreter semantics\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLive smoke\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eMKLANG_LIVE=1 pytest tests/test_live.py\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eOpt-in providers\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eKeep \u003ccode\u003emachine.test.yaml\u003c/code\u003e beside the machine. Cover escalate, repair exhaustion, empty tool results, and search-unbound paths for web machines.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eStatic checks are not behavioural correctness.\u003c/strong\u003e \u003ccode\u003echeck\u003c/code\u003e and \u003ccode\u003elint\u003c/code\u003e prove a\nmachine is \u003cem\u003ewell-formed\u003c/em\u003e, not that it \u003cem\u003edoes the right thing\u003c/em\u003e — only a scenario\nrun exercises behaviour. This gap matters most for agent-authored machines\n(console / MCP, ADR 0015): freeze a hand-written \u003ccode\u003e*.test.yaml\u003c/code\u003e acceptance\nscenario before trusting one. Treat “check-clean” as a precondition for\ntesting, not a substitute.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eConsole vs MCP authoring.\u003c/strong\u003e The console can \u003ccode\u003ewrite_machine\u003c/code\u003e into a workspace\n(with human overwrite consent); MCP has no persist tool (§11) — headless hosts\nauthor and run inline. The console's authoring turn shares one step budget\nacross discover/run/author/repair/reply, so prefer tight authoring contracts\nover lengthening the loop.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e\u003ccode\u003eescalate\u003c/code\u003e is control-flow-critical.\u003c/strong\u003e Prose escalate gates are\nnon-deterministic under provider and repeats; for production\npage/approve/legal paths prefer \u003cstrong\u003e\u003ccode\u003e--hitl\u003c/code\u003e\u003c/strong\u003e or a \u003cstrong\u003ecode-hook gate\u003c/strong\u003e, and keep\nprose escalate for soft routing where an occasional mis-route is acceptable.\n\u003ccode\u003emklang lint\u003c/code\u003e emits an advisory \u003ccode\u003enote:\u003c/code\u003e on machines that use escalate.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e11. Security (SPEC §11) — operational minimum\u003c/h2\u003e\u003ca id=\"user-content-11-security-spec-11--operational-minimum\" class=\"anchor\" aria-label=\"Permalink: 11. Security (SPEC §11) — operational minimum\" href=\"#11-security-spec-11--operational-minimum\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eCustomer text, web snippets, workspace files, and tool observations are\n\u003cstrong\u003einjection-capable\u003c/strong\u003e: they may be evidence, never new system policy,\ncapability grants, budgets, or registry definitions.\u003c/li\u003e\n\u003cli\u003eTainted interpolations and the judge's OUTPUT/REASONING/CONTEXT are\n\u003cstrong\u003eautomatically fenced\u003c/strong\u003e (\u003ccode\u003e\u0026lt;data-NONCE\u0026gt;\u003c/code\u003e, SPEC §6 / ADR 0025). Fencing\nprevents \u003cem\u003econfusion\u003c/em\u003e, not \u003cem\u003epersuasion\u003c/em\u003e — the next bullet still applies.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eControl-flow taint\u003c/strong\u003e (SPEC §6 / ADR 0030): run production paths with\n\u003ccode\u003e--untrusted-flow halt\u003c/code\u003e (equivalents on \u003ccode\u003erun(...)\u003c/code\u003e, MCP, and the console) and\nclassify your own tools with \u003ccode\u003etool_effects=\u003c/code\u003e — an unclassified tool counts as\neffectful. The fix for a finding is a \u003cstrong\u003e\u003ccode\u003ehook:\u003c/code\u003e gate or a fresh HITL\nconfirmation for that suspension\u003c/strong\u003e, not a better prompt; a stale\n\u003ccode\u003ehuman.reply\u003c/code\u003e in the blackboard does not confirm a later decision.\u003c/li\u003e\n\u003cli\u003eCheckpoints hold the \u003cstrong\u003efull blackboard in plaintext\u003c/strong\u003e (mode \u003ccode\u003e0600\u003c/code\u003e is a\nfloor, not encryption) — mind PII retention. No secrets in \u003ccode\u003e.mkl\u003c/code\u003e or\ncontext; keys stay in host env / \u003ccode\u003e.env\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eMCP is \u003cstrong\u003eread-only to disk by design\u003c/strong\u003e — no persist/write tool (ADR\n0011/0013; the only disk write is an explicit per-call \u003ccode\u003echeckpoint_path\u003c/code\u003e).\nThe console's interactive guard model does not transfer to headless hosts.\u003c/li\u003e\n\u003cli\u003eProduction hosts set \u003ccode\u003eMKLANG_ALLOWED_PLUGINS=name1,name2\u003c/code\u003e to allowlist\nentry-point plugins; audit records redact credential-shaped values and never\ncontain full prompts or keys at default log levels.\u003c/li\u003e\n\u003cli\u003eConsole tool \u003cstrong\u003econsent\u003c/strong\u003e is once per workspace-scoped session; \u003ccode\u003ealways yes\u003c/code\u003e\nis an explicit operator choice for low-risk prompts only — high-risk prompts\n(egress, writes, irreversible, unknown tools) are always shown again\n(\u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/console.md#security-model\"\u003econsole\u003c/a\u003e).\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\"\u003e12. Observability: trace vs events vs process logging\u003c/h2\u003e\u003ca id=\"user-content-12-observability-trace-vs-events-vs-process-logging\" class=\"anchor\" aria-label=\"Permalink: 12. Observability: trace vs events vs process logging\" href=\"#12-observability-trace-vs-events-vs-process-logging\"\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\"\u003eThree channels — do not merge them into one API.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eChannel\u003c/th\u003e\n\u003cth\u003ePurpose\u003c/th\u003e\n\u003cth\u003eConsumer\u003c/th\u003e\n\u003cth\u003ePersistence\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eRun trace\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eSemantic record: state, gate, policy, tokens, \u003ccode\u003etruncated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAuthors, tests, checkpoints\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eRunResult.trace\u003c/code\u003e, checkpoint JSON\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eLive events\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eIn-flight progress (\u003ccode\u003eon_event\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eConsole activity tree; MCP \u003ccode\u003emklang.event\u003c/code\u003e (ADR 0019)\u003c/td\u003e\n\u003ctd\u003eEphemeral; console may append to \u003ccode\u003etranscript.jsonl\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eProcess / ops logging\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eHost diagnostics: adapter HTTP, retries, config, plugin errors\u003c/td\u003e\n\u003ctd\u003eOperators, developers\u003c/td\u003e\n\u003ctd\u003estderr / host log file / future OTel\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRules\u003c/h3\u003e\u003ca id=\"user-content-rules\" class=\"anchor\" aria-label=\"Permalink: Rules\" href=\"#rules\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eTrace is the source of truth\u003c/strong\u003e for “what the machine did.” Events are a live\nshadow of the same story, not a second semantic model (ADR 0019).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOps logging is host-only\u003c/strong\u003e — never a face of the \u003ccode\u003e.mkl\u003c/code\u003e, never deposited on\nthe blackboard as “memory,” never a gate condition.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNo \u003ccode\u003etool: log\u003c/code\u003e in core.\u003c/strong\u003e Business audit that must be a side effect is a\nnamed host tool with ADR 0020 envelope + consent — not free-form logging.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eObserver isolation.\u003c/strong\u003e A failing log sink or event listener must not abort\nthe run (same rule as \u003ccode\u003eon_event\u003c/code\u003e / MCP forwarder).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSecrets.\u003c/strong\u003e Never log API keys. Prefer no full produce/judge bodies at\ndefault levels; DEBUG only when explicitly enabled.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLevels.\u003c/strong\u003e The host logs on the \u003ccode\u003emklang.*\u003c/code\u003e hierarchy (\u003ccode\u003emklang.registry\u003c/code\u003e,\n\u003ccode\u003emklang.fs\u003c/code\u003e, \u003ccode\u003emklang.cli\u003c/code\u003e, …) to stderr — \u003ccode\u003e--log-level\u003c/code\u003e or\n\u003ccode\u003eMKLANG_LOG_LEVEL\u003c/code\u003e, default \u003ccode\u003ewarning\u003c/code\u003e, format \u003ccode\u003eLEVEL name: message\u003c/code\u003e (no\ntimestamps; journald/CI add their own). \u003ccode\u003eDEBUG\u003c/code\u003e adapters/raw HTTP; \u003ccode\u003eINFO\u003c/code\u003e\ncoarse host lifecycle (e.g. the fs audit lines); \u003ccode\u003eWARNING\u003c/code\u003e plugin-load\nfailures, stub tools, truncation, \u003ccode\u003ejudge_fallback\u003c/code\u003e; \u003ccode\u003eERROR\u003c/code\u003e halts. Do\n\u003cstrong\u003enot\u003c/strong\u003e INFO-log every state (events already cover that).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eConsole separation.\u003c/strong\u003e Conversation pane ≠ ops log. UI stays Rich/Markdown;\ndiagnostics go to stderr or a host log path.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMCP.\u003c/strong\u003e Keep \u003ccode\u003emklang.event\u003c/code\u003e for run vocabulary only. Host stack traces use a\ndifferent logger name (e.g. \u003ccode\u003emklang.host\u003c/code\u003e), not the event stream.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOTel (optional, later).\u003c/strong\u003e Spans are a \u003cstrong\u003eprojection\u003c/strong\u003e of the trace for\nplatforms; they do not replace \u003ccode\u003eRunResult.trace\u003c/code\u003e (\u003ca href=\"/gianlucamazza/mklang/blob/main/ROADMAP.md\"\u003eROADMAP\u003c/a\u003e).\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAnti-patterns\u003c/h3\u003e\u003ca id=\"user-content-anti-patterns\" class=\"anchor\" aria-label=\"Permalink: Anti-patterns\" href=\"#anti-patterns\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eprint()\u003c/code\u003e in the engine; log-spam every token at INFO.\u003c/li\u003e\n\u003cli\u003ePutting log lines or file tails into context so gates “read the log.”\u003c/li\u003e\n\u003cli\u003eOverloading MCP logging notifications with host debug (breaks clients that\ntreat \u003ccode\u003emklang.event\u003c/code\u003e as the run UI feed).\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\"\u003e13. Filesystem: four classes, not one tool\u003c/h2\u003e\u003ca id=\"user-content-13-filesystem-four-classes-not-one-tool\" class=\"anchor\" aria-label=\"Permalink: 13. Filesystem: four classes, not one tool\" href=\"#13-filesystem-four-classes-not-one-tool\"\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\"\u003eGeneric bash/FS stay \u003cstrong\u003eout of core\u003c/strong\u003e. When you need disk, pick the class:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eClass\u003c/th\u003e\n\u003cth\u003eExamples\u003c/th\u003e\n\u003cth\u003eWhere it lives\u003c/th\u003e\n\u003cth\u003eControls\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003e1. Host-owned paths\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.yaml\u003c/code\u003e, checkpoints, console session dir\u003c/td\u003e\n\u003ctd\u003eCLI / host config\u003c/td\u003e\n\u003ctd\u003eOperator-chosen paths; checkpoint mode \u003ccode\u003e0600\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003e2. Workspace console\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003elist_workspace\u003c/code\u003e / \u003ccode\u003eread_workspace_file\u003c/code\u003e / \u003ccode\u003esearch_workspace\u003c/code\u003e (read-only) plus \u003ccode\u003ewrite_machine\u003c/code\u003e / \u003ccode\u003eread_machine\u003c/code\u003e (\u003ccode\u003e.mkl\u003c/code\u003e)\u003c/td\u003e\n\u003ctd\u003eConsole surface (ADR 0015)\u003c/td\u003e\n\u003ctd\u003eRoot defaults to the launch cwd and is injected as absolute \u003ccode\u003eworkspace_root\u003c/code\u003e; \u003ccode\u003e--workspace\u003c/code\u003e overrides it; relative paths; reject escape, hidden/build/vendor/sensitive paths; bounded file/byte budgets; report truncation; confirm \u003ccode\u003e.mkl\u003c/code\u003e overwrite; project machines live in \u003ccode\u003emachines/\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003e3. Machine data I/O\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eRead CSV, write a report\u003c/td\u003e\n\u003ctd\u003eBuiltins \u003ccode\u003emklang.fs\u003c/code\u003e (ADR 0024)\u003c/td\u003e\n\u003ctd\u003eWorkspace confinement, size/type limits, write grant, stub off-switch\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003e4. Arbitrary FS / shell\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003erm\u003c/code\u003e, bash, git\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eNever core\u003c/strong\u003e; explicit sandboxed plugin\u003c/td\u003e\n\u003ctd\u003eDefault off; high friction\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eThe current host-owned paths (XDG roots, system layer, config and machine\nresolution) are documented once, in \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/install.md#host-layout\"\u003eInstallation\u003c/a\u003e —\nADR 0021 records the decision history.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRules for class 3 (data tools)\u003c/h3\u003e\u003ca id=\"user-content-rules-for-class-3-data-tools\" class=\"anchor\" aria-label=\"Permalink: Rules for class 3 (data tools)\" href=\"#rules-for-class-3-data-tools\"\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\"\u003eImplemented by \u003ccode\u003emklang.fs\u003c/code\u003e (\u003ccode\u003elist_files\u003c/code\u003e / \u003ccode\u003eread_file\u003c/code\u003e / \u003ccode\u003ewrite_file\u003c/code\u003e —\ncontracts in the \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/reference/tools.md\"\u003etool reference\u003c/a\u003e; ADR 0024). The\nreference posture is the coding-tool workspace model: reads are live by default\nunder \u003ccode\u003e--workspace\u003c/code\u003e / \u003ccode\u003eMKLANG_FS_ROOT\u003c/code\u003e / cwd, disk writes need an explicit\ngrant (\u003ccode\u003e--allow-write\u003c/code\u003e / \u003ccode\u003eMKLANG_FS_WRITE=1\u003c/code\u003e / console consent).\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eNames only in the \u003ccode\u003e.mkl\u003c/code\u003e\u003c/strong\u003e — \u003ccode\u003etool: read_file\u003c/code\u003e, not path syntax in the language.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRelative paths in tool input\u003c/strong\u003e; host joins to the configured \u003cstrong\u003eworkspace\u003c/strong\u003e\nroot; \u003ccode\u003e..\u003c/code\u003e, absolute paths, and dotfile segments never resolve.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eADR 0020 envelope\u003c/strong\u003e — \u003ccode\u003e{tool, stub, error, …}\u003c/code\u003e; \u003ccode\u003eMKLANG_FS_BACKEND=stub\u003c/code\u003e\nforces the offline refusal tier.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFile bodies are untrusted observations\u003c/strong\u003e (§11) — never in the produce\nsystem channel.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNo recursive delete / shell in core.\u003c/strong\u003e Destructive ops only as explicit\nplugins with strong confirmation.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAudit lightly\u003c/strong\u003e — tool name + relative path + byte count at INFO; not\nfull file contents.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eConsole stays non-IDE\u003c/strong\u003e — read-only inspection plus \u003ccode\u003e.mkl\u003c/code\u003e authoring;\nno generic write, shell, or git tools.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLarge workspace analysis (ADR 0036)\u003c/h3\u003e\u003ca id=\"user-content-large-workspace-analysis-adr-0036\" class=\"anchor\" aria-label=\"Permalink: Large workspace analysis (ADR 0036)\" href=\"#large-workspace-analysis-adr-0036\"\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\"\u003eFor large projects, use the console's metadata-only workspace index as the\nstructural inventory and read file bodies only when they are relevant to the\nquestion. The index is persisted under the user state directory, is rebuilt\nincrementally from visible file metadata, and never stores file contents.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eTreat the index as a candidate map, not proof that a file was understood.\u003c/li\u003e\n\u003cli\u003eRank and read relevant files progressively; do not inject an entire tree into\none prompt.\u003c/li\u003e\n\u003cli\u003eReport indexed, read, skipped, and truncated counts in the evidence brief.\u003c/li\u003e\n\u003cli\u003eA truncated index or search makes the analysis partial; never call it complete.\u003c/li\u003e\n\u003cli\u003eKeep secrets, hidden paths, build/vendor/cache trees, binaries, and databases\noutside both the index and the model context.\u003c/li\u003e\n\u003cli\u003eRebuild or invalidate the index when the canonical workspace root changes or\nthe manifest version is incompatible.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMemory \u0026amp; planning mapping\u003c/h3\u003e\u003ca id=\"user-content-memory--planning-mapping\" class=\"anchor\" aria-label=\"Permalink: Memory \u0026amp; planning mapping\" href=\"#memory--planning-mapping\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe class model gives machines the same memory layering native coding agents\nuse: working memory is the blackboard (\u003ccode\u003econtext\u003c/code\u003e + \u003ccode\u003eaccumulate\u003c/code\u003e, never on\ndisk); session state is checkpoints and console \u003ccode\u003estate.json\u003c/code\u003e (class 1, outside\nthe workspace); project memory (\u003ccode\u003eAGENTS.md\u003c/code\u003e-style files) and plans/reports the\nmachine produces are non-dotted workspace files (classes 2/3, writes behind\nthe grant). Host state is unreachable from class-3 tools by construction — the\ndotfile ban makes the “session dir as data lake” anti-pattern structural.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAnti-patterns\u003c/h3\u003e\u003ca id=\"user-content-anti-patterns-1\" class=\"anchor\" aria-label=\"Permalink: Anti-patterns\" href=\"#anti-patterns-1\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eLanguage face \u003ccode\u003efile:\u003c/code\u003e / \u003ccode\u003e$path\u003c/code\u003e without ADR + conformance.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eexecution: write the result to disk\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eWidening \u003ccode\u003ewrite_machine\u003c/code\u003e to arbitrary extensions/paths.\u003c/li\u003e\n\u003cli\u003eUsing session/transcript directories as a machine “data lake.”\u003c/li\u003e\n\u003cli\u003eAbsolute paths from the model without canonicalize + root check.\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\"\u003e14. Surfaces quick reference\u003c/h2\u003e\u003ca id=\"user-content-14-surfaces-quick-reference\" class=\"anchor\" aria-label=\"Permalink: 14. Surfaces quick reference\" href=\"#14-surfaces-quick-reference\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eSurface\u003c/th\u003e\n\u003cth\u003eBest practice\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eCLI\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003einit\u003c/code\u003e once, \u003ccode\u003edoctor\u003c/code\u003e when in doubt, then \u003ccode\u003echeck\u003c/code\u003e → \u003ccode\u003elint\u003c/code\u003e → \u003ccode\u003etest\u003c/code\u003e → \u003ccode\u003erun\u003c/code\u003e; \u003ccode\u003e--on-truncate halt\u003c/code\u003e for strict research; \u003ccode\u003e--hitl\u003c/code\u003e for human gates (auto-checkpoints; \u003ccode\u003e--checkpoint\u003c/code\u003e to choose the path); ops log on stderr when enabled\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eMCP\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003eCommission by name/path/source; stream \u003cstrong\u003erun\u003c/strong\u003e events as \u003ccode\u003emklang.event\u003c/code\u003e only; durable \u003ccode\u003echeckpoint_path\u003c/code\u003e for multi-process HITL; \u003cstrong\u003eread-only to disk\u003c/strong\u003e — author/validate/run inline, no persist tool (§11, ADR 0011/0013)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eLibrary / embed\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003ePrefer \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/host-embedding.md\"\u003e\u003ccode\u003ehost-embedding\u003c/code\u003e\u003c/a\u003e: \u003ccode\u003eprepare_*\u003c/code\u003e → \u003ccode\u003erun\u003c/code\u003e → \u003ccode\u003ebuild_output\u003c/code\u003e; map \u003ccode\u003edone\u003c/code\u003e/\u003ccode\u003esuspended\u003c/code\u003e/\u003ccode\u003ehalt\u003c/code\u003e; validate against \u003ca href=\"/gianlucamazza/mklang/blob/main/schema/run-result.schema.json\"\u003e\u003ccode\u003erun-result.schema.json\u003c/code\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cstrong\u003eConsole\u003c/strong\u003e\u003c/td\u003e\n\u003ctd\u003ePrefer RUN of workspace/search machines for live facts; honor truncation fields; enable Tavily for web; workspace inspection is read-only and \u003ccode\u003e.mkl\u003c/code\u003e authoring is the only write path — the full contract, including cancellation and shutdown, is the \u003ca href=\"/gianlucamazza/mklang/blob/main/docs/guides/console.md\"\u003eConsole guide\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e15. Language vs host: what may become language later\u003c/h2\u003e\u003ca id=\"user-content-15-language-vs-host-what-may-become-language-later\" class=\"anchor\" aria-label=\"Permalink: 15. Language vs host: what may become language later\" href=\"#15-language-vs-host-what-may-become-language-later\"\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\"\u003eCandidates for a future spec revision (need ADR + conformance) — \u003cstrong\u003enot\u003c/strong\u003e current practice requirements:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCandidate\u003c/th\u003e\n\u003cth\u003eWhy it might become language\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cdel\u003e\u003ccode\u003eparse: json\u003c/code\u003e\u003c/del\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cstrong\u003eShipped in 0.4\u003c/strong\u003e (ADR 0034) — object-shaped composition is \u003ccode\u003estructure\u003c/code\u003e + gates\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMachine/state \u003ccode\u003eon_truncate\u003c/code\u003e policy\u003c/td\u003e\n\u003ctd\u003ePortable anti-cutoff in the document\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eContext zones / pin (ADR 0017 L2)\u003c/td\u003e\n\u003ctd\u003eAuthorable trust zones — runtime provenance taint already ships (ADR 0025)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003ePer-gate \u003ccode\u003ehitl:\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eFiner HITL than run-level\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBudget split (steps vs fan-out width)\u003c/td\u003e\n\u003ctd\u003eClearer volume caps\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eUntil then: use \u003cstrong\u003ehost policy + patterns + this checklist\u003c/strong\u003e. Do \u003cstrong\u003enot\u003c/strong\u003e invent ad-hoc syntax outside the schema.\u003c/p\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"Best practices","fully_qualified_name":"Best practices","kind":"section_1","ident_start":2,"ident_end":16,"extent_start":0,"extent_end":27685,"ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":16}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":389,"utf16_col":0}}},{"name":"1. Layer discipline (do not mix layers)","fully_qualified_name":"1. Layer discipline (do not mix layers)","kind":"section_2","ident_start":474,"ident_end":513,"extent_start":471,"extent_end":2462,"ident_utf16":{"start":{"line_number":12,"utf16_col":3},"end":{"line_number":12,"utf16_col":42}},"extent_utf16":{"start":{"line_number":12,"utf16_col":0},"end":{"line_number":29,"utf16_col":0}}},{"name":"2. Authoring checklist (every machine)","fully_qualified_name":"2. Authoring checklist (every machine)","kind":"section_2","ident_start":2465,"ident_end":2503,"extent_start":2462,"extent_end":3632,"ident_utf16":{"start":{"line_number":29,"utf16_col":3},"end":{"line_number":29,"utf16_col":41}},"extent_utf16":{"start":{"line_number":29,"utf16_col":0},"end":{"line_number":48,"utf16_col":0}}},{"name":"3. Prompt assembly (system vs user)","fully_qualified_name":"3. Prompt assembly (system vs user)","kind":"section_2","ident_start":3635,"ident_end":3670,"extent_start":3632,"extent_end":6070,"ident_utf16":{"start":{"line_number":48,"utf16_col":3},"end":{"line_number":48,"utf16_col":38}},"extent_utf16":{"start":{"line_number":48,"utf16_col":0},"end":{"line_number":85,"utf16_col":0}}},{"name":"4. Gates and reliability","fully_qualified_name":"4. Gates and reliability","kind":"section_2","ident_start":6073,"ident_end":6097,"extent_start":6070,"extent_end":8171,"ident_utf16":{"start":{"line_number":85,"utf16_col":3},"end":{"line_number":85,"utf16_col":27}},"extent_utf16":{"start":{"line_number":85,"utf16_col":0},"end":{"line_number":110,"utf16_col":0}}},{"name":"5. Tools (host contracts)","fully_qualified_name":"5. Tools (host contracts)","kind":"section_2","ident_start":8174,"ident_end":8199,"extent_start":8171,"extent_end":8962,"ident_utf16":{"start":{"line_number":110,"utf16_col":3},"end":{"line_number":110,"utf16_col":28}},"extent_utf16":{"start":{"line_number":110,"utf16_col":0},"end":{"line_number":128,"utf16_col":0}}},{"name":"6. Web, time, and knowledge cutoff","fully_qualified_name":"6. Web, time, and knowledge cutoff","kind":"section_2","ident_start":8965,"ident_end":8999,"extent_start":8962,"extent_end":9790,"ident_utf16":{"start":{"line_number":128,"utf16_col":3},"end":{"line_number":128,"utf16_col":37}},"extent_utf16":{"start":{"line_number":128,"utf16_col":0},"end":{"line_number":147,"utf16_col":0}}},{"name":"7. Output cutoff and context budgets (anti-cutoff)","fully_qualified_name":"7. Output cutoff and context budgets (anti-cutoff)","kind":"section_2","ident_start":9793,"ident_end":9843,"extent_start":9790,"extent_end":10445,"ident_utf16":{"start":{"line_number":147,"utf16_col":3},"end":{"line_number":147,"utf16_col":53}},"extent_utf16":{"start":{"line_number":147,"utf16_col":0},"end":{"line_number":160,"utf16_col":0}}},{"name":"8. Memory and composition","fully_qualified_name":"8. Memory and composition","kind":"section_2","ident_start":10448,"ident_end":10473,"extent_start":10445,"extent_end":11262,"ident_utf16":{"start":{"line_number":160,"utf16_col":3},"end":{"line_number":160,"utf16_col":28}},"extent_utf16":{"start":{"line_number":160,"utf16_col":0},"end":{"line_number":172,"utf16_col":0}}},{"name":"9. Budgets and cost","fully_qualified_name":"9. Budgets and cost","kind":"section_2","ident_start":11265,"ident_end":11284,"extent_start":11262,"extent_end":11659,"ident_utf16":{"start":{"line_number":172,"utf16_col":3},"end":{"line_number":172,"utf16_col":22}},"extent_utf16":{"start":{"line_number":172,"utf16_col":0},"end":{"line_number":182,"utf16_col":0}}},{"name":"10. Testing and CI","fully_qualified_name":"10. Testing and CI","kind":"section_2","ident_start":11662,"ident_end":11680,"extent_start":11659,"extent_end":13800,"ident_utf16":{"start":{"line_number":182,"utf16_col":3},"end":{"line_number":182,"utf16_col":21}},"extent_utf16":{"start":{"line_number":182,"utf16_col":0},"end":{"line_number":216,"utf16_col":0}}},{"name":"11. Security (SPEC §11) — operational minimum","fully_qualified_name":"11. Security (SPEC §11) — operational minimum","kind":"section_2","ident_start":13803,"ident_end":13851,"extent_start":13800,"extent_end":15617,"ident_utf16":{"start":{"line_number":216,"utf16_col":3},"end":{"line_number":216,"utf16_col":48}},"extent_utf16":{"start":{"line_number":216,"utf16_col":0},"end":{"line_number":246,"utf16_col":0}}},{"name":"12. Observability: trace vs events vs process logging","fully_qualified_name":"12. Observability: trace vs events vs process logging","kind":"section_2","ident_start":15620,"ident_end":15673,"extent_start":15617,"extent_end":18697,"ident_utf16":{"start":{"line_number":246,"utf16_col":3},"end":{"line_number":246,"utf16_col":56}},"extent_utf16":{"start":{"line_number":246,"utf16_col":0},"end":{"line_number":291,"utf16_col":0}}},{"name":"Rules","fully_qualified_name":"Rules","kind":"section_3","ident_start":16752,"ident_end":16757,"extent_start":16748,"extent_end":18418,"ident_utf16":{"start":{"line_number":256,"utf16_col":4},"end":{"line_number":256,"utf16_col":9}},"extent_utf16":{"start":{"line_number":256,"utf16_col":0},"end":{"line_number":282,"utf16_col":0}}},{"name":"Anti-patterns","fully_qualified_name":"Anti-patterns","kind":"section_3","ident_start":18422,"ident_end":18435,"extent_start":18418,"extent_end":18697,"ident_utf16":{"start":{"line_number":282,"utf16_col":4},"end":{"line_number":282,"utf16_col":17}},"extent_utf16":{"start":{"line_number":282,"utf16_col":0},"end":{"line_number":291,"utf16_col":0}}},{"name":"13. Filesystem: four classes, not one tool","fully_qualified_name":"13. Filesystem: four classes, not one tool","kind":"section_2","ident_start":18700,"ident_end":18742,"extent_start":18697,"extent_end":24923,"ident_utf16":{"start":{"line_number":291,"utf16_col":3},"end":{"line_number":291,"utf16_col":45}},"extent_utf16":{"start":{"line_number":291,"utf16_col":0},"end":{"line_number":365,"utf16_col":0}}},{"name":"Rules for class 3 (data tools)","fully_qualified_name":"Rules for class 3 (data tools)","kind":"section_3","ident_start":21921,"ident_end":21951,"extent_start":21917,"extent_end":23105,"ident_utf16":{"start":{"line_number":306,"utf16_col":4},"end":{"line_number":306,"utf16_col":34}},"extent_utf16":{"start":{"line_number":306,"utf16_col":0},"end":{"line_number":328,"utf16_col":0}}},{"name":"Large workspace analysis (ADR 0036)","fully_qualified_name":"Large workspace analysis (ADR 0036)","kind":"section_3","ident_start":23109,"ident_end":23144,"extent_start":23105,"extent_end":24026,"ident_utf16":{"start":{"line_number":328,"utf16_col":4},"end":{"line_number":328,"utf16_col":39}},"extent_utf16":{"start":{"line_number":328,"utf16_col":0},"end":{"line_number":345,"utf16_col":0}}},{"name":"Memory \u0026 planning mapping","fully_qualified_name":"Memory \u0026 planning mapping","kind":"section_3","ident_start":24030,"ident_end":24055,"extent_start":24026,"extent_end":24602,"ident_utf16":{"start":{"line_number":345,"utf16_col":4},"end":{"line_number":345,"utf16_col":29}},"extent_utf16":{"start":{"line_number":345,"utf16_col":0},"end":{"line_number":355,"utf16_col":0}}},{"name":"Anti-patterns","fully_qualified_name":"Anti-patterns","kind":"section_3","ident_start":24606,"ident_end":24619,"extent_start":24602,"extent_end":24923,"ident_utf16":{"start":{"line_number":355,"utf16_col":4},"end":{"line_number":355,"utf16_col":17}},"extent_utf16":{"start":{"line_number":355,"utf16_col":0},"end":{"line_number":365,"utf16_col":0}}},{"name":"14. Surfaces quick reference","fully_qualified_name":"14. Surfaces quick reference","kind":"section_2","ident_start":24926,"ident_end":24954,"extent_start":24923,"extent_end":26564,"ident_utf16":{"start":{"line_number":365,"utf16_col":3},"end":{"line_number":365,"utf16_col":31}},"extent_utf16":{"start":{"line_number":365,"utf16_col":0},"end":{"line_number":376,"utf16_col":0}}},{"name":"15. Language vs host: what may become language later","fully_qualified_name":"15. Language vs host: what may become language later","kind":"section_2","ident_start":26567,"ident_end":26619,"extent_start":26564,"extent_end":27685,"ident_utf16":{"start":{"line_number":376,"utf16_col":3},"end":{"line_number":376,"utf16_col":55}},"extent_utf16":{"start":{"line_number":376,"utf16_col":0},"end":{"line_number":389,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":1302812422,"defaultBranch":"main","name":"mklang","ownerLogin":"gianlucamazza","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2026-07-16T13:24:16.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/25006045?v=4","public":true,"private":false,"isOrgOwned":false,"isArchived":false},"currentUser":null,"uploadToken":"v2wQ6crGnX0x4clOKHDzrdp7BMKCxvGec1lQTu1H-ibW6RF3SK1dOtO2ORC8mVE5pAGTXiQSHaO5fZ1wG3y_fQ","allShortcutsEnabled":false,"treeExpanded":true,"path":"docs/guides/best-practices.md","symbolsExpanded":false,"refInfo":{"name":"main","listCacheKey":"v0:1791632091.0","canEdit":false,"currentOid":"bc68a2233a673d88f905e37008d5fc024f260cfc"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"docs/guides":{"items":[{"name":"authoring.md","path":"docs/guides/authoring.md","contentType":"file"},{"name":"best-practices.md","path":"docs/guides/best-practices.md","contentType":"file"},{"name":"console.md","path":"docs/guides/console.md","contentType":"file"},{"name":"first-machine.md","path":"docs/guides/first-machine.md","contentType":"file"},{"name":"getting-started.md","path":"docs/guides/getting-started.md","contentType":"file"},{"name":"host-embedding.md","path":"docs/guides/host-embedding.md","contentType":"file"},{"name":"install.md","path":"docs/guides/install.md","contentType":"file"},{"name":"jev-noul-judge.md","path":"docs/guides/jev-noul-judge.md","contentType":"file"},{"name":"patterns.md","path":"docs/guides/patterns.md","contentType":"file"},{"name":"plugins.md","path":"docs/guides/plugins.md","contentType":"file"},{"name":"stability.md","path":"docs/guides/stability.md","contentType":"file"}],"totalCount":11},"docs":{"items":[{"name":"adr","path":"docs/adr","contentType":"directory"},{"name":"assets","path":"docs/assets","contentType":"directory"},{"name":"experiments","path":"docs/experiments","contentType":"directory"},{"name":"guides","path":"docs/guides","contentType":"directory"},{"name":"reference","path":"docs/reference","contentType":"directory"},{"name":"cover.jpg","path":"docs/cover.jpg","contentType":"file"},{"name":"demos.md","path":"docs/demos.md","contentType":"file"},{"name":"social.jpg","path":"docs/social.jpg","contentType":"file"},{"name":"what-mklang-is.md","path":"docs/what-mklang-is.md","contentType":"file"}],"totalCount":9},"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"config","path":"config","contentType":"directory"},{"name":"conformance","path":"conformance","contentType":"directory"},{"name":"demos","path":"demos","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"evidence","path":"evidence","contentType":"directory"},{"name":"examples","path":"examples","contentType":"directory"},{"name":"machines","path":"machines","contentType":"directory"},{"name":"packaging","path":"packaging","contentType":"directory"},{"name":"schema","path":"schema","contentType":"directory"},{"name":"scripts","path":"scripts","contentType":"directory"},{"name":"spaces","path":"spaces","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":"tests","path":"tests","contentType":"directory"},{"name":".editorconfig","path":".editorconfig","contentType":"file"},{"name":".env.example","path":".env.example","contentType":"file"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".pre-commit-config.yaml","path":".pre-commit-config.yaml","contentType":"file"},{"name":"CHANGELOG.md","path":"CHANGELOG.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"ROADMAP.md","path":"ROADMAP.md","contentType":"file"},{"name":"SECURITY.md","path":"SECURITY.md","contentType":"file"},{"name":"SPEC.md","path":"SPEC.md","contentType":"file"},{"name":"mkdocs.yml","path":"mkdocs.yml","contentType":"file"},{"name":"pyproject.toml","path":"pyproject.toml","contentType":"file"},{"name":"uv.lock","path":"uv.lock","contentType":"file"}],"totalCount":29}},"fileTreeProcessingTime":79.618927,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"main","listCacheKey":"v0:1791632091.0","canEdit":false,"refType":"branch","currentOid":"bc68a2233a673d88f905e37008d5fc024f260cfc","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"docs/guides/best-practices.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/gianlucamazza/mklang/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"best-practices.md","displayUrl":"https://github.com/gianlucamazza/mklang/blob/main/docs/guides/best-practices.md?raw=true","headerInfo":{"blobSize":"27 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":"2d8f16b","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fgianlucamazza%2Fmklang%2Fblob%2Fmain%2Fdocs%2Fguides%2Fbest-practices.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"389","truncatedSloc":"304"},"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":"/gianlucamazza/mklang/blob/main/docs/guides/best-practices.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/gianlucamazza/mklang/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/gianlucamazza/mklang/raw/refs/heads/main/docs/guides/best-practices.md","renderImageOrRaw":false,"shortPath":null,"symbolsEnabled":true,"tabSize":2,"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":["# Best practices","","Canonical checklist for writing, running, and hosting mklang machines.","**How to author a correct file:** [Authoring](authoring.md).  ","**How to tune reliability and cost:** [Patterns](patterns.md).  ","**Host tool contracts:** [Tool reference](../reference/tools.md).  ","**What the language guarantees:** [SPEC](../../SPEC.md) (cookbook §10, threat model §11).","","This page answers: _what should I always do, never do, and where does each rule live?_","","---","","## 1. Layer discipline (do not mix layers)","","| Layer                 | Owns                                                                                                                                  | Examples                                                                                                                         |","| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |","| **Language (`.mkl`)** | Control flow, prose contracts, portable structure                                                                                     | states, gates, tiers, `tool:` _names_, `parse: list`                                                                             |","| **Host runtime**      | Bindings, budgets, clocks, truncation _policy_, LLM adapters, produce/judge prompt assembly, **ops logging**, FS data roots for tools | `tools={…}`, hooks, `on_truncate`, `context.today` / `now` fill, `llm/prompts.py`, process loggers, plugin FS tools              |","| **Surface**           | UX, consent, compact observations, chrome vs content rendering, session audit                                                         | CLI flags, MCP tools, console brain, Markdown log, transcript/session paths, read-only workspace inspection and `.mkl` authoring |","","**Rules**","","- Side effects live only in **`tool:` states** (host callables). Never in `execution` or generative prompts.","- The `.mkl` **never** names a provider or model — only `tier:` (ADR 0003).","- Host tools are **opaque names** + `(dict) → str`. Do not promote search/bash/FS into language syntax.","- Generic **bash / filesystem** stay **out of core** (console: bounded read-only workspace inspection plus `.mkl` authoring; production I/O = plugins or external host).","","---","","## 2. Authoring checklist (every machine)","","Before shipping a `.mkl`:","","- [ ] Schema header + `mklang: \"0.4\"` when using post-0.2 faces (`parse: list`, `parse: json`, `max_visits`, …).","- [ ] Every non-terminal state ends with **`when: otherwise`** (last).","- [ ] At least one path reaches **`END`**; `budget` ≥ shortest path (+ headroom).","- [ ] Every `{{path}}` root is `context:`, a state `output:`, HITL `human.*`, or fan-out `item`/`index`.","- [ ] Exact policy (amounts, allowlists, formats) uses **`hook:`**, not prose alone.","- [ ] Real I/O uses **`tool:`** + top-level `tools:` declarations for documentation.","- [ ] Time-sensitive machines declare **`today: \"\"`** (and **`now: \"\"`** for wall-clock) in `context:` and use `Today is {{today}}` / `Current local time is {{now}}` in prompts.","- [ ] Irreversible actions sit behind **`escalate`** (and HITL in production).","- [ ] `mklang check` clean; `mklang lint` clean (use `--strict` in CI).","- [ ] Scenario tests cover happy path **and** escape hatches (`mklang test`).","- [ ] Sticky policy lives in **`execution`** (system channel); turn data and","      `{{…}}` live in **`prompt`** (user channel) — see §3.","","---","","## 3. Prompt assembly (system vs user)","","The reference interpreter builds LLM calls from language faces. There is **no**","`system:` keyword in the language. Map faces to channels:","","| Face / artifact     | LLM channel          | Interpolated?   | Put here                                                                        |","| ------------------- | -------------------- | --------------- | ------------------------------------------------------------------------------- |","| `structure`         | **system** (produce) | No              | Output contract / shape for this state                                          |","| `execution`         | **system** (produce) | No              | Sticky operational policy (never side effects)                                  |","| `prompt`            | **user** (produce)   | **Yes** `{{…}}` | This turn’s task + data — tainted values arrive `\u003cdata-NONCE\u003e`-fenced (SPEC §6) |","| `when:` conditions  | judge **user**       | No (prose)      | Gate selection only — stay bare (author-trusted)                                |","| Host `JUDGE_SYSTEM` | judge **system**     | fixed           | Choice protocol `{\"choice\": n}` — not authorable                                |","","The judge user payload always presents OUTPUT / REASONING / CONTEXT as fenced","data (shared `build_judge_user`, ADR 0025); the produce system message gains an","untrusted-data rule only when the user message actually carries a fence.","","**Rules**","","1. **Durable vs turn data.** Role, hard constraints, “never invent search” →","   `execution`. Instance values (`{{user_message}}`, `{{today}}`, `{{now}}`,","   `{{history}}`, tool notes) → `prompt`.","2. **Do not put `{{…}}` in `structure` / `execution`.** They are not rendered;","   braces stay literal.","3. **Untrusted text stays out of system** (user text, web snippets, history) —","   SPEC §11. System is for host-stable contract + policy. In the user channel","   the runtime additionally delimits tainted values structurally (SPEC §6) —","   discipline and delimiting stack, they do not replace each other.","4. **`execution` is not a tool.** Side effects only via `tool:` states.","5. **Console brain** follows the same split: policy in `execution`, clocks and","   conversation in `prompt` ([console](console.md)).","","**Anti-patterns:** long persona only in `prompt`; search snippets in system;","inventing a `system:` field; using `execution: call the search tool`.","","---","","## 4. Gates and reliability","","| Do                                                                             | Don't                                                 |","| ------------------------------------------------------------------------------ | ----------------------------------------------------- |","| Put **hooks above** prose gates; keep `when` as the human-readable trace label | Ask the LLM to check `amount \u003c= 100`                  |","| Cap `repair` at 1–2, then `escalate` or `fail`                                 | Open-ended repair-only states                         |","| Give escalate a **safe sink** state (human / fallback)                         | Fail closed only when that is truly required          |","| Read **trace** (gate, `judge_fallback`, nested `call`) when debugging          | Trust only the final `result` string                  |","| Use `reason: true` when the _why_ must be auditable                            | Dump chain-of-thought into `output` / context         |","| Quote any `when` that contains `#` / `##` (markdown headings)                  | Bare `## Section` in unquoted `when` (YAML truncates) |","","**Builtin / parametric hooks** (no plugin): `always_true` / `always_false`,","`write_failed` (write_file observation failed), `eq:key:value` /","`neq:key:value` (string equality on a top-level context key). Put hooks **above**","prose batches so control-flow does not depend on a judge fallback.","","Gate judging **follows the state tier** by default. Use config `judge:` only when all gates are deliberately cheap classifications (SPEC §2.1). `judge: jev-latest` is an opt-in Noul-only host adapter ([ADR 0037](../adr/0037-jev-noul-host-judge.md), [guide](jev-noul-judge.md)) — not the default, not a produce tier, never Choice.","","Optional: `mklang lint --llm` to probe overlapping prose `when` conditions (advisory; not CI-blocking). `mklang lint` also flags unquoted `#` inside raw `when` lines.","","The prose behind each of these rules — and everything else about tuning","reliability — is in [Patterns](patterns.md#reliability-gates-are-the-safety-net).","","---","","## 5. Tools (host contracts)","","Input/output/enable contracts for the reference host tools (`search`,","`search_kb`, `send_reply`, the `list_files`/`read_file`/`write_file` data","tools, `calc`), the ADR 0020 observation envelope, and capability policy are","one page: the [host tool reference](../reference/tools.md). The rules that","belong on this checklist:","","- Observations are **untrusted** blackboard data (SPEC §11), fenced","  automatically when interpolated (SPEC §6).","- Side effects only via **`tool:`** states; declare expected tools under","  top-level `tools:`; bind production implementations via entry points","  (`mklang.tools` / `mklang.hooks`).","- A stub `send_reply` is **not** delivery: live means `sent` true **and**","  `stub` false. Never ask the model to confirm a side effect.","","---","","## 6. Web, time, and knowledge cutoff","","Live or news-like questions fail in predictable ways if the machine relies on","model training data:","","- **Use `tool: search`** — ready-made as the [`std_research`](../reference/stdlib.md)","  stdlib machine; never “search the web” only in prose.","- **Declare `today: \"\"`** (and **`now: \"\"`** for wall-clock) and prompt with","  `Today is {{today}}` / `Current local time is {{now}}` — the host fill","  convention and key table are in [Patterns](patterns.md).","- **Ground finalize in notes only** (titles/URLs/`published_date`); explicitly","  forbid filling gaps from pre-training; when the stub says search is unbound,","  say so — do not fabricate hits.","","**Language note:** there is no primitive that “disables knowledge cutoff.”","Discipline is host clock + tools + prose + gates.","","---","","## 7. Output cutoff and context budgets (anti-cutoff)","","- A produce that hits its length stop is marked `truncated: true` in trace and","  events (ADR 0018). Default policy `report` continues with partial text — never","  treat a partial finalize as complete; use `--on-truncate halt` for strict runs.","- Interpolation budgets end long values with `…[truncated]` (ADR 0017);","  compress notes before the next loop (`research_compress.mkl`), and put","  critical facts in **state output**, not only deep context.","- The full tuning detail (`parse: list` halts on truncation, judge CONTEXT","  caps, console observation fields) is in [Patterns](patterns.md).","","---","","## 8. Memory and composition","","| Situation                     | Practice                                                                   |","| ----------------------------- | -------------------------------------------------------------------------- |","| Growing `accumulate` lists    | Explicit **compress** generative state; do not rely on silent host summary |","| Plan → map                    | Planner uses `parse: list`; executor `over: \"{{steps}}\"`                   |","| Pass lists into `call`/`tool` | Whole-template `input: { x: \"{{list}}\" }` (0.3 raw resolution)             |","| Reuse architecture            | Prefer **`std_*`** (`call: std_refine`, …) over copy-paste                 |","| Host-dependent patterns       | ReAct / router / hooks stay authored examples, not pure stdlib             |","","---","","## 9. Budgets and cost","","`budget` is steps, `--max-tokens` / `cost_budget` is spend (shared with `call`","children, partitioned across fan-out). Size the step budget to the worst case —","loops, repair headroom, fan-out width — and let `mklang check` reject the","infeasible ones. The sizing rules and the fan-out arithmetic are in","[Patterns](patterns.md); the normative semantics in SPEC §7.","","---","","## 10. Testing and CI","","| Layer              | Command                                   | Role                                  |","| ------------------ | ----------------------------------------- | ------------------------------------- |","| Schema + semantics | `mklang check`                            | Blocking shape/graph                  |","| Static smells      | `mklang lint` (`--strict` in CI)          | Typos, dead gates, missing catch-alls |","| Prose gate overlap | `mklang lint --llm`                       | Advisory only                         |","| Path pinning       | `mklang test … --script …`                | No API keys; escape hatches           |","| Language contract  | `pytest` + `conformance/`                 | Interpreter semantics                 |","| Live smoke         | `MKLANG_LIVE=1 pytest tests/test_live.py` | Opt-in providers                      |","","Keep `machine.test.yaml` beside the machine. Cover escalate, repair exhaustion, empty tool results, and search-unbound paths for web machines.","","**Static checks are not behavioural correctness.** `check` and `lint` prove a","machine is _well-formed_, not that it _does the right thing_ — only a scenario","run exercises behaviour. This gap matters most for agent-authored machines","(console / MCP, ADR 0015): freeze a hand-written `*.test.yaml` acceptance","scenario before trusting one. Treat “check-clean” as a precondition for","testing, not a substitute.","","**Console vs MCP authoring.** The console can `write_machine` into a workspace","(with human overwrite consent); MCP has no persist tool (§11) — headless hosts","author and run inline. The console's authoring turn shares one step budget","across discover/run/author/repair/reply, so prefer tight authoring contracts","over lengthening the loop.","","**`escalate` is control-flow-critical.** Prose escalate gates are","non-deterministic under provider and repeats; for production","page/approve/legal paths prefer **`--hitl`** or a **code-hook gate**, and keep","prose escalate for soft routing where an occasional mis-route is acceptable.","`mklang lint` emits an advisory `note:` on machines that use escalate.","","---","","## 11. Security (SPEC §11) — operational minimum","","- Customer text, web snippets, workspace files, and tool observations are","  **injection-capable**: they may be evidence, never new system policy,","  capability grants, budgets, or registry definitions.","- Tainted interpolations and the judge's OUTPUT/REASONING/CONTEXT are","  **automatically fenced** (`\u003cdata-NONCE\u003e`, SPEC §6 / ADR 0025). Fencing","  prevents _confusion_, not _persuasion_ — the next bullet still applies.","- **Control-flow taint** (SPEC §6 / ADR 0030): run production paths with","  `--untrusted-flow halt` (equivalents on `run(...)`, MCP, and the console) and","  classify your own tools with `tool_effects=` — an unclassified tool counts as","  effectful. The fix for a finding is a **`hook:` gate or a fresh HITL","  confirmation for that suspension**, not a better prompt; a stale","  `human.reply` in the blackboard does not confirm a later decision.","- Checkpoints hold the **full blackboard in plaintext** (mode `0600` is a","  floor, not encryption) — mind PII retention. No secrets in `.mkl` or","  context; keys stay in host env / `.env`.","- MCP is **read-only to disk by design** — no persist/write tool (ADR","  0011/0013; the only disk write is an explicit per-call `checkpoint_path`).","  The console's interactive guard model does not transfer to headless hosts.","- Production hosts set `MKLANG_ALLOWED_PLUGINS=name1,name2` to allowlist","  entry-point plugins; audit records redact credential-shaped values and never","  contain full prompts or keys at default log levels.","- Console tool **consent** is once per workspace-scoped session; `always yes`","  is an explicit operator choice for low-risk prompts only — high-risk prompts","  (egress, writes, irreversible, unknown tools) are always shown again","  ([console](console.md#security-model)).","","---","","## 12. Observability: trace vs events vs process logging","","Three channels — do not merge them into one API.","","| Channel                   | Purpose                                                        | Consumer                                             | Persistence                                         |","| ------------------------- | -------------------------------------------------------------- | ---------------------------------------------------- | --------------------------------------------------- |","| **Run trace**             | Semantic record: state, gate, policy, tokens, `truncated`      | Authors, tests, checkpoints                          | `RunResult.trace`, checkpoint JSON                  |","| **Live events**           | In-flight progress (`on_event`)                                | Console activity tree; MCP `mklang.event` (ADR 0019) | Ephemeral; console may append to `transcript.jsonl` |","| **Process / ops logging** | Host diagnostics: adapter HTTP, retries, config, plugin errors | Operators, developers                                | stderr / host log file / future OTel                |","","### Rules","","1. **Trace is the source of truth** for “what the machine did.” Events are a live","   shadow of the same story, not a second semantic model (ADR 0019).","2. **Ops logging is host-only** — never a face of the `.mkl`, never deposited on","   the blackboard as “memory,” never a gate condition.","3. **No `tool: log` in core.** Business audit that must be a side effect is a","   named host tool with ADR 0020 envelope + consent — not free-form logging.","4. **Observer isolation.** A failing log sink or event listener must not abort","   the run (same rule as `on_event` / MCP forwarder).","5. **Secrets.** Never log API keys. Prefer no full produce/judge bodies at","   default levels; DEBUG only when explicitly enabled.","6. **Levels.** The host logs on the `mklang.*` hierarchy (`mklang.registry`,","   `mklang.fs`, `mklang.cli`, …) to stderr — `--log-level` or","   `MKLANG_LOG_LEVEL`, default `warning`, format `LEVEL name: message` (no","   timestamps; journald/CI add their own). `DEBUG` adapters/raw HTTP; `INFO`","   coarse host lifecycle (e.g. the fs audit lines); `WARNING` plugin-load","   failures, stub tools, truncation, `judge_fallback`; `ERROR` halts. Do","   **not** INFO-log every state (events already cover that).","7. **Console separation.** Conversation pane ≠ ops log. UI stays Rich/Markdown;","   diagnostics go to stderr or a host log path.","8. **MCP.** Keep `mklang.event` for run vocabulary only. Host stack traces use a","   different logger name (e.g. `mklang.host`), not the event stream.","9. **OTel (optional, later).** Spans are a **projection** of the trace for","   platforms; they do not replace `RunResult.trace` ([ROADMAP](../../ROADMAP.md)).","","### Anti-patterns","","- `print()` in the engine; log-spam every token at INFO.","- Putting log lines or file tails into context so gates “read the log.”","- Overloading MCP logging notifications with host debug (breaks clients that","  treat `mklang.event` as the run UI feed).","","---","","## 13. Filesystem: four classes, not one tool","","Generic bash/FS stay **out of core**. When you need disk, pick the class:","","| Class                       | Examples                                                                                                                 | Where it lives                            | Controls                                                                                                                                                                                                                                                                                   |","| --------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |","| **1. Host-owned paths**     | `runtime.yaml`, checkpoints, console session dir                                                                         | CLI / host config                         | Operator-chosen paths; checkpoint mode `0600`                                                                                                                                                                                                                                              |","| **2. Workspace console**    | `list_workspace` / `read_workspace_file` / `search_workspace` (read-only) plus `write_machine` / `read_machine` (`.mkl`) | Console surface (ADR 0015)                | Root defaults to the launch cwd and is injected as absolute `workspace_root`; `--workspace` overrides it; relative paths; reject escape, hidden/build/vendor/sensitive paths; bounded file/byte budgets; report truncation; confirm `.mkl` overwrite; project machines live in `machines/` |","| **3. Machine data I/O**     | Read CSV, write a report                                                                                                 | Builtins `mklang.fs` (ADR 0024)           | Workspace confinement, size/type limits, write grant, stub off-switch                                                                                                                                                                                                                      |","| **4. Arbitrary FS / shell** | `rm`, bash, git                                                                                                          | **Never core**; explicit sandboxed plugin | Default off; high friction                                                                                                                                                                                                                                                                 |","","The current host-owned paths (XDG roots, system layer, config and machine","resolution) are documented once, in [Installation](install.md#host-layout) —","ADR 0021 records the decision history.","","### Rules for class 3 (data tools)","","Implemented by `mklang.fs` (`list_files` / `read_file` / `write_file` —","contracts in the [tool reference](../reference/tools.md); ADR 0024). The","reference posture is the coding-tool workspace model: reads are live by default","under `--workspace` / `MKLANG_FS_ROOT` / cwd, disk writes need an explicit","grant (`--allow-write` / `MKLANG_FS_WRITE=1` / console consent).","","1. **Names only in the `.mkl`** — `tool: read_file`, not path syntax in the language.","2. **Relative paths in tool input**; host joins to the configured **workspace**","   root; `..`, absolute paths, and dotfile segments never resolve.","3. **ADR 0020 envelope** — `{tool, stub, error, …}`; `MKLANG_FS_BACKEND=stub`","   forces the offline refusal tier.","4. **File bodies are untrusted observations** (§11) — never in the produce","   system channel.","5. **No recursive delete / shell in core.** Destructive ops only as explicit","   plugins with strong confirmation.","6. **Audit lightly** — tool name + relative path + byte count at INFO; not","   full file contents.","7. **Console stays non-IDE** — read-only inspection plus `.mkl` authoring;","   no generic write, shell, or git tools.","","### Large workspace analysis (ADR 0036)","","For large projects, use the console's metadata-only workspace index as the","structural inventory and read file bodies only when they are relevant to the","question. The index is persisted under the user state directory, is rebuilt","incrementally from visible file metadata, and never stores file contents.","","- Treat the index as a candidate map, not proof that a file was understood.","- Rank and read relevant files progressively; do not inject an entire tree into","  one prompt.","- Report indexed, read, skipped, and truncated counts in the evidence brief.","- A truncated index or search makes the analysis partial; never call it complete.","- Keep secrets, hidden paths, build/vendor/cache trees, binaries, and databases","  outside both the index and the model context.","- Rebuild or invalidate the index when the canonical workspace root changes or","  the manifest version is incompatible.","","### Memory \u0026 planning mapping","","The class model gives machines the same memory layering native coding agents","use: working memory is the blackboard (`context` + `accumulate`, never on","disk); session state is checkpoints and console `state.json` (class 1, outside","the workspace); project memory (`AGENTS.md`-style files) and plans/reports the","machine produces are non-dotted workspace files (classes 2/3, writes behind","the grant). Host state is unreachable from class-3 tools by construction — the","dotfile ban makes the “session dir as data lake” anti-pattern structural.","","### Anti-patterns","","- Language face `file:` / `$path` without ADR + conformance.","- `execution: write the result to disk`.","- Widening `write_machine` to arbitrary extensions/paths.","- Using session/transcript directories as a machine “data lake.”","- Absolute paths from the model without canonicalize + root check.","","---","","## 14. Surfaces quick reference","","| Surface             | Best practice                                                                                                                                                                                                                          |","| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |","| **CLI**             | `init` once, `doctor` when in doubt, then `check` → `lint` → `test` → `run`; `--on-truncate halt` for strict research; `--hitl` for human gates (auto-checkpoints; `--checkpoint` to choose the path); ops log on stderr when enabled  |","| **MCP**             | Commission by name/path/source; stream **run** events as `mklang.event` only; durable `checkpoint_path` for multi-process HITL; **read-only to disk** — author/validate/run inline, no persist tool (§11, ADR 0011/0013)               |","| **Library / embed** | Prefer [`host-embedding`](host-embedding.md): `prepare_*` → `run` → `build_output`; map `done`/`suspended`/`halt`; validate against [`run-result.schema.json`](../../schema/run-result.schema.json)                                    |","| **Console**         | Prefer RUN of workspace/search machines for live facts; honor truncation fields; enable Tavily for web; workspace inspection is read-only and `.mkl` authoring is the only write path — the full contract, including cancellation and shutdown, is the [Console guide](console.md) |","","---","","## 15. Language vs host: what may become language later","","Candidates for a future spec revision (need ADR + conformance) — **not** current practice requirements:","","| Candidate                             | Why it might become language                                               |","| ------------------------------------- | -------------------------------------------------------------------------- |","| ~~`parse: json`~~                     | **Shipped in 0.4** (ADR 0034) — object-shaped composition is `structure` + gates |","| Machine/state `on_truncate` policy    | Portable anti-cutoff in the document                                       |","| Context zones / pin (ADR 0017 L2)     | Authorable trust zones — runtime provenance taint already ships (ADR 0025) |","| Per-gate `hitl:`                      | Finer HITL than run-level                                                  |","| Budget split (steps vs fan-out width) | Clearer volume caps                                                        |","","Until then: use **host policy + patterns + this checklist**. Do **not** invent ad-hoc syntax outside the schema."],"stylingDirectives":[[[0,16,"pl-mh"],[2,16,"pl-en"]],[],[],[[0,2,"pl-s"],[31,33,"pl-s"],[34,35,"pl-s"],[44,45,"pl-s"],[45,46,"pl-s"],[46,58,"pl-corl"],[58,59,"pl-s"]],[[0,2,"pl-s"],[35,37,"pl-s"],[38,39,"pl-s"],[47,48,"pl-s"],[48,49,"pl-s"],[49,60,"pl-corl"],[60,61,"pl-s"]],[[0,2,"pl-s"],[22,24,"pl-s"],[25,26,"pl-s"],[40,41,"pl-s"],[41,42,"pl-s"],[42,63,"pl-corl"],[63,64,"pl-s"]],[[0,2,"pl-s"],[31,33,"pl-s"],[34,35,"pl-s"],[39,40,"pl-s"],[40,41,"pl-s"],[41,54,"pl-corl"],[54,55,"pl-s"]],[],[[19,20,"pl-s"],[85,86,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,42,"pl-mh"],[3,42,"pl-en"]],[],[[0,1,"pl-ml"],[24,25,"pl-ml"],[160,161,"pl-ml"],[291,292,"pl-ml"]],[[0,1,"pl-ml"],[24,25,"pl-ml"],[160,161,"pl-ml"],[291,292,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[14,15,"pl-s"],[15,19,"pl-c1"],[19,20,"pl-s"],[21,23,"pl-s"],[24,25,"pl-ml"],[160,161,"pl-ml"],[184,185,"pl-s"],[185,190,"pl-c1"],[190,191,"pl-s"],[192,193,"pl-s"],[198,199,"pl-s"],[201,202,"pl-s"],[202,213,"pl-c1"],[213,214,"pl-s"],[291,292,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[16,18,"pl-s"],[24,25,"pl-ml"],[64,65,"pl-s"],[71,72,"pl-s"],[119,121,"pl-s"],[132,134,"pl-s"],[160,161,"pl-ml"],[162,163,"pl-s"],[163,172,"pl-c1"],[172,173,"pl-s"],[182,183,"pl-s"],[183,194,"pl-c1"],[194,195,"pl-s"],[197,198,"pl-s"],[198,211,"pl-c1"],[211,212,"pl-s"],[215,216,"pl-s"],[216,219,"pl-c1"],[219,220,"pl-s"],[227,228,"pl-s"],[228,242,"pl-c1"],[242,243,"pl-s"],[291,292,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[11,13,"pl-s"],[24,25,"pl-ml"],[160,161,"pl-ml"],[274,275,"pl-s"],[275,279,"pl-c1"],[279,280,"pl-s"],[291,292,"pl-ml"]],[],[[0,2,"pl-s"],[7,9,"pl-s"]],[],[[0,1,"pl-v"],[28,30,"pl-s"],[30,31,"pl-s"],[31,36,"pl-c1"],[36,37,"pl-s"],[44,46,"pl-s"],[74,75,"pl-s"],[75,84,"pl-c1"],[84,85,"pl-s"]],[[0,1,"pl-v"],[6,7,"pl-s"],[7,11,"pl-c1"],[11,12,"pl-s"],[13,15,"pl-s"],[20,22,"pl-s"],[56,57,"pl-s"],[57,62,"pl-c1"],[62,63,"pl-s"]],[[0,1,"pl-v"],[17,19,"pl-s"],[31,33,"pl-s"],[36,37,"pl-s"],[37,49,"pl-c1"],[49,50,"pl-s"]],[[0,1,"pl-v"],[10,12,"pl-s"],[29,31,"pl-s"],[37,39,"pl-s"],[50,52,"pl-s"],[107,108,"pl-s"],[108,112,"pl-c1"],[112,113,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,41,"pl-mh"],[3,41,"pl-en"]],[],[[18,19,"pl-s"],[19,23,"pl-c1"],[23,24,"pl-s"]],[],[[0,1,"pl-v"],[2,5,"pl-k"],[22,23,"pl-s"],[23,36,"pl-c1"],[36,37,"pl-s"],[65,66,"pl-s"],[66,77,"pl-c1"],[77,78,"pl-s"],[80,81,"pl-s"],[81,92,"pl-c1"],[92,93,"pl-s"],[95,96,"pl-s"],[96,106,"pl-c1"],[106,107,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[41,43,"pl-s"],[43,44,"pl-s"],[44,59,"pl-c1"],[59,60,"pl-s"],[60,62,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[32,34,"pl-s"],[34,35,"pl-s"],[35,38,"pl-c1"],[38,39,"pl-s"],[39,41,"pl-s"],[43,44,"pl-s"],[44,50,"pl-c1"],[50,51,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[12,13,"pl-s"],[13,21,"pl-c1"],[21,22,"pl-s"],[31,32,"pl-s"],[32,40,"pl-c1"],[40,41,"pl-s"],[51,52,"pl-s"],[52,59,"pl-c1"],[59,60,"pl-s"],[67,68,"pl-s"],[68,75,"pl-c1"],[75,76,"pl-s"],[89,90,"pl-s"],[90,94,"pl-c1"],[94,95,"pl-s"],[96,97,"pl-s"],[97,102,"pl-c1"],[102,103,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[55,57,"pl-s"],[57,58,"pl-s"],[58,63,"pl-c1"],[63,64,"pl-s"],[64,66,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[20,22,"pl-s"],[22,23,"pl-s"],[23,28,"pl-c1"],[28,29,"pl-s"],[29,31,"pl-s"],[44,45,"pl-s"],[45,51,"pl-c1"],[51,52,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[38,40,"pl-s"],[40,41,"pl-s"],[41,50,"pl-c1"],[50,51,"pl-s"],[51,53,"pl-s"],[59,61,"pl-s"],[61,62,"pl-s"],[62,69,"pl-c1"],[69,70,"pl-s"],[70,72,"pl-s"],[92,93,"pl-s"],[93,101,"pl-c1"],[101,102,"pl-s"],[111,112,"pl-s"],[112,130,"pl-c1"],[130,131,"pl-s"],[134,135,"pl-s"],[135,164,"pl-c1"],[164,165,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[38,40,"pl-s"],[40,41,"pl-s"],[41,49,"pl-c1"],[49,50,"pl-s"],[50,52,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[6,7,"pl-s"],[7,19,"pl-c1"],[19,20,"pl-s"],[28,29,"pl-s"],[29,40,"pl-c1"],[40,41,"pl-s"],[53,54,"pl-s"],[54,62,"pl-c1"],[62,63,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[38,40,"pl-s"],[43,45,"pl-s"],[62,63,"pl-s"],[63,74,"pl-c1"],[74,75,"pl-s"]],[[0,1,"pl-v"],[2,5,"pl-k"],[29,31,"pl-s"],[31,32,"pl-s"],[32,41,"pl-c1"],[41,42,"pl-s"],[42,44,"pl-s"]],[[6,7,"pl-s"],[7,12,"pl-c1"],[12,13,"pl-s"],[22,24,"pl-s"],[24,25,"pl-s"],[25,31,"pl-c1"],[31,32,"pl-s"],[32,34,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,38,"pl-mh"],[3,38,"pl-en"]],[],[[73,75,"pl-s"],[77,79,"pl-s"]],[[0,1,"pl-s"],[1,8,"pl-c1"],[8,9,"pl-s"]],[],[[0,1,"pl-ml"],[22,23,"pl-ml"],[45,46,"pl-ml"],[63,64,"pl-ml"],[145,146,"pl-ml"]],[[0,1,"pl-ml"],[22,23,"pl-ml"],[45,46,"pl-ml"],[63,64,"pl-ml"],[145,146,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"],[22,23,"pl-ml"],[24,26,"pl-s"],[32,34,"pl-s"],[45,46,"pl-ml"],[63,64,"pl-ml"],[145,146,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"],[22,23,"pl-ml"],[24,26,"pl-s"],[32,34,"pl-s"],[45,46,"pl-ml"],[63,64,"pl-ml"],[145,146,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"],[22,23,"pl-ml"],[24,26,"pl-s"],[30,32,"pl-s"],[45,46,"pl-ml"],[47,49,"pl-s"],[52,54,"pl-s"],[55,56,"pl-s"],[56,61,"pl-c1"],[61,62,"pl-s"],[63,64,"pl-ml"],[113,114,"pl-s"],[114,126,"pl-c1"],[126,127,"pl-s"],[145,146,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[22,23,"pl-ml"],[30,32,"pl-s"],[36,38,"pl-s"],[45,46,"pl-ml"],[63,64,"pl-ml"],[145,146,"pl-ml"]],[[0,1,"pl-ml"],[7,8,"pl-s"],[8,20,"pl-c1"],[20,21,"pl-s"],[22,23,"pl-ml"],[30,32,"pl-s"],[38,40,"pl-s"],[45,46,"pl-ml"],[63,64,"pl-ml"],[81,82,"pl-s"],[82,95,"pl-c1"],[95,96,"pl-s"],[145,146,"pl-ml"]],[],[],[[13,14,"pl-s"],[14,30,"pl-c1"],[30,31,"pl-s"]],[],[],[[0,2,"pl-s"],[7,9,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[26,28,"pl-s"]],[[3,4,"pl-s"],[4,13,"pl-c1"],[13,14,"pl-s"],[33,34,"pl-s"],[34,50,"pl-c1"],[50,51,"pl-s"],[53,54,"pl-s"],[54,63,"pl-c1"],[63,64,"pl-s"],[66,67,"pl-s"],[67,74,"pl-c1"],[74,75,"pl-s"]],[[3,4,"pl-s"],[4,15,"pl-c1"],[15,16,"pl-s"],[32,33,"pl-s"],[33,39,"pl-c1"],[39,40,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[16,17,"pl-s"],[17,22,"pl-c1"],[22,23,"pl-s"],[27,28,"pl-s"],[28,37,"pl-c1"],[37,38,"pl-s"],[41,42,"pl-s"],[42,51,"pl-c1"],[51,52,"pl-s"],[53,55,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[39,41,"pl-s"]],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[5,6,"pl-s"],[6,15,"pl-c1"],[15,16,"pl-s"],[31,33,"pl-s"],[56,57,"pl-s"],[57,62,"pl-c1"],[62,63,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[18,20,"pl-s"],[55,56,"pl-s"],[56,65,"pl-c1"],[65,66,"pl-s"]],[[19,20,"pl-s"],[20,26,"pl-c1"],[26,27,"pl-s"],[29,30,"pl-s"],[37,38,"pl-s"],[38,39,"pl-s"],[39,49,"pl-corl"],[49,50,"pl-s"]],[],[[0,2,"pl-s"],[16,18,"pl-s"],[40,41,"pl-s"],[41,47,"pl-c1"],[47,48,"pl-s"]],[[12,13,"pl-s"],[13,20,"pl-c1"],[20,21,"pl-s"],[35,36,"pl-s"],[36,67,"pl-c1"],[67,68,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,27,"pl-mh"],[3,27,"pl-en"]],[],[[0,1,"pl-ml"],[81,82,"pl-ml"],[137,138,"pl-ml"]],[[0,1,"pl-ml"],[81,82,"pl-ml"],[137,138,"pl-ml"]],[[0,1,"pl-ml"],[6,8,"pl-s"],[19,21,"pl-s"],[40,41,"pl-s"],[41,45,"pl-c1"],[45,46,"pl-s"],[81,82,"pl-ml"],[104,105,"pl-s"],[105,118,"pl-c1"],[118,119,"pl-s"],[137,138,"pl-ml"]],[[0,1,"pl-ml"],[6,7,"pl-s"],[7,13,"pl-c1"],[13,14,"pl-s"],[28,29,"pl-s"],[29,37,"pl-c1"],[37,38,"pl-s"],[42,43,"pl-s"],[43,47,"pl-c1"],[47,48,"pl-s"],[81,82,"pl-ml"],[137,138,"pl-ml"]],[[0,1,"pl-ml"],[18,20,"pl-s"],[29,31,"pl-s"],[81,82,"pl-ml"],[137,138,"pl-ml"]],[[0,1,"pl-ml"],[7,9,"pl-s"],[14,16,"pl-s"],[24,25,"pl-s"],[25,39,"pl-c1"],[39,40,"pl-s"],[49,50,"pl-s"],[50,54,"pl-c1"],[54,55,"pl-s"],[81,82,"pl-ml"],[104,105,"pl-s"],[105,111,"pl-c1"],[111,112,"pl-s"],[137,138,"pl-ml"]],[[0,1,"pl-ml"],[6,7,"pl-s"],[7,19,"pl-c1"],[19,20,"pl-s"],[30,31,"pl-s"],[34,35,"pl-s"],[81,82,"pl-ml"],[110,111,"pl-s"],[111,117,"pl-c1"],[117,118,"pl-s"],[137,138,"pl-ml"]],[[0,1,"pl-ml"],[12,13,"pl-s"],[13,17,"pl-c1"],[17,18,"pl-s"],[33,34,"pl-s"],[34,35,"pl-c1"],[35,36,"pl-s"],[39,40,"pl-s"],[40,42,"pl-c1"],[42,43,"pl-s"],[81,82,"pl-ml"],[88,89,"pl-s"],[89,99,"pl-c1"],[99,100,"pl-s"],[113,114,"pl-s"],[114,118,"pl-c1"],[118,119,"pl-s"],[137,138,"pl-ml"]],[],[[0,2,"pl-s"],[28,30,"pl-s"],[44,45,"pl-s"],[45,56,"pl-c1"],[56,57,"pl-s"],[60,61,"pl-s"],[61,73,"pl-c1"],[73,74,"pl-s"]],[[0,1,"pl-s"],[1,13,"pl-c1"],[13,14,"pl-s"],[48,49,"pl-s"],[49,61,"pl-c1"],[61,62,"pl-s"]],[[0,1,"pl-s"],[1,14,"pl-c1"],[14,15,"pl-s"],[72,74,"pl-s"],[79,81,"pl-s"]],[],[],[[13,15,"pl-s"],[37,39,"pl-s"],[63,64,"pl-s"],[64,70,"pl-c1"],[70,71,"pl-s"],[144,145,"pl-s"],[145,162,"pl-c1"],[162,163,"pl-s"],[201,202,"pl-s"],[210,211,"pl-s"],[211,212,"pl-s"],[212,246,"pl-corl"],[246,247,"pl-s"],[249,250,"pl-s"],[255,256,"pl-s"],[256,257,"pl-s"],[257,274,"pl-corl"],[274,275,"pl-s"]],[],[[10,11,"pl-s"],[11,28,"pl-c1"],[28,29,"pl-s"],[57,58,"pl-s"],[58,62,"pl-c1"],[62,63,"pl-s"],[104,105,"pl-s"],[105,116,"pl-c1"],[116,117,"pl-s"],[138,139,"pl-s"],[139,140,"pl-c1"],[140,141,"pl-s"],[153,154,"pl-s"],[154,158,"pl-c1"],[158,159,"pl-s"]],[],[],[[20,21,"pl-s"],[29,30,"pl-s"],[30,31,"pl-s"],[31,79,"pl-corl"],[79,80,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,28,"pl-mh"],[3,28,"pl-en"]],[],[[60,61,"pl-s"],[61,67,"pl-c1"],[67,68,"pl-s"]],[[0,1,"pl-s"],[1,10,"pl-c1"],[10,11,"pl-s"],[13,14,"pl-s"],[14,24,"pl-c1"],[24,25,"pl-s"],[31,32,"pl-s"],[32,42,"pl-c1"],[42,43,"pl-s"],[44,45,"pl-s"],[45,54,"pl-c1"],[54,55,"pl-s"],[56,57,"pl-s"],[57,67,"pl-c1"],[67,68,"pl-s"]],[[7,8,"pl-s"],[8,12,"pl-c1"],[12,13,"pl-s"]],[[14,15,"pl-s"],[34,35,"pl-s"],[35,36,"pl-s"],[36,57,"pl-corl"],[57,58,"pl-s"]],[],[],[[0,1,"pl-v"],[19,21,"pl-s"],[30,32,"pl-s"]],[],[[0,1,"pl-v"],[24,26,"pl-s"],[26,27,"pl-s"],[27,32,"pl-c1"],[32,33,"pl-s"],[33,35,"pl-s"]],[[12,13,"pl-s"],[13,19,"pl-c1"],[19,20,"pl-s"]],[[3,4,"pl-s"],[4,16,"pl-c1"],[16,17,"pl-s"],[20,21,"pl-s"],[21,33,"pl-c1"],[33,34,"pl-s"]],[[0,1,"pl-v"],[9,10,"pl-s"],[10,20,"pl-c1"],[20,21,"pl-s"],[25,27,"pl-s"],[30,32,"pl-s"],[54,55,"pl-s"],[55,59,"pl-c1"],[59,60,"pl-s"],[66,68,"pl-s"],[71,73,"pl-s"]],[[2,3,"pl-s"],[3,7,"pl-c1"],[7,8,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,37,"pl-mh"],[3,37,"pl-en"]],[],[],[],[],[[0,1,"pl-v"],[2,4,"pl-s"],[8,9,"pl-s"],[9,21,"pl-c1"],[21,22,"pl-s"],[22,24,"pl-s"],[45,46,"pl-s"],[46,47,"pl-s"],[47,59,"pl-c1"],[59,60,"pl-s"],[60,61,"pl-s"],[61,62,"pl-s"],[62,84,"pl-corl"],[84,85,"pl-s"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[12,13,"pl-s"],[13,22,"pl-c1"],[22,23,"pl-s"],[23,25,"pl-s"],[31,33,"pl-s"],[33,34,"pl-s"],[34,41,"pl-c1"],[41,42,"pl-s"],[42,44,"pl-s"]],[[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[25,26,"pl-s"],[26,55,"pl-c1"],[55,56,"pl-s"]],[[34,35,"pl-s"],[43,44,"pl-s"],[44,45,"pl-s"],[45,56,"pl-corl"],[56,57,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[33,35,"pl-s"],[49,50,"pl-s"],[50,64,"pl-c1"],[64,65,"pl-s"]],[],[],[],[[0,2,"pl-s"],[16,18,"pl-s"]],[],[],[[0,3,"pl-ms"]],[],[[0,53,"pl-mh"],[3,53,"pl-en"]],[],[[0,1,"pl-v"],[48,49,"pl-s"],[49,64,"pl-c1"],[64,65,"pl-s"]],[[36,37,"pl-s"],[37,43,"pl-c1"],[43,44,"pl-s"]],[[44,45,"pl-s"],[45,63,"pl-c1"],[63,64,"pl-s"]],[[0,1,"pl-v"],[45,46,"pl-s"],[46,58,"pl-c1"],[58,59,"pl-s"]],[[39,40,"pl-s"],[40,61,"pl-c1"],[61,62,"pl-s"]],[[20,22,"pl-s"],[34,36,"pl-s"]],[[0,1,"pl-v"],[26,27,"pl-s"],[27,38,"pl-c1"],[38,39,"pl-s"]],[[42,43,"pl-s"],[51,52,"pl-s"],[52,53,"pl-s"],[53,64,"pl-corl"],[64,65,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,28,"pl-mh"],[3,28,"pl-en"]],[],[[0,1,"pl-ml"],[32,33,"pl-ml"],[109,110,"pl-ml"]],[[0,1,"pl-ml"],[32,33,"pl-ml"],[109,110,"pl-ml"]],[[0,1,"pl-ml"],[10,11,"pl-s"],[11,21,"pl-c1"],[21,22,"pl-s"],[32,33,"pl-ml"],[43,45,"pl-s"],[53,55,"pl-s"],[109,110,"pl-ml"]],[[0,1,"pl-ml"],[32,33,"pl-ml"],[47,48,"pl-s"],[48,59,"pl-c1"],[59,60,"pl-s"],[71,72,"pl-s"],[72,89,"pl-c1"],[89,90,"pl-s"],[109,110,"pl-ml"]],[[0,1,"pl-ml"],[18,19,"pl-s"],[19,23,"pl-c1"],[23,24,"pl-s"],[25,26,"pl-s"],[26,30,"pl-c1"],[30,31,"pl-s"],[32,33,"pl-ml"],[49,50,"pl-s"],[50,74,"pl-c1"],[74,75,"pl-s"],[109,110,"pl-ml"]],[[0,1,"pl-ml"],[32,33,"pl-ml"],[41,43,"pl-s"],[43,44,"pl-s"],[44,49,"pl-c1"],[49,50,"pl-s"],[50,52,"pl-s"],[54,55,"pl-s"],[55,71,"pl-c1"],[71,72,"pl-s"],[109,110,"pl-ml"]],[[0,1,"pl-ml"],[32,33,"pl-ml"],[109,110,"pl-ml"]],[],[[0,3,"pl-ms"]],[],[[0,22,"pl-mh"],[3,22,"pl-en"]],[],[[0,1,"pl-s"],[1,7,"pl-c1"],[7,8,"pl-s"],[19,20,"pl-s"],[20,32,"pl-c1"],[32,33,"pl-s"],[36,37,"pl-s"],[37,48,"pl-c1"],[48,49,"pl-s"],[72,73,"pl-s"],[73,77,"pl-c1"],[77,78,"pl-s"]],[],[[48,49,"pl-s"],[49,61,"pl-c1"],[61,62,"pl-s"]],[],[[0,1,"pl-s"],[9,10,"pl-s"],[10,11,"pl-s"],[11,22,"pl-corl"],[22,23,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,21,"pl-mh"],[3,21,"pl-en"]],[],[[0,1,"pl-ml"],[21,22,"pl-ml"],[65,66,"pl-ml"],[105,106,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[65,66,"pl-ml"],[105,106,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,36,"pl-c1"],[36,37,"pl-s"],[65,66,"pl-ml"],[105,106,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,35,"pl-c1"],[35,36,"pl-s"],[38,39,"pl-s"],[39,47,"pl-c1"],[47,48,"pl-s"],[65,66,"pl-ml"],[105,106,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,41,"pl-c1"],[41,42,"pl-s"],[65,66,"pl-ml"],[105,106,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,48,"pl-c1"],[48,49,"pl-s"],[65,66,"pl-ml"],[105,106,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,30,"pl-c1"],[30,31,"pl-s"],[34,35,"pl-s"],[35,47,"pl-c1"],[47,48,"pl-s"],[65,66,"pl-ml"],[105,106,"pl-ml"]],[[0,1,"pl-ml"],[21,22,"pl-ml"],[23,24,"pl-s"],[24,63,"pl-c1"],[63,64,"pl-s"],[65,66,"pl-ml"],[105,106,"pl-ml"]],[],[[5,6,"pl-s"],[6,23,"pl-c1"],[23,24,"pl-s"]],[],[[0,2,"pl-s"],[48,50,"pl-s"],[51,52,"pl-s"],[52,57,"pl-c1"],[57,58,"pl-s"],[63,64,"pl-s"],[64,68,"pl-c1"],[68,69,"pl-s"]],[[11,12,"pl-s"],[23,24,"pl-s"],[38,39,"pl-s"],[59,60,"pl-s"]],[],[[49,50,"pl-s"],[50,61,"pl-c1"],[61,62,"pl-s"]],[],[],[],[[0,2,"pl-s"],[27,29,"pl-s"],[46,47,"pl-s"],[47,60,"pl-c1"],[60,61,"pl-s"]],[],[],[],[],[],[[0,2,"pl-s"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[38,40,"pl-s"]],[],[[32,34,"pl-s"],[34,35,"pl-s"],[35,41,"pl-c1"],[41,42,"pl-s"],[42,44,"pl-s"],[50,52,"pl-s"],[66,68,"pl-s"]],[],[[0,1,"pl-s"],[1,12,"pl-c1"],[12,13,"pl-s"],[32,33,"pl-s"],[33,38,"pl-c1"],[38,39,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,48,"pl-mh"],[3,48,"pl-en"]],[],[[0,1,"pl-v"]],[[2,4,"pl-s"],[21,23,"pl-s"]],[],[[0,1,"pl-v"]],[[2,4,"pl-s"],[24,26,"pl-s"],[28,29,"pl-s"],[29,41,"pl-c1"],[41,42,"pl-s"]],[[11,12,"pl-s"],[21,22,"pl-s"],[28,29,"pl-s"],[39,40,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[22,24,"pl-s"]],[[2,3,"pl-s"],[3,24,"pl-c1"],[24,25,"pl-s"],[42,43,"pl-s"],[43,51,"pl-c1"],[51,52,"pl-s"]],[[31,32,"pl-s"],[32,45,"pl-c1"],[45,46,"pl-s"]],[[40,42,"pl-s"],[42,43,"pl-s"],[43,48,"pl-c1"],[48,49,"pl-s"]],[[34,36,"pl-s"]],[[2,3,"pl-s"],[3,14,"pl-c1"],[14,15,"pl-s"]],[[0,1,"pl-v"],[23,25,"pl-s"],[53,55,"pl-s"],[62,63,"pl-s"],[63,67,"pl-c1"],[67,68,"pl-s"]],[[61,62,"pl-s"],[62,66,"pl-c1"],[66,67,"pl-s"]],[[35,36,"pl-s"],[36,40,"pl-c1"],[40,41,"pl-s"]],[[0,1,"pl-v"],[9,11,"pl-s"],[38,40,"pl-s"]],[[57,58,"pl-s"],[58,73,"pl-c1"],[73,74,"pl-s"]],[],[[0,1,"pl-v"],[23,24,"pl-s"],[24,58,"pl-c1"],[58,59,"pl-s"]],[],[],[[0,1,"pl-v"],[15,17,"pl-s"],[24,26,"pl-s"],[65,66,"pl-s"],[66,76,"pl-c1"],[76,77,"pl-s"]],[],[],[[3,4,"pl-s"],[11,12,"pl-s"],[12,13,"pl-s"],[13,38,"pl-corl"],[38,39,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,56,"pl-mh"],[3,56,"pl-en"]],[],[],[],[[0,1,"pl-ml"],[28,29,"pl-ml"],[93,94,"pl-ml"],[148,149,"pl-ml"],[202,203,"pl-ml"]],[[0,1,"pl-ml"],[28,29,"pl-ml"],[93,94,"pl-ml"],[148,149,"pl-ml"],[202,203,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[13,15,"pl-s"],[28,29,"pl-ml"],[76,77,"pl-s"],[77,86,"pl-c1"],[86,87,"pl-s"],[93,94,"pl-ml"],[148,149,"pl-ml"],[150,151,"pl-s"],[151,166,"pl-c1"],[166,167,"pl-s"],[202,203,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[15,17,"pl-s"],[28,29,"pl-ml"],[50,51,"pl-s"],[51,59,"pl-c1"],[59,60,"pl-s"],[93,94,"pl-ml"],[122,123,"pl-s"],[123,135,"pl-c1"],[135,136,"pl-s"],[148,149,"pl-ml"],[183,184,"pl-s"],[184,200,"pl-c1"],[200,201,"pl-s"],[202,203,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[25,27,"pl-s"],[28,29,"pl-ml"],[93,94,"pl-ml"],[148,149,"pl-ml"],[202,203,"pl-ml"]],[],[[0,9,"pl-mh"],[4,9,"pl-en"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[33,35,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[29,31,"pl-s"],[54,55,"pl-s"],[55,59,"pl-c1"],[59,60,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[8,9,"pl-s"],[9,18,"pl-c1"],[18,19,"pl-s"],[28,30,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[24,26,"pl-s"]],[[25,26,"pl-s"],[26,34,"pl-c1"],[34,35,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[13,15,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[12,14,"pl-s"],[36,37,"pl-s"],[37,45,"pl-c1"],[45,46,"pl-s"],[58,59,"pl-s"],[59,74,"pl-c1"],[74,75,"pl-s"]],[[3,4,"pl-s"],[4,13,"pl-c1"],[13,14,"pl-s"],[16,17,"pl-s"],[17,27,"pl-c1"],[27,28,"pl-s"],[45,46,"pl-s"],[46,57,"pl-c1"],[57,58,"pl-s"]],[[3,4,"pl-s"],[4,20,"pl-c1"],[20,21,"pl-s"],[31,32,"pl-s"],[32,39,"pl-c1"],[39,40,"pl-s"],[49,50,"pl-s"],[50,69,"pl-c1"],[69,70,"pl-s"]],[[43,44,"pl-s"],[44,49,"pl-c1"],[49,50,"pl-s"],[70,71,"pl-s"],[71,75,"pl-c1"],[75,76,"pl-s"]],[[52,53,"pl-s"],[53,60,"pl-c1"],[60,61,"pl-s"]],[[37,38,"pl-s"],[38,52,"pl-c1"],[52,53,"pl-s"],[55,56,"pl-s"],[56,61,"pl-c1"],[61,62,"pl-s"]],[[3,5,"pl-s"],[8,10,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[24,26,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[9,11,"pl-s"],[17,18,"pl-s"],[18,30,"pl-c1"],[30,31,"pl-s"]],[[31,32,"pl-s"],[32,43,"pl-c1"],[43,44,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[28,30,"pl-s"],[43,45,"pl-s"],[55,57,"pl-s"]],[[34,35,"pl-s"],[35,50,"pl-c1"],[50,51,"pl-s"],[53,54,"pl-s"],[61,62,"pl-s"],[62,63,"pl-s"],[63,79,"pl-corl"],[79,80,"pl-s"]],[],[[0,17,"pl-mh"],[4,17,"pl-en"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[8,9,"pl-s"],[9,21,"pl-c1"],[21,22,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,45,"pl-mh"],[3,45,"pl-en"]],[],[[21,23,"pl-s"],[34,36,"pl-s"]],[],[[0,1,"pl-ml"],[30,31,"pl-ml"],[153,154,"pl-ml"],[197,198,"pl-ml"],[482,483,"pl-ml"]],[[0,1,"pl-ml"],[30,31,"pl-ml"],[153,154,"pl-ml"],[197,198,"pl-ml"],[482,483,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[23,25,"pl-s"],[30,31,"pl-ml"],[32,33,"pl-s"],[33,45,"pl-c1"],[45,46,"pl-s"],[153,154,"pl-ml"],[197,198,"pl-ml"],[238,239,"pl-s"],[239,243,"pl-c1"],[243,244,"pl-s"],[482,483,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[24,26,"pl-s"],[30,31,"pl-ml"],[32,33,"pl-s"],[33,47,"pl-c1"],[47,48,"pl-s"],[51,52,"pl-s"],[52,71,"pl-c1"],[71,72,"pl-s"],[75,76,"pl-s"],[76,92,"pl-c1"],[92,93,"pl-s"],[111,112,"pl-s"],[112,125,"pl-c1"],[125,126,"pl-s"],[129,130,"pl-s"],[130,142,"pl-c1"],[142,143,"pl-s"],[145,146,"pl-s"],[146,150,"pl-c1"],[150,151,"pl-s"],[153,154,"pl-ml"],[197,198,"pl-ml"],[259,260,"pl-s"],[260,274,"pl-c1"],[274,275,"pl-s"],[277,278,"pl-s"],[278,289,"pl-c1"],[289,290,"pl-s"],[427,428,"pl-s"],[428,432,"pl-c1"],[432,433,"pl-s"],[470,471,"pl-s"],[471,480,"pl-c1"],[480,481,"pl-s"],[482,483,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[23,25,"pl-s"],[30,31,"pl-ml"],[153,154,"pl-ml"],[164,165,"pl-s"],[165,174,"pl-c1"],[174,175,"pl-s"],[197,198,"pl-ml"],[482,483,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[27,29,"pl-s"],[30,31,"pl-ml"],[32,33,"pl-s"],[33,35,"pl-c1"],[35,36,"pl-s"],[153,154,"pl-ml"],[155,157,"pl-s"],[167,169,"pl-s"],[197,198,"pl-ml"],[482,483,"pl-ml"]],[],[],[[36,37,"pl-s"],[49,50,"pl-s"],[50,51,"pl-s"],[51,73,"pl-corl"],[73,74,"pl-s"]],[],[],[[0,34,"pl-mh"],[4,34,"pl-en"]],[],[[15,16,"pl-s"],[16,25,"pl-c1"],[25,26,"pl-s"],[28,29,"pl-s"],[29,39,"pl-c1"],[39,40,"pl-s"],[43,44,"pl-s"],[44,53,"pl-c1"],[53,54,"pl-s"],[57,58,"pl-s"],[58,68,"pl-c1"],[68,69,"pl-s"]],[[17,18,"pl-s"],[32,33,"pl-s"],[33,34,"pl-s"],[34,55,"pl-corl"],[55,56,"pl-s"]],[],[[6,7,"pl-s"],[7,18,"pl-c1"],[18,19,"pl-s"],[22,23,"pl-s"],[23,37,"pl-c1"],[37,38,"pl-s"]],[[7,8,"pl-s"],[8,21,"pl-c1"],[21,22,"pl-s"],[25,26,"pl-s"],[26,43,"pl-c1"],[43,44,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[23,24,"pl-s"],[24,28,"pl-c1"],[28,29,"pl-s"],[29,31,"pl-s"],[34,35,"pl-s"],[35,50,"pl-c1"],[50,51,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[33,35,"pl-s"],[66,68,"pl-s"],[77,79,"pl-s"]],[[9,10,"pl-s"],[10,12,"pl-c1"],[12,13,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[22,24,"pl-s"],[27,28,"pl-s"],[28,50,"pl-c1"],[50,51,"pl-s"],[53,54,"pl-s"],[54,76,"pl-c1"],[76,77,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[43,45,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[41,43,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[18,20,"pl-s"]],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,5,"pl-s"],[26,28,"pl-s"],[57,58,"pl-s"],[58,62,"pl-c1"],[62,63,"pl-s"]],[],[],[[0,39,"pl-mh"],[4,39,"pl-en"]],[],[],[],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[],[[0,29,"pl-mh"],[4,29,"pl-en"]],[],[],[[39,40,"pl-s"],[40,47,"pl-c1"],[47,48,"pl-s"],[51,52,"pl-s"],[52,62,"pl-c1"],[62,63,"pl-s"]],[[48,49,"pl-s"],[49,59,"pl-c1"],[59,60,"pl-s"]],[[32,33,"pl-s"],[33,42,"pl-c1"],[42,43,"pl-s"]],[],[],[],[],[[0,17,"pl-mh"],[4,17,"pl-en"]],[],[[0,1,"pl-v"],[16,17,"pl-s"],[17,22,"pl-c1"],[22,23,"pl-s"],[26,27,"pl-s"],[27,32,"pl-c1"],[32,33,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,38,"pl-c1"],[38,39,"pl-s"]],[[0,1,"pl-v"],[11,12,"pl-s"],[12,25,"pl-c1"],[25,26,"pl-s"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,3,"pl-ms"]],[],[[0,31,"pl-mh"],[3,31,"pl-en"]],[],[[0,1,"pl-ml"],[22,23,"pl-ml"],[255,256,"pl-ml"]],[[0,1,"pl-ml"],[22,23,"pl-ml"],[256,257,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[7,9,"pl-s"],[22,23,"pl-ml"],[24,25,"pl-s"],[25,29,"pl-c1"],[29,30,"pl-s"],[37,38,"pl-s"],[38,44,"pl-c1"],[44,45,"pl-s"],[66,67,"pl-s"],[67,72,"pl-c1"],[72,73,"pl-s"],[76,77,"pl-s"],[77,81,"pl-c1"],[81,82,"pl-s"],[85,86,"pl-s"],[86,90,"pl-c1"],[90,91,"pl-s"],[94,95,"pl-s"],[95,98,"pl-c1"],[98,99,"pl-s"],[101,102,"pl-s"],[102,120,"pl-c1"],[120,121,"pl-s"],[143,144,"pl-s"],[144,150,"pl-c1"],[150,151,"pl-s"],[187,188,"pl-s"],[188,200,"pl-c1"],[200,201,"pl-s"],[255,256,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[7,9,"pl-s"],[22,23,"pl-ml"],[63,65,"pl-s"],[68,70,"pl-s"],[81,82,"pl-s"],[82,94,"pl-c1"],[94,95,"pl-s"],[110,111,"pl-s"],[111,126,"pl-c1"],[126,127,"pl-s"],[152,154,"pl-s"],[171,173,"pl-s"],[255,256,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[19,21,"pl-s"],[22,23,"pl-ml"],[31,32,"pl-s"],[32,33,"pl-s"],[33,47,"pl-c1"],[47,48,"pl-s"],[48,49,"pl-s"],[49,50,"pl-s"],[50,67,"pl-corl"],[67,68,"pl-s"],[70,71,"pl-s"],[71,80,"pl-c1"],[80,81,"pl-s"],[84,85,"pl-s"],[85,88,"pl-c1"],[88,89,"pl-s"],[92,93,"pl-s"],[93,105,"pl-c1"],[105,106,"pl-s"],[112,113,"pl-s"],[113,117,"pl-c1"],[117,118,"pl-s"],[119,120,"pl-s"],[120,129,"pl-c1"],[129,130,"pl-s"],[131,132,"pl-s"],[132,136,"pl-c1"],[136,137,"pl-s"],[156,157,"pl-s"],[157,158,"pl-s"],[158,180,"pl-c1"],[180,181,"pl-s"],[181,182,"pl-s"],[182,183,"pl-s"],[183,218,"pl-corl"],[218,219,"pl-s"],[255,256,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[11,13,"pl-s"],[22,23,"pl-ml"],[166,167,"pl-s"],[167,171,"pl-c1"],[171,172,"pl-s"],[271,272,"pl-s"],[285,286,"pl-s"],[286,287,"pl-s"],[287,297,"pl-corl"],[297,298,"pl-s"],[299,300,"pl-ml"]],[],[[0,3,"pl-ms"]],[],[[0,55,"pl-mh"],[3,55,"pl-en"]],[],[[65,67,"pl-s"],[70,72,"pl-s"]],[],[[0,1,"pl-ml"],[40,41,"pl-ml"],[117,118,"pl-ml"]],[[0,1,"pl-ml"],[40,41,"pl-ml"],[117,118,"pl-ml"]],[[0,1,"pl-ml"],[2,4,"pl-s"],[4,5,"pl-s"],[5,16,"pl-c1"],[16,17,"pl-s"],[17,19,"pl-s"],[40,41,"pl-ml"],[42,44,"pl-s"],[58,60,"pl-s"],[103,104,"pl-s"],[104,113,"pl-c1"],[113,114,"pl-s"],[123,124,"pl-ml"]],[[0,1,"pl-ml"],[16,17,"pl-s"],[17,28,"pl-c1"],[28,29,"pl-s"],[40,41,"pl-ml"],[117,118,"pl-ml"]],[[0,1,"pl-ml"],[40,41,"pl-ml"],[117,118,"pl-ml"]],[[0,1,"pl-ml"],[11,12,"pl-s"],[12,17,"pl-c1"],[17,18,"pl-s"],[40,41,"pl-ml"],[117,118,"pl-ml"]],[[0,1,"pl-ml"],[40,41,"pl-ml"],[117,118,"pl-ml"]],[],[[16,18,"pl-s"],[57,59,"pl-s"],[64,66,"pl-s"],[69,71,"pl-s"]]],"colorizedLines":null}},"title":"mklang/docs/guides/best-practices.md at main · gianlucamazza/mklang","appPayload":{},"meta":{"title":"mklang/docs/guides/best-practices.md at main · gianlucamazza/mklang"}}</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="/gianlucamazza/mklang" 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="/gianlucamazza/mklang/tree/main" data-discover="true">mklang</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/gianlucamazza/mklang/tree/main/docs" data-discover="true">docs</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/gianlucamazza/mklang/tree/main/docs/guides" data-discover="true">guides</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">best-practices.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="/gianlucamazza/mklang/commits/main/docs/guides/best-practices.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="/gianlucamazza/mklang/commits/main/docs/guides/best-practices.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="27 KB" style="--truncate-max-width:100%"><span>389 lines (304 loc) · 27 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="/gianlucamazza/mklang/tree/main" data-discover="true">mklang</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/gianlucamazza/mklang/tree/main/docs" data-discover="true">docs</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/gianlucamazza/mklang/tree/main/docs/guides" data-discover="true">guides</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">best-practices.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="27 KB" style="--truncate-max-width:100%"><span>389 lines (304 loc) · 27 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/gianlucamazza/mklang/raw/refs/heads/main/docs/guides/best-practices.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">Best practices</h1><a id="user-content-best-practices" class="anchor" aria-label="Permalink: Best practices" href="#best-practices"><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">Canonical checklist for writing, running, and hosting mklang machines.
<strong>How to author a correct file:</strong> <a href="/gianlucamazza/mklang/blob/main/docs/guides/authoring.md">Authoring</a>.<br>
<strong>How to tune reliability and cost:</strong> <a href="/gianlucamazza/mklang/blob/main/docs/guides/patterns.md">Patterns</a>.<br>
<strong>Host tool contracts:</strong> <a href="/gianlucamazza/mklang/blob/main/docs/reference/tools.md">Tool reference</a>.<br>
<strong>What the language guarantees:</strong> <a href="/gianlucamazza/mklang/blob/main/SPEC.md">SPEC</a> (cookbook §10, threat model §11).</p>
<p dir="auto">This page answers: <em>what should I always do, never do, and where does each rule live?</em></p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">1. Layer discipline (do not mix layers)</h2><a id="user-content-1-layer-discipline-do-not-mix-layers" class="anchor" aria-label="Permalink: 1. Layer discipline (do not mix layers)" href="#1-layer-discipline-do-not-mix-layers"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Layer</th>
<th>Owns</th>
<th>Examples</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Language (<code>.mkl</code>)</strong></td>
<td>Control flow, prose contracts, portable structure</td>
<td>states, gates, tiers, <code>tool:</code> <em>names</em>, <code>parse: list</code></td>
</tr>
<tr>
<td><strong>Host runtime</strong></td>
<td>Bindings, budgets, clocks, truncation <em>policy</em>, LLM adapters, produce/judge prompt assembly, <strong>ops logging</strong>, FS data roots for tools</td>
<td><code>tools={…}</code>, hooks, <code>on_truncate</code>, <code>context.today</code> / <code>now</code> fill, <code>llm/prompts.py</code>, process loggers, plugin FS tools</td>
</tr>
<tr>
<td><strong>Surface</strong></td>
<td>UX, consent, compact observations, chrome vs content rendering, session audit</td>
<td>CLI flags, MCP tools, console brain, Markdown log, transcript/session paths, read-only workspace inspection and <code>.mkl</code> authoring</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto"><strong>Rules</strong></p>
<ul dir="auto">
<li>Side effects live only in <strong><code>tool:</code> states</strong> (host callables). Never in <code>execution</code> or generative prompts.</li>
<li>The <code>.mkl</code> <strong>never</strong> names a provider or model — only <code>tier:</code> (ADR 0003).</li>
<li>Host tools are <strong>opaque names</strong> + <code>(dict) → str</code>. Do not promote search/bash/FS into language syntax.</li>
<li>Generic <strong>bash / filesystem</strong> stay <strong>out of core</strong> (console: bounded read-only workspace inspection plus <code>.mkl</code> authoring; production I/O = plugins or external host).</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">2. Authoring checklist (every machine)</h2><a id="user-content-2-authoring-checklist-every-machine" class="anchor" aria-label="Permalink: 2. Authoring checklist (every machine)" href="#2-authoring-checklist-every-machine"><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">Before shipping a <code>.mkl</code>:</p>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Schema header + <code>mklang: "0.4"</code> when using post-0.2 faces (<code>parse: list</code>, <code>parse: json</code>, <code>max_visits</code>, …).</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Every non-terminal state ends with <strong><code>when: otherwise</code></strong> (last).</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> At least one path reaches <strong><code>END</code></strong>; <code>budget</code> ≥ shortest path (+ headroom).</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Every <code>{{path}}</code> root is <code>context:</code>, a state <code>output:</code>, HITL <code>human.*</code>, or fan-out <code>item</code>/<code>index</code>.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Exact policy (amounts, allowlists, formats) uses <strong><code>hook:</code></strong>, not prose alone.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Real I/O uses <strong><code>tool:</code></strong> + top-level <code>tools:</code> declarations for documentation.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Time-sensitive machines declare <strong><code>today: ""</code></strong> (and <strong><code>now: ""</code></strong> for wall-clock) in <code>context:</code> and use <code>Today is {{today}}</code> / <code>Current local time is {{now}}</code> in prompts.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Irreversible actions sit behind <strong><code>escalate</code></strong> (and HITL in production).</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> <code>mklang check</code> clean; <code>mklang lint</code> clean (use <code>--strict</code> in CI).</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Scenario tests cover happy path <strong>and</strong> escape hatches (<code>mklang test</code>).</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" aria-label="Incomplete task"> Sticky policy lives in <strong><code>execution</code></strong> (system channel); turn data and
<code>{{…}}</code> live in <strong><code>prompt</code></strong> (user channel) — see §3.</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">3. Prompt assembly (system vs user)</h2><a id="user-content-3-prompt-assembly-system-vs-user" class="anchor" aria-label="Permalink: 3. Prompt assembly (system vs user)" href="#3-prompt-assembly-system-vs-user"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The reference interpreter builds LLM calls from language faces. There is <strong>no</strong>
<code>system:</code> keyword in the language. Map faces to channels:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Face / artifact</th>
<th>LLM channel</th>
<th>Interpolated?</th>
<th>Put here</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>structure</code></td>
<td><strong>system</strong> (produce)</td>
<td>No</td>
<td>Output contract / shape for this state</td>
</tr>
<tr>
<td><code>execution</code></td>
<td><strong>system</strong> (produce)</td>
<td>No</td>
<td>Sticky operational policy (never side effects)</td>
</tr>
<tr>
<td><code>prompt</code></td>
<td><strong>user</strong> (produce)</td>
<td><strong>Yes</strong> <code>{{…}}</code></td>
<td>This turn’s task + data — tainted values arrive <code>&lt;data-NONCE&gt;</code>-fenced (SPEC §6)</td>
</tr>
<tr>
<td><code>when:</code> conditions</td>
<td>judge <strong>user</strong></td>
<td>No (prose)</td>
<td>Gate selection only — stay bare (author-trusted)</td>
</tr>
<tr>
<td>Host <code>JUDGE_SYSTEM</code></td>
<td>judge <strong>system</strong></td>
<td>fixed</td>
<td>Choice protocol <code>{"choice": n}</code> — not authorable</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">The judge user payload always presents OUTPUT / REASONING / CONTEXT as fenced
data (shared <code>build_judge_user</code>, ADR 0025); the produce system message gains an
untrusted-data rule only when the user message actually carries a fence.</p>
<p dir="auto"><strong>Rules</strong></p>
<ol dir="auto">
<li><strong>Durable vs turn data.</strong> Role, hard constraints, “never invent search” →
<code>execution</code>. Instance values (<code>{{user_message}}</code>, <code>{{today}}</code>, <code>{{now}}</code>,
<code>{{history}}</code>, tool notes) → <code>prompt</code>.</li>
<li><strong>Do not put <code>{{…}}</code> in <code>structure</code> / <code>execution</code>.</strong> They are not rendered;
braces stay literal.</li>
<li><strong>Untrusted text stays out of system</strong> (user text, web snippets, history) —
SPEC §11. System is for host-stable contract + policy. In the user channel
the runtime additionally delimits tainted values structurally (SPEC §6) —
discipline and delimiting stack, they do not replace each other.</li>
<li><strong><code>execution</code> is not a tool.</strong> Side effects only via <code>tool:</code> states.</li>
<li><strong>Console brain</strong> follows the same split: policy in <code>execution</code>, clocks and
conversation in <code>prompt</code> (<a href="/gianlucamazza/mklang/blob/main/docs/guides/console.md">console</a>).</li>
</ol>
<p dir="auto"><strong>Anti-patterns:</strong> long persona only in <code>prompt</code>; search snippets in system;
inventing a <code>system:</code> field; using <code>execution: call the search tool</code>.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">4. Gates and reliability</h2><a id="user-content-4-gates-and-reliability" class="anchor" aria-label="Permalink: 4. Gates and reliability" href="#4-gates-and-reliability"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Do</th>
<th>Don't</th>
</tr>
</thead>
<tbody>
<tr>
<td>Put <strong>hooks above</strong> prose gates; keep <code>when</code> as the human-readable trace label</td>
<td>Ask the LLM to check <code>amount &lt;= 100</code></td>
</tr>
<tr>
<td>Cap <code>repair</code> at 1–2, then <code>escalate</code> or <code>fail</code></td>
<td>Open-ended repair-only states</td>
</tr>
<tr>
<td>Give escalate a <strong>safe sink</strong> state (human / fallback)</td>
<td>Fail closed only when that is truly required</td>
</tr>
<tr>
<td>Read <strong>trace</strong> (gate, <code>judge_fallback</code>, nested <code>call</code>) when debugging</td>
<td>Trust only the final <code>result</code> string</td>
</tr>
<tr>
<td>Use <code>reason: true</code> when the <em>why</em> must be auditable</td>
<td>Dump chain-of-thought into <code>output</code> / context</td>
</tr>
<tr>
<td>Quote any <code>when</code> that contains <code>#</code> / <code>##</code> (markdown headings)</td>
<td>Bare <code>## Section</code> in unquoted <code>when</code> (YAML truncates)</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto"><strong>Builtin / parametric hooks</strong> (no plugin): <code>always_true</code> / <code>always_false</code>,
<code>write_failed</code> (write_file observation failed), <code>eq:key:value</code> /
<code>neq:key:value</code> (string equality on a top-level context key). Put hooks <strong>above</strong>
prose batches so control-flow does not depend on a judge fallback.</p>
<p dir="auto">Gate judging <strong>follows the state tier</strong> by default. Use config <code>judge:</code> only when all gates are deliberately cheap classifications (SPEC §2.1). <code>judge: jev-latest</code> is an opt-in Noul-only host adapter (<a href="/gianlucamazza/mklang/blob/main/docs/adr/0037-jev-noul-host-judge.md">ADR 0037</a>, <a href="/gianlucamazza/mklang/blob/main/docs/guides/jev-noul-judge.md">guide</a>) — not the default, not a produce tier, never Choice.</p>
<p dir="auto">Optional: <code>mklang lint --llm</code> to probe overlapping prose <code>when</code> conditions (advisory; not CI-blocking). <code>mklang lint</code> also flags unquoted <code>#</code> inside raw <code>when</code> lines.</p>
<p dir="auto">The prose behind each of these rules — and everything else about tuning
reliability — is in <a href="/gianlucamazza/mklang/blob/main/docs/guides/patterns.md#reliability-gates-are-the-safety-net">Patterns</a>.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">5. Tools (host contracts)</h2><a id="user-content-5-tools-host-contracts" class="anchor" aria-label="Permalink: 5. Tools (host contracts)" href="#5-tools-host-contracts"><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">Input/output/enable contracts for the reference host tools (<code>search</code>,
<code>search_kb</code>, <code>send_reply</code>, the <code>list_files</code>/<code>read_file</code>/<code>write_file</code> data
tools, <code>calc</code>), the ADR 0020 observation envelope, and capability policy are
one page: the <a href="/gianlucamazza/mklang/blob/main/docs/reference/tools.md">host tool reference</a>. The rules that
belong on this checklist:</p>
<ul dir="auto">
<li>Observations are <strong>untrusted</strong> blackboard data (SPEC §11), fenced
automatically when interpolated (SPEC §6).</li>
<li>Side effects only via <strong><code>tool:</code></strong> states; declare expected tools under
top-level <code>tools:</code>; bind production implementations via entry points
(<code>mklang.tools</code> / <code>mklang.hooks</code>).</li>
<li>A stub <code>send_reply</code> is <strong>not</strong> delivery: live means <code>sent</code> true <strong>and</strong>
<code>stub</code> false. Never ask the model to confirm a side effect.</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">6. Web, time, and knowledge cutoff</h2><a id="user-content-6-web-time-and-knowledge-cutoff" class="anchor" aria-label="Permalink: 6. Web, time, and knowledge cutoff" href="#6-web-time-and-knowledge-cutoff"><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">Live or news-like questions fail in predictable ways if the machine relies on
model training data:</p>
<ul dir="auto">
<li><strong>Use <code>tool: search</code></strong> — ready-made as the <a href="/gianlucamazza/mklang/blob/main/docs/reference/stdlib.md"><code>std_research</code></a>
stdlib machine; never “search the web” only in prose.</li>
<li><strong>Declare <code>today: ""</code></strong> (and <strong><code>now: ""</code></strong> for wall-clock) and prompt with
<code>Today is {{today}}</code> / <code>Current local time is {{now}}</code> — the host fill
convention and key table are in <a href="/gianlucamazza/mklang/blob/main/docs/guides/patterns.md">Patterns</a>.</li>
<li><strong>Ground finalize in notes only</strong> (titles/URLs/<code>published_date</code>); explicitly
forbid filling gaps from pre-training; when the stub says search is unbound,
say so — do not fabricate hits.</li>
</ul>
<p dir="auto"><strong>Language note:</strong> there is no primitive that “disables knowledge cutoff.”
Discipline is host clock + tools + prose + gates.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">7. Output cutoff and context budgets (anti-cutoff)</h2><a id="user-content-7-output-cutoff-and-context-budgets-anti-cutoff" class="anchor" aria-label="Permalink: 7. Output cutoff and context budgets (anti-cutoff)" href="#7-output-cutoff-and-context-budgets-anti-cutoff"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li>A produce that hits its length stop is marked <code>truncated: true</code> in trace and
events (ADR 0018). Default policy <code>report</code> continues with partial text — never
treat a partial finalize as complete; use <code>--on-truncate halt</code> for strict runs.</li>
<li>Interpolation budgets end long values with <code>…[truncated]</code> (ADR 0017);
compress notes before the next loop (<code>research_compress.mkl</code>), and put
critical facts in <strong>state output</strong>, not only deep context.</li>
<li>The full tuning detail (<code>parse: list</code> halts on truncation, judge CONTEXT
caps, console observation fields) is in <a href="/gianlucamazza/mklang/blob/main/docs/guides/patterns.md">Patterns</a>.</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">8. Memory and composition</h2><a id="user-content-8-memory-and-composition" class="anchor" aria-label="Permalink: 8. Memory and composition" href="#8-memory-and-composition"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Situation</th>
<th>Practice</th>
</tr>
</thead>
<tbody>
<tr>
<td>Growing <code>accumulate</code> lists</td>
<td>Explicit <strong>compress</strong> generative state; do not rely on silent host summary</td>
</tr>
<tr>
<td>Plan → map</td>
<td>Planner uses <code>parse: list</code>; executor <code>over: "{{steps}}"</code></td>
</tr>
<tr>
<td>Pass lists into <code>call</code>/<code>tool</code></td>
<td>Whole-template <code>input: { x: "{{list}}" }</code> (0.3 raw resolution)</td>
</tr>
<tr>
<td>Reuse architecture</td>
<td>Prefer <strong><code>std_*</code></strong> (<code>call: std_refine</code>, …) over copy-paste</td>
</tr>
<tr>
<td>Host-dependent patterns</td>
<td>ReAct / router / hooks stay authored examples, not pure stdlib</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">9. Budgets and cost</h2><a id="user-content-9-budgets-and-cost" class="anchor" aria-label="Permalink: 9. Budgets and cost" href="#9-budgets-and-cost"><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"><code>budget</code> is steps, <code>--max-tokens</code> / <code>cost_budget</code> is spend (shared with <code>call</code>
children, partitioned across fan-out). Size the step budget to the worst case —
loops, repair headroom, fan-out width — and let <code>mklang check</code> reject the
infeasible ones. The sizing rules and the fan-out arithmetic are in
<a href="/gianlucamazza/mklang/blob/main/docs/guides/patterns.md">Patterns</a>; the normative semantics in SPEC §7.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">10. Testing and CI</h2><a id="user-content-10-testing-and-ci" class="anchor" aria-label="Permalink: 10. Testing and CI" href="#10-testing-and-ci"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Layer</th>
<th>Command</th>
<th>Role</th>
</tr>
</thead>
<tbody>
<tr>
<td>Schema + semantics</td>
<td><code>mklang check</code></td>
<td>Blocking shape/graph</td>
</tr>
<tr>
<td>Static smells</td>
<td><code>mklang lint</code> (<code>--strict</code> in CI)</td>
<td>Typos, dead gates, missing catch-alls</td>
</tr>
<tr>
<td>Prose gate overlap</td>
<td><code>mklang lint --llm</code></td>
<td>Advisory only</td>
</tr>
<tr>
<td>Path pinning</td>
<td><code>mklang test … --script …</code></td>
<td>No API keys; escape hatches</td>
</tr>
<tr>
<td>Language contract</td>
<td><code>pytest</code> + <code>conformance/</code></td>
<td>Interpreter semantics</td>
</tr>
<tr>
<td>Live smoke</td>
<td><code>MKLANG_LIVE=1 pytest tests/test_live.py</code></td>
<td>Opt-in providers</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">Keep <code>machine.test.yaml</code> beside the machine. Cover escalate, repair exhaustion, empty tool results, and search-unbound paths for web machines.</p>
<p dir="auto"><strong>Static checks are not behavioural correctness.</strong> <code>check</code> and <code>lint</code> prove a
machine is <em>well-formed</em>, not that it <em>does the right thing</em> — only a scenario
run exercises behaviour. This gap matters most for agent-authored machines
(console / MCP, ADR 0015): freeze a hand-written <code>*.test.yaml</code> acceptance
scenario before trusting one. Treat “check-clean” as a precondition for
testing, not a substitute.</p>
<p dir="auto"><strong>Console vs MCP authoring.</strong> The console can <code>write_machine</code> into a workspace
(with human overwrite consent); MCP has no persist tool (§11) — headless hosts
author and run inline. The console's authoring turn shares one step budget
across discover/run/author/repair/reply, so prefer tight authoring contracts
over lengthening the loop.</p>
<p dir="auto"><strong><code>escalate</code> is control-flow-critical.</strong> Prose escalate gates are
non-deterministic under provider and repeats; for production
page/approve/legal paths prefer <strong><code>--hitl</code></strong> or a <strong>code-hook gate</strong>, and keep
prose escalate for soft routing where an occasional mis-route is acceptable.
<code>mklang lint</code> emits an advisory <code>note:</code> on machines that use escalate.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">11. Security (SPEC §11) — operational minimum</h2><a id="user-content-11-security-spec-11--operational-minimum" class="anchor" aria-label="Permalink: 11. Security (SPEC §11) — operational minimum" href="#11-security-spec-11--operational-minimum"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li>Customer text, web snippets, workspace files, and tool observations are
<strong>injection-capable</strong>: they may be evidence, never new system policy,
capability grants, budgets, or registry definitions.</li>
<li>Tainted interpolations and the judge's OUTPUT/REASONING/CONTEXT are
<strong>automatically fenced</strong> (<code>&lt;data-NONCE&gt;</code>, SPEC §6 / ADR 0025). Fencing
prevents <em>confusion</em>, not <em>persuasion</em> — the next bullet still applies.</li>
<li><strong>Control-flow taint</strong> (SPEC §6 / ADR 0030): run production paths with
<code>--untrusted-flow halt</code> (equivalents on <code>run(...)</code>, MCP, and the console) and
classify your own tools with <code>tool_effects=</code> — an unclassified tool counts as
effectful. The fix for a finding is a <strong><code>hook:</code> gate or a fresh HITL
confirmation for that suspension</strong>, not a better prompt; a stale
<code>human.reply</code> in the blackboard does not confirm a later decision.</li>
<li>Checkpoints hold the <strong>full blackboard in plaintext</strong> (mode <code>0600</code> is a
floor, not encryption) — mind PII retention. No secrets in <code>.mkl</code> or
context; keys stay in host env / <code>.env</code>.</li>
<li>MCP is <strong>read-only to disk by design</strong> — no persist/write tool (ADR
0011/0013; the only disk write is an explicit per-call <code>checkpoint_path</code>).
The console's interactive guard model does not transfer to headless hosts.</li>
<li>Production hosts set <code>MKLANG_ALLOWED_PLUGINS=name1,name2</code> to allowlist
entry-point plugins; audit records redact credential-shaped values and never
contain full prompts or keys at default log levels.</li>
<li>Console tool <strong>consent</strong> is once per workspace-scoped session; <code>always yes</code>
is an explicit operator choice for low-risk prompts only — high-risk prompts
(egress, writes, irreversible, unknown tools) are always shown again
(<a href="/gianlucamazza/mklang/blob/main/docs/guides/console.md#security-model">console</a>).</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">12. Observability: trace vs events vs process logging</h2><a id="user-content-12-observability-trace-vs-events-vs-process-logging" class="anchor" aria-label="Permalink: 12. Observability: trace vs events vs process logging" href="#12-observability-trace-vs-events-vs-process-logging"><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">Three channels — do not merge them into one API.</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Channel</th>
<th>Purpose</th>
<th>Consumer</th>
<th>Persistence</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Run trace</strong></td>
<td>Semantic record: state, gate, policy, tokens, <code>truncated</code></td>
<td>Authors, tests, checkpoints</td>
<td><code>RunResult.trace</code>, checkpoint JSON</td>
</tr>
<tr>
<td><strong>Live events</strong></td>
<td>In-flight progress (<code>on_event</code>)</td>
<td>Console activity tree; MCP <code>mklang.event</code> (ADR 0019)</td>
<td>Ephemeral; console may append to <code>transcript.jsonl</code></td>
</tr>
<tr>
<td><strong>Process / ops logging</strong></td>
<td>Host diagnostics: adapter HTTP, retries, config, plugin errors</td>
<td>Operators, developers</td>
<td>stderr / host log file / future OTel</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Rules</h3><a id="user-content-rules" class="anchor" aria-label="Permalink: Rules" href="#rules"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ol dir="auto">
<li><strong>Trace is the source of truth</strong> for “what the machine did.” Events are a live
shadow of the same story, not a second semantic model (ADR 0019).</li>
<li><strong>Ops logging is host-only</strong> — never a face of the <code>.mkl</code>, never deposited on
the blackboard as “memory,” never a gate condition.</li>
<li><strong>No <code>tool: log</code> in core.</strong> Business audit that must be a side effect is a
named host tool with ADR 0020 envelope + consent — not free-form logging.</li>
<li><strong>Observer isolation.</strong> A failing log sink or event listener must not abort
the run (same rule as <code>on_event</code> / MCP forwarder).</li>
<li><strong>Secrets.</strong> Never log API keys. Prefer no full produce/judge bodies at
default levels; DEBUG only when explicitly enabled.</li>
<li><strong>Levels.</strong> The host logs on the <code>mklang.*</code> hierarchy (<code>mklang.registry</code>,
<code>mklang.fs</code>, <code>mklang.cli</code>, …) to stderr — <code>--log-level</code> or
<code>MKLANG_LOG_LEVEL</code>, default <code>warning</code>, format <code>LEVEL name: message</code> (no
timestamps; journald/CI add their own). <code>DEBUG</code> adapters/raw HTTP; <code>INFO</code>
coarse host lifecycle (e.g. the fs audit lines); <code>WARNING</code> plugin-load
failures, stub tools, truncation, <code>judge_fallback</code>; <code>ERROR</code> halts. Do
<strong>not</strong> INFO-log every state (events already cover that).</li>
<li><strong>Console separation.</strong> Conversation pane ≠ ops log. UI stays Rich/Markdown;
diagnostics go to stderr or a host log path.</li>
<li><strong>MCP.</strong> Keep <code>mklang.event</code> for run vocabulary only. Host stack traces use a
different logger name (e.g. <code>mklang.host</code>), not the event stream.</li>
<li><strong>OTel (optional, later).</strong> Spans are a <strong>projection</strong> of the trace for
platforms; they do not replace <code>RunResult.trace</code> (<a href="/gianlucamazza/mklang/blob/main/ROADMAP.md">ROADMAP</a>).</li>
</ol>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Anti-patterns</h3><a id="user-content-anti-patterns" class="anchor" aria-label="Permalink: Anti-patterns" href="#anti-patterns"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li><code>print()</code> in the engine; log-spam every token at INFO.</li>
<li>Putting log lines or file tails into context so gates “read the log.”</li>
<li>Overloading MCP logging notifications with host debug (breaks clients that
treat <code>mklang.event</code> as the run UI feed).</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">13. Filesystem: four classes, not one tool</h2><a id="user-content-13-filesystem-four-classes-not-one-tool" class="anchor" aria-label="Permalink: 13. Filesystem: four classes, not one tool" href="#13-filesystem-four-classes-not-one-tool"><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">Generic bash/FS stay <strong>out of core</strong>. When you need disk, pick the class:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Class</th>
<th>Examples</th>
<th>Where it lives</th>
<th>Controls</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>1. Host-owned paths</strong></td>
<td><code>runtime.yaml</code>, checkpoints, console session dir</td>
<td>CLI / host config</td>
<td>Operator-chosen paths; checkpoint mode <code>0600</code></td>
</tr>
<tr>
<td><strong>2. Workspace console</strong></td>
<td><code>list_workspace</code> / <code>read_workspace_file</code> / <code>search_workspace</code> (read-only) plus <code>write_machine</code> / <code>read_machine</code> (<code>.mkl</code>)</td>
<td>Console surface (ADR 0015)</td>
<td>Root defaults to the launch cwd and is injected as absolute <code>workspace_root</code>; <code>--workspace</code> overrides it; relative paths; reject escape, hidden/build/vendor/sensitive paths; bounded file/byte budgets; report truncation; confirm <code>.mkl</code> overwrite; project machines live in <code>machines/</code></td>
</tr>
<tr>
<td><strong>3. Machine data I/O</strong></td>
<td>Read CSV, write a report</td>
<td>Builtins <code>mklang.fs</code> (ADR 0024)</td>
<td>Workspace confinement, size/type limits, write grant, stub off-switch</td>
</tr>
<tr>
<td><strong>4. Arbitrary FS / shell</strong></td>
<td><code>rm</code>, bash, git</td>
<td><strong>Never core</strong>; explicit sandboxed plugin</td>
<td>Default off; high friction</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">The current host-owned paths (XDG roots, system layer, config and machine
resolution) are documented once, in <a href="/gianlucamazza/mklang/blob/main/docs/guides/install.md#host-layout">Installation</a> —
ADR 0021 records the decision history.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Rules for class 3 (data tools)</h3><a id="user-content-rules-for-class-3-data-tools" class="anchor" aria-label="Permalink: Rules for class 3 (data tools)" href="#rules-for-class-3-data-tools"><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">Implemented by <code>mklang.fs</code> (<code>list_files</code> / <code>read_file</code> / <code>write_file</code> —
contracts in the <a href="/gianlucamazza/mklang/blob/main/docs/reference/tools.md">tool reference</a>; ADR 0024). The
reference posture is the coding-tool workspace model: reads are live by default
under <code>--workspace</code> / <code>MKLANG_FS_ROOT</code> / cwd, disk writes need an explicit
grant (<code>--allow-write</code> / <code>MKLANG_FS_WRITE=1</code> / console consent).</p>
<ol dir="auto">
<li><strong>Names only in the <code>.mkl</code></strong> — <code>tool: read_file</code>, not path syntax in the language.</li>
<li><strong>Relative paths in tool input</strong>; host joins to the configured <strong>workspace</strong>
root; <code>..</code>, absolute paths, and dotfile segments never resolve.</li>
<li><strong>ADR 0020 envelope</strong> — <code>{tool, stub, error, …}</code>; <code>MKLANG_FS_BACKEND=stub</code>
forces the offline refusal tier.</li>
<li><strong>File bodies are untrusted observations</strong> (§11) — never in the produce
system channel.</li>
<li><strong>No recursive delete / shell in core.</strong> Destructive ops only as explicit
plugins with strong confirmation.</li>
<li><strong>Audit lightly</strong> — tool name + relative path + byte count at INFO; not
full file contents.</li>
<li><strong>Console stays non-IDE</strong> — read-only inspection plus <code>.mkl</code> authoring;
no generic write, shell, or git tools.</li>
</ol>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Large workspace analysis (ADR 0036)</h3><a id="user-content-large-workspace-analysis-adr-0036" class="anchor" aria-label="Permalink: Large workspace analysis (ADR 0036)" href="#large-workspace-analysis-adr-0036"><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">For large projects, use the console's metadata-only workspace index as the
structural inventory and read file bodies only when they are relevant to the
question. The index is persisted under the user state directory, is rebuilt
incrementally from visible file metadata, and never stores file contents.</p>
<ul dir="auto">
<li>Treat the index as a candidate map, not proof that a file was understood.</li>
<li>Rank and read relevant files progressively; do not inject an entire tree into
one prompt.</li>
<li>Report indexed, read, skipped, and truncated counts in the evidence brief.</li>
<li>A truncated index or search makes the analysis partial; never call it complete.</li>
<li>Keep secrets, hidden paths, build/vendor/cache trees, binaries, and databases
outside both the index and the model context.</li>
<li>Rebuild or invalidate the index when the canonical workspace root changes or
the manifest version is incompatible.</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Memory &amp; planning mapping</h3><a id="user-content-memory--planning-mapping" class="anchor" aria-label="Permalink: Memory &amp; planning mapping" href="#memory--planning-mapping"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">The class model gives machines the same memory layering native coding agents
use: working memory is the blackboard (<code>context</code> + <code>accumulate</code>, never on
disk); session state is checkpoints and console <code>state.json</code> (class 1, outside
the workspace); project memory (<code>AGENTS.md</code>-style files) and plans/reports the
machine produces are non-dotted workspace files (classes 2/3, writes behind
the grant). Host state is unreachable from class-3 tools by construction — the
dotfile ban makes the “session dir as data lake” anti-pattern structural.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Anti-patterns</h3><a id="user-content-anti-patterns-1" class="anchor" aria-label="Permalink: Anti-patterns" href="#anti-patterns-1"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<ul dir="auto">
<li>Language face <code>file:</code> / <code>$path</code> without ADR + conformance.</li>
<li><code>execution: write the result to disk</code>.</li>
<li>Widening <code>write_machine</code> to arbitrary extensions/paths.</li>
<li>Using session/transcript directories as a machine “data lake.”</li>
<li>Absolute paths from the model without canonicalize + root check.</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">14. Surfaces quick reference</h2><a id="user-content-14-surfaces-quick-reference" class="anchor" aria-label="Permalink: 14. Surfaces quick reference" href="#14-surfaces-quick-reference"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Surface</th>
<th>Best practice</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>CLI</strong></td>
<td><code>init</code> once, <code>doctor</code> when in doubt, then <code>check</code> → <code>lint</code> → <code>test</code> → <code>run</code>; <code>--on-truncate halt</code> for strict research; <code>--hitl</code> for human gates (auto-checkpoints; <code>--checkpoint</code> to choose the path); ops log on stderr when enabled</td>
</tr>
<tr>
<td><strong>MCP</strong></td>
<td>Commission by name/path/source; stream <strong>run</strong> events as <code>mklang.event</code> only; durable <code>checkpoint_path</code> for multi-process HITL; <strong>read-only to disk</strong> — author/validate/run inline, no persist tool (§11, ADR 0011/0013)</td>
</tr>
<tr>
<td><strong>Library / embed</strong></td>
<td>Prefer <a href="/gianlucamazza/mklang/blob/main/docs/guides/host-embedding.md"><code>host-embedding</code></a>: <code>prepare_*</code> → <code>run</code> → <code>build_output</code>; map <code>done</code>/<code>suspended</code>/<code>halt</code>; validate against <a href="/gianlucamazza/mklang/blob/main/schema/run-result.schema.json"><code>run-result.schema.json</code></a></td>
</tr>
<tr>
<td><strong>Console</strong></td>
<td>Prefer RUN of workspace/search machines for live facts; honor truncation fields; enable Tavily for web; workspace inspection is read-only and <code>.mkl</code> authoring is the only write path — the full contract, including cancellation and shutdown, is the <a href="/gianlucamazza/mklang/blob/main/docs/guides/console.md">Console guide</a></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">15. Language vs host: what may become language later</h2><a id="user-content-15-language-vs-host-what-may-become-language-later" class="anchor" aria-label="Permalink: 15. Language vs host: what may become language later" href="#15-language-vs-host-what-may-become-language-later"><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">Candidates for a future spec revision (need ADR + conformance) — <strong>not</strong> current practice requirements:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Candidate</th>
<th>Why it might become language</th>
</tr>
</thead>
<tbody>
<tr>
<td><del><code>parse: json</code></del></td>
<td><strong>Shipped in 0.4</strong> (ADR 0034) — object-shaped composition is <code>structure</code> + gates</td>
</tr>
<tr>
<td>Machine/state <code>on_truncate</code> policy</td>
<td>Portable anti-cutoff in the document</td>
</tr>
<tr>
<td>Context zones / pin (ADR 0017 L2)</td>
<td>Authorable trust zones — runtime provenance taint already ships (ADR 0025)</td>
</tr>
<tr>
<td>Per-gate <code>hitl:</code></td>
<td>Finer HITL than run-level</td>
</tr>
<tr>
<td>Budget split (steps vs fan-out width)</td>
<td>Clearer volume caps</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">Until then: use <strong>host policy + patterns + this checklist</strong>. Do <strong>not</strong> invent ad-hoc syntax outside the schema.</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>

