



  

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




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

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

  


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

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

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

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

  

  <script type="application/json" id="client-env">{"locale":"en","featureFlags":["actions_caches_react_shell","actions_enable_background_steps","actions_new_hosted_runner_image_select_sizes_and_versions","actions_runners_react_shell","activity_diff_file_tree","activity_repos_file_tree","activity_repos_overview_header","activity_repos_overview_sidebar","agent_author_search_expansion","agent_author_search_expansion_ui_pulls","alternate_user_config_repo","async_conversion_coverage_enabled","billing_billable_licenses_cost_center_bucket_fix","billing_budget_expiration","billing_cost_center_list_assigned_resources","billing_discount_threshold_notification","code_quality_enablement_banner_targeting","code_quality_remove_preview","code_view_raf_sticky_lines","codespaces_prebuild_region_target_update","coding_agent_third_party_model_ui","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_automation_repo_mcp_servers","copilot_automations_pagination","copilot_base_model_policy_row","copilot_chat_auto_mode_v2","copilot_chat_clear_model_selection_for_default_change","copilot_chat_early_task_provisioning","copilot_chat_persist_session_drafts","copilot_chat_vision_dotcom_chat_ga_gate","copilot_css_textarea_autosize","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_removal_on_marketplace","copilot_fix_failed_workflows_all_skus","copilot_hide_hovercard","copilot_immersive_task_hyperlinking","copilot_mc_cli_resume_any_users_task","copilot_mission_control_agent_merge_fix_ci","copilot_mission_control_agent_merge_resolve_conflicts","copilot_mission_control_awps_batching","copilot_mission_control_early_stop","copilot_mission_control_managed_sandbox_environments","copilot_mission_control_needs_attention","copilot_mission_control_reasoning_effort","copilot_mission_control_sandbox_remote_bypass","copilot_mission_control_task_alive_updates","copilot_mission_control_task_sharing","copilot_org_policy_page_focus_mode","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_swe_agent_authorization_status_ui","copilot_swe_agent_automation_resource_scoped_writes","copilot_swe_agent_discussion_comment_trigger","copilot_swe_agent_discussion_opened_trigger","copilot_swe_agent_discussion_updated_trigger","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_issue_assigned_trigger","copilot_swe_agent_issue_comment_trigger","copilot_swe_agent_issue_labeled_trigger","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_pull_request_assigned_trigger","copilot_swe_agent_pull_request_comment_trigger","copilot_swe_agent_pull_request_labeled_trigger","copilot_swe_agent_pull_request_merged_trigger","copilot_swe_agent_pull_request_opened_trigger","copilot_swe_agent_pull_request_ready_for_review_trigger","copilot_swe_agent_pull_request_review_requested_trigger","copilot_swe_agent_pull_request_review_submitted_trigger","copilot_swe_agent_pull_request_synchronize_trigger","copilot_swe_agent_sub_issue_added_trigger","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_task_scoped_alive_channel","copilot_token_based_billing","copilot_unconfigured_is_inherited","copilot_user_can_upgrade_plan_field","copilot_workbench_sunset_redirect","dashboard_agents_module_auth_token_check","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","fgpat_permissions_selector_redesign","glc_code_quality_repo_settings_workflow_config","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","in_product_messaging_datadog_monitoring","ipm_ubb_individual_budget_banner","issue_fields_multi_select","issue_inline_avatars","issue_pinned_views","issue_pinned_views_team_vs_personal","issue_relative_time_micro","issues_dashboard_sso_structured_errors","issues_expanded_file_types","issues_hide_closed_sub_issues","issues_index_data_router","issues_lazy_load_comment_box_suggestions","issues_react_chrome_container_query_fix","labels_archiving","labels_archiving_info","landing_pages_ninetailed","lifecycle_label_name_updates","marketing_cookie_consent_banner","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_queue_restricted_pushers_warning","merge_status_header_feedback","milestone_closed_issues_prioritization","milestone_show_data_router","octocaptcha_origin_optimization","primer_react_css_anchor_positioning","primer_react_merged_forwarded_refs","prs_copilot_app_open_action","prs_css_anchor_positioning","pull_request_copilot_attribution_header","pull_request_overview_merge_control","pull_request_overview_panel_edit_description","pull_request_persister","pull_request_stacks_navigation_shortcuts","pull_request_virtualization_image_estimate","pull_request_virtualization_loader_batching","pull_request_virtualization_scroll_compensation","pull_request_virtualization_scroll_intent","quick_search_lazy_suggestions","react_blob_isolate_code_lines","react_blob_ssr_content_visibility","react_data_router_tanstack_allowed","react_logged_out_repository_header","react_query_props_with_key","react_sandbox_future_tanstack","repo_app_turbo","repo_issues_sidebar_layout","repo_pulls_dashboard_declutter","repo_pulls_dashboard_ga","repo_pulls_dashboard_persistence","repo_pulls_dashboard_sidebar_links","repos_contributors_limited_default_range","review_involves_filter","rule_ignored_file_paths","rulesets_actor_list_editor","sample_network_conn_type","security_center_artifact_filters_popover","see_who_reacted","semantic_similarity_duplicate_issue_detection","session_logs_ungroup_reasoning_text","set_sha256_on_repo_creation_form","site_banner_desktop_copilot_app","site_ghca_pixel_mona","site_github_app_ga_page","site_github_app_ga_page_highlight","site_github_app_mobile_native_share","site_global_banner_dev_days_attendee","site_global_nav_spark_models_removed","speculation_rules_ui_service","suggest_custom_property_values_copilot","suppress_automated_browser_vitals","swp_forms_disable_octocaptcha","thread_resolution_reason","update_issue_suggestions","viewscreen_sandbox","warn_inaccessible_attachments","webp_support","workstream_plugin_bootstrap"],"githubDomain":"https://github.com","copilotApiOverrideUrl":"https://api.githubcopilot.com","cmcApiUrl":"https://api.github.com/cmc_internal/api"}</script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/high-contrast-cookie-b752d992928a526c.js"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-runtime-9f688730c8670bcd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-foundation-2f08c823163591a8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/app-runtime-633ad94fa06c334b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fetch-utilities-0fb4c544a797ec0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ser-7c872b58ac9f1b39.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tp-7e9817cf5c068979.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/environment-d5ac5c6c0ff82dad.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-runtime.bef03fb24bb03be8.module.css" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/catalyst-52ed81112a548e10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/selector-observer-e8810f64c443fb9b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/relative-time-element-0417f617ad744a0d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/by-9da36843ba9d191d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ja9-9a1160b939f2cd52.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3h-55903cf2303047ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hk-f1498fec45311acd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jz5-7aa1ff0a0e750f41.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hj-1d800d09e9a8720a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j0-9697c1c8f5cbf523.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/github-elements-82cb199fd0cf6516.js" defer="defer"></script>
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/element-registry-9bf553744fe18335.js" defer="defer"></script>
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/runtime-helpers-5e0b3ae3c4036207.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/aria-live-524a06aa946df6fc.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/hotkey-b1ee53c2200b172a.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/react-core-7bf7b9d689fe3d10.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a9-ca3bc10b816bcc1f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ur-21ec1e439ee2d87c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4t-4c39f7195fc42cc8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/pb-53cfff089eaac51b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6n-afcf86ccabc4cad2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zj-4d9cf83cf08e1643.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wo-6991af5b3829ffe8.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/nfv-a6c14301d3ea6d67.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b5-a2fde30ce0c692b9.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sw-9d0489dbf9a9c942.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ttf-7d5abe1b447ced2c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sj-c7a44023ee90d468.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0pd-c46d8dfae89c2b64.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/behaviors-2198390a7f5cea63.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/react-core.255cab819a92f7e1.module.css" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-menu-cea7728cfd2f3d62.js" defer="defer"></script>
  
  <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/primer-react-8503588299651923.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ncx-66e64888bc4615bb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/qmp-c7cfba40cf5a93b0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j6-148a74299e5a01ab.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t7l-a9404625ec30bbc7.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/4u-8f9f1d6be01d6a22.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/s0-68d09e5e8a80cb94.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y5-0cb3f75cec297941.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/n4u-cd9039ad946274ad.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/j8s-00bd469c4017a543.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/la-27679061f16e1495.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/iu-2d03f5e6d4fdd54d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gru-2b0fac8887ff8c57.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/a0-234e967e7c6d22ce.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gz3-5bdfbfceac967bb6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/15m-64f3034430471048.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/1e-c15441bdb94d54ae.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gzu-6ad9a0527a5d7afd.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bi-3a42b8714e06c4d0.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tu1-37e16844272ddefa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b1-ac66ededed061993.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/gmn-1e5497c041b66231.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/0l5-d1b2a63015b5eb6d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/c2-e85522be441acf73.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/f9-baf0a4193779952e.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/sp-87dce99c82a27004.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/zkm-116b01b8485bbe3f.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/og-518d12c9e011601d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/b9-947db365ea875cfa.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/14-8c7b4ad3c845664c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dsj-2e7d883cb843e9e6.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ec-38012819307fd539.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/du-6607da3b8b579202.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/20-f43eb09c2be69457.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ql0-107312645ac2b72d.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/wp-fa7cdc0f7656d876.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/p0l-fe491d943adf7508.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/v1e-d099d9fd21ad25e5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fn-7b298a45c55fb6fb.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7cw-6e493a20eaaa04b5.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ok-290e4b9465ba9c5b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/6d-ca6d584a0fd6368c.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/y8-e2f18f5a24733f3b.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xc-3fd4a2e7dcbad8e2.js" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/vjg-2874f95f389c4d3f.js" />
<script crossorigin="anonymous" type="module" src="https://github.githubassets.com/assets/code-view-2743729837dcb46b.js" defer="defer"></script>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.501e99879e15a48e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/xc.de2b1dde0494f261.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-view.11c24ad1d0aa48bd.module.css" />


  <title>Kontext/SPEC.md at main · MFS-code/Kontext · 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:b51e2640-962f-3436-4738-23c0e882a078">

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


  <meta name="request-id" content="D45C:2DA7AA:BCE653:B3E1CF:6AC776CC" data-pjax-transient="true"/><meta name="html-safe-nonce" content="11854a827a5e240efd473ba19a08c63c2680b26be70626d14c0299d7021913b1" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJENDVDOjJEQTdBQTpCQ0U2NTM6QjNFMUNGOjZBQzc3NkNDIiwidmlzaXRvcl9pZCI6IjQ3MjE4MzQ1NzUzOTg0MDE3NDAiLCJyZWdpb25fZWRnZSI6ImZyYSIsInJlZ2lvbl9yZW5kZXIiOiJmcmEifQ==" data-pjax-transient="true"/><meta name="visitor-hmac" content="a505af3a91a5536f4c84f91ebe004e5a5ff09a718319fb3c1a8b2daec5d13813" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:1221165054" 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="Kubernetes-native control plane for running, governing, and observing AI agents as production workloads - Kontext/SPEC.md at main · MFS-code/Kontext">

      <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/MFS-code/Kontext/blob/main/SPEC.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/fdd0bd6b92174635c73fcf7ec83bfb17fca38ee8ec150bd7cf6685a093a45749/MFS-code/Kontext" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="Kontext/SPEC.md at main · MFS-code/Kontext" /><meta name="twitter:description" content="Kubernetes-native control plane for running, governing, and observing AI agents as production workloads - MFS-code/Kontext" />
  <meta property="og:image" content="https://opengraph.githubassets.com/fdd0bd6b92174635c73fcf7ec83bfb17fca38ee8ec150bd7cf6685a093a45749/MFS-code/Kontext" /><meta property="og:image:alt" content="Kubernetes-native control plane for running, governing, and observing AI agents as production workloads - MFS-code/Kontext" /><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="Kontext/SPEC.md at main · MFS-code/Kontext" /><meta property="og:url" content="https://github.com/MFS-code/Kontext/blob/main/SPEC.md" /><meta property="og:description" content="Kubernetes-native control plane for running, governing, and observing AI agents as production workloads - MFS-code/Kontext" />
  




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



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


  <meta http-equiv="x-pjax-version" content="e522098cd81ce3951f93d525f1bab680d96d458ceaa79f4334f1a1acbd31325a" data-turbo-track="reload">
  <meta http-equiv="x-pjax-csp-version" content="c4a65e47b0c850e1157ae8e66298070851d7e3b558038de5a3b4ff7a93e630ed" data-turbo-track="reload">
  <meta http-equiv="x-pjax-css-version" content="1ff3f1d4e1abd61f6f135b47d3b815e2f7169f8dd418f0118c6b1cf4de6cbc86" data-turbo-track="reload">
  <meta http-equiv="x-pjax-js-version" content="df1876f47a5ef2fa7fbfc80778d9090e7c16f6a2e8185c3ff473153a18e2b7c0" 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/MFS-code/Kontext git https://github.com/MFS-code/Kontext.git">

  <meta name="octolytics-dimension-user_id" content="56933863" /><meta name="octolytics-dimension-user_login" content="MFS-code" /><meta name="octolytics-dimension-repository_id" content="1221165054" /><meta name="octolytics-dimension-repository_nwo" content="MFS-code/Kontext" /><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="1221165054" /><meta name="octolytics-dimension-repository_network_root_nwo" content="MFS-code/Kontext" />
  



    

    <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="1d3d325175b005a7dd92cb845d32b422a23095f3" data-turbo-track="reload">
  <meta name="ui-target" content="full">

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

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


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

  </head>

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

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

      <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full">
    <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span>
</span>      
      <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/qc-1bbbe8787ea1cd4b.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-f8c407e82ebe6fc9.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/keyboard-shortcuts-dialog.81950090fc5b508a.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-1dd5a92ada6adeee.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/app-install-banner-partial.2ba9251ec6f3a018.module.css" />

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


          

                <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2l-e468179ba7123a2e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/rwd-069fc3d9814ff9fe.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/fz-e662bc3745e171e7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/jag-3559ee48016881a2.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/3d-7f22b36f29a9dd94.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/tua-4998592d21eb16f7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/8i-756d611a52e5f265.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/marketing-header-fa45fa8444a09065.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-brand-css.05b219cdb8e80c43.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/8i.779dd52a6bc5b0b6.module.css" />

<react-partial
  partial-name="marketing-header"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2FMFS-code%2FKontext%2Fblob%2Fmain%2FSPEC.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=MFS-code%2FKontext","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/MFS-code/Kontext/blob/main/SPEC.md\",\"user_id\":null}}","auth_hydro_click_hmac":"2414ec8c15d2a559a162020ccd16f67fcc70da5e979f358e2d015d83cd9ae671","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%2FMFS-code%2FKontext%2Fblob%2Fmain%2FSPEC.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/MFS-code/Kontext/blob/main/SPEC.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="2414ec8c15d2a559a162020ccd16f67fcc70da5e979f358e2d015d83cd9ae671"><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%2FMFS-code%2FKontext%2Fblob%2Fmain%2FSPEC.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/MFS-code/Kontext/blob/main/SPEC.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="2414ec8c15d2a559a162020ccd16f67fcc70da5e979f358e2d015d83cd9ae671"><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=MFS-code%2FKontext" 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/MFS-code/Kontext/blob/main/SPEC.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="2414ec8c15d2a559a162020ccd16f67fcc70da5e979f358e2d015d83cd9ae671"><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-bc5b0fc5-9fac-4029-b248-ba43a2d45c63" aria-labelledby="tooltip-ab60f8f9-081a-4284-a700-714af9cc8e18" 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-ab60f8f9-081a-4284-a700-714af9cc8e18" for="icon-button-bc5b0fc5-9fac-4029-b248-ba43a2d45c63" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

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








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






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

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


    






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








  

    <link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ym-1a7ce813a378e1f7.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/mn-bb458474353a279e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/t5-26d19272bbf73ca3.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/2d5-9abb2f6ba5c935d0.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/24-b11e1c4108322883.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/mrn-12afac2ecd2be980.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/dgq-bbf7670f9cdba2e0.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/7w-740b4e942974ccba.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/we-c9f93392098ad6c9.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/775-5adcc74216a7c5ae.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/bn-fcef0645a47703fc.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/xgw-6c6cb7b2ed77f52e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/ge-ca1c0ba8656f9680.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/9f-e543bc691db8262e.js" fetchpriority="low" />
<link crossorigin="anonymous" rel="modulepreload" href="https://github.githubassets.com/assets/global-nav-bar-ce0c7963290f892b.js" fetchpriority="low" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react-css.e4334163c54cccf5.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/ql0.501e99879e15a48e.module.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-nav-bar.f20205647191e018.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":"MFS-code","is_root":false,"href":"/MFS-code"},{"crumb_type":"repository","label":"Kontext","is_root":false,"href":"/MFS-code/Kontext"}],"localNavigation":[{"id":"code","icon":"code","label":"Code","href":"/MFS-code/Kontext","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":"/MFS-code/Kontext/issues","selectedLinks":["repo_issues","repo_labels","repo_milestones"],"count":0,"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":"/MFS-code/Kontext/pulls","selectedLinks":["repo_pulls","checks"],"count":0,"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":"/MFS-code/Kontext/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":"/MFS-code/Kontext/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":"/MFS-code/Kontext/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":"/MFS-code/Kontext/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:MFS-code/Kontext","current_repo_name":"Kontext","current_repo_nwo":"MFS-code/Kontext","user_id":"MFS-code"}},"commandPalette":null,"enterpriseBar":{"show":false},"globalTransactionalMessage":[],"payloadsUrl":"/_global-navigation/payloads.json?can_toggle_site_admin_and_employee_status=0\u0026is_admin_mode_on=0\u0026is_ui_opted_out=0\u0026show_ui_opt_out=0\u0026v=6","contextRegionUrl":"/_global-navigation/context-region.json"}}</script>
  <div data-target="react-partial.reactRoot"><header aria-label="Global navigation menu" data-component="Stack" class="GlobalNav styles-module__appHeader__YzYWk prc-Stack-Stack-UQ9k6" data-gap="none" data-direction="vertical" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="none"><div data-component="Stack" class="prc-Stack-Stack-UQ9k6" data-direction="horizontal" data-align="center" data-wrap="nowrap" data-justify="center" data-padding="none"><div data-testid="top-nav-center" data-component="Stack" class="styles-module__center__R3QRv styles-module__withLocalNavigation__rjTJ_ GlobalNavBar-module__loggedOut__Jv1rk prc-Stack-Stack-UQ9k6" data-gap="condensed" data-direction="horizontal" data-align="stretch" data-wrap="nowrap" data-justify="start" data-padding="normal"><nav class="styles-module__contextRegion__VbSp2 prc-Breadcrumbs-BreadcrumbsBase-3Gb-B" aria-label="Breadcrumbs" data-overflow="menu" data-variant="normal" data-component="Breadcrumbs"><ol class="prc-Breadcrumbs-BreadcrumbsList-BKjpe"><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/MFS-code" data-discover="true"><span class="">MFS-code</span></a></li><li class="prc-Breadcrumbs-ItemWrapper-k0NLn"><a class="styles-module__contextCrumb__IzGIq prc-Breadcrumbs-Item-jcraJ" data-component="Breadcrumbs.Item" href="/MFS-code/Kontext" data-discover="true"><span class="styles-module__contextCrumbLast__tI2e3">Kontext</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="/MFS-code/Kontext" 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="/MFS-code/Kontext/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></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="/MFS-code/Kontext/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></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="/MFS-code/Kontext/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="/MFS-code/Kontext/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="/MFS-code/Kontext/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="/MFS-code/Kontext/pulse" data-discover="true"><span data-component="icon"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-graph" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg></span><span data-component="text" data-content="Insights">Insights</span></a></li></ul><div class="prc-UnderlineNav-MoreButtonContainer-Dnrq6"><div class="prc-UnderlineNav-MoreButtonDivider-dN0a-"></div><button data-component="overflow-menu-button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk prc-UnderlineNav-MoreButton-Y8soj" data-loading="false" data-size="medium" data-variant="invisible" id="_R_2ktl_"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3"><span>More<span class="prc-src-InternalVisuallyHidden-2YaI6"> items</span></span></span></span><span data-component="trailingAction" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></button></div></nav><div class="d-none"></div></header></div>
</react-partial>


  



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



    
      
    








<react-app
  app-name="code-view"
  initial-path="/MFS-code/Kontext/blob/main/SPEC.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":"Kontext API specification (v1alpha1)","anchor":"kontext-api-specification-v1alpha1","htmlText":"Kontext API specification (v1alpha1)"},{"level":2,"text":"Mental model (map to core Kubernetes)","anchor":"mental-model-map-to-core-kubernetes","htmlText":"Mental model (map to core Kubernetes)"},{"level":2,"text":"Agent","anchor":"agent","htmlText":"Agent"},{"level":3,"text":"spec","anchor":"spec","htmlText":"spec"},{"level":3,"text":"status","anchor":"status","htmlText":"status"},{"level":3,"text":"ScheduleSpec","anchor":"schedulespec","htmlText":"ScheduleSpec"},{"level":3,"text":"Agent condition reasons","anchor":"agent-condition-reasons","htmlText":"Agent condition reasons"},{"level":2,"text":"AgentRun","anchor":"agentrun","htmlText":"AgentRun"},{"level":3,"text":"spec","anchor":"spec-1","htmlText":"spec"},{"level":3,"text":"Referenced invocation and resolution","anchor":"referenced-invocation-and-resolution","htmlText":"Referenced invocation and resolution"},{"level":3,"text":"status","anchor":"status-1","htmlText":"status"},{"level":3,"text":"Ownership","anchor":"ownership","htmlText":"Ownership"},{"level":3,"text":"Contract evolution policy","anchor":"contract-evolution-policy","htmlText":"Contract evolution policy"},{"level":2,"text":"Runtime image contract","anchor":"runtime-image-contract","htmlText":"Runtime image contract"},{"level":3,"text":"Inputs","anchor":"inputs","htmlText":"Inputs"},{"level":3,"text":"Input — Service warm delivery","anchor":"input--service-warm-delivery","htmlText":"Input — Service warm delivery"},{"level":3,"text":"Output — logs and execution events","anchor":"output--logs-and-execution-events","htmlText":"Output — logs and execution events"},{"level":3,"text":"Output — result","anchor":"output--result","htmlText":"Output — result"},{"level":3,"text":"Optional result reporter","anchor":"optional-result-reporter","htmlText":"Optional result reporter"},{"level":3,"text":"Runtime roles","anchor":"runtime-roles","htmlText":"Runtime roles"},{"level":3,"text":"Maintained reference runtime","anchor":"maintained-reference-runtime","htmlText":"Maintained reference runtime"},{"level":3,"text":"Mode expectations for the image","anchor":"mode-expectations-for-the-image","htmlText":"Mode expectations for the image"},{"level":2,"text":"Anti-overfit firewall (read before adding a field)","anchor":"anti-overfit-firewall-read-before-adding-a-field","htmlText":"Anti-overfit firewall (read before adding a field)"}]},"issueTemplate":null,"discussionTemplate":null,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n  \u003ctbody\u003e\n  \u003ctr\u003e\n    \u003cth\u003etitle\u003c/th\u003e\n    \u003ctd\u003eAPI specification\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003edescription\u003c/th\u003e\n    \u003ctd\u003eAgent, AgentRun, and runtime-image contract for kontext.dev/v1alpha1.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003esidebarTitle\u003c/th\u003e\n    \u003ctd\u003eAPI spec\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eKontext API specification (\u003ccode\u003ev1alpha1\u003c/code\u003e)\u003c/h1\u003e\u003ca id=\"user-content-kontext-api-specification-v1alpha1\" class=\"anchor\" aria-label=\"Permalink: Kontext API specification (v1alpha1)\" href=\"#kontext-api-specification-v1alpha1\"\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\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eThis is the published \u003ccode\u003ev1alpha1\u003c/code\u003e API and runtime-image contract. Kontext\nremains a general agent runtime. Application-specific vocabulary and behavior\nbelong in the consumer's runtime image, not the control plane.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eKontext exposes two custom resources and one runtime-image contract.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eAgent\u003c/code\u003e — the reusable \u003cstrong\u003edefinition / desired state\u003c/strong\u003e of an agent.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eAgentRun\u003c/code\u003e — one bounded, auditable \u003cstrong\u003eexecution\u003c/strong\u003e of an agent. It either owns\none Pod or is delivered to a standing Service runtime.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRuntime image contract\u003c/strong\u003e — how any container becomes a Kontext agent.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eAPI group/version: \u003ccode\u003ekontext.dev/v1alpha1\u003c/code\u003e (alpha on purpose — the shape is allowed to evolve).\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMental model (map to core Kubernetes)\u003c/h2\u003e\u003ca id=\"user-content-mental-model-map-to-core-kubernetes\" class=\"anchor\" aria-label=\"Permalink: Mental model (map to core Kubernetes)\" href=\"#mental-model-map-to-core-kubernetes\"\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\u003eKontext\u003c/th\u003e\n\u003cth\u003eCore Kubernetes analogue\u003c/th\u003e\n\u003cth\u003eBehavior\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eAgent\u003c/code\u003e mode \u003ccode\u003eService\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eDeployment\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eAlways-on. Controller keeps one live \u003ccode\u003eAgentRun\u003c/code\u003e; re-casts on exit/failure.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eAgent\u003c/code\u003e mode \u003ccode\u003eTask\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ereusable task template\u003c/td\u003e\n\u003ctd\u003eCreating the Agent does not execute it. A user creates a named, sparse \u003ccode\u003eAgentRun\u003c/code\u003e referencing it to trigger work.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eAgent\u003c/code\u003e mode \u003ccode\u003eScheduled\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eCronJob\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eMints one-shot \u003ccode\u003eAgentRun\u003c/code\u003es from standard five-field cron slots.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eAgentRun\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003ePod\u003c/code\u003e / \u003ccode\u003eJob\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe single auditable execution unit. Owns one Pod unless warm-delivered to a standing Service runtime. Holds \u003ccode\u003estatus.result\u003c/code\u003e, usage, immutable spec.\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\u003ccode\u003eAgentRun\u003c/code\u003e is the execution record every mode reuses. The \u003ccode\u003eAgent\u003c/code\u003e controller\nmanages standing Service and Scheduled \u003ccode\u003eAgentRun\u003c/code\u003es the way\n\u003ccode\u003eDeployment\u003c/code\u003e/\u003ccode\u003eCronJob\u003c/code\u003e manage their children. Users may also create referenced\nruns to invoke Task Agents or warm-delivery-enabled Service Agents.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003eAgent\u003c/code\u003e\u003c/h2\u003e\u003ca id=\"user-content-agent\" class=\"anchor\" aria-label=\"Permalink: Agent\" href=\"#agent\"\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 reusable definition. Cluster-namespaced. Has a status subresource.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003espec\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-spec\" class=\"anchor\" aria-label=\"Permalink: spec\" href=\"#spec\"\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\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eReq\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emode\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eenum \u003ccode\u003eTask\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eService\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eScheduled\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eyes\u003c/td\u003e\n\u003ctd\u003eContainer image implementing the runtime contract.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.command\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eOverride entrypoint.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.args\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.result\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eOptional stdout result capture policy.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.delivery\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eService-only opt-in to warm HTTP delivery. Requires \u003ccode\u003eport\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.securityContext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003erestricted security context\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003ePortable non-root, capability-drop, filesystem, and seccomp settings.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egoal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno*\u003c/td\u003e\n\u003ctd\u003eConcrete execution goal. Required for \u003ccode\u003eService\u003c/code\u003e/\u003ccode\u003eScheduled\u003c/code\u003e; exactly one of \u003ccode\u003egoal\u003c/code\u003e or \u003ccode\u003egoalTemplate\u003c/code\u003e is required for \u003ccode\u003eTask\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egoalTemplate\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eParameterized invocation goal for \u003ccode\u003eTask\u003c/code\u003e or a warm-delivery-enabled \u003ccode\u003eService\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprovider\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eDefault \u003ccode\u003eanthropic\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emodel\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eyes\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etools\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eDeclared tool allowlist (semantics live in the runtime image).\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebudget.tokens\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint ≥ 1\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebudget.wallclock\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eduration string\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003ee.g. \u003ccode\u003e5m\u003c/code\u003e. Enforced by controller.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebudget.dollars\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber ≥ 0\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esecretRef.name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eProvider credentials Secret.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eknowledgeConfigMapRef.name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eStatic ConfigMap context mounted read-only at \u003ccode\u003e/kontext/knowledge\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eserviceAccountName\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003ePer-agent identity.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenv\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]EnvVar\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eExtra literal or Secret-backed env passed to the Pod.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eschedule\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eScheduleSpec\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eno*\u003c/td\u003e\n\u003ctd\u003eRequired and allowed only for \u003ccode\u003eScheduled\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebackoff\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eRe-cast backoff policy for \u003ccode\u003eService\u003c/code\u003e. Controller-defaulted.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003erequired depending on \u003ccode\u003emode\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eA Service Agent always has a concrete \u003ccode\u003egoal\u003c/code\u003e for its standing runtime. Without\n\u003ccode\u003eruntime.delivery\u003c/code\u003e, it forbids \u003ccode\u003egoalTemplate\u003c/code\u003e and preserves the original\nlong-running behavior. Opting into warm delivery requires both\n\u003ccode\u003eruntime.delivery.port\u003c/code\u003e and \u003ccode\u003egoalTemplate\u003c/code\u003e: \u003ccode\u003egoal\u003c/code\u003e starts the standing runtime,\nwhile \u003ccode\u003egoalTemplate\u003c/code\u003e resolves each referenced user-created \u003ccode\u003eAgentRun\u003c/code\u003e.\n\u003ccode\u003eruntime.delivery.port\u003c/code\u003e is an integer from 1 through 65535. Task and Scheduled\nAgents cannot configure \u003ccode\u003eruntime.delivery\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003estatus\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-status\" class=\"anchor\" aria-label=\"Permalink: status\" href=\"#status\"\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\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econditions\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]Condition\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eReady\u003c/code\u003e, \u003ccode\u003eProgressing\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecurrentRunName\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eService\u003c/code\u003e: the live run.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elastRunName\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eTask\u003c/code\u003e: newest retained owned run by creation time. \u003ccode\u003eScheduled\u003c/code\u003e: newest retained owned run by slot; empty when no child is retained.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erunsCreated\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eTask\u003c/code\u003e: current retained owned-run count. \u003ccode\u003eScheduled\u003c/code\u003e: monotonic creation sequence. \u003ccode\u003eService\u003c/code\u003e: monotonic standing-run suffix; delivered runs are excluded.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003erestarts\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eService\u003c/code\u003e: re-cast count.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003elastScheduleTime\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etimestamp\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eScheduled\u003c/code\u003e: latest observed slot that minted a run; retained after child pruning.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enextScheduleTime\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etimestamp\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eScheduled\u003c/code\u003e: next slot the controller will evaluate.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eobservedGeneration\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003eScheduleSpec\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-schedulespec\" class=\"anchor\" aria-label=\"Permalink: ScheduleSpec\" href=\"#schedulespec\"\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\u003eScheduled\u003c/code\u003e requires a concrete \u003ccode\u003espec.goal\u003c/code\u003e. Its schedule fields are:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eDefault\u003c/th\u003e\n\u003cth\u003eContract\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eexpression\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003erequired\u003c/td\u003e\n\u003ctd\u003eStandard five-field minute/hour/day-of-month/month/day-of-week cron. Descriptors and seconds are rejected.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etimeZone\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eIANA name\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eEtc/UTC\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eThe expression cannot embed \u003ccode\u003eTZ\u003c/code\u003e or \u003ccode\u003eCRON_TZ\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econcurrencyPolicy\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eAllow\u003c/code\u003e or \u003ccode\u003eForbid\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eForbid\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eForbid\u003c/code\u003e treats Pending and Running owned runs as active. \u003ccode\u003eReplace\u003c/code\u003e is not supported.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estartingDeadlineSeconds\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enon-negative int\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e60\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eA late slot is eligible only within this duration.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esuspend\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ebool\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003ePrevents new runs. Resuming waits for the next future slot.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esuccessfulRunsHistoryLimit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enon-negative int\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e3\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCompleted successful children retained.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003efailedRunsHistoryLimit\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enon-negative int\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003e1\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCompleted failed or budget-exceeded children retained.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eAfter controller downtime, only the latest due slot is considered. It is\ncreated when still inside the starting deadline; older slots are skipped and\nnever burst-backfilled. A skipped \u003ccode\u003eForbid\u003c/code\u003e overlap is not queued. Any Agent\ngeneration change resets the scheduling anchor to the current time and waits\nfor the next future slot.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRun names are derived from the scheduled slot, not reconciliation wall-clock\ntime. Creation is idempotent across retries and leader changes. Completed\nhistory is pruned independently by outcome, active runs are never pruned, and\nAgent ownership gives all children normal Kubernetes deletion cascading.\n\u003ccode\u003ecurrentRunName\u003c/code\u003e, \u003ccode\u003erestarts\u003c/code\u003e, and Service backoff remain Service-only.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTask and Scheduled status intentionally use different counting semantics. For\nTask, deleting an owned run immediately decreases \u003ccode\u003erunsCreated\u003c/code\u003e; deleting the\nnewest run moves \u003ccode\u003elastRunName\u003c/code\u003e to the next newest retained child, and deleting\nall owned runs clears it. Creation timestamp determines Task recency, with\nlexically greater run name as the deterministic tie-breaker. For Scheduled,\neach new run receives an increasing sequence. \u003ccode\u003erunsCreated\u003c/code\u003e never decreases\nwhen history pruning or a user deletes a child. \u003ccode\u003elastRunName\u003c/code\u003e remains a live\nreference and can move or clear as retained history changes.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAgent condition reasons\u003c/h3\u003e\u003ca id=\"user-content-agent-condition-reasons\" class=\"anchor\" aria-label=\"Permalink: Agent condition reasons\" href=\"#agent-condition-reasons\"\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 controller publishes \u003ccode\u003eReady\u003c/code\u003e and \u003ccode\u003eProgressing\u003c/code\u003e conditions with these\nmode-specific reasons:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eTask: \u003ccode\u003eTemplateReady\u003c/code\u003e and \u003ccode\u003eIdle\u003c/code\u003e for a valid template;\n\u003ccode\u003eInvalidTemplate\u003c/code\u003e when invocations are blocked by template validation.\u003c/li\u003e\n\u003cli\u003eScheduled: \u003ccode\u003eScheduleInitialized\u003c/code\u003e, \u003ccode\u003eScheduleUpdated\u003c/code\u003e,\n\u003ccode\u003eWaitingForSchedule\u003c/code\u003e, \u003ccode\u003eRunCreated\u003c/code\u003e, \u003ccode\u003eSuspended\u003c/code\u003e, \u003ccode\u003eMissedDeadline\u003c/code\u003e,\n\u003ccode\u003eOverlapSkipped\u003c/code\u003e, and \u003ccode\u003eInvalidSchedule\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eService: \u003ccode\u003eRecasting\u003c/code\u003e, \u003ccode\u003eRunActive\u003c/code\u003e, and \u003ccode\u003eMissingGoal\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eUnknown stored mode values: \u003ccode\u003eInvalidMode\u003c/code\u003e. The CRD enum rejects unknown\nvalues on normal writes.\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\"\u003e\u003ccode\u003eAgentRun\u003c/code\u003e\u003c/h2\u003e\u003ca id=\"user-content-agentrun\" class=\"anchor\" aria-label=\"Permalink: AgentRun\" href=\"#agentrun\"\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\"\u003eOne bounded execution. It maps to exactly one owned Pod unless \u003ccode\u003espec.delivery\u003c/code\u003e\nmarks it for a standing Service runtime. \u003cstrong\u003eSpec is immutable after creation\u003c/strong\u003e\n(snapshot semantics) so a run is self-contained and auditable.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003espec\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-spec-1\" class=\"anchor\" aria-label=\"Permalink: spec\" href=\"#spec-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\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eReq\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eagentRef.name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eOwning \u003ccode\u003eAgent\u003c/code\u003e. CREATE admission treats a sparse user-created reference as an explicit Task or Service invocation. Omitted = standalone ad-hoc run.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eparameters\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003emap[string]string\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eImmutable invocation parameters retained with the resolved snapshot. Requires \u003ccode\u003eagentRef\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003edelivery.port\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eImmutable Service warm-delivery marker and port snapshot. Admission-controlled; requires \u003ccode\u003eagentRef\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003egoal\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eyes\u003c/td\u003e\n\u003ctd\u003eConcrete, fully-resolved goal.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eprovider\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eResolved from Agent at creation.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emodel\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eyes\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003etools\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ebudget\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eResolved snapshot.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esecretRef.name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eknowledgeConfigMapRef.name\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eStatic ConfigMap context mounted read-only at \u003ccode\u003e/kontext/knowledge\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eserviceAccountName\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eenv\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]EnvVar\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eResolved literal or Secret-backed env snapshot.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.image\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eyes\u003c/td\u003e\n\u003ctd\u003eResolved from Agent.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.command\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eRequired when stdout capture is configured.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.args\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]string\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eAppended to the declared command.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.result\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eOptional stdout result capture policy.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.delivery\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eobject\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003eResolved runtime capability snapshot; \u003ccode\u003espec.delivery\u003c/code\u003e determines this run's lifecycle.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eruntime.securityContext\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003erestricted security context\u003c/td\u003e\n\u003ctd\u003eno\u003c/td\u003e\n\u003ctd\u003ePortable non-root, capability-drop, filesystem, and seccomp settings.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eWhen created from an \u003ccode\u003eAgent\u003c/code\u003e, execution fields are snapshotted so the run does\nnot drift if the \u003ccode\u003eAgent\u003c/code\u003e changes later. The Service and Scheduled controllers\ncreate fully resolved Pod-owning runs. Admission adds \u003ccode\u003edelivery\u003c/code\u003e only to sparse\ninvocations of warm-delivery-enabled Service Agents; this immutable field is\nthe lifecycle discriminator and prevents a delivered run from being mistaken\nfor the Service's standing run. Standalone runs provide a complete execution\nspec directly.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eReferenced invocation and resolution\u003c/h3\u003e\u003ca id=\"user-content-referenced-invocation-and-resolution\" class=\"anchor\" aria-label=\"Permalink: Referenced invocation and resolution\" href=\"#referenced-invocation-and-resolution\"\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\"\u003eCreating a Task \u003ccode\u003eAgent\u003c/code\u003e never starts work. A user explicitly triggers it by\nsubmitting a user-named \u003ccode\u003eAgentRun\u003c/code\u003e whose \u003ccode\u003espec.agentRef.name\u003c/code\u003e names that Task\nAgent. Runs may be submitted concurrently; there is no generated-name or\nsingle-active-run restriction. A user invokes a warm-delivery-enabled Service\nAgent with the same sparse \u003ccode\u003eAgentRun\u003c/code\u003e shape. Service Agents without\n\u003ccode\u003eruntime.delivery\u003c/code\u003e reject referenced invocations. Names matching the referenced\nService Agent followed by a canonical positive integer, such as \u003ccode\u003eowner-1\u003c/code\u003e, are\nused for the controller's standing runs, so user invocations with those names\nare rejected.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eA referenced invocation request is sparse: it may contain only \u003ccode\u003eagentRef\u003c/code\u003e and\noptional \u003ccode\u003eparameters\u003c/code\u003e. Kubernetes\n\u003ca href=\"https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/\" rel=\"nofollow\"\u003einvokes mutating admission first\u003c/a\u003e\nand then validates the final object against the CRD. CREATE admission\nreceives the sparse request, resolves it in memory, and returns the complete\nimmutable execution snapshot that the API server validates and stores. The\npersisted \u003ccode\u003eAgentRun.spec\u003c/code\u003e always includes \u003ccode\u003egoal\u003c/code\u003e, \u003ccode\u003emodel\u003c/code\u003e, and \u003ccode\u003eruntime.image\u003c/code\u003e;\nan unresolved sparse object is never valid stored state.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eResolution copies runtime, provider, model, tools, budget, service account,\nSecret reference, knowledge ConfigMap reference, and environment from the\nAgent. For Task Agents, the concrete goal is copied from \u003ccode\u003egoal\u003c/code\u003e or rendered\nfrom \u003ccode\u003egoalTemplate\u003c/code\u003e. For Service Agents, the standing \u003ccode\u003egoal\u003c/code\u003e is never\ndelivered; the invocation goal is rendered from \u003ccode\u003egoalTemplate\u003c/code\u003e, and admission\nadds the immutable \u003ccode\u003edelivery.port\u003c/code\u003e snapshot. These execution fields are\nlocked: an invocation request that\nsupplies any of them is rejected, even when the supplied value would match the\ntemplate. Users needing execution overrides create a standalone \u003ccode\u003eAgentRun\u003c/code\u003e or\na separate Agent definition.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eA Task Agent configures exactly one of \u003ccode\u003egoal\u003c/code\u003e or \u003ccode\u003egoalTemplate\u003c/code\u003e. A static\n\u003ccode\u003egoal\u003c/code\u003e accepts no parameters. A warm-delivery-enabled Service Agent configures\nboth its standing \u003ccode\u003egoal\u003c/code\u003e and its invocation \u003ccode\u003egoalTemplate\u003c/code\u003e. A template uses\nonly ASCII identifier\nplaceholders matching \u003ccode\u003e[A-Za-z_][A-Za-z0-9_]*\u003c/code\u003e:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003e${name}\u003c/code\u003e inserts the exact string value of parameter \u003ccode\u003ename\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e$${name}\u003c/code\u003e emits the literal text \u003ccode\u003e${name}\u003c/code\u003e and does not consume a parameter.\u003c/li\u003e\n\u003cli\u003eSubstitution is one pass: parameter values are never interpreted as\ntemplates.\u003c/li\u003e\n\u003cli\u003eRepeated placeholders reuse the same parameter. Empty, Unicode, and\nmultiline values are valid.\u003c/li\u003e\n\u003cli\u003eMalformed placeholders, missing parameters, and supplied-but-unused\nparameters reject the invocation. Missing and unused names are reported in\nsorted order.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eResolution is all-or-nothing and does not mutate either input object. Copied\nmaps, slices, pointers, and nested values are isolated from later mutation.\nProvider defaults and aliases are normalized while the execution snapshot is\nbuilt, once at this boundary.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe pure resolver in \u003ccode\u003einternal/runfactory\u003c/code\u003e defines these semantics. The CREATE\nwebhook fetches the referenced same-namespace Agent through the API reader,\nrejects invalid requests, and returns the resolver's complete object as the\nadmission patch. Complete standalone and controller-created runs do not match\nthe sparse webhook and remain independent of invocation admission.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe installed \u003ccode\u003eMutatingWebhookConfiguration\u003c/code\u003e matches namespaced\n\u003ccode\u003ekontext.dev/v1alpha1\u003c/code\u003e \u003ccode\u003eAgentRun\u003c/code\u003e CREATE requests only when \u003ccode\u003eagentRef\u003c/code\u003e is\npresent and at least one required execution field is absent. It uses\n\u003ccode\u003efailurePolicy: Fail\u003c/code\u003e, a five-second timeout, \u003ccode\u003ematchPolicy: Equivalent\u003c/code\u003e,\n\u003ccode\u003esideEffects: None\u003c/code\u003e, and no reinvocation. Matching sparse requests therefore\nfail closed when admission is unavailable; complete requests bypass the\nwebhook.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eEvery rejected referenced resolution includes one stable class:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eMissingAgent\u003c/code\u003e: the same-namespace referenced Agent does not exist.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eWrongMode\u003c/code\u003e: the reference names a Scheduled or unknown-mode Agent.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eDeliveryDisabled\u003c/code\u003e: the reference names a Service Agent without\n\u003ccode\u003eruntime.delivery\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eInvalidDelivery\u003c/code\u003e: the Service delivery configuration is invalid.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eReservedName\u003c/code\u003e: a Service invocation uses the standing-run name pattern\n\u003ccode\u003e\u0026lt;agent\u0026gt;-\u0026lt;positive integer\u0026gt;\u003c/code\u003e managed by the controller.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eInvalidTemplate\u003c/code\u003e: the Agent definition has invalid goal/template shape or\nplaceholder syntax.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eMissingParameters\u003c/code\u003e: required placeholder names have no supplied value.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eUnusedParameters\u003c/code\u003e: supplied names are unused, including any parameter map\non a static goal.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eConflictingFields\u003c/code\u003e: the invocation supplies one or more locked execution\nfields.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ccode\u003estatus\u003c/code\u003e\u003c/h3\u003e\u003ca id=\"user-content-status-1\" class=\"anchor\" aria-label=\"Permalink: status\" href=\"#status-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\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eField\u003c/th\u003e\n\u003cth\u003eType\u003c/th\u003e\n\u003cth\u003eNotes\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ephase\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eenum \u003ccode\u003ePending\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ccode\u003eRunning\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003epodName\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eOwned execution Pod, or the standing Service Pod selected for delivery.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoutput.mediaType\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eMedia type for the structured terminal output.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eoutput.value\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003earbitrary JSON\u003c/td\u003e\n\u003ctd\u003eAuthoritative structured output.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eresult\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eBackward-compatible deterministic projection of \u003ccode\u003eoutput\u003c/code\u003e.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eusage.tokens\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eTotal tokens when measured.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eusage.inputTokens\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eInput tokens when measured.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eusage.outputTokens\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eint\u003c/td\u003e\n\u003ctd\u003eOutput tokens when measured.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eusage.dollars\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003enumber\u003c/td\u003e\n\u003ctd\u003eAuthoritative reported cost when measured.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003estartTime\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etime\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecompletionTime\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003etime\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003emessage\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003estring\u003c/td\u003e\n\u003ctd\u003eHuman-readable status/error.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003econditions\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003e[]Condition\u003c/td\u003e\n\u003ctd\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eUsage fields are optional independently. A missing field means the runtime or\nprovider did not measure it; a present zero means it measured zero.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOwnership\u003c/h3\u003e\u003ca id=\"user-content-ownership\" class=\"anchor\" aria-label=\"Permalink: Ownership\" href=\"#ownership\"\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\u003eAgentRun\u003c/code\u003e created from or resolved against an \u003ccode\u003eAgent\u003c/code\u003e carries an owner\nreference to it → standard GC cascade. Standalone \u003ccode\u003eAgentRun\u003c/code\u003es are allowed for\nad-hoc execution, demos, and direct task dispatch.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor Task Agents, \u003ccode\u003estatus.lastRunName\u003c/code\u003e is the newest retained owned Task run by\ncreation time. \u003ccode\u003estatus.runsCreated\u003c/code\u003e is the exact number of currently retained\nowned Task runs, not a lifetime counter. Deleting an owned run can therefore\ndecrease \u003ccode\u003erunsCreated\u003c/code\u003e and can move or clear \u003ccode\u003elastRunName\u003c/code\u003e. These Task meanings\ndo not change the existing Service status semantics. Delivered Service runs do\nnot participate in standing-run suffixes, \u003ccode\u003ecurrentRunName\u003c/code\u003e, \u003ccode\u003elastRunName\u003c/code\u003e,\n\u003ccode\u003erunsCreated\u003c/code\u003e, or \u003ccode\u003erestarts\u003c/code\u003e. \u003ccode\u003ecurrentRunName\u003c/code\u003e and \u003ccode\u003erestarts\u003c/code\u003e stay empty for\nTask Agents.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContract evolution policy\u003c/h3\u003e\u003ca id=\"user-content-contract-evolution-policy\" class=\"anchor\" aria-label=\"Permalink: Contract evolution policy\" href=\"#contract-evolution-policy\"\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 four public contract surfaces evolve differently:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eResult envelopes are lenient at the top level.\u003c/strong\u003e Consumers ignore unknown\ntop-level fields so producers can add optional result metadata without\nbreaking older readers. Known fields are still fully validated.\nRuntime/provider-specific JSON belongs in \u003ccode\u003eextensions\u003c/code\u003e under namespaced keys\nsuch as \u003ccode\u003eanthropic.com/request\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEvent envelopes are strict.\u003c/strong\u003e Consumers reject unknown top-level fields and\ntrailing JSON. Changing the event envelope shape requires a new event\ncontract version so streaming observers never silently interpret a different\nrecord shape.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDelivery request envelopes are strict.\u003c/strong\u003e Service runtimes reject unknown\nfields and trailing JSON. Changing the request shape requires a new delivery\ncontract version.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCRDs evolve additively within \u003ccode\u003ev1alpha1\u003c/code\u003e.\u003c/strong\u003e Existing fields keep their\nmeaning and new fields are optional. Kubernetes structurally validates CRD\ndata; arbitrary JSON is confined to fields explicitly documented as\nschemaless, currently \u003ccode\u003eAgentRun.status.output.value\u003c/code\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\"\u003eRuntime image contract\u003c/h2\u003e\u003ca id=\"user-content-runtime-image-contract\" class=\"anchor\" aria-label=\"Permalink: Runtime image contract\" href=\"#runtime-image-contract\"\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\"\u003eAny container can be a Kontext agent if it follows this. Kontext never inspects what the agent \u003cem\u003edoes\u003c/em\u003e — only this I/O boundary.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInputs\u003c/h3\u003e\u003ca id=\"user-content-inputs\" class=\"anchor\" aria-label=\"Permalink: Inputs\" href=\"#inputs\"\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 controller injects, on the Pod:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eEnv vars: \u003ccode\u003eKONTEXT_GOAL\u003c/code\u003e, \u003ccode\u003eKONTEXT_MODEL\u003c/code\u003e, \u003ccode\u003eKONTEXT_PROVIDER\u003c/code\u003e, \u003ccode\u003eKONTEXT_TOOLS\u003c/code\u003e (comma-separated), \u003ccode\u003eKONTEXT_BUDGET_TOKENS\u003c/code\u003e, \u003ccode\u003eKONTEXT_BUDGET_WALLCLOCK\u003c/code\u003e, \u003ccode\u003eKONTEXT_BUDGET_DOLLARS\u003c/code\u003e, \u003ccode\u003eKONTEXT_AGENT_NAME\u003c/code\u003e, \u003ccode\u003eKONTEXT_RUN_NAME\u003c/code\u003e. Warm-delivery Service Pods additionally receive the Secret-backed \u003ccode\u003eKONTEXT_DELIVERY_TOKEN\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eProvider credentials mounted from \u003ccode\u003esecretRef\u003c/code\u003e as env (e.g. \u003ccode\u003eANTHROPIC_API_KEY\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003eOptional static ConfigMap context from \u003ccode\u003eknowledgeConfigMapRef\u003c/code\u003e, mounted\nread-only at \u003ccode\u003e/kontext/knowledge\u003c/code\u003e. This is not RAG: the control plane does no\ningestion, embedding, ranking, or retrieval.\u003c/li\u003e\n\u003cli\u003eGeneric \u003ccode\u003espec.env\u003c/code\u003e entries. Each entry selects exactly one literal \u003ccode\u003evalue\u003c/code\u003e or\n\u003ccode\u003evalueFrom.secretKeyRef{name,key}\u003c/code\u003e. Controller-managed variables cannot be\noverridden through either form. Secret values remain Kubernetes Secret data;\nthey are not copied into Agent/AgentRun fields or controller logs.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInput — Service warm delivery\u003c/h3\u003e\u003ca id=\"user-content-input--service-warm-delivery\" class=\"anchor\" aria-label=\"Permalink: Input — Service warm delivery\" href=\"#input--service-warm-delivery\"\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\"\u003eA Service runtime opts in by configuring \u003ccode\u003espec.runtime.delivery.port\u003c/code\u003e. The\nruntime listens on that port on the Pod network interface and exposes:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"POST /kontext.dev/v1alpha1/agent-runs\nHost: \u0026lt;standing Pod name\u0026gt;\nContent-Type: application/json\nAccept: application/json\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003ePOST /kontext.dev/v1alpha1/agent-runs\nHost: \u0026lt;standing Pod name\u0026gt;\nContent-Type: application/json\nAccept: application/json\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe request is one strict JSON object:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;apiVersion\u0026quot;: \u0026quot;kontext.dev/delivery/v1alpha1\u0026quot;,\n  \u0026quot;run\u0026quot;: {\n    \u0026quot;name\u0026quot;: \u0026quot;review-42\u0026quot;,\n    \u0026quot;namespace\u0026quot;: \u0026quot;default\u0026quot;,\n    \u0026quot;uid\u0026quot;: \u0026quot;6d291c0e-3a2d-4b33-956e-8d4ec30f1ac3\u0026quot;\n  },\n  \u0026quot;target\u0026quot;: {\n    \u0026quot;name\u0026quot;: \u0026quot;owner-1-pod\u0026quot;,\n    \u0026quot;uid\u0026quot;: \u0026quot;481b6787-bc93-4eae-9d23-e8253c99d481\u0026quot;\n  },\n  \u0026quot;goal\u0026quot;: \u0026quot;the fully resolved invocation goal\u0026quot;\n}\"\u003e\u003cpre\u003e{\n  \u003cspan class=\"pl-ent\"\u003e\"apiVersion\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ekontext.dev/delivery/v1alpha1\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n  \u003cspan class=\"pl-ent\"\u003e\"run\"\u003c/span\u003e: {\n    \u003cspan class=\"pl-ent\"\u003e\"name\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ereview-42\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"namespace\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003edefault\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"uid\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e6d291c0e-3a2d-4b33-956e-8d4ec30f1ac3\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n  },\n  \u003cspan class=\"pl-ent\"\u003e\"target\"\u003c/span\u003e: {\n    \u003cspan class=\"pl-ent\"\u003e\"name\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eowner-1-pod\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"uid\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e481b6787-bc93-4eae-9d23-e8253c99d481\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n  },\n  \u003cspan class=\"pl-ent\"\u003e\"goal\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ethe fully resolved invocation goal\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003erun\u003c/code\u003e identifies the persisted \u003ccode\u003eAgentRun\u003c/code\u003e audit record. Its Kubernetes UID is\nthe delivery idempotency identity; runtimes must not execute the same UID\nconcurrently and should replay a cached terminal response when they still have\none. The controller does not promise exactly-once execution across ambiguous\nnetwork failures or Service Pod replacement. Runtimes performing non-idempotent\nexternal effects must persist whatever stronger deduplication their workload\nrequires.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003etarget\u003c/code\u003e identifies the verified standing Service Pod selected for this\nattempt. The controller also sets the HTTP \u003ccode\u003eHost\u003c/code\u003e header to that Pod name. A\nruntime must reject a request whose Host does not match its own Kubernetes\nhostname before accepting the delivery. The controller verifies the target Pod\nname, UID, IP, readiness, and owner chain again after the HTTP exchange and\ndiscards the response if that identity changed.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eEach standing warm-delivery Pod receives a controller-generated random\ncredential through the Secret-backed \u003ccode\u003eKONTEXT_DELIVERY_TOKEN\u003c/code\u003e environment\nvariable. The credential never appears in an Agent or AgentRun, request,\nstatus, or log. For every attempt, the controller sends a fresh base64url\nnonce in \u003ccode\u003eKontext-Delivery-Challenge\u003c/code\u003e. A successful runtime response includes\n\u003ccode\u003eKontext-Delivery-Signature\u003c/code\u003e, computed as unpadded base64url of:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"HMAC-SHA256(\n  KONTEXT_DELIVERY_TOKEN,\n  apiVersion || 0x00 || challenge || 0x00 || run.uid || 0x00 || exact-response-body\n)\"\u003e\u003cpre lang=\"text\" class=\"notranslate\"\u003e\u003ccode\u003eHMAC-SHA256(\n  KONTEXT_DELIVERY_TOKEN,\n  apiVersion || 0x00 || challenge || 0x00 || run.uid || 0x00 || exact-response-body\n)\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe controller verifies that signature before parsing or projecting the result\nenvelope. Missing or invalid signatures fail the run. This challenge-response\nbinds the accepted result to the credential mounted only into the verified\nstanding Pod without transmitting that credential over plaintext Pod HTTP.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe request contains the resolved goal, not template parameters. Parameter\nrendering and execution-field snapshotting have already completed in\nadmission. Unknown fields, a missing run or target identity or goal, an unsupported\n\u003ccode\u003eapiVersion\u003c/code\u003e, and trailing JSON are invalid requests.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe runtime returns HTTP \u003ccode\u003e200 OK\u003c/code\u003e only with one terminal\n\u003ccode\u003ekontext.dev/result/v1alpha1\u003c/code\u003e envelope as the response body. The envelope is\nvalidated and projected into \u003ccode\u003estatus.output\u003c/code\u003e, \u003ccode\u003estatus.result\u003c/code\u003e, and\n\u003ccode\u003estatus.usage\u003c/code\u003e exactly like a native termination-log envelope. Legacy result\npayloads and plain text are not accepted on this new endpoint. The complete\nresponse body must not exceed 4096 bytes. A non-2xx response or malformed or\noversized body fails the run with an actionable status message. A transport\nfailure without a response returns the run to \u003ccode\u003ePending\u003c/code\u003e and retries against\nthe current standing Pod using the stable run UID. Exhausting the bounded\ndelivery window fails the run.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eDelivery uses the existing phases; it does not add a \u003ccode\u003eDelivered\u003c/code\u003e phase:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003ePending\u003c/code\u003e — waiting for the referenced Service Agent to have a live, Ready\nstanding Pod, or waiting to retry a connection that was not established.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eRunning\u003c/code\u003e — the controller has started the HTTP request against the selected\nPod. \u003ccode\u003estatus.startTime\u003c/code\u003e is set and \u003ccode\u003estatus.podName\u003c/code\u003e records that standing Pod.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSucceeded\u003c/code\u003e or \u003ccode\u003eFailed\u003c/code\u003e — projected from a valid terminal response envelope,\nor failed by the controller for a delivery/protocol error.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eBudgetExceeded\u003c/code\u003e — the delivered run exceeded its wallclock budget.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eA missing, unready, unreachable, or mid-recast target remains or returns to\n\u003ccode\u003ePending\u003c/code\u003e and is retried with bounded backoff until the delivery window\nexpires. Kontext does not create a replacement Pod for a delivered run;\nService recast remains the \u003ccode\u003eAgent\u003c/code\u003e controller's responsibility. The delivery\nwindow is five minutes from \u003ccode\u003eAgentRun\u003c/code\u003e creation. Once the first HTTP attempt\nstarts, \u003ccode\u003ebudget.wallclock\u003c/code\u003e also runs across transport retries and wins when it\nexpires sooner. Request cancellation closes the HTTP request; runtimes should\nstop work when the request context is canceled.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe control plane sends one delivery to one standing runtime and records its\noutcome. Queueing, prioritization, fan-out, and workload-specific backpressure\nremain runtime-image concerns.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOutput — logs and execution events\u003c/h3\u003e\u003ca id=\"user-content-output--logs-and-execution-events\" class=\"anchor\" aria-label=\"Permalink: Output — logs and execution events\" href=\"#output--logs-and-execution-events\"\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\u003eWrite operational progress to \u003cstrong\u003estdout\u003c/strong\u003e and diagnostics to \u003cstrong\u003estderr\u003c/strong\u003e,\nline-buffered. Both remain ordinary container logs observable with\n\u003ccode\u003ekubectl logs\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eRuntimes that expose detailed execution events write one JSON object per line.\nEvent objects use \u003ccode\u003eapiVersion: kontext.dev/event/v1alpha1\u003c/code\u003e, an RFC3339\n\u003ccode\u003etimestamp\u003c/code\u003e, a \u003ccode\u003etype\u003c/code\u003e (\u003ccode\u003elifecycle\u003c/code\u003e, \u003ccode\u003eoutput\u003c/code\u003e, \u003ccode\u003eusage\u003c/code\u003e, \u003ccode\u003etool\u003c/code\u003e, or \u003ccode\u003eerror\u003c/code\u003e),\nand type-specific \u003ccode\u003edata\u003c/code\u003e. Events may include tool calls, bounded tool output,\ntiming, provider usage, errors, and final responses.\u003c/li\u003e\n\u003cli\u003eDo not emit private chain-of-thought. Operational summaries and explicit\nmodel/tool outputs are sufficient.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOutput — result\u003c/h3\u003e\u003ca id=\"user-content-output--result\" class=\"anchor\" aria-label=\"Permalink: Output — result\" href=\"#output--result\"\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 terminal envelope is optional at the control-plane boundary. An empty or\nwhitespace-only termination message is normalized internally to the current\nresult API version with outcome \u003ccode\u003eSucceeded\u003c/code\u003e and no output, usage, or error; it\nis not a legacy wire payload. An unchanged plain image that exits \u003ccode\u003e0\u003c/code\u003e without\nwriting \u003ccode\u003e/dev/termination-log\u003c/code\u003e therefore succeeds with absent \u003ccode\u003estatus.output\u003c/code\u003e\nand an empty \u003ccode\u003estatus.result\u003c/code\u003e. Native runtimes and images using injected stdout\ncapture write richer structured output, usage, timing, and execution metadata.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOn completion, a one-shot runtime that provides a structured result writes a\ncompact versioned envelope to \u003ccode\u003e/dev/termination-log\u003c/code\u003e (and may also write\n\u003ccode\u003e/kontext/result.json\u003c/code\u003e). A warm-delivery Service runtime returns the same\nversioned envelope as its HTTP response body:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  \u0026quot;apiVersion\u0026quot;: \u0026quot;kontext.dev/result/v1alpha1\u0026quot;,\n  \u0026quot;outcome\u0026quot;: \u0026quot;Succeeded\u0026quot;,\n  \u0026quot;output\u0026quot;: {\n    \u0026quot;mediaType\u0026quot;: \u0026quot;application/json\u0026quot;,\n    \u0026quot;value\u0026quot;: { \u0026quot;answer\u0026quot;: \u0026quot;final output\u0026quot; }\n  },\n  \u0026quot;usage\u0026quot;: {\n    \u0026quot;inputTokens\u0026quot;: 1000,\n    \u0026quot;outputTokens\u0026quot;: 234,\n    \u0026quot;totalTokens\u0026quot;: 1234,\n    \u0026quot;reasoningTokens\u0026quot;: 180\n  },\n  \u0026quot;timing\u0026quot;: {\n    \u0026quot;durationMillis\u0026quot;: 1750\n  },\n  \u0026quot;execution\u0026quot;: {\n    \u0026quot;provider\u0026quot;: \u0026quot;anthropic\u0026quot;,\n    \u0026quot;model\u0026quot;: \u0026quot;provider-defined-model-id\u0026quot;,\n    \u0026quot;requestId\u0026quot;: \u0026quot;request-id\u0026quot;\n  }\n}\"\u003e\u003cpre\u003e{\n  \u003cspan class=\"pl-ent\"\u003e\"apiVersion\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ekontext.dev/result/v1alpha1\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n  \u003cspan class=\"pl-ent\"\u003e\"outcome\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eSucceeded\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n  \u003cspan class=\"pl-ent\"\u003e\"output\"\u003c/span\u003e: {\n    \u003cspan class=\"pl-ent\"\u003e\"mediaType\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eapplication/json\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"value\"\u003c/span\u003e: { \u003cspan class=\"pl-ent\"\u003e\"answer\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003efinal output\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e }\n  },\n  \u003cspan class=\"pl-ent\"\u003e\"usage\"\u003c/span\u003e: {\n    \u003cspan class=\"pl-ent\"\u003e\"inputTokens\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1000\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"outputTokens\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e234\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"totalTokens\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1234\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"reasoningTokens\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e180\u003c/span\u003e\n  },\n  \u003cspan class=\"pl-ent\"\u003e\"timing\"\u003c/span\u003e: {\n    \u003cspan class=\"pl-ent\"\u003e\"durationMillis\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1750\u003c/span\u003e\n  },\n  \u003cspan class=\"pl-ent\"\u003e\"execution\"\u003c/span\u003e: {\n    \u003cspan class=\"pl-ent\"\u003e\"provider\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eanthropic\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"model\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eprovider-defined-model-id\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e,\n    \u003cspan class=\"pl-ent\"\u003e\"requestId\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003erequest-id\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n  }\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe envelope fields are:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eapiVersion\u003c/code\u003e — exactly \u003ccode\u003ekontext.dev/result/v1alpha1\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eoutcome\u003c/code\u003e — \u003ccode\u003eSucceeded\u003c/code\u003e or \u003ccode\u003eFailed\u003c/code\u003e. A failed outcome includes\n\u003ccode\u003eerror.message\u003c/code\u003e and may include a stable \u003ccode\u003eerror.code\u003c/code\u003e and \u003ccode\u003eerror.retryable\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eoutput\u003c/code\u003e — an optional media type plus any valid JSON value.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusage\u003c/code\u003e — optional typed metrics. \u003ccode\u003ereasoningTokens\u003c/code\u003e records a\nprovider-reported reasoning-token breakdown of output/completion usage.\nMissing values are never inferred as zero, including when the provider does\nnot expose that breakdown; a present zero means the provider measured zero.\nVisible response text can therefore tokenize to fewer tokens than\n\u003ccode\u003eoutputTokens\u003c/code\u003e: provider completion totals may also include hidden reasoning\nor other provider-defined completion accounting. The count does not expose\nreasoning content.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etiming\u003c/code\u003e — optional start/completion timestamps and measured durations.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eexecution\u003c/code\u003e — optional non-secret provider, model, request, turn, and tool\nmetadata.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eartifacts\u003c/code\u003e — optional references to data stored outside Kubernetes status.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eextensions\u003c/code\u003e — optional provider/runtime-specific JSON under namespaced keys\nsuch as \u003ccode\u003eanthropic.com/request\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etruncation\u003c/code\u003e — explicit metadata added when fields were removed to fit the\nKubernetes termination-message limit.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe termination message is a terminal summary, not a transcript. Producers\nmust compact it below 4096 bytes while preserving valid JSON and setting\n\u003ccode\u003etruncation\u003c/code\u003e. Full execution events remain in the JSONL log stream.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe controller projects the stable aggregate usage fields into\n\u003ccode\u003eAgentRun.status.usage\u003c/code\u003e. Optional usage breakdowns such as \u003ccode\u003ereasoningTokens\u003c/code\u003e\nremain in the versioned result envelope and usage events, avoiding\nprovider-detail growth in Kubernetes status.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003estatus.output\u003c/code\u003e preserves \u003ccode\u003eoutput\u003c/code\u003e. The compatibility field \u003ccode\u003estatus.result\u003c/code\u003e is\nprojected deterministically: JSON strings with a \u003ccode\u003etext/*\u003c/code\u003e media type become\ntheir unquoted value; every other JSON value becomes compact JSON text; absent\noutput becomes an empty string.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe controller continues to accept the legacy payload during the v1alpha1\ntransition:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{ \u0026quot;result\u0026quot;: \u0026quot;\u0026lt;final output\u0026gt;\u0026quot;, \u0026quot;tokensUsed\u0026quot;: 1234, \u0026quot;dollarsUsed\u0026quot;: 0.0 }\"\u003e\u003cpre\u003e{ \u003cspan class=\"pl-ent\"\u003e\"result\"\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u0026lt;final output\u0026gt;\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, \u003cspan class=\"pl-ent\"\u003e\"tokensUsed\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e1234\u003c/span\u003e, \u003cspan class=\"pl-ent\"\u003e\"dollarsUsed\"\u003c/span\u003e: \u003cspan class=\"pl-c1\"\u003e0.0\u003c/span\u003e }\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eLegacy text becomes \u003ccode\u003etext/plain\u003c/code\u003e structured output. Legacy usage fields are\nrecorded only when they are present in the payload. For compatibility, the\nprocess exit code remains authoritative for legacy payloads; a legacy \u003ccode\u003eerror\u003c/code\u003e\nfield is retained as diagnostic text but never determines the run outcome and\ndoes not turn exit \u003ccode\u003e0\u003c/code\u003e into failure.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eExit \u003ccode\u003e0\u003c/code\u003e with no termination payload or with a successful envelope means\nsuccess. A non-zero process exit always fails the run. A failed envelope also\nfails the run even if the process exits zero. If a JSON-looking termination\npayload is present, malformed or partially written JSON remains an actionable\nfailure rather than silently becoming a successful plain-text result.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOptional result reporter\u003c/h3\u003e\u003ca id=\"user-content-optional-result-reporter\" class=\"anchor\" aria-label=\"Permalink: Optional result reporter\" href=\"#optional-result-reporter\"\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 maintained \u003ccode\u003eruntimes/reporter\u003c/code\u003e executable can supervise an explicit child\ncommand and produce the versioned envelope without requiring the child to write\nthe termination log itself. It preserves child stdout, stderr, signals, and\nprocess exit status.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eReporter extraction supports:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003elast-line\u003c/code\u003e — the last non-empty stdout line becomes \u003ccode\u003etext/plain\u003c/code\u003e output.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ekontext-envelope\u003c/code\u003e — the last stdout line prefixed with\n\u003ccode\u003eKONTEXT_RESULT:\u003c/code\u003e supplies a complete versioned envelope.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe reporter bounds only captured result data; streamed logs remain unbounded.\nIt compacts every emitted envelope to the termination-message limit. Reporter\ninjection and workload configuration are control-plane concerns defined\nseparately from this executable.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAn existing Linux image opts into stdout capture with:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"runtime:\n  image: example/agent:v1\n  command: [\u0026quot;python\u0026quot;, \u0026quot;-m\u0026quot;, \u0026quot;agent\u0026quot;]\n  result:\n    source: Stdout\n    format: LastLine\"\u003e\u003cpre\u003e\u003cspan class=\"pl-ent\"\u003eruntime\u003c/span\u003e:\n  \u003cspan class=\"pl-ent\"\u003eimage\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eexample/agent:v1\u003c/span\u003e\n  \u003cspan class=\"pl-ent\"\u003ecommand\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e[\"python\", \"-m\", \"agent\"]\u003c/span\u003e\n  \u003cspan class=\"pl-ent\"\u003eresult\u003c/span\u003e:\n    \u003cspan class=\"pl-ent\"\u003esource\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eStdout\u003c/span\u003e\n    \u003cspan class=\"pl-ent\"\u003eformat\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003eLastLine\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eruntime.command\u003c/code\u003e is required because reporter injection replaces the image\nentrypoint; Kubernetes cannot recover that entrypoint automatically.\n\u003ccode\u003eKontextEnvelope\u003c/code\u003e is the other supported format. Without \u003ccode\u003eruntime.result\u003c/code\u003e,\nKontext leaves the image entrypoint and native termination behavior unchanged.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe operator installation selects the trusted reporter image. Kontext injects\nits binary with an init container and mounts it read-only into the workload\ncontainer; workloads cannot select a different reporter image. The controller\ndoes not read Pod logs and needs no \u003ccode\u003epods/log\u003c/code\u003e permission. \u003ccode\u003eLastLine\u003c/code\u003e is\nheuristic, cannot infer usage, and is discouraged for long-running Service\nagents. The trusted init container runs as UID 0 only while populating the\notherwise empty shared volume; it drops capabilities, disables privilege\nescalation, and uses a read-only root filesystem. The workload container's own\nuser and security context remain unchanged.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRuntime roles\u003c/h3\u003e\u003ca id=\"user-content-runtime-roles\" class=\"anchor\" aria-label=\"Permalink: Runtime roles\" href=\"#runtime-roles\"\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\u003eruntimes/echo\u003c/code\u003e is the deterministic control-plane conformance oracle. During\nthe v1alpha1 transition it intentionally writes the legacy termination payload\ndocumented above. \u003ccode\u003eruntimes/reference\u003c/code\u003e is the maintained model-backed runtime.\nArbitrary conforming images remain supported and need not use any of these\nimplementations.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMaintained reference runtime\u003c/h3\u003e\u003ca id=\"user-content-maintained-reference-runtime\" class=\"anchor\" aria-label=\"Permalink: Maintained reference runtime\" href=\"#maintained-reference-runtime\"\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\u003eruntimes/reference\u003c/code\u003e is the optional maintained Go runtime. It owns a small\nprovider-neutral completion loop behind a normalized provider interface; it is\nnot an agent framework. The runtime image bundles the reporter as PID 1 and\nuses the internal \u003ccode\u003eKONTEXT_RESULT:\u003c/code\u003e capture protocol so the reporter can write\nthe authoritative versioned envelope to the runtime container's termination\nmessage. Raw logs remain an event and diagnostic stream.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe initial keyless \u003ccode\u003efake\u003c/code\u003e provider is deterministic and exercises the same\nconfiguration, conversation, event, result, cancellation, and failure paths\nthat real HTTP transports use. The maintained real transports are Anthropic\nMessages (\u003ccode\u003eanthropic\u003c/code\u003e) and OpenAI-compatible Chat Completions (\u003ccode\u003eopenai\u003c/code\u003e or\n\u003ccode\u003eopenai-compatible\u003c/code\u003e). They use direct non-streaming HTTP, accept an optional\nexact endpoint or base-URL override, and normalize text, function tool calls,\nstop reasons, measured usage, request IDs, and actionable transport errors.\nThe OpenAI-compatible boundary is the documented Chat Completions request,\nresponse, bearer-auth, and function-tool-call shape; it does not imply support\nfor the Responses API, streaming, Azure URL construction, or every inference\nprotocol. \u003ccode\u003eKONTEXT_MODEL\u003c/code\u003e remains opaque and is never aliased or rewritten.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCredentials come from the \u003ccode\u003eAgentRun\u003c/code\u003e Secret policy as \u003ccode\u003eANTHROPIC_API_KEY\u003c/code\u003e or\n\u003ccode\u003eOPENAI_API_KEY\u003c/code\u003e. Authenticated acceptance is manual and environment-protected;\npull-request CI remains deterministic, keyless, and network-independent.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe controller remains authoritative for wallclock enforcement. The runtime\nparses \u003ccode\u003eKONTEXT_BUDGET_WALLCLOCK\u003c/code\u003e but does not start a competing timer; it\nreacts to cancellation when the reporter forwards controller signals.\nOmission means no deadline, and the runtime does not invent a five-minute\ndefault.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe maintained runtime exposes only tools named in \u003ccode\u003eKONTEXT_TOOLS\u003c/code\u003e. It owns a\nbounded provider-neutral loop that returns normalized tool results until final\noutput, cancellation, failure, or a configured turn, token, tool-call, or\ntool-output limit. Omitted or zero runtime limits are disabled. Built-in tools\nare \u003ccode\u003eread_knowledge\u003c/code\u003e, \u003ccode\u003ekubernetes_read\u003c/code\u003e, and \u003ccode\u003eshell\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe reference runtime applies \u003ccode\u003eKONTEXT_BUDGET_TOKENS\u003c/code\u003e to cumulative measured\nprovider usage across every request in the run. Each tool follow-up resends the\nconversation, including prior tool calls and bounded results, so providers may\ncount that context again. Provider-reported reasoning or completion usage also\ncounts even when it does not appear in the final text. The runtime sends the\nremaining budget as a provider completion limit where supported, but checks\nactual usage only after each response. A response can therefore exceed the run\nbudget and fail with \u003ccode\u003etoken_limit_exceeded\u003c/code\u003e. Missing usage is not estimated.\nBudgets need headroom because provider and model usage can vary between live\nruns.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eread_knowledge\u003c/code\u003e is confined to \u003ccode\u003e/kontext/knowledge\u003c/code\u003e. \u003ccode\u003ekubernetes_read\u003c/code\u003e has a\nfixed current-namespace get/list allowlist and never reads Secrets. \u003ccode\u003eshell\u003c/code\u003e\nuses an explicit working directory, filters its direct child environment,\nstreams logs, bounds captured output, and cleans up its process group on\ncancellation. These runtime checks prevent accidental exposure; Kubernetes\nRBAC, workload security context, mounted data, and container isolation remain\nthe security boundaries. In particular, \u003ccode\u003eshell\u003c/code\u003e shares the runtime container;\nenvironment filtering does not isolate its filesystem or process view. Tool\nevents omit result content by default; the maintained runtime requires an\nexplicit opt-in before placing bounded tool content in the event stream.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eConfigured per-result and cumulative tool-output limits bound content returned\nto the model. Omission or zero disables those configured limits, but built-in\ntools still enforce a fixed 8 MiB capture safety ceiling per call. Tool errors\nbecome structured results that the model may recover from; they do not fail the\nrun by themselves. Only a successful terminal provider response without tool\ncalls becomes final output. Cancellation, execution failures, or reaching a\nconfigured limit before final output fail the run.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWhen tool content exceeds an effective positive byte limit, the runtime sets\nthe tool result's \u003ccode\u003etruncated\u003c/code\u003e field to \u003ccode\u003etrue\u003c/code\u003e and normally replaces \u003ccode\u003econtent\u003c/code\u003e\nwith \u003ccode\u003e{\"partial\":\"\u0026lt;UTF-8 prefix\u0026gt;\"}\u003c/code\u003e. The prefix is chosen so the complete\nencoded envelope, including JSON escaping and envelope overhead, does not\nexceed the limit. If the limit is too small for that envelope, the runtime\nreturns the deterministic minimal JSON value \u003ccode\u003e0\u003c/code\u003e at one byte or \u003ccode\u003e{}\u003c/code\u003e when at\nleast two bytes fit. Thus every positively bounded truncated result is valid\nUTF-8, valid JSON, and no larger than its effective limit. Providers preserve\nthis bounded JSON as the tool-result content string alongside the explicit\ntruncation metadata.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe reference runtime emits versioned JSONL lifecycle, usage, tool, output, and\nerror events to stdout. It retains conversation state only in memory for one\nrun and does not provide retries, planning, persistent memory, retrieval,\nsubagents, or background orchestration.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eConfigured MCP servers are a maintained-runtime concern, not control-plane\nvocabulary. The reference runtime uses the official MCP Go SDK v1.6.1, which\nrequires Go 1.25 or newer; this repository declares Go 1.26.6. The SDK\nnegotiates protocol \u003ccode\u003e2025-11-25\u003c/code\u003e and accepts \u003ccode\u003e2025-06-18\u003c/code\u003e, \u003ccode\u003e2025-03-26\u003c/code\u003e, and\n\u003ccode\u003e2024-11-05\u003c/code\u003e. Discovered MCP tools join the same immutable allowlisted registry\nand use the same turn, call-count, output, cancellation, event, and cleanup\ncontrols as built-ins.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe maintained Playwright MCP example is a separate restricted\nDeployment/Service reached over HTTP \u003ccode\u003e/mcp\u003c/code\u003e, never an AgentRun sidecar.\nPlaywright MCP 0.0.78 is pinned to\n\u003ccode\u003emcr.microsoft.com/playwright/mcp@sha256:3d871c22ea2d4cca0966e2cfb1860e1cb03eb7353725a3d6cffd133296fb04eb\u003c/code\u003e.\nThe browser server has its own keyless identity, ephemeral profile and writable\nstorage, finite resources, and NetworkPolicy. It does not add MCP or browser\nfields to either CRD. The example disables Chromium's sandbox because the\npinned image runs in a restricted container; Playwright MCP is not itself a\nsecurity boundary.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMode expectations for the image\u003c/h3\u003e\u003ca id=\"user-content-mode-expectations-for-the-image\" class=\"anchor\" aria-label=\"Permalink: Mode expectations for the image\" href=\"#mode-expectations-for-the-image\"\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\u003cstrong\u003eTask / Scheduled run image:\u003c/strong\u003e does its work, writes result, exits. Pod \u003ccode\u003erestartPolicy: Never\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eService run image:\u003c/strong\u003e expected to be long-running (loop / serve / watch).\nWhen \u003ccode\u003eruntime.delivery\u003c/code\u003e is configured, it also implements the warm-delivery\nHTTP endpoint. When the standing process exits for any reason, the \u003ccode\u003eAgent\u003c/code\u003e\n(Service) controller mints a fresh Pod-owning \u003ccode\u003eAgentRun\u003c/code\u003e — this is \"instantly\nre-cast on failure\". Delivered \u003ccode\u003eAgentRun\u003c/code\u003es never own or recast Pods.\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\"\u003eAnti-overfit firewall (read before adding a field)\u003c/h2\u003e\u003ca id=\"user-content-anti-overfit-firewall-read-before-adding-a-field\" class=\"anchor\" aria-label=\"Permalink: Anti-overfit firewall (read before adding a field)\" href=\"#anti-overfit-firewall-read-before-adding-a-field\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eKontext's vocabulary is fixed: \u003ccode\u003eAgent\u003c/code\u003e, \u003ccode\u003eAgentRun\u003c/code\u003e, runtime image, mode, budget, secret, tools, status, result. It must not gain domain-specific fields or workflow semantics for any one consumer. Consumers encode their semantics inside runtime images and orchestrate by creating generic \u003ccode\u003eAgent\u003c/code\u003e/\u003ccode\u003eAgentRun\u003c/code\u003e objects.\u003c/p\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"Kontext API specification (`v1alpha1`)","fully_qualified_name":"Kontext API specification (`v1alpha1`)","kind":"section_1","ident_start":142,"ident_end":180,"extent_start":140,"extent_end":42108,"ident_utf16":{"start":{"line_number":6,"utf16_col":2},"end":{"line_number":6,"utf16_col":40}},"extent_utf16":{"start":{"line_number":6,"utf16_col":0},"end":{"line_number":731,"utf16_col":0}}},{"name":"Mental model (map to core Kubernetes)","fully_qualified_name":"Mental model (map to core Kubernetes)","kind":"section_2","ident_start":866,"ident_end":903,"extent_start":863,"extent_end":2133,"ident_utf16":{"start":{"line_number":23,"utf16_col":3},"end":{"line_number":23,"utf16_col":40}},"extent_utf16":{"start":{"line_number":23,"utf16_col":0},"end":{"line_number":41,"utf16_col":0}}},{"name":"`Agent`","fully_qualified_name":"`Agent`","kind":"section_2","ident_start":2136,"ident_end":2143,"extent_start":2133,"extent_end":9887,"ident_utf16":{"start":{"line_number":41,"utf16_col":3},"end":{"line_number":41,"utf16_col":10}},"extent_utf16":{"start":{"line_number":41,"utf16_col":0},"end":{"line_number":149,"utf16_col":0}}},{"name":"`spec`","fully_qualified_name":"`spec`","kind":"section_3","ident_start":2221,"ident_end":2227,"extent_start":2217,"extent_end":5975,"ident_utf16":{"start":{"line_number":45,"utf16_col":4},"end":{"line_number":45,"utf16_col":10}},"extent_utf16":{"start":{"line_number":45,"utf16_col":0},"end":{"line_number":83,"utf16_col":0}}},{"name":"`status`","fully_qualified_name":"`status`","kind":"section_3","ident_start":5979,"ident_end":5987,"extent_start":5975,"extent_end":7047,"ident_utf16":{"start":{"line_number":83,"utf16_col":4},"end":{"line_number":83,"utf16_col":12}},"extent_utf16":{"start":{"line_number":83,"utf16_col":0},"end":{"line_number":97,"utf16_col":0}}},{"name":"`ScheduleSpec`","fully_qualified_name":"`ScheduleSpec`","kind":"section_3","ident_start":7051,"ident_end":7065,"extent_start":7047,"extent_end":9300,"ident_utf16":{"start":{"line_number":97,"utf16_col":4},"end":{"line_number":97,"utf16_col":18}},"extent_utf16":{"start":{"line_number":97,"utf16_col":0},"end":{"line_number":132,"utf16_col":0}}},{"name":"Agent condition reasons","fully_qualified_name":"Agent condition reasons","kind":"section_3","ident_start":9304,"ident_end":9327,"extent_start":9300,"extent_end":9887,"ident_utf16":{"start":{"line_number":132,"utf16_col":4},"end":{"line_number":132,"utf16_col":27}},"extent_utf16":{"start":{"line_number":132,"utf16_col":0},"end":{"line_number":149,"utf16_col":0}}},{"name":"`AgentRun`","fully_qualified_name":"`AgentRun`","kind":"section_2","ident_start":9890,"ident_end":9900,"extent_start":9887,"extent_end":21797,"ident_utf16":{"start":{"line_number":149,"utf16_col":3},"end":{"line_number":149,"utf16_col":13}},"extent_utf16":{"start":{"line_number":149,"utf16_col":0},"end":{"line_number":333,"utf16_col":0}}},{"name":"`spec`","fully_qualified_name":"`spec`","kind":"section_3","ident_start":10127,"ident_end":10133,"extent_start":10123,"extent_end":12788,"ident_utf16":{"start":{"line_number":155,"utf16_col":4},"end":{"line_number":155,"utf16_col":10}},"extent_utf16":{"start":{"line_number":155,"utf16_col":0},"end":{"line_number":188,"utf16_col":0}}},{"name":"Referenced invocation and resolution","fully_qualified_name":"Referenced invocation and resolution","kind":"section_3","ident_start":12792,"ident_end":12828,"extent_start":12788,"extent_end":17439,"ident_utf16":{"start":{"line_number":188,"utf16_col":4},"end":{"line_number":188,"utf16_col":40}},"extent_utf16":{"start":{"line_number":188,"utf16_col":0},"end":{"line_number":272,"utf16_col":0}}},{"name":"`status`","fully_qualified_name":"`status`","kind":"section_3","ident_start":17443,"ident_end":17451,"extent_start":17439,"extent_end":19895,"ident_utf16":{"start":{"line_number":272,"utf16_col":4},"end":{"line_number":272,"utf16_col":12}},"extent_utf16":{"start":{"line_number":272,"utf16_col":0},"end":{"line_number":295,"utf16_col":0}}},{"name":"Ownership","fully_qualified_name":"Ownership","kind":"section_3","ident_start":19899,"ident_end":19908,"extent_start":19895,"extent_end":20673,"ident_utf16":{"start":{"line_number":295,"utf16_col":4},"end":{"line_number":295,"utf16_col":13}},"extent_utf16":{"start":{"line_number":295,"utf16_col":0},"end":{"line_number":310,"utf16_col":0}}},{"name":"Contract evolution policy","fully_qualified_name":"Contract evolution policy","kind":"section_3","ident_start":20677,"ident_end":20702,"extent_start":20673,"extent_end":21797,"ident_utf16":{"start":{"line_number":310,"utf16_col":4},"end":{"line_number":310,"utf16_col":29}},"extent_utf16":{"start":{"line_number":310,"utf16_col":0},"end":{"line_number":333,"utf16_col":0}}},{"name":"Runtime image contract","fully_qualified_name":"Runtime image contract","kind":"section_2","ident_start":21800,"ident_end":21822,"extent_start":21797,"extent_end":41737,"ident_utf16":{"start":{"line_number":333,"utf16_col":3},"end":{"line_number":333,"utf16_col":25}},"extent_utf16":{"start":{"line_number":333,"utf16_col":0},"end":{"line_number":727,"utf16_col":0}}},{"name":"Inputs","fully_qualified_name":"Inputs","kind":"section_3","ident_start":21959,"ident_end":21965,"extent_start":21955,"extent_end":22907,"ident_utf16":{"start":{"line_number":337,"utf16_col":4},"end":{"line_number":337,"utf16_col":10}},"extent_utf16":{"start":{"line_number":337,"utf16_col":0},"end":{"line_number":351,"utf16_col":0}}},{"name":"Input — Service warm delivery","fully_qualified_name":"Input — Service warm delivery","kind":"section_3","ident_start":22911,"ident_end":22942,"extent_start":22907,"extent_end":27722,"ident_utf16":{"start":{"line_number":351,"utf16_col":4},"end":{"line_number":351,"utf16_col":33}},"extent_utf16":{"start":{"line_number":351,"utf16_col":0},"end":{"line_number":454,"utf16_col":0}}},{"name":"Output — logs and execution events","fully_qualified_name":"Output — logs and execution events","kind":"section_3","ident_start":27726,"ident_end":27762,"extent_start":27722,"extent_end":28405,"ident_utf16":{"start":{"line_number":454,"utf16_col":4},"end":{"line_number":454,"utf16_col":38}},"extent_utf16":{"start":{"line_number":454,"utf16_col":0},"end":{"line_number":467,"utf16_col":0}}},{"name":"Output — result","fully_qualified_name":"Output — result","kind":"section_3","ident_start":28409,"ident_end":28426,"extent_start":28405,"extent_end":32670,"ident_utf16":{"start":{"line_number":467,"utf16_col":4},"end":{"line_number":467,"utf16_col":19}},"extent_utf16":{"start":{"line_number":467,"utf16_col":0},"end":{"line_number":563,"utf16_col":0}}},{"name":"Optional result reporter","fully_qualified_name":"Optional result reporter","kind":"section_3","ident_start":32674,"ident_end":32698,"extent_start":32670,"extent_end":34592,"ident_utf16":{"start":{"line_number":563,"utf16_col":4},"end":{"line_number":563,"utf16_col":28}},"extent_utf16":{"start":{"line_number":563,"utf16_col":0},"end":{"line_number":607,"utf16_col":0}}},{"name":"Runtime roles","fully_qualified_name":"Runtime roles","kind":"section_3","ident_start":34596,"ident_end":34609,"extent_start":34592,"extent_end":34940,"ident_utf16":{"start":{"line_number":607,"utf16_col":4},"end":{"line_number":607,"utf16_col":17}},"extent_utf16":{"start":{"line_number":607,"utf16_col":0},"end":{"line_number":615,"utf16_col":0}}},{"name":"Maintained reference runtime","fully_qualified_name":"Maintained reference runtime","kind":"section_3","ident_start":34944,"ident_end":34972,"extent_start":34940,"extent_end":41210,"ident_utf16":{"start":{"line_number":615,"utf16_col":4},"end":{"line_number":615,"utf16_col":32}},"extent_utf16":{"start":{"line_number":615,"utf16_col":0},"end":{"line_number":716,"utf16_col":0}}},{"name":"Mode expectations for the image","fully_qualified_name":"Mode expectations for the image","kind":"section_3","ident_start":41214,"ident_end":41245,"extent_start":41210,"extent_end":41737,"ident_utf16":{"start":{"line_number":716,"utf16_col":4},"end":{"line_number":716,"utf16_col":35}},"extent_utf16":{"start":{"line_number":716,"utf16_col":0},"end":{"line_number":727,"utf16_col":0}}},{"name":"Anti-overfit firewall (read before adding a field)","fully_qualified_name":"Anti-overfit firewall (read before adding a field)","kind":"section_2","ident_start":41740,"ident_end":41790,"extent_start":41737,"extent_end":42108,"ident_utf16":{"start":{"line_number":727,"utf16_col":3},"end":{"line_number":727,"utf16_col":53}},"extent_utf16":{"start":{"line_number":727,"utf16_col":0},"end":{"line_number":731,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":1221165054,"defaultBranch":"main","name":"Kontext","ownerLogin":"MFS-code","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2026-04-25T20:51:24.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/56933863?v=4","public":true,"private":false,"isOrgOwned":false,"isArchived":false},"currentUser":null,"uploadToken":"eMEoACu4t6Dc5Whq9Mgn-gJObiItZe02EfHHb8sfdOYuiqVXI7hCpBLzVEBXpgTCgtCloP4xoQrHSw1zRaYbDA","allShortcutsEnabled":false,"treeExpanded":true,"path":"SPEC.md","symbolsExpanded":false,"refInfo":{"name":"main","listCacheKey":"v0:1789852785.0","canEdit":false,"currentOid":"fdc17204e8228804dd6a0081d1c98c1e3dd954e0"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"api","path":"api","contentType":"directory"},{"name":"cmd","path":"cmd","contentType":"directory"},{"name":"config","path":"config","contentType":"directory"},{"name":"deploy","path":"deploy","contentType":"directory"},{"name":"docs-site","path":"docs-site","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"evals","path":"evals","contentType":"directory"},{"name":"hack","path":"hack","contentType":"directory"},{"name":"internal","path":"internal","contentType":"directory"},{"name":"pkg","path":"pkg","contentType":"directory"},{"name":"runtimes","path":"runtimes","contentType":"directory"},{"name":"scripts","path":"scripts","contentType":"directory"},{"name":"website","path":"website","contentType":"directory"},{"name":".dockerignore","path":".dockerignore","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".vercelignore","path":".vercelignore","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"DEPRECATED.md","path":"DEPRECATED.md","contentType":"file"},{"name":"Dockerfile","path":"Dockerfile","contentType":"file"},{"name":"EVALS.md","path":"EVALS.md","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"Makefile","path":"Makefile","contentType":"file"},{"name":"PROJECT","path":"PROJECT","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"SECURITY.md","path":"SECURITY.md","contentType":"file"},{"name":"SPEC.md","path":"SPEC.md","contentType":"file"},{"name":"SUPPORT.md","path":"SUPPORT.md","contentType":"file"},{"name":"docs-nav.json","path":"docs-nav.json","contentType":"file"},{"name":"go.mod","path":"go.mod","contentType":"file"},{"name":"go.sum","path":"go.sum","contentType":"file"}],"totalCount":31}},"fileTreeProcessingTime":18.02474,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"main","listCacheKey":"v0:1789852785.0","canEdit":false,"refType":"branch","currentOid":"fdc17204e8228804dd6a0081d1c98c1e3dd954e0","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"SPEC.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/MFS-code/Kontext/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"SPEC.md","displayUrl":"https://github.com/MFS-code/Kontext/blob/main/SPEC.md?raw=true","headerInfo":{"blobSize":"41.1 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"4d2ecef","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FMFS-code%2FKontext%2Fblob%2Fmain%2FSPEC.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"731","truncatedSloc":"601"},"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":"/MFS-code/Kontext/blob/main/SPEC.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/MFS-code/Kontext/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/MFS-code/Kontext/raw/refs/heads/main/SPEC.md","renderImageOrRaw":false,"shortPath":null,"symbolsEnabled":true,"tabSize":4,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null},"copilotInfo":null,"copilotAccessAllowed":false,"copilotSpacesEnabled":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"isMarketplaceEnabled":true},"codeViewBlobLayoutRoute.StyledBlob":{"rawLines":["---","title: API specification","description: Agent, AgentRun, and runtime-image contract for kontext.dev/v1alpha1.","sidebarTitle: API spec","---","","# Kontext API specification (`v1alpha1`)","","\u003e This is the published `v1alpha1` API and runtime-image contract. Kontext","\u003e remains a general agent runtime. Application-specific vocabulary and behavior","\u003e belong in the consumer's runtime image, not the control plane.","","Kontext exposes two custom resources and one runtime-image contract.","","- `Agent` — the reusable **definition / desired state** of an agent.","- `AgentRun` — one bounded, auditable **execution** of an agent. It either owns","  one Pod or is delivered to a standing Service runtime.","- **Runtime image contract** — how any container becomes a Kontext agent.","","API group/version: `kontext.dev/v1alpha1` (alpha on purpose — the shape is allowed to evolve).","","---","","## Mental model (map to core Kubernetes)","","","| Kontext                  | Core Kubernetes analogue | Behavior                                                                               |","| ------------------------ | ------------------------ | -------------------------------------------------------------------------------------- |","| `Agent` mode `Service`   | `Deployment`             | Always-on. Controller keeps one live `AgentRun`; re-casts on exit/failure.             |","| `Agent` mode `Task`      | reusable task template   | Creating the Agent does not execute it. A user creates a named, sparse `AgentRun` referencing it to trigger work. |","| `Agent` mode `Scheduled` | `CronJob`                | Mints one-shot `AgentRun`s from standard five-field cron slots. |","| `AgentRun`               | `Pod` / `Job`            | The single auditable execution unit. Owns one Pod unless warm-delivered to a standing Service runtime. Holds `status.result`, usage, immutable spec. |","","","`AgentRun` is the execution record every mode reuses. The `Agent` controller","manages standing Service and Scheduled `AgentRun`s the way","`Deployment`/`CronJob` manage their children. Users may also create referenced","runs to invoke Task Agents or warm-delivery-enabled Service Agents.","","---","","## `Agent`","","The reusable definition. Cluster-namespaced. Has a status subresource.","","### `spec`","","","| Field                | Type                                  | Req | Notes                                                          |","| -------------------- | ------------------------------------- | --- | -------------------------------------------------------------- |","| `mode`               | enum `Task` | `Service` | `Scheduled` | yes | Discriminator.                                                  |","| `runtime.image`      | string                                | yes | Container image implementing the runtime contract.             |","| `runtime.command`    | []string                              | no  | Override entrypoint.                                           |","| `runtime.args`       | []string                              | no  |                                                                |","| `runtime.result`     | object                                | no  | Optional stdout result capture policy.                         |","| `runtime.delivery`   | object                                | no  | Service-only opt-in to warm HTTP delivery. Requires `port`.    |","| `runtime.securityContext` | restricted security context     | no  | Portable non-root, capability-drop, filesystem, and seccomp settings. |","| `goal`               | string                                | no* | Concrete execution goal. Required for `Service`/`Scheduled`; exactly one of `goal` or `goalTemplate` is required for `Task`. |","| `goalTemplate`       | string                                | no  | Parameterized invocation goal for `Task` or a warm-delivery-enabled `Service`. |","| `provider`           | string                                | no  | Default `anthropic`.                                           |","| `model`              | string                                | yes |                                                                |","| `tools`              | []string                              | no  | Declared tool allowlist (semantics live in the runtime image). |","| `budget.tokens`      | int ≥ 1                               | no  |                                                                |","| `budget.wallclock`   | duration string                       | no  | e.g. `5m`. Enforced by controller.                             |","| `budget.dollars`     | number ≥ 0                            | no  |                                                                |","| `secretRef.name`     | string                                | no  | Provider credentials Secret.                                   |","| `knowledgeConfigMapRef.name` | string                       | no  | Static ConfigMap context mounted read-only at `/kontext/knowledge`. |","| `serviceAccountName` | string                                | no  | Per-agent identity.                                            |","| `env`                | []EnvVar                              | no  | Extra literal or Secret-backed env passed to the Pod.          |","| `schedule`           | `ScheduleSpec`                        | no* | Required and allowed only for `Scheduled`.                     |","| `backoff`            | object                                | no  | Re-cast backoff policy for `Service`. Controller-defaulted.    |","",""," required depending on `mode`.","","A Service Agent always has a concrete `goal` for its standing runtime. Without","`runtime.delivery`, it forbids `goalTemplate` and preserves the original","long-running behavior. Opting into warm delivery requires both","`runtime.delivery.port` and `goalTemplate`: `goal` starts the standing runtime,","while `goalTemplate` resolves each referenced user-created `AgentRun`.","`runtime.delivery.port` is an integer from 1 through 65535. Task and Scheduled","Agents cannot configure `runtime.delivery`.","","### `status`","","","| Field                | Type        | Notes                                |","| -------------------- | ----------- | ------------------------------------ |","| `conditions`         | []Condition | `Ready`, `Progressing`.              |","| `currentRunName`     | string      | `Service`: the live run.             |","| `lastRunName`        | string      | `Task`: newest retained owned run by creation time. `Scheduled`: newest retained owned run by slot; empty when no child is retained. |","| `runsCreated`        | int         | `Task`: current retained owned-run count. `Scheduled`: monotonic creation sequence. `Service`: monotonic standing-run suffix; delivered runs are excluded. |","| `restarts`           | int         | `Service`: re-cast count.            |","| `lastScheduleTime`   | timestamp   | `Scheduled`: latest observed slot that minted a run; retained after child pruning. |","| `nextScheduleTime`   | timestamp   | `Scheduled`: next slot the controller will evaluate. |","| `observedGeneration` | int         |                                      |","","### `ScheduleSpec`","","`Scheduled` requires a concrete `spec.goal`. Its schedule fields are:","","| Field | Type | Default | Contract |","| --- | --- | --- | --- |","| `expression` | string | required | Standard five-field minute/hour/day-of-month/month/day-of-week cron. Descriptors and seconds are rejected. |","| `timeZone` | IANA name | `Etc/UTC` | The expression cannot embed `TZ` or `CRON_TZ`. |","| `concurrencyPolicy` | `Allow` or `Forbid` | `Forbid` | `Forbid` treats Pending and Running owned runs as active. `Replace` is not supported. |","| `startingDeadlineSeconds` | non-negative int | `60` | A late slot is eligible only within this duration. |","| `suspend` | bool | `false` | Prevents new runs. Resuming waits for the next future slot. |","| `successfulRunsHistoryLimit` | non-negative int | `3` | Completed successful children retained. |","| `failedRunsHistoryLimit` | non-negative int | `1` | Completed failed or budget-exceeded children retained. |","","After controller downtime, only the latest due slot is considered. It is","created when still inside the starting deadline; older slots are skipped and","never burst-backfilled. A skipped `Forbid` overlap is not queued. Any Agent","generation change resets the scheduling anchor to the current time and waits","for the next future slot.","","Run names are derived from the scheduled slot, not reconciliation wall-clock","time. Creation is idempotent across retries and leader changes. Completed","history is pruned independently by outcome, active runs are never pruned, and","Agent ownership gives all children normal Kubernetes deletion cascading.","`currentRunName`, `restarts`, and Service backoff remain Service-only.","","Task and Scheduled status intentionally use different counting semantics. For","Task, deleting an owned run immediately decreases `runsCreated`; deleting the","newest run moves `lastRunName` to the next newest retained child, and deleting","all owned runs clears it. Creation timestamp determines Task recency, with","lexically greater run name as the deterministic tie-breaker. For Scheduled,","each new run receives an increasing sequence. `runsCreated` never decreases","when history pruning or a user deletes a child. `lastRunName` remains a live","reference and can move or clear as retained history changes.","","### Agent condition reasons","","The controller publishes `Ready` and `Progressing` conditions with these","mode-specific reasons:","","- Task: `TemplateReady` and `Idle` for a valid template;","  `InvalidTemplate` when invocations are blocked by template validation.","- Scheduled: `ScheduleInitialized`, `ScheduleUpdated`,","  `WaitingForSchedule`, `RunCreated`, `Suspended`, `MissedDeadline`,","  `OverlapSkipped`, and `InvalidSchedule`.","- Service: `Recasting`, `RunActive`, and `MissingGoal`.","- Unknown stored mode values: `InvalidMode`. The CRD enum rejects unknown","  values on normal writes.","","","---","","## `AgentRun`","","One bounded execution. It maps to exactly one owned Pod unless `spec.delivery`","marks it for a standing Service runtime. **Spec is immutable after creation**","(snapshot semantics) so a run is self-contained and auditable.","","### `spec`","","","| Field                | Type     | Req | Notes                                            |","| -------------------- | -------- | --- | ------------------------------------------------ |","| `agentRef.name`      | string   | no  | Owning `Agent`. CREATE admission treats a sparse user-created reference as an explicit Task or Service invocation. Omitted = standalone ad-hoc run. |","| `parameters`         | map[string]string | no | Immutable invocation parameters retained with the resolved snapshot. Requires `agentRef`. |","| `delivery.port`      | int      | no  | Immutable Service warm-delivery marker and port snapshot. Admission-controlled; requires `agentRef`. |","| `goal`               | string   | yes | Concrete, fully-resolved goal.                   |","| `provider`           | string   | no  | Resolved from Agent at creation.                 |","| `model`              | string   | yes |                                                  |","| `tools`              | []string | no  |                                                  |","| `budget`             | object   | no  | Resolved snapshot.                               |","| `secretRef.name`     | string   | no  |                                                  |","| `knowledgeConfigMapRef.name` | string | no | Static ConfigMap context mounted read-only at `/kontext/knowledge`. |","| `serviceAccountName` | string   | no  |                                                  |","| `env`                | []EnvVar | no  | Resolved literal or Secret-backed env snapshot.  |","| `runtime.image`      | string   | yes | Resolved from Agent.                             |","| `runtime.command`    | []string | no  | Required when stdout capture is configured.      |","| `runtime.args`       | []string | no  | Appended to the declared command.                |","| `runtime.result`     | object   | no  | Optional stdout result capture policy.           |","| `runtime.delivery`   | object   | no  | Resolved runtime capability snapshot; `spec.delivery` determines this run's lifecycle. |","| `runtime.securityContext` | restricted security context | no | Portable non-root, capability-drop, filesystem, and seccomp settings. |","","","When created from an `Agent`, execution fields are snapshotted so the run does","not drift if the `Agent` changes later. The Service and Scheduled controllers","create fully resolved Pod-owning runs. Admission adds `delivery` only to sparse","invocations of warm-delivery-enabled Service Agents; this immutable field is","the lifecycle discriminator and prevents a delivered run from being mistaken","for the Service's standing run. Standalone runs provide a complete execution","spec directly.","","### Referenced invocation and resolution","","Creating a Task `Agent` never starts work. A user explicitly triggers it by","submitting a user-named `AgentRun` whose `spec.agentRef.name` names that Task","Agent. Runs may be submitted concurrently; there is no generated-name or","single-active-run restriction. A user invokes a warm-delivery-enabled Service","Agent with the same sparse `AgentRun` shape. Service Agents without","`runtime.delivery` reject referenced invocations. Names matching the referenced","Service Agent followed by a canonical positive integer, such as `owner-1`, are","used for the controller's standing runs, so user invocations with those names","are rejected.","","A referenced invocation request is sparse: it may contain only `agentRef` and","optional `parameters`. Kubernetes","[invokes mutating admission first](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/)","and then validates the final object against the CRD. CREATE admission","receives the sparse request, resolves it in memory, and returns the complete","immutable execution snapshot that the API server validates and stores. The","persisted `AgentRun.spec` always includes `goal`, `model`, and `runtime.image`;","an unresolved sparse object is never valid stored state.","","Resolution copies runtime, provider, model, tools, budget, service account,","Secret reference, knowledge ConfigMap reference, and environment from the","Agent. For Task Agents, the concrete goal is copied from `goal` or rendered","from `goalTemplate`. For Service Agents, the standing `goal` is never","delivered; the invocation goal is rendered from `goalTemplate`, and admission","adds the immutable `delivery.port` snapshot. These execution fields are","locked: an invocation request that","supplies any of them is rejected, even when the supplied value would match the","template. Users needing execution overrides create a standalone `AgentRun` or","a separate Agent definition.","","A Task Agent configures exactly one of `goal` or `goalTemplate`. A static","`goal` accepts no parameters. A warm-delivery-enabled Service Agent configures","both its standing `goal` and its invocation `goalTemplate`. A template uses","only ASCII identifier","placeholders matching `[A-Za-z_][A-Za-z0-9_]*`:","","- `${name}` inserts the exact string value of parameter `name`.","- `$${name}` emits the literal text `${name}` and does not consume a parameter.","- Substitution is one pass: parameter values are never interpreted as","  templates.","- Repeated placeholders reuse the same parameter. Empty, Unicode, and","  multiline values are valid.","- Malformed placeholders, missing parameters, and supplied-but-unused","  parameters reject the invocation. Missing and unused names are reported in","  sorted order.","","Resolution is all-or-nothing and does not mutate either input object. Copied","maps, slices, pointers, and nested values are isolated from later mutation.","Provider defaults and aliases are normalized while the execution snapshot is","built, once at this boundary.","","The pure resolver in `internal/runfactory` defines these semantics. The CREATE","webhook fetches the referenced same-namespace Agent through the API reader,","rejects invalid requests, and returns the resolver's complete object as the","admission patch. Complete standalone and controller-created runs do not match","the sparse webhook and remain independent of invocation admission.","","The installed `MutatingWebhookConfiguration` matches namespaced","`kontext.dev/v1alpha1` `AgentRun` CREATE requests only when `agentRef` is","present and at least one required execution field is absent. It uses","`failurePolicy: Fail`, a five-second timeout, `matchPolicy: Equivalent`,","`sideEffects: None`, and no reinvocation. Matching sparse requests therefore","fail closed when admission is unavailable; complete requests bypass the","webhook.","","Every rejected referenced resolution includes one stable class:","","- `MissingAgent`: the same-namespace referenced Agent does not exist.","- `WrongMode`: the reference names a Scheduled or unknown-mode Agent.","- `DeliveryDisabled`: the reference names a Service Agent without","  `runtime.delivery`.","- `InvalidDelivery`: the Service delivery configuration is invalid.","- `ReservedName`: a Service invocation uses the standing-run name pattern","  `\u003cagent\u003e-\u003cpositive integer\u003e` managed by the controller.","- `InvalidTemplate`: the Agent definition has invalid goal/template shape or","  placeholder syntax.","- `MissingParameters`: required placeholder names have no supplied value.","- `UnusedParameters`: supplied names are unused, including any parameter map","  on a static goal.","- `ConflictingFields`: the invocation supplies one or more locked execution","  fields.","","### `status`","","","| Field                | Type                                                           | Notes                                                       |","| -------------------- | -------------------------------------------------------------- | ----------------------------------------------------------- |","| `phase`              | enum `Pending`|`Running`|`Succeeded`|`Failed`|`BudgetExceeded` |                                                             |","| `podName`            | string                                                         | Owned execution Pod, or the standing Service Pod selected for delivery. |","| `output.mediaType`   | string                                                         | Media type for the structured terminal output.              |","| `output.value`       | arbitrary JSON                                                 | Authoritative structured output.                            |","| `result`             | string                                                         | Backward-compatible deterministic projection of `output`.   |","| `usage.tokens`       | int                                                            | Total tokens when measured.                                 |","| `usage.inputTokens`  | int                                                            | Input tokens when measured.                                 |","| `usage.outputTokens` | int                                                            | Output tokens when measured.                                |","| `usage.dollars`      | number                                                         | Authoritative reported cost when measured.                  |","| `startTime`          | time                                                           |                                                             |","| `completionTime`     | time                                                           |                                                             |","| `message`            | string                                                         | Human-readable status/error.                                |","| `conditions`         | []Condition                                                    |                                                             |","","Usage fields are optional independently. A missing field means the runtime or","provider did not measure it; a present zero means it measured zero.","","","### Ownership","","`AgentRun` created from or resolved against an `Agent` carries an owner","reference to it → standard GC cascade. Standalone `AgentRun`s are allowed for","ad-hoc execution, demos, and direct task dispatch.","","For Task Agents, `status.lastRunName` is the newest retained owned Task run by","creation time. `status.runsCreated` is the exact number of currently retained","owned Task runs, not a lifetime counter. Deleting an owned run can therefore","decrease `runsCreated` and can move or clear `lastRunName`. These Task meanings","do not change the existing Service status semantics. Delivered Service runs do","not participate in standing-run suffixes, `currentRunName`, `lastRunName`,","`runsCreated`, or `restarts`. `currentRunName` and `restarts` stay empty for","Task Agents.","","### Contract evolution policy","","The four public contract surfaces evolve differently:","","- **Result envelopes are lenient at the top level.** Consumers ignore unknown","  top-level fields so producers can add optional result metadata without","  breaking older readers. Known fields are still fully validated.","  Runtime/provider-specific JSON belongs in `extensions` under namespaced keys","  such as `anthropic.com/request`.","- **Event envelopes are strict.** Consumers reject unknown top-level fields and","  trailing JSON. Changing the event envelope shape requires a new event","  contract version so streaming observers never silently interpret a different","  record shape.","- **Delivery request envelopes are strict.** Service runtimes reject unknown","  fields and trailing JSON. Changing the request shape requires a new delivery","  contract version.","- **CRDs evolve additively within `v1alpha1`.** Existing fields keep their","  meaning and new fields are optional. Kubernetes structurally validates CRD","  data; arbitrary JSON is confined to fields explicitly documented as","  schemaless, currently `AgentRun.status.output.value`.","","---","","## Runtime image contract","","Any container can be a Kontext agent if it follows this. Kontext never inspects what the agent *does* — only this I/O boundary.","","### Inputs","","The controller injects, on the Pod:","","- Env vars: `KONTEXT_GOAL`, `KONTEXT_MODEL`, `KONTEXT_PROVIDER`, `KONTEXT_TOOLS` (comma-separated), `KONTEXT_BUDGET_TOKENS`, `KONTEXT_BUDGET_WALLCLOCK`, `KONTEXT_BUDGET_DOLLARS`, `KONTEXT_AGENT_NAME`, `KONTEXT_RUN_NAME`. Warm-delivery Service Pods additionally receive the Secret-backed `KONTEXT_DELIVERY_TOKEN`.","- Provider credentials mounted from `secretRef` as env (e.g. `ANTHROPIC_API_KEY`).","- Optional static ConfigMap context from `knowledgeConfigMapRef`, mounted","  read-only at `/kontext/knowledge`. This is not RAG: the control plane does no","  ingestion, embedding, ranking, or retrieval.","- Generic `spec.env` entries. Each entry selects exactly one literal `value` or","  `valueFrom.secretKeyRef{name,key}`. Controller-managed variables cannot be","  overridden through either form. Secret values remain Kubernetes Secret data;","  they are not copied into Agent/AgentRun fields or controller logs.","","### Input — Service warm delivery","","A Service runtime opts in by configuring `spec.runtime.delivery.port`. The","runtime listens on that port on the Pod network interface and exposes:","","```text","POST /kontext.dev/v1alpha1/agent-runs","Host: \u003cstanding Pod name\u003e","Content-Type: application/json","Accept: application/json","```","","The request is one strict JSON object:","","```json","{","  \"apiVersion\": \"kontext.dev/delivery/v1alpha1\",","  \"run\": {","    \"name\": \"review-42\",","    \"namespace\": \"default\",","    \"uid\": \"6d291c0e-3a2d-4b33-956e-8d4ec30f1ac3\"","  },","  \"target\": {","    \"name\": \"owner-1-pod\",","    \"uid\": \"481b6787-bc93-4eae-9d23-e8253c99d481\"","  },","  \"goal\": \"the fully resolved invocation goal\"","}","```","","`run` identifies the persisted `AgentRun` audit record. Its Kubernetes UID is","the delivery idempotency identity; runtimes must not execute the same UID","concurrently and should replay a cached terminal response when they still have","one. The controller does not promise exactly-once execution across ambiguous","network failures or Service Pod replacement. Runtimes performing non-idempotent","external effects must persist whatever stronger deduplication their workload","requires.","","`target` identifies the verified standing Service Pod selected for this","attempt. The controller also sets the HTTP `Host` header to that Pod name. A","runtime must reject a request whose Host does not match its own Kubernetes","hostname before accepting the delivery. The controller verifies the target Pod","name, UID, IP, readiness, and owner chain again after the HTTP exchange and","discards the response if that identity changed.","","Each standing warm-delivery Pod receives a controller-generated random","credential through the Secret-backed `KONTEXT_DELIVERY_TOKEN` environment","variable. The credential never appears in an Agent or AgentRun, request,","status, or log. For every attempt, the controller sends a fresh base64url","nonce in `Kontext-Delivery-Challenge`. A successful runtime response includes","`Kontext-Delivery-Signature`, computed as unpadded base64url of:","","```text","HMAC-SHA256(","  KONTEXT_DELIVERY_TOKEN,","  apiVersion || 0x00 || challenge || 0x00 || run.uid || 0x00 || exact-response-body",")","```","","The controller verifies that signature before parsing or projecting the result","envelope. Missing or invalid signatures fail the run. This challenge-response","binds the accepted result to the credential mounted only into the verified","standing Pod without transmitting that credential over plaintext Pod HTTP.","","The request contains the resolved goal, not template parameters. Parameter","rendering and execution-field snapshotting have already completed in","admission. Unknown fields, a missing run or target identity or goal, an unsupported","`apiVersion`, and trailing JSON are invalid requests.","","The runtime returns HTTP `200 OK` only with one terminal","`kontext.dev/result/v1alpha1` envelope as the response body. The envelope is","validated and projected into `status.output`, `status.result`, and","`status.usage` exactly like a native termination-log envelope. Legacy result","payloads and plain text are not accepted on this new endpoint. The complete","response body must not exceed 4096 bytes. A non-2xx response or malformed or","oversized body fails the run with an actionable status message. A transport","failure without a response returns the run to `Pending` and retries against","the current standing Pod using the stable run UID. Exhausting the bounded","delivery window fails the run.","","Delivery uses the existing phases; it does not add a `Delivered` phase:","","- `Pending` — waiting for the referenced Service Agent to have a live, Ready","  standing Pod, or waiting to retry a connection that was not established.","- `Running` — the controller has started the HTTP request against the selected","  Pod. `status.startTime` is set and `status.podName` records that standing Pod.","- `Succeeded` or `Failed` — projected from a valid terminal response envelope,","  or failed by the controller for a delivery/protocol error.","- `BudgetExceeded` — the delivered run exceeded its wallclock budget.","","A missing, unready, unreachable, or mid-recast target remains or returns to","`Pending` and is retried with bounded backoff until the delivery window","expires. Kontext does not create a replacement Pod for a delivered run;","Service recast remains the `Agent` controller's responsibility. The delivery","window is five minutes from `AgentRun` creation. Once the first HTTP attempt","starts, `budget.wallclock` also runs across transport retries and wins when it","expires sooner. Request cancellation closes the HTTP request; runtimes should","stop work when the request context is canceled.","","The control plane sends one delivery to one standing runtime and records its","outcome. Queueing, prioritization, fan-out, and workload-specific backpressure","remain runtime-image concerns.","","### Output — logs and execution events","","- Write operational progress to **stdout** and diagnostics to **stderr**,","  line-buffered. Both remain ordinary container logs observable with","  `kubectl logs`.","- Runtimes that expose detailed execution events write one JSON object per line.","  Event objects use `apiVersion: kontext.dev/event/v1alpha1`, an RFC3339","  `timestamp`, a `type` (`lifecycle`, `output`, `usage`, `tool`, or `error`),","  and type-specific `data`. Events may include tool calls, bounded tool output,","  timing, provider usage, errors, and final responses.","- Do not emit private chain-of-thought. Operational summaries and explicit","  model/tool outputs are sufficient.","","### Output — result","","The terminal envelope is optional at the control-plane boundary. An empty or","whitespace-only termination message is normalized internally to the current","result API version with outcome `Succeeded` and no output, usage, or error; it","is not a legacy wire payload. An unchanged plain image that exits `0` without","writing `/dev/termination-log` therefore succeeds with absent `status.output`","and an empty `status.result`. Native runtimes and images using injected stdout","capture write richer structured output, usage, timing, and execution metadata.","","On completion, a one-shot runtime that provides a structured result writes a","compact versioned envelope to `/dev/termination-log` (and may also write","`/kontext/result.json`). A warm-delivery Service runtime returns the same","versioned envelope as its HTTP response body:","","```json","{","  \"apiVersion\": \"kontext.dev/result/v1alpha1\",","  \"outcome\": \"Succeeded\",","  \"output\": {","    \"mediaType\": \"application/json\",","    \"value\": { \"answer\": \"final output\" }","  },","  \"usage\": {","    \"inputTokens\": 1000,","    \"outputTokens\": 234,","    \"totalTokens\": 1234,","    \"reasoningTokens\": 180","  },","  \"timing\": {","    \"durationMillis\": 1750","  },","  \"execution\": {","    \"provider\": \"anthropic\",","    \"model\": \"provider-defined-model-id\",","    \"requestId\": \"request-id\"","  }","}","```","","The envelope fields are:","","- `apiVersion` — exactly `kontext.dev/result/v1alpha1`.","- `outcome` — `Succeeded` or `Failed`. A failed outcome includes","  `error.message` and may include a stable `error.code` and `error.retryable`.","- `output` — an optional media type plus any valid JSON value.","- `usage` — optional typed metrics. `reasoningTokens` records a","  provider-reported reasoning-token breakdown of output/completion usage.","  Missing values are never inferred as zero, including when the provider does","  not expose that breakdown; a present zero means the provider measured zero.","  Visible response text can therefore tokenize to fewer tokens than","  `outputTokens`: provider completion totals may also include hidden reasoning","  or other provider-defined completion accounting. The count does not expose","  reasoning content.","- `timing` — optional start/completion timestamps and measured durations.","- `execution` — optional non-secret provider, model, request, turn, and tool","  metadata.","- `artifacts` — optional references to data stored outside Kubernetes status.","- `extensions` — optional provider/runtime-specific JSON under namespaced keys","  such as `anthropic.com/request`.","- `truncation` — explicit metadata added when fields were removed to fit the","  Kubernetes termination-message limit.","","The termination message is a terminal summary, not a transcript. Producers","must compact it below 4096 bytes while preserving valid JSON and setting","`truncation`. Full execution events remain in the JSONL log stream.","","The controller projects the stable aggregate usage fields into","`AgentRun.status.usage`. Optional usage breakdowns such as `reasoningTokens`","remain in the versioned result envelope and usage events, avoiding","provider-detail growth in Kubernetes status.","","`status.output` preserves `output`. The compatibility field `status.result` is","projected deterministically: JSON strings with a `text/*` media type become","their unquoted value; every other JSON value becomes compact JSON text; absent","output becomes an empty string.","","The controller continues to accept the legacy payload during the v1alpha1","transition:","","```json","{ \"result\": \"\u003cfinal output\u003e\", \"tokensUsed\": 1234, \"dollarsUsed\": 0.0 }","```","","Legacy text becomes `text/plain` structured output. Legacy usage fields are","recorded only when they are present in the payload. For compatibility, the","process exit code remains authoritative for legacy payloads; a legacy `error`","field is retained as diagnostic text but never determines the run outcome and","does not turn exit `0` into failure.","","Exit `0` with no termination payload or with a successful envelope means","success. A non-zero process exit always fails the run. A failed envelope also","fails the run even if the process exits zero. If a JSON-looking termination","payload is present, malformed or partially written JSON remains an actionable","failure rather than silently becoming a successful plain-text result.","","### Optional result reporter","","The maintained `runtimes/reporter` executable can supervise an explicit child","command and produce the versioned envelope without requiring the child to write","the termination log itself. It preserves child stdout, stderr, signals, and","process exit status.","","Reporter extraction supports:","","- `last-line` — the last non-empty stdout line becomes `text/plain` output.","- `kontext-envelope` — the last stdout line prefixed with","  `KONTEXT_RESULT:` supplies a complete versioned envelope.","","The reporter bounds only captured result data; streamed logs remain unbounded.","It compacts every emitted envelope to the termination-message limit. Reporter","injection and workload configuration are control-plane concerns defined","separately from this executable.","","An existing Linux image opts into stdout capture with:","","```yaml","runtime:","  image: example/agent:v1","  command: [\"python\", \"-m\", \"agent\"]","  result:","    source: Stdout","    format: LastLine","```","","`runtime.command` is required because reporter injection replaces the image","entrypoint; Kubernetes cannot recover that entrypoint automatically.","`KontextEnvelope` is the other supported format. Without `runtime.result`,","Kontext leaves the image entrypoint and native termination behavior unchanged.","","The operator installation selects the trusted reporter image. Kontext injects","its binary with an init container and mounts it read-only into the workload","container; workloads cannot select a different reporter image. The controller","does not read Pod logs and needs no `pods/log` permission. `LastLine` is","heuristic, cannot infer usage, and is discouraged for long-running Service","agents. The trusted init container runs as UID 0 only while populating the","otherwise empty shared volume; it drops capabilities, disables privilege","escalation, and uses a read-only root filesystem. The workload container's own","user and security context remain unchanged.","","### Runtime roles","","`runtimes/echo` is the deterministic control-plane conformance oracle. During","the v1alpha1 transition it intentionally writes the legacy termination payload","documented above. `runtimes/reference` is the maintained model-backed runtime.","Arbitrary conforming images remain supported and need not use any of these","implementations.","","### Maintained reference runtime","","`runtimes/reference` is the optional maintained Go runtime. It owns a small","provider-neutral completion loop behind a normalized provider interface; it is","not an agent framework. The runtime image bundles the reporter as PID 1 and","uses the internal `KONTEXT_RESULT:` capture protocol so the reporter can write","the authoritative versioned envelope to the runtime container's termination","message. Raw logs remain an event and diagnostic stream.","","The initial keyless `fake` provider is deterministic and exercises the same","configuration, conversation, event, result, cancellation, and failure paths","that real HTTP transports use. The maintained real transports are Anthropic","Messages (`anthropic`) and OpenAI-compatible Chat Completions (`openai` or","`openai-compatible`). They use direct non-streaming HTTP, accept an optional","exact endpoint or base-URL override, and normalize text, function tool calls,","stop reasons, measured usage, request IDs, and actionable transport errors.","The OpenAI-compatible boundary is the documented Chat Completions request,","response, bearer-auth, and function-tool-call shape; it does not imply support","for the Responses API, streaming, Azure URL construction, or every inference","protocol. `KONTEXT_MODEL` remains opaque and is never aliased or rewritten.","","Credentials come from the `AgentRun` Secret policy as `ANTHROPIC_API_KEY` or","`OPENAI_API_KEY`. Authenticated acceptance is manual and environment-protected;","pull-request CI remains deterministic, keyless, and network-independent.","","The controller remains authoritative for wallclock enforcement. The runtime","parses `KONTEXT_BUDGET_WALLCLOCK` but does not start a competing timer; it","reacts to cancellation when the reporter forwards controller signals.","Omission means no deadline, and the runtime does not invent a five-minute","default.","","The maintained runtime exposes only tools named in `KONTEXT_TOOLS`. It owns a","bounded provider-neutral loop that returns normalized tool results until final","output, cancellation, failure, or a configured turn, token, tool-call, or","tool-output limit. Omitted or zero runtime limits are disabled. Built-in tools","are `read_knowledge`, `kubernetes_read`, and `shell`.","","The reference runtime applies `KONTEXT_BUDGET_TOKENS` to cumulative measured","provider usage across every request in the run. Each tool follow-up resends the","conversation, including prior tool calls and bounded results, so providers may","count that context again. Provider-reported reasoning or completion usage also","counts even when it does not appear in the final text. The runtime sends the","remaining budget as a provider completion limit where supported, but checks","actual usage only after each response. A response can therefore exceed the run","budget and fail with `token_limit_exceeded`. Missing usage is not estimated.","Budgets need headroom because provider and model usage can vary between live","runs.","","`read_knowledge` is confined to `/kontext/knowledge`. `kubernetes_read` has a","fixed current-namespace get/list allowlist and never reads Secrets. `shell`","uses an explicit working directory, filters its direct child environment,","streams logs, bounds captured output, and cleans up its process group on","cancellation. These runtime checks prevent accidental exposure; Kubernetes","RBAC, workload security context, mounted data, and container isolation remain","the security boundaries. In particular, `shell` shares the runtime container;","environment filtering does not isolate its filesystem or process view. Tool","events omit result content by default; the maintained runtime requires an","explicit opt-in before placing bounded tool content in the event stream.","","Configured per-result and cumulative tool-output limits bound content returned","to the model. Omission or zero disables those configured limits, but built-in","tools still enforce a fixed 8 MiB capture safety ceiling per call. Tool errors","become structured results that the model may recover from; they do not fail the","run by themselves. Only a successful terminal provider response without tool","calls becomes final output. Cancellation, execution failures, or reaching a","configured limit before final output fail the run.","","When tool content exceeds an effective positive byte limit, the runtime sets","the tool result's `truncated` field to `true` and normally replaces `content`","with `{\"partial\":\"\u003cUTF-8 prefix\u003e\"}`. The prefix is chosen so the complete","encoded envelope, including JSON escaping and envelope overhead, does not","exceed the limit. If the limit is too small for that envelope, the runtime","returns the deterministic minimal JSON value `0` at one byte or `{}` when at","least two bytes fit. Thus every positively bounded truncated result is valid","UTF-8, valid JSON, and no larger than its effective limit. Providers preserve","this bounded JSON as the tool-result content string alongside the explicit","truncation metadata.","","The reference runtime emits versioned JSONL lifecycle, usage, tool, output, and","error events to stdout. It retains conversation state only in memory for one","run and does not provide retries, planning, persistent memory, retrieval,","subagents, or background orchestration.","","Configured MCP servers are a maintained-runtime concern, not control-plane","vocabulary. The reference runtime uses the official MCP Go SDK v1.6.1, which","requires Go 1.25 or newer; this repository declares Go 1.26.6. The SDK","negotiates protocol `2025-11-25` and accepts `2025-06-18`, `2025-03-26`, and","`2024-11-05`. Discovered MCP tools join the same immutable allowlisted registry","and use the same turn, call-count, output, cancellation, event, and cleanup","controls as built-ins.","","The maintained Playwright MCP example is a separate restricted","Deployment/Service reached over HTTP `/mcp`, never an AgentRun sidecar.","Playwright MCP 0.0.78 is pinned to","`mcr.microsoft.com/playwright/mcp@sha256:3d871c22ea2d4cca0966e2cfb1860e1cb03eb7353725a3d6cffd133296fb04eb`.","The browser server has its own keyless identity, ephemeral profile and writable","storage, finite resources, and NetworkPolicy. It does not add MCP or browser","fields to either CRD. The example disables Chromium's sandbox because the","pinned image runs in a restricted container; Playwright MCP is not itself a","security boundary.","","### Mode expectations for the image","","- **Task / Scheduled run image:** does its work, writes result, exits. Pod `restartPolicy: Never`.","- **Service run image:** expected to be long-running (loop / serve / watch).","  When `runtime.delivery` is configured, it also implements the warm-delivery","  HTTP endpoint. When the standing process exits for any reason, the `Agent`","  (Service) controller mints a fresh Pod-owning `AgentRun` — this is \"instantly","  re-cast on failure\". Delivered `AgentRun`s never own or recast Pods.","","---","","## Anti-overfit firewall (read before adding a field)","","Kontext's vocabulary is fixed: `Agent`, `AgentRun`, runtime image, mode, budget, secret, tools, status, result. It must not gain domain-specific fields or workflow semantics for any one consumer. Consumers encode their semantics inside runtime images and orchestrate by creating generic `Agent`/`AgentRun` objects."],"stylingDirectives":[[[0,3,"pl-s"]],[[0,5,"pl-ent"],[7,24,"pl-s"]],[[0,11,"pl-ent"],[13,82,"pl-s"]],[[0,12,"pl-ent"],[14,22,"pl-s"]],[[0,3,"pl-s"]],[],[[0,40,"pl-mh"],[2,40,"pl-en"],[29,30,"pl-s"],[30,38,"pl-c1"],[38,39,"pl-s"]],[],[[0,74,"pl-ent"],[0,2,"pl-ent"],[24,25,"pl-s"],[25,33,"pl-c1"],[33,34,"pl-s"]],[[0,79,"pl-ent"],[0,2,"pl-ent"]],[[0,64,"pl-ent"],[0,2,"pl-ent"]],[[0,0,"pl-ent"]],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[25,27,"pl-s"],[53,55,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[38,40,"pl-s"],[49,51,"pl-s"]],[],[[0,1,"pl-v"],[2,4,"pl-s"],[26,28,"pl-s"]],[],[[19,20,"pl-s"],[20,40,"pl-c1"],[40,41,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,40,"pl-mh"],[3,40,"pl-en"]],[],[],[[0,1,"pl-ml"],[27,28,"pl-ml"],[54,55,"pl-ml"],[143,144,"pl-ml"]],[[0,1,"pl-ml"],[27,28,"pl-ml"],[54,55,"pl-ml"],[143,144,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[15,16,"pl-s"],[16,23,"pl-c1"],[23,24,"pl-s"],[27,28,"pl-ml"],[29,30,"pl-s"],[30,40,"pl-c1"],[40,41,"pl-s"],[54,55,"pl-ml"],[93,94,"pl-s"],[94,102,"pl-c1"],[102,103,"pl-s"],[143,144,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[15,16,"pl-s"],[16,20,"pl-c1"],[20,21,"pl-s"],[27,28,"pl-ml"],[54,55,"pl-ml"],[127,128,"pl-s"],[128,136,"pl-c1"],[136,137,"pl-s"],[170,171,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[15,16,"pl-s"],[16,25,"pl-c1"],[25,26,"pl-s"],[27,28,"pl-ml"],[29,30,"pl-s"],[30,37,"pl-c1"],[37,38,"pl-s"],[54,55,"pl-ml"],[71,72,"pl-s"],[72,80,"pl-c1"],[80,81,"pl-s"],[120,121,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[27,28,"pl-ml"],[29,30,"pl-s"],[30,33,"pl-c1"],[33,34,"pl-s"],[37,38,"pl-s"],[38,41,"pl-c1"],[41,42,"pl-s"],[54,55,"pl-ml"],[165,166,"pl-s"],[166,179,"pl-c1"],[179,180,"pl-s"],[205,206,"pl-ml"]],[],[],[[0,1,"pl-s"],[1,9,"pl-c1"],[9,10,"pl-s"],[58,59,"pl-s"],[59,64,"pl-c1"],[64,65,"pl-s"]],[[39,40,"pl-s"],[40,48,"pl-c1"],[48,49,"pl-s"]],[[0,1,"pl-s"],[1,11,"pl-c1"],[11,12,"pl-s"],[13,14,"pl-s"],[14,21,"pl-c1"],[21,22,"pl-s"]],[],[],[[0,3,"pl-ms"]],[],[[0,10,"pl-mh"],[3,10,"pl-en"],[3,4,"pl-s"],[4,9,"pl-c1"],[9,10,"pl-s"]],[],[],[],[[0,10,"pl-mh"],[4,10,"pl-en"],[4,5,"pl-s"],[5,9,"pl-c1"],[9,10,"pl-s"]],[],[],[[0,1,"pl-ml"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,7,"pl-c1"],[7,8,"pl-s"],[23,24,"pl-ml"],[30,31,"pl-s"],[31,35,"pl-c1"],[35,36,"pl-s"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,47,"pl-c1"],[47,48,"pl-s"],[49,50,"pl-ml"],[51,52,"pl-s"],[52,61,"pl-c1"],[61,62,"pl-s"],[63,64,"pl-ml"],[69,70,"pl-ml"],[135,136,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,27,"pl-s"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,27,"pl-s"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[123,124,"pl-s"],[124,128,"pl-c1"],[128,129,"pl-s"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,26,"pl-c1"],[26,27,"pl-s"],[28,29,"pl-ml"],[62,63,"pl-ml"],[68,69,"pl-ml"],[140,141,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,7,"pl-c1"],[7,8,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[67,68,"pl-s"],[69,70,"pl-ml"],[109,110,"pl-s"],[110,117,"pl-c1"],[117,118,"pl-s"],[119,120,"pl-s"],[120,129,"pl-c1"],[129,130,"pl-s"],[147,148,"pl-s"],[148,152,"pl-c1"],[152,153,"pl-s"],[157,158,"pl-s"],[158,170,"pl-c1"],[170,171,"pl-s"],[188,189,"pl-s"],[189,193,"pl-c1"],[193,194,"pl-s"],[196,197,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[105,106,"pl-s"],[106,110,"pl-c1"],[110,111,"pl-s"],[139,140,"pl-s"],[140,147,"pl-c1"],[147,148,"pl-s"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[79,80,"pl-s"],[80,89,"pl-c1"],[89,90,"pl-s"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,27,"pl-s"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[76,77,"pl-s"],[77,79,"pl-c1"],[79,80,"pl-s"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"],[31,32,"pl-ml"],[62,63,"pl-ml"],[68,69,"pl-ml"],[116,117,"pl-s"],[117,135,"pl-c1"],[135,136,"pl-s"],[138,139,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,6,"pl-c1"],[6,7,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,27,"pl-s"],[63,64,"pl-ml"],[69,70,"pl-ml"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,38,"pl-c1"],[38,39,"pl-s"],[63,64,"pl-ml"],[67,68,"pl-s"],[69,70,"pl-ml"],[101,102,"pl-s"],[102,111,"pl-c1"],[111,112,"pl-s"],[134,135,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"],[23,24,"pl-ml"],[63,64,"pl-ml"],[69,70,"pl-ml"],[98,99,"pl-s"],[99,106,"pl-c1"],[106,107,"pl-s"],[134,135,"pl-ml"]],[],[],[[23,24,"pl-s"],[24,28,"pl-c1"],[28,29,"pl-s"]],[],[[38,39,"pl-s"],[39,43,"pl-c1"],[43,44,"pl-s"]],[[0,1,"pl-s"],[1,17,"pl-c1"],[17,18,"pl-s"],[31,32,"pl-s"],[32,44,"pl-c1"],[44,45,"pl-s"]],[],[[0,1,"pl-s"],[1,22,"pl-c1"],[22,23,"pl-s"],[28,29,"pl-s"],[29,41,"pl-c1"],[41,42,"pl-s"],[44,45,"pl-s"],[45,49,"pl-c1"],[49,50,"pl-s"]],[[6,7,"pl-s"],[7,19,"pl-c1"],[19,20,"pl-s"],[59,60,"pl-s"],[60,68,"pl-c1"],[68,69,"pl-s"]],[[0,1,"pl-s"],[1,22,"pl-c1"],[22,23,"pl-s"]],[[24,25,"pl-s"],[25,41,"pl-c1"],[41,42,"pl-s"]],[],[[0,12,"pl-mh"],[4,12,"pl-en"],[4,5,"pl-s"],[5,11,"pl-c1"],[11,12,"pl-s"]],[],[],[[0,1,"pl-ml"],[23,24,"pl-ml"],[37,38,"pl-ml"],[76,77,"pl-ml"]],[[0,1,"pl-ml"],[23,24,"pl-ml"],[37,38,"pl-ml"],[76,77,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,27,"pl-s"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,45,"pl-c1"],[45,46,"pl-s"],[48,49,"pl-s"],[49,60,"pl-c1"],[60,61,"pl-s"],[76,77,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[23,24,"pl-ml"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,47,"pl-c1"],[47,48,"pl-s"],[76,77,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,14,"pl-c1"],[14,15,"pl-s"],[23,24,"pl-ml"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,44,"pl-c1"],[44,45,"pl-s"],[91,92,"pl-s"],[92,101,"pl-c1"],[101,102,"pl-s"],[172,173,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,14,"pl-c1"],[14,15,"pl-s"],[23,24,"pl-ml"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,44,"pl-c1"],[44,45,"pl-s"],[81,82,"pl-s"],[82,91,"pl-c1"],[91,92,"pl-s"],[123,124,"pl-s"],[124,131,"pl-c1"],[131,132,"pl-s"],[194,195,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[23,24,"pl-ml"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,47,"pl-c1"],[47,48,"pl-s"],[76,77,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"],[23,24,"pl-ml"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,49,"pl-c1"],[49,50,"pl-s"],[122,123,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"],[23,24,"pl-ml"],[37,38,"pl-ml"],[39,40,"pl-s"],[40,49,"pl-c1"],[49,50,"pl-s"],[92,93,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[23,24,"pl-ml"],[37,38,"pl-ml"],[76,77,"pl-ml"]],[],[[0,18,"pl-mh"],[4,18,"pl-en"],[4,5,"pl-s"],[5,17,"pl-c1"],[17,18,"pl-s"]],[],[[0,1,"pl-s"],[1,10,"pl-c1"],[10,11,"pl-s"],[32,33,"pl-s"],[33,42,"pl-c1"],[42,43,"pl-s"]],[],[[0,1,"pl-ml"],[8,9,"pl-ml"],[15,16,"pl-ml"],[25,26,"pl-ml"],[36,37,"pl-ml"]],[[0,1,"pl-ml"],[6,7,"pl-ml"],[12,13,"pl-ml"],[18,19,"pl-ml"],[24,25,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"],[15,16,"pl-ml"],[24,25,"pl-ml"],[35,36,"pl-ml"],[144,145,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[13,14,"pl-ml"],[25,26,"pl-ml"],[27,28,"pl-s"],[28,35,"pl-c1"],[35,36,"pl-s"],[37,38,"pl-ml"],[67,68,"pl-s"],[68,70,"pl-c1"],[70,71,"pl-s"],[75,76,"pl-s"],[76,83,"pl-c1"],[83,84,"pl-s"],[86,87,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,20,"pl-c1"],[20,21,"pl-s"],[22,23,"pl-ml"],[24,25,"pl-s"],[25,30,"pl-c1"],[30,31,"pl-s"],[35,36,"pl-s"],[36,42,"pl-c1"],[42,43,"pl-s"],[44,45,"pl-ml"],[46,47,"pl-s"],[47,53,"pl-c1"],[53,54,"pl-s"],[55,56,"pl-ml"],[57,58,"pl-s"],[58,64,"pl-c1"],[64,65,"pl-s"],[115,116,"pl-s"],[116,123,"pl-c1"],[123,124,"pl-s"],[143,144,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,26,"pl-c1"],[26,27,"pl-s"],[28,29,"pl-ml"],[47,48,"pl-ml"],[49,50,"pl-s"],[50,52,"pl-c1"],[52,53,"pl-s"],[54,55,"pl-ml"],[107,108,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"],[12,13,"pl-ml"],[19,20,"pl-ml"],[21,22,"pl-s"],[22,27,"pl-c1"],[27,28,"pl-s"],[29,30,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"],[31,32,"pl-ml"],[50,51,"pl-ml"],[52,53,"pl-s"],[53,54,"pl-c1"],[54,55,"pl-s"],[56,57,"pl-ml"],[98,99,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,25,"pl-c1"],[25,26,"pl-s"],[27,28,"pl-ml"],[46,47,"pl-ml"],[48,49,"pl-s"],[49,50,"pl-c1"],[50,51,"pl-s"],[52,53,"pl-ml"],[109,110,"pl-ml"]],[],[],[],[[34,35,"pl-s"],[35,41,"pl-c1"],[41,42,"pl-s"]],[],[],[],[],[],[],[],[[0,1,"pl-s"],[1,15,"pl-c1"],[15,16,"pl-s"],[18,19,"pl-s"],[19,27,"pl-c1"],[27,28,"pl-s"]],[],[],[[50,51,"pl-s"],[51,62,"pl-c1"],[62,63,"pl-s"]],[[17,18,"pl-s"],[18,29,"pl-c1"],[29,30,"pl-s"]],[],[],[[46,47,"pl-s"],[47,58,"pl-c1"],[58,59,"pl-s"]],[[48,49,"pl-s"],[49,60,"pl-c1"],[60,61,"pl-s"]],[],[],[[0,27,"pl-mh"],[4,27,"pl-en"]],[],[[25,26,"pl-s"],[26,31,"pl-c1"],[31,32,"pl-s"],[37,38,"pl-s"],[38,49,"pl-c1"],[49,50,"pl-s"]],[],[],[[0,1,"pl-v"],[8,9,"pl-s"],[9,22,"pl-c1"],[22,23,"pl-s"],[28,29,"pl-s"],[29,33,"pl-c1"],[33,34,"pl-s"]],[[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"]],[[0,1,"pl-v"],[13,14,"pl-s"],[14,33,"pl-c1"],[33,34,"pl-s"],[36,37,"pl-s"],[37,52,"pl-c1"],[52,53,"pl-s"]],[[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[24,25,"pl-s"],[25,35,"pl-c1"],[35,36,"pl-s"],[38,39,"pl-s"],[39,48,"pl-c1"],[48,49,"pl-s"],[51,52,"pl-s"],[52,66,"pl-c1"],[66,67,"pl-s"]],[[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[24,25,"pl-s"],[25,40,"pl-c1"],[40,41,"pl-s"]],[[0,1,"pl-v"],[11,12,"pl-s"],[12,21,"pl-c1"],[21,22,"pl-s"],[24,25,"pl-s"],[25,34,"pl-c1"],[34,35,"pl-s"],[41,42,"pl-s"],[42,53,"pl-c1"],[53,54,"pl-s"]],[[0,1,"pl-v"],[30,31,"pl-s"],[31,42,"pl-c1"],[42,43,"pl-s"]],[],[],[],[[0,3,"pl-ms"]],[],[[0,13,"pl-mh"],[3,13,"pl-en"],[3,4,"pl-s"],[4,12,"pl-c1"],[12,13,"pl-s"]],[],[[63,64,"pl-s"],[64,77,"pl-c1"],[77,78,"pl-s"]],[[41,43,"pl-s"],[75,77,"pl-s"]],[],[],[[0,10,"pl-mh"],[4,10,"pl-en"],[4,5,"pl-s"],[5,9,"pl-c1"],[9,10,"pl-s"]],[],[],[[0,1,"pl-ml"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[49,50,"pl-s"],[50,55,"pl-c1"],[55,56,"pl-s"],[190,191,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"],[23,24,"pl-ml"],[28,29,"pl-s"],[35,36,"pl-s"],[43,44,"pl-ml"],[48,49,"pl-ml"],[128,129,"pl-s"],[129,137,"pl-c1"],[137,138,"pl-s"],[140,141,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[131,132,"pl-s"],[132,140,"pl-c1"],[140,141,"pl-s"],[143,144,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,7,"pl-c1"],[7,8,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,27,"pl-s"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"],[31,32,"pl-ml"],[40,41,"pl-ml"],[45,46,"pl-ml"],[93,94,"pl-s"],[94,112,"pl-c1"],[112,113,"pl-s"],[115,116,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,6,"pl-c1"],[6,7,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,27,"pl-s"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,27,"pl-s"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,27,"pl-s"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[91,92,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"],[23,24,"pl-ml"],[34,35,"pl-ml"],[40,41,"pl-ml"],[80,81,"pl-s"],[81,94,"pl-c1"],[94,95,"pl-s"],[129,130,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,26,"pl-c1"],[26,27,"pl-s"],[28,29,"pl-ml"],[58,59,"pl-ml"],[63,64,"pl-ml"],[135,136,"pl-ml"]],[],[],[[21,22,"pl-s"],[22,27,"pl-c1"],[27,28,"pl-s"]],[[17,18,"pl-s"],[18,23,"pl-c1"],[23,24,"pl-s"]],[[54,55,"pl-s"],[55,63,"pl-c1"],[63,64,"pl-s"]],[],[],[],[],[],[[0,40,"pl-mh"],[4,40,"pl-en"]],[],[[16,17,"pl-s"],[17,22,"pl-c1"],[22,23,"pl-s"]],[[24,25,"pl-s"],[25,33,"pl-c1"],[33,34,"pl-s"],[41,42,"pl-s"],[42,60,"pl-c1"],[60,61,"pl-s"]],[],[],[[27,28,"pl-s"],[28,36,"pl-c1"],[36,37,"pl-s"]],[[0,1,"pl-s"],[1,17,"pl-c1"],[17,18,"pl-s"]],[[64,65,"pl-s"],[65,72,"pl-c1"],[72,73,"pl-s"]],[],[],[],[[63,64,"pl-s"],[64,72,"pl-c1"],[72,73,"pl-s"]],[[9,10,"pl-s"],[10,20,"pl-c1"],[20,21,"pl-s"]],[[0,1,"pl-s"],[33,34,"pl-s"],[34,35,"pl-s"],[35,124,"pl-corl"],[124,125,"pl-s"]],[],[],[],[[10,11,"pl-s"],[11,24,"pl-c1"],[24,25,"pl-s"],[42,43,"pl-s"],[43,47,"pl-c1"],[47,48,"pl-s"],[50,51,"pl-s"],[51,56,"pl-c1"],[56,57,"pl-s"],[63,64,"pl-s"],[64,77,"pl-c1"],[77,78,"pl-s"]],[],[],[],[],[[57,58,"pl-s"],[58,62,"pl-c1"],[62,63,"pl-s"]],[[5,6,"pl-s"],[6,18,"pl-c1"],[18,19,"pl-s"],[54,55,"pl-s"],[55,59,"pl-c1"],[59,60,"pl-s"]],[[48,49,"pl-s"],[49,61,"pl-c1"],[61,62,"pl-s"]],[[19,20,"pl-s"],[20,33,"pl-c1"],[33,34,"pl-s"]],[],[],[[64,65,"pl-s"],[65,73,"pl-c1"],[73,74,"pl-s"]],[],[],[[39,40,"pl-s"],[40,44,"pl-c1"],[44,45,"pl-s"],[49,50,"pl-s"],[50,62,"pl-c1"],[62,63,"pl-s"]],[[0,1,"pl-s"],[1,5,"pl-c1"],[5,6,"pl-s"]],[[18,19,"pl-s"],[19,23,"pl-c1"],[23,24,"pl-s"],[44,45,"pl-s"],[45,57,"pl-c1"],[57,58,"pl-s"]],[],[[22,23,"pl-s"],[23,45,"pl-c1"],[45,46,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"],[56,57,"pl-s"],[57,61,"pl-c1"],[61,62,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,11,"pl-c1"],[11,12,"pl-s"],[36,37,"pl-s"],[37,44,"pl-c1"],[44,45,"pl-s"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[],[],[],[],[],[],[],[[21,22,"pl-s"],[22,41,"pl-c1"],[41,42,"pl-s"]],[],[],[],[],[],[[14,15,"pl-s"],[15,43,"pl-c1"],[43,44,"pl-s"]],[[0,1,"pl-s"],[1,21,"pl-c1"],[21,22,"pl-s"],[23,24,"pl-s"],[24,32,"pl-c1"],[32,33,"pl-s"],[60,61,"pl-s"],[61,69,"pl-c1"],[69,70,"pl-s"]],[],[[0,1,"pl-s"],[1,20,"pl-c1"],[20,21,"pl-s"],[46,47,"pl-s"],[47,70,"pl-c1"],[70,71,"pl-s"]],[[0,1,"pl-s"],[1,18,"pl-c1"],[18,19,"pl-s"]],[],[],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"]],[[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"]],[[2,3,"pl-s"],[3,29,"pl-c1"],[29,30,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,20,"pl-c1"],[20,21,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,20,"pl-c1"],[20,21,"pl-s"]],[],[],[[0,12,"pl-mh"],[4,12,"pl-en"],[4,5,"pl-s"],[5,11,"pl-c1"],[11,12,"pl-s"]],[],[],[[0,1,"pl-ml"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[23,24,"pl-ml"],[30,31,"pl-s"],[31,38,"pl-c1"],[38,39,"pl-s"],[39,40,"pl-ml"],[40,41,"pl-s"],[41,48,"pl-c1"],[48,49,"pl-s"],[49,50,"pl-ml"],[50,51,"pl-s"],[51,60,"pl-c1"],[60,61,"pl-s"],[61,62,"pl-ml"],[62,63,"pl-s"],[63,69,"pl-c1"],[69,70,"pl-s"],[70,71,"pl-ml"],[71,72,"pl-s"],[72,86,"pl-c1"],[86,87,"pl-s"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[162,163,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[138,139,"pl-s"],[139,145,"pl-c1"],[145,146,"pl-s"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,20,"pl-c1"],[20,21,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,21,"pl-c1"],[21,22,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"],[23,24,"pl-ml"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[[0,1,"pl-ml"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"],[23,24,"pl-ml"],[25,26,"pl-s"],[26,27,"pl-s"],[88,89,"pl-ml"],[150,151,"pl-ml"]],[],[],[],[],[],[[0,13,"pl-mh"],[4,13,"pl-en"]],[],[[0,1,"pl-s"],[1,9,"pl-c1"],[9,10,"pl-s"],[47,48,"pl-s"],[48,53,"pl-c1"],[53,54,"pl-s"]],[[50,51,"pl-s"],[51,59,"pl-c1"],[59,60,"pl-s"]],[],[],[[17,18,"pl-s"],[18,36,"pl-c1"],[36,37,"pl-s"]],[[15,16,"pl-s"],[16,34,"pl-c1"],[34,35,"pl-s"]],[],[[9,10,"pl-s"],[10,21,"pl-c1"],[21,22,"pl-s"],[45,46,"pl-s"],[46,57,"pl-c1"],[57,58,"pl-s"]],[],[[42,43,"pl-s"],[43,57,"pl-c1"],[57,58,"pl-s"],[60,61,"pl-s"],[61,72,"pl-c1"],[72,73,"pl-s"]],[[0,1,"pl-s"],[1,12,"pl-c1"],[12,13,"pl-s"],[18,19,"pl-s"],[19,27,"pl-c1"],[27,28,"pl-s"],[30,31,"pl-s"],[31,45,"pl-c1"],[45,46,"pl-s"],[51,52,"pl-s"],[52,60,"pl-c1"],[60,61,"pl-s"]],[],[],[[0,29,"pl-mh"],[4,29,"pl-en"]],[],[],[],[[0,1,"pl-v"],[2,4,"pl-s"],[50,52,"pl-s"]],[],[],[[44,45,"pl-s"],[45,55,"pl-c1"],[55,56,"pl-s"]],[[10,11,"pl-s"],[11,32,"pl-c1"],[32,33,"pl-s"]],[[0,1,"pl-v"],[2,4,"pl-s"],[31,33,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,4,"pl-s"],[42,44,"pl-s"]],[],[],[[0,1,"pl-v"],[2,4,"pl-s"],[34,35,"pl-s"],[35,43,"pl-c1"],[43,44,"pl-s"],[45,47,"pl-s"]],[],[],[[24,25,"pl-s"],[25,53,"pl-c1"],[53,54,"pl-s"]],[],[[0,3,"pl-ms"]],[],[[0,25,"pl-mh"],[3,25,"pl-en"]],[],[[95,96,"pl-s"],[100,101,"pl-s"]],[],[[0,10,"pl-mh"],[4,10,"pl-en"]],[],[],[],[[0,1,"pl-v"],[12,13,"pl-s"],[13,25,"pl-c1"],[25,26,"pl-s"],[28,29,"pl-s"],[29,42,"pl-c1"],[42,43,"pl-s"],[45,46,"pl-s"],[46,62,"pl-c1"],[62,63,"pl-s"],[65,66,"pl-s"],[66,79,"pl-c1"],[79,80,"pl-s"],[100,101,"pl-s"],[101,122,"pl-c1"],[122,123,"pl-s"],[125,126,"pl-s"],[126,150,"pl-c1"],[150,151,"pl-s"],[153,154,"pl-s"],[154,176,"pl-c1"],[176,177,"pl-s"],[179,180,"pl-s"],[180,198,"pl-c1"],[198,199,"pl-s"],[201,202,"pl-s"],[202,218,"pl-c1"],[218,219,"pl-s"],[287,288,"pl-s"],[288,310,"pl-c1"],[310,311,"pl-s"]],[[0,1,"pl-v"],[36,37,"pl-s"],[37,46,"pl-c1"],[46,47,"pl-s"],[61,62,"pl-s"],[62,79,"pl-c1"],[79,80,"pl-s"]],[[0,1,"pl-v"],[41,42,"pl-s"],[42,63,"pl-c1"],[63,64,"pl-s"]],[[15,16,"pl-s"],[16,34,"pl-c1"],[34,35,"pl-s"]],[],[[0,1,"pl-v"],[10,11,"pl-s"],[11,19,"pl-c1"],[19,20,"pl-s"],[69,70,"pl-s"],[70,75,"pl-c1"],[75,76,"pl-s"]],[[2,3,"pl-s"],[3,35,"pl-c1"],[35,36,"pl-s"]],[],[],[],[[0,33,"pl-mh"],[4,33,"pl-en"]],[],[[41,42,"pl-s"],[42,68,"pl-c1"],[68,69,"pl-s"]],[],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,37,"pl-c1"]],[[0,25,"pl-c1"]],[[0,30,"pl-c1"]],[[0,24,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[2,14,"pl-ent"],[16,47,"pl-s"],[16,17,"pl-pds"],[46,47,"pl-pds"]],[[2,7,"pl-ent"]],[[4,10,"pl-ent"],[12,23,"pl-s"],[12,13,"pl-pds"],[22,23,"pl-pds"]],[[4,15,"pl-ent"],[17,26,"pl-s"],[17,18,"pl-pds"],[25,26,"pl-pds"]],[[4,9,"pl-ent"],[11,49,"pl-s"],[11,12,"pl-pds"],[48,49,"pl-pds"]],[],[[2,10,"pl-ent"]],[[4,10,"pl-ent"],[12,25,"pl-s"],[12,13,"pl-pds"],[24,25,"pl-pds"]],[[4,9,"pl-ent"],[11,49,"pl-s"],[11,12,"pl-pds"],[48,49,"pl-pds"]],[],[[2,8,"pl-ent"],[10,46,"pl-s"],[10,11,"pl-pds"],[45,46,"pl-pds"]],[],[[0,3,"pl-s"]],[],[[0,1,"pl-s"],[1,4,"pl-c1"],[4,5,"pl-s"],[31,32,"pl-s"],[32,40,"pl-c1"],[40,41,"pl-s"]],[],[],[],[],[],[],[],[[0,1,"pl-s"],[1,7,"pl-c1"],[7,8,"pl-s"]],[[43,44,"pl-s"],[44,48,"pl-c1"],[48,49,"pl-s"]],[],[],[],[],[],[],[[37,38,"pl-s"],[38,60,"pl-c1"],[60,61,"pl-s"]],[],[],[[9,10,"pl-s"],[10,36,"pl-c1"],[36,37,"pl-s"]],[[0,1,"pl-s"],[1,27,"pl-c1"],[27,28,"pl-s"]],[],[[0,3,"pl-s"],[3,7,"pl-en"],[7,7,"pl-c1"]],[[0,12,"pl-c1"]],[[0,25,"pl-c1"]],[[0,83,"pl-c1"]],[[0,1,"pl-c1"]],[[0,0,"pl-c1"],[0,3,"pl-s"]],[],[],[],[],[],[],[],[],[],[[0,1,"pl-s"],[1,11,"pl-c1"],[11,12,"pl-s"]],[],[[25,26,"pl-s"],[26,32,"pl-c1"],[32,33,"pl-s"]],[[0,1,"pl-s"],[1,28,"pl-c1"],[28,29,"pl-s"]],[[29,30,"pl-s"],[30,43,"pl-c1"],[43,44,"pl-s"],[46,47,"pl-s"],[47,60,"pl-c1"],[60,61,"pl-s"]],[[0,1,"pl-s"],[1,13,"pl-c1"],[13,14,"pl-s"]],[],[],[],[[46,47,"pl-s"],[47,54,"pl-c1"],[54,55,"pl-s"]],[],[],[],[[53,54,"pl-s"],[54,63,"pl-c1"],[63,64,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"]],[[7,8,"pl-s"],[8,24,"pl-c1"],[24,25,"pl-s"],[37,38,"pl-s"],[38,52,"pl-c1"],[52,53,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"],[17,18,"pl-s"],[18,24,"pl-c1"],[24,25,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,17,"pl-c1"],[17,18,"pl-s"]],[],[],[[0,1,"pl-s"],[1,8,"pl-c1"],[8,9,"pl-s"]],[],[[27,28,"pl-s"],[28,33,"pl-c1"],[33,34,"pl-s"]],[[28,29,"pl-s"],[29,37,"pl-c1"],[37,38,"pl-s"]],[[8,9,"pl-s"],[9,25,"pl-c1"],[25,26,"pl-s"]],[],[],[],[],[],[],[],[[0,38,"pl-mh"],[4,38,"pl-en"]],[],[[0,1,"pl-v"],[32,34,"pl-s"],[40,42,"pl-s"],[62,64,"pl-s"],[70,72,"pl-s"]],[],[[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"]],[[0,1,"pl-v"]],[[20,21,"pl-s"],[21,59,"pl-c1"],[59,60,"pl-s"]],[[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"],[17,18,"pl-s"],[18,22,"pl-c1"],[22,23,"pl-s"],[25,26,"pl-s"],[26,35,"pl-c1"],[35,36,"pl-s"],[38,39,"pl-s"],[39,45,"pl-c1"],[45,46,"pl-s"],[48,49,"pl-s"],[49,54,"pl-c1"],[54,55,"pl-s"],[57,58,"pl-s"],[58,62,"pl-c1"],[62,63,"pl-s"],[68,69,"pl-s"],[69,74,"pl-c1"],[74,75,"pl-s"]],[[20,21,"pl-s"],[21,25,"pl-c1"],[25,26,"pl-s"]],[],[[0,1,"pl-v"]],[],[],[[0,19,"pl-mh"],[4,19,"pl-en"]],[],[],[],[[32,33,"pl-s"],[33,42,"pl-c1"],[42,43,"pl-s"]],[[66,67,"pl-s"],[67,68,"pl-c1"],[68,69,"pl-s"]],[[8,9,"pl-s"],[9,29,"pl-c1"],[29,30,"pl-s"],[62,63,"pl-s"],[63,76,"pl-c1"],[76,77,"pl-s"]],[[13,14,"pl-s"],[14,27,"pl-c1"],[27,28,"pl-s"]],[],[],[],[[30,31,"pl-s"],[31,51,"pl-c1"],[51,52,"pl-s"]],[[0,1,"pl-s"],[1,21,"pl-c1"],[21,22,"pl-s"]],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[[2,14,"pl-ent"],[16,45,"pl-s"],[16,17,"pl-pds"],[44,45,"pl-pds"]],[[2,11,"pl-ent"],[13,24,"pl-s"],[13,14,"pl-pds"],[23,24,"pl-pds"]],[[2,10,"pl-ent"]],[[4,15,"pl-ent"],[17,35,"pl-s"],[17,18,"pl-pds"],[34,35,"pl-pds"]],[[4,11,"pl-ent"],[15,23,"pl-ent"],[25,39,"pl-s"],[25,26,"pl-pds"],[38,39,"pl-pds"]],[],[[2,9,"pl-ent"]],[[4,17,"pl-ent"],[19,23,"pl-c1"]],[[4,18,"pl-ent"],[20,23,"pl-c1"]],[[4,17,"pl-ent"],[19,23,"pl-c1"]],[[4,21,"pl-ent"],[23,26,"pl-c1"]],[],[[2,10,"pl-ent"]],[[4,20,"pl-ent"],[22,26,"pl-c1"]],[],[[2,13,"pl-ent"]],[[4,14,"pl-ent"],[16,27,"pl-s"],[16,17,"pl-pds"],[26,27,"pl-pds"]],[[4,11,"pl-ent"],[13,40,"pl-s"],[13,14,"pl-pds"],[39,40,"pl-pds"]],[[4,15,"pl-ent"],[17,29,"pl-s"],[17,18,"pl-pds"],[28,29,"pl-pds"]],[],[],[[0,3,"pl-s"]],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"],[25,26,"pl-s"],[26,53,"pl-c1"],[53,54,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,10,"pl-c1"],[10,11,"pl-s"],[14,15,"pl-s"],[15,24,"pl-c1"],[24,25,"pl-s"],[29,30,"pl-s"],[30,36,"pl-c1"],[36,37,"pl-s"]],[[2,3,"pl-s"],[3,16,"pl-c1"],[16,17,"pl-s"],[43,44,"pl-s"],[44,54,"pl-c1"],[54,55,"pl-s"],[60,61,"pl-s"],[61,76,"pl-c1"],[76,77,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,8,"pl-c1"],[8,9,"pl-s"],[36,37,"pl-s"],[37,52,"pl-c1"],[52,53,"pl-s"]],[],[],[],[],[[2,3,"pl-s"],[3,15,"pl-c1"],[15,16,"pl-s"]],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,9,"pl-c1"],[9,10,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"]],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"]],[[10,11,"pl-s"],[11,32,"pl-c1"],[32,33,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,13,"pl-c1"],[13,14,"pl-s"]],[],[],[],[],[[0,1,"pl-s"],[1,11,"pl-c1"],[11,12,"pl-s"]],[],[],[[0,1,"pl-s"],[1,22,"pl-c1"],[22,23,"pl-s"],[59,60,"pl-s"],[60,75,"pl-c1"],[75,76,"pl-s"]],[],[],[],[[0,1,"pl-s"],[1,14,"pl-c1"],[14,15,"pl-s"],[26,27,"pl-s"],[27,33,"pl-c1"],[33,34,"pl-s"],[60,61,"pl-s"],[61,74,"pl-c1"],[74,75,"pl-s"]],[[49,50,"pl-s"],[50,56,"pl-c1"],[56,57,"pl-s"]],[],[],[],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[2,10,"pl-ent"],[12,28,"pl-s"],[12,13,"pl-pds"],[27,28,"pl-pds"],[30,42,"pl-ent"],[44,48,"pl-c1"],[50,63,"pl-ent"],[65,68,"pl-c1"]],[[0,3,"pl-s"]],[],[[20,21,"pl-s"],[21,31,"pl-c1"],[31,32,"pl-s"]],[],[[70,71,"pl-s"],[71,76,"pl-c1"],[76,77,"pl-s"]],[],[[19,20,"pl-s"],[20,21,"pl-c1"],[21,22,"pl-s"]],[],[[5,6,"pl-s"],[6,7,"pl-c1"],[7,8,"pl-s"]],[],[],[],[],[],[[0,28,"pl-mh"],[4,28,"pl-en"]],[],[[15,16,"pl-s"],[16,33,"pl-c1"],[33,34,"pl-s"]],[],[],[],[],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,12,"pl-c1"],[12,13,"pl-s"],[55,56,"pl-s"],[56,66,"pl-c1"],[66,67,"pl-s"]],[[0,1,"pl-v"],[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"]],[[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"]],[],[],[],[],[],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[[0,7,"pl-ent"]],[[2,7,"pl-ent"],[9,25,"pl-s"]],[[2,9,"pl-ent"],[11,36,"pl-s"]],[[2,8,"pl-ent"]],[[4,10,"pl-ent"],[12,18,"pl-s"]],[[4,10,"pl-ent"],[12,20,"pl-s"]],[[0,3,"pl-s"],[0,1,"pl-pds"],[1,2,"pl-pds"],[2,3,"pl-pds"]],[[0,0,"pl-s"]],[[0,1,"pl-s"],[0,1,"pl-pds"],[1,75,"pl-s"]],[[0,68,"pl-s"]],[[0,17,"pl-s"],[0,1,"pl-pds"],[16,17,"pl-pds"],[18,74,"pl-s"]],[[0,78,"pl-s"]],[],[[0,77,"pl-s"]],[[0,75,"pl-s"]],[[0,77,"pl-s"]],[[0,72,"pl-s"]],[[0,74,"pl-s"]],[[0,74,"pl-s"]],[[0,72,"pl-s"]],[[0,78,"pl-s"]],[[0,43,"pl-s"]],[],[[0,17,"pl-c"],[0,1,"pl-c"]],[],[[0,15,"pl-s"],[0,1,"pl-pds"],[14,15,"pl-pds"],[16,77,"pl-s"]],[[0,78,"pl-s"]],[[0,78,"pl-s"]],[[0,74,"pl-s"]],[[0,16,"pl-s"]],[],[[0,32,"pl-c"],[0,1,"pl-c"]],[],[[0,20,"pl-s"],[0,1,"pl-pds"],[19,20,"pl-pds"],[21,75,"pl-s"]],[[0,78,"pl-s"]],[[0,75,"pl-s"]],[[0,78,"pl-s"]],[[0,75,"pl-s"]],[[0,56,"pl-s"]],[],[[0,75,"pl-s"]],[[0,75,"pl-s"]],[[0,75,"pl-s"]],[[0,74,"pl-s"]],[[0,19,"pl-s"],[0,1,"pl-pds"],[18,19,"pl-pds"],[19,76,"pl-s"]],[[0,77,"pl-s"]],[[0,75,"pl-s"]],[[0,74,"pl-s"]],[[0,78,"pl-s"]],[[0,76,"pl-s"]],[[0,75,"pl-s"]],[],[[0,76,"pl-s"]],[[0,16,"pl-s"],[0,1,"pl-pds"],[15,16,"pl-pds"],[16,79,"pl-s"]],[[0,72,"pl-s"]],[],[[0,75,"pl-s"]],[[0,74,"pl-s"]],[[0,69,"pl-s"]],[[0,73,"pl-s"]],[[0,8,"pl-s"]],[],[[0,77,"pl-s"]],[[0,78,"pl-s"]],[[0,73,"pl-s"]],[[0,78,"pl-s"]],[[0,53,"pl-s"]],[],[[0,76,"pl-s"]],[[0,79,"pl-s"]],[[0,78,"pl-s"]],[[0,78,"pl-s"]],[[0,76,"pl-s"]],[[0,75,"pl-s"]],[[0,78,"pl-s"]],[[0,76,"pl-s"]],[[0,76,"pl-s"]],[[0,5,"pl-s"]],[],[[0,16,"pl-s"],[0,1,"pl-pds"],[15,16,"pl-pds"],[17,77,"pl-s"]],[[0,75,"pl-s"]],[[0,73,"pl-s"]],[[0,72,"pl-s"]],[[0,74,"pl-s"]],[[0,77,"pl-s"]],[[0,77,"pl-s"]],[[0,75,"pl-s"]],[[0,73,"pl-s"]],[[0,72,"pl-s"]],[],[[0,78,"pl-s"]],[[0,77,"pl-s"]],[[0,78,"pl-s"]],[[0,79,"pl-s"]],[[0,76,"pl-s"]],[[0,75,"pl-s"]],[[0,50,"pl-s"]],[],[[0,76,"pl-s"]],[[0,77,"pl-s"]],[[0,73,"pl-s"]],[[0,73,"pl-s"]],[[0,74,"pl-s"]],[[0,76,"pl-s"]],[[0,76,"pl-s"]],[[0,77,"pl-s"]],[[0,74,"pl-s"]],[[0,20,"pl-s"]],[],[[0,79,"pl-s"]],[[0,76,"pl-s"]],[[0,73,"pl-s"]],[[0,39,"pl-s"]],[],[[0,74,"pl-s"]],[[0,76,"pl-s"]],[[0,70,"pl-s"]],[[0,76,"pl-s"]],[[0,12,"pl-s"],[0,1,"pl-pds"],[11,12,"pl-pds"],[12,79,"pl-s"]],[[0,75,"pl-s"]],[[0,22,"pl-s"]],[],[[0,62,"pl-s"]],[[0,71,"pl-s"]],[[0,34,"pl-s"]],[[0,106,"pl-s"],[0,1,"pl-pds"],[105,106,"pl-pds"],[106,107,"pl-s"]],[[0,79,"pl-s"]],[[0,76,"pl-s"]],[[0,73,"pl-s"]],[[0,75,"pl-s"]],[[0,18,"pl-s"]],[],[[0,35,"pl-c"],[0,1,"pl-c"]],[],[[0,98,"pl-s"]],[[0,76,"pl-s"]],[[2,77,"pl-s"]],[[2,76,"pl-s"]],[[2,79,"pl-s"]],[[2,70,"pl-s"]],[],[],[],[[0,53,"pl-c"],[0,1,"pl-c"]],[],[[0,29,"pl-ent"],[31,38,"pl-s"],[31,32,"pl-pds"],[37,38,"pl-pds"],[38,314,"pl-s"]],[]],"colorizedLines":null}},"title":"Kontext/SPEC.md at main · MFS-code/Kontext","appPayload":{},"meta":{"title":"Kontext/SPEC.md at main · MFS-code/Kontext"}}</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="/MFS-code/Kontext" 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="/MFS-code/Kontext/tree/main" data-discover="true">Kontext</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">SPEC.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="/MFS-code/Kontext/commits/main/SPEC.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="/MFS-code/Kontext/commits/main/SPEC.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="41.1 KB" style="--truncate-max-width:100%"><span>731 lines (601 loc) · 41.1 KB</span></div></div></div></div><div class="react-blob-view-header-sticky BlobViewContent-module__stickyHeader__VwxB5" id="repos-sticky-header"><div class="BlobViewHeader-module__Box__yhm9u"><div class="react-blob-sticky-header"><div class="FileNameStickyHeader-module__outerWrapper__ZL4Xc FileNameStickyHeader-module__outerWrapperHidden__Zpynk"><div class="FileNameStickyHeader-module__Box_1__Hazu5"><div class="FileNameStickyHeader-module__Box_2__hoolP"><div class="FileNameStickyHeader-module__Box_3__MVKsk"><button data-component="Button" type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="main branch" data-testid="anchor-button" data-icv-name="Switch branches/tags" class="prc-Button-ButtonBase-9n-Xk ref-selector-class RefSelectorAnchoredOverlay-module__RefSelectorOverlayBtn__a3WK3" data-loading="false" data-size="medium" data-variant="default" id="ref-picker-repos-header-ref-selector"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="leadingVisual" class="prc-Button-Visual-YNt2F prc-Button-LeadingVisual-UySKu prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-FWkx3"><div class="RefSelectorAnchoredOverlay-module__RefSelectorOverlayContainer__yaf4p"><div style="max-width:125px" class="ref-selector-button-text-container RefSelectorAnchoredOverlay-module__RefSelectorBtnTextContainer__Di3rk"><span class="RefSelectorAnchoredOverlay-module__RefSelectorText__w_fmP">main</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-YNt2F prc-Button-VisualWrap-E4cnq"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="d-none"></div></div><div class="FileNameStickyHeader-module__Box_4__FLhtt"><div class="Breadcrumb-module__container__Vxvev Breadcrumb-module__md__Wb1Gs"><nav data-testid="breadcrumbs" aria-labelledby="sticky-breadcrumb-heading" id="sticky-breadcrumb" class="Breadcrumb-module__nav__rQFDj"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone__rwWIk prc-Heading-Heading-MtWFE" data-component="Heading" data-testid="screen-reader-heading" id="sticky-breadcrumb-heading">Breadcrumbs</h2><ol class="Breadcrumb-module__list__ZH6zr"><li class="Breadcrumb-module__listItem__Ib0x_"><a class="Breadcrumb-module__repoLink__O2Nbs prc-Link-Link-9ZwDx" data-component="Link" data-testid="breadcrumbs-repo-link" href="/MFS-code/Kontext/tree/main" data-discover="true">Kontext</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">SPEC.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="41.1 KB" style="--truncate-max-width:100%"><span>731 lines (601 loc) · 41.1 KB</span></div></div></div></div><div class="BlobViewHeader-module__Box_3__ng6v2"><div class="d-none"></div><div class="react-blob-header-edit-and-raw-actions BlobViewHeader-module__Box_4__J4Y4W"><div class="d-none"></div><div class="prc-ButtonGroup-ButtonGroup-vFUrY" data-component="ButtonGroup"><div class="prc-ButtonGroup-Item-PqvDl"><a data-component="LinkButton" href="https://github.com/MFS-code/Kontext/raw/refs/heads/main/SPEC.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"><markdown-accessiblity-table><table>
  <tbody>
  <tr>
    <th>title</th>
    <td>API specification</td>
  </tr>
  <tr>
    <th>description</th>
    <td>Agent, AgentRun, and runtime-image contract for kontext.dev/v1alpha1.</td>
  </tr>
  <tr>
    <th>sidebarTitle</th>
    <td>API spec</td>
  </tr>
  </tbody>
</table></markdown-accessiblity-table>

<div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Kontext API specification (<code>v1alpha1</code>)</h1><a id="user-content-kontext-api-specification-v1alpha1" class="anchor" aria-label="Permalink: Kontext API specification (v1alpha1)" href="#kontext-api-specification-v1alpha1"><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>
<blockquote>
<p dir="auto">This is the published <code>v1alpha1</code> API and runtime-image contract. Kontext
remains a general agent runtime. Application-specific vocabulary and behavior
belong in the consumer's runtime image, not the control plane.</p>
</blockquote>
<p dir="auto">Kontext exposes two custom resources and one runtime-image contract.</p>
<ul dir="auto">
<li><code>Agent</code> — the reusable <strong>definition / desired state</strong> of an agent.</li>
<li><code>AgentRun</code> — one bounded, auditable <strong>execution</strong> of an agent. It either owns
one Pod or is delivered to a standing Service runtime.</li>
<li><strong>Runtime image contract</strong> — how any container becomes a Kontext agent.</li>
</ul>
<p dir="auto">API group/version: <code>kontext.dev/v1alpha1</code> (alpha on purpose — the shape is allowed to evolve).</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Mental model (map to core Kubernetes)</h2><a id="user-content-mental-model-map-to-core-kubernetes" class="anchor" aria-label="Permalink: Mental model (map to core Kubernetes)" href="#mental-model-map-to-core-kubernetes"><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>Kontext</th>
<th>Core Kubernetes analogue</th>
<th>Behavior</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Agent</code> mode <code>Service</code></td>
<td><code>Deployment</code></td>
<td>Always-on. Controller keeps one live <code>AgentRun</code>; re-casts on exit/failure.</td>
</tr>
<tr>
<td><code>Agent</code> mode <code>Task</code></td>
<td>reusable task template</td>
<td>Creating the Agent does not execute it. A user creates a named, sparse <code>AgentRun</code> referencing it to trigger work.</td>
</tr>
<tr>
<td><code>Agent</code> mode <code>Scheduled</code></td>
<td><code>CronJob</code></td>
<td>Mints one-shot <code>AgentRun</code>s from standard five-field cron slots.</td>
</tr>
<tr>
<td><code>AgentRun</code></td>
<td><code>Pod</code> / <code>Job</code></td>
<td>The single auditable execution unit. Owns one Pod unless warm-delivered to a standing Service runtime. Holds <code>status.result</code>, usage, immutable spec.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto"><code>AgentRun</code> is the execution record every mode reuses. The <code>Agent</code> controller
manages standing Service and Scheduled <code>AgentRun</code>s the way
<code>Deployment</code>/<code>CronJob</code> manage their children. Users may also create referenced
runs to invoke Task Agents or warm-delivery-enabled Service Agents.</p>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto"><code>Agent</code></h2><a id="user-content-agent" class="anchor" aria-label="Permalink: Agent" href="#agent"><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 reusable definition. Cluster-namespaced. Has a status subresource.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><code>spec</code></h3><a id="user-content-spec" class="anchor" aria-label="Permalink: spec" href="#spec"><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>Field</th>
<th>Type</th>
<th>Req</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>mode</code></td>
<td>enum <code>Task</code></td>
<td><code>Service</code></td>
<td><code>Scheduled</code></td>
</tr>
<tr>
<td><code>runtime.image</code></td>
<td>string</td>
<td>yes</td>
<td>Container image implementing the runtime contract.</td>
</tr>
<tr>
<td><code>runtime.command</code></td>
<td>[]string</td>
<td>no</td>
<td>Override entrypoint.</td>
</tr>
<tr>
<td><code>runtime.args</code></td>
<td>[]string</td>
<td>no</td>
<td></td>
</tr>
<tr>
<td><code>runtime.result</code></td>
<td>object</td>
<td>no</td>
<td>Optional stdout result capture policy.</td>
</tr>
<tr>
<td><code>runtime.delivery</code></td>
<td>object</td>
<td>no</td>
<td>Service-only opt-in to warm HTTP delivery. Requires <code>port</code>.</td>
</tr>
<tr>
<td><code>runtime.securityContext</code></td>
<td>restricted security context</td>
<td>no</td>
<td>Portable non-root, capability-drop, filesystem, and seccomp settings.</td>
</tr>
<tr>
<td><code>goal</code></td>
<td>string</td>
<td>no*</td>
<td>Concrete execution goal. Required for <code>Service</code>/<code>Scheduled</code>; exactly one of <code>goal</code> or <code>goalTemplate</code> is required for <code>Task</code>.</td>
</tr>
<tr>
<td><code>goalTemplate</code></td>
<td>string</td>
<td>no</td>
<td>Parameterized invocation goal for <code>Task</code> or a warm-delivery-enabled <code>Service</code>.</td>
</tr>
<tr>
<td><code>provider</code></td>
<td>string</td>
<td>no</td>
<td>Default <code>anthropic</code>.</td>
</tr>
<tr>
<td><code>model</code></td>
<td>string</td>
<td>yes</td>
<td></td>
</tr>
<tr>
<td><code>tools</code></td>
<td>[]string</td>
<td>no</td>
<td>Declared tool allowlist (semantics live in the runtime image).</td>
</tr>
<tr>
<td><code>budget.tokens</code></td>
<td>int ≥ 1</td>
<td>no</td>
<td></td>
</tr>
<tr>
<td><code>budget.wallclock</code></td>
<td>duration string</td>
<td>no</td>
<td>e.g. <code>5m</code>. Enforced by controller.</td>
</tr>
<tr>
<td><code>budget.dollars</code></td>
<td>number ≥ 0</td>
<td>no</td>
<td></td>
</tr>
<tr>
<td><code>secretRef.name</code></td>
<td>string</td>
<td>no</td>
<td>Provider credentials Secret.</td>
</tr>
<tr>
<td><code>knowledgeConfigMapRef.name</code></td>
<td>string</td>
<td>no</td>
<td>Static ConfigMap context mounted read-only at <code>/kontext/knowledge</code>.</td>
</tr>
<tr>
<td><code>serviceAccountName</code></td>
<td>string</td>
<td>no</td>
<td>Per-agent identity.</td>
</tr>
<tr>
<td><code>env</code></td>
<td>[]EnvVar</td>
<td>no</td>
<td>Extra literal or Secret-backed env passed to the Pod.</td>
</tr>
<tr>
<td><code>schedule</code></td>
<td><code>ScheduleSpec</code></td>
<td>no*</td>
<td>Required and allowed only for <code>Scheduled</code>.</td>
</tr>
<tr>
<td><code>backoff</code></td>
<td>object</td>
<td>no</td>
<td>Re-cast backoff policy for <code>Service</code>. Controller-defaulted.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">required depending on <code>mode</code>.</p>
<p dir="auto">A Service Agent always has a concrete <code>goal</code> for its standing runtime. Without
<code>runtime.delivery</code>, it forbids <code>goalTemplate</code> and preserves the original
long-running behavior. Opting into warm delivery requires both
<code>runtime.delivery.port</code> and <code>goalTemplate</code>: <code>goal</code> starts the standing runtime,
while <code>goalTemplate</code> resolves each referenced user-created <code>AgentRun</code>.
<code>runtime.delivery.port</code> is an integer from 1 through 65535. Task and Scheduled
Agents cannot configure <code>runtime.delivery</code>.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><code>status</code></h3><a id="user-content-status" class="anchor" aria-label="Permalink: status" href="#status"><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>Field</th>
<th>Type</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>conditions</code></td>
<td>[]Condition</td>
<td><code>Ready</code>, <code>Progressing</code>.</td>
</tr>
<tr>
<td><code>currentRunName</code></td>
<td>string</td>
<td><code>Service</code>: the live run.</td>
</tr>
<tr>
<td><code>lastRunName</code></td>
<td>string</td>
<td><code>Task</code>: newest retained owned run by creation time. <code>Scheduled</code>: newest retained owned run by slot; empty when no child is retained.</td>
</tr>
<tr>
<td><code>runsCreated</code></td>
<td>int</td>
<td><code>Task</code>: current retained owned-run count. <code>Scheduled</code>: monotonic creation sequence. <code>Service</code>: monotonic standing-run suffix; delivered runs are excluded.</td>
</tr>
<tr>
<td><code>restarts</code></td>
<td>int</td>
<td><code>Service</code>: re-cast count.</td>
</tr>
<tr>
<td><code>lastScheduleTime</code></td>
<td>timestamp</td>
<td><code>Scheduled</code>: latest observed slot that minted a run; retained after child pruning.</td>
</tr>
<tr>
<td><code>nextScheduleTime</code></td>
<td>timestamp</td>
<td><code>Scheduled</code>: next slot the controller will evaluate.</td>
</tr>
<tr>
<td><code>observedGeneration</code></td>
<td>int</td>
<td></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><code>ScheduleSpec</code></h3><a id="user-content-schedulespec" class="anchor" aria-label="Permalink: ScheduleSpec" href="#schedulespec"><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>Scheduled</code> requires a concrete <code>spec.goal</code>. Its schedule fields are:</p>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Field</th>
<th>Type</th>
<th>Default</th>
<th>Contract</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>expression</code></td>
<td>string</td>
<td>required</td>
<td>Standard five-field minute/hour/day-of-month/month/day-of-week cron. Descriptors and seconds are rejected.</td>
</tr>
<tr>
<td><code>timeZone</code></td>
<td>IANA name</td>
<td><code>Etc/UTC</code></td>
<td>The expression cannot embed <code>TZ</code> or <code>CRON_TZ</code>.</td>
</tr>
<tr>
<td><code>concurrencyPolicy</code></td>
<td><code>Allow</code> or <code>Forbid</code></td>
<td><code>Forbid</code></td>
<td><code>Forbid</code> treats Pending and Running owned runs as active. <code>Replace</code> is not supported.</td>
</tr>
<tr>
<td><code>startingDeadlineSeconds</code></td>
<td>non-negative int</td>
<td><code>60</code></td>
<td>A late slot is eligible only within this duration.</td>
</tr>
<tr>
<td><code>suspend</code></td>
<td>bool</td>
<td><code>false</code></td>
<td>Prevents new runs. Resuming waits for the next future slot.</td>
</tr>
<tr>
<td><code>successfulRunsHistoryLimit</code></td>
<td>non-negative int</td>
<td><code>3</code></td>
<td>Completed successful children retained.</td>
</tr>
<tr>
<td><code>failedRunsHistoryLimit</code></td>
<td>non-negative int</td>
<td><code>1</code></td>
<td>Completed failed or budget-exceeded children retained.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">After controller downtime, only the latest due slot is considered. It is
created when still inside the starting deadline; older slots are skipped and
never burst-backfilled. A skipped <code>Forbid</code> overlap is not queued. Any Agent
generation change resets the scheduling anchor to the current time and waits
for the next future slot.</p>
<p dir="auto">Run names are derived from the scheduled slot, not reconciliation wall-clock
time. Creation is idempotent across retries and leader changes. Completed
history is pruned independently by outcome, active runs are never pruned, and
Agent ownership gives all children normal Kubernetes deletion cascading.
<code>currentRunName</code>, <code>restarts</code>, and Service backoff remain Service-only.</p>
<p dir="auto">Task and Scheduled status intentionally use different counting semantics. For
Task, deleting an owned run immediately decreases <code>runsCreated</code>; deleting the
newest run moves <code>lastRunName</code> to the next newest retained child, and deleting
all owned runs clears it. Creation timestamp determines Task recency, with
lexically greater run name as the deterministic tie-breaker. For Scheduled,
each new run receives an increasing sequence. <code>runsCreated</code> never decreases
when history pruning or a user deletes a child. <code>lastRunName</code> remains a live
reference and can move or clear as retained history changes.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Agent condition reasons</h3><a id="user-content-agent-condition-reasons" class="anchor" aria-label="Permalink: Agent condition reasons" href="#agent-condition-reasons"><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 controller publishes <code>Ready</code> and <code>Progressing</code> conditions with these
mode-specific reasons:</p>
<ul dir="auto">
<li>Task: <code>TemplateReady</code> and <code>Idle</code> for a valid template;
<code>InvalidTemplate</code> when invocations are blocked by template validation.</li>
<li>Scheduled: <code>ScheduleInitialized</code>, <code>ScheduleUpdated</code>,
<code>WaitingForSchedule</code>, <code>RunCreated</code>, <code>Suspended</code>, <code>MissedDeadline</code>,
<code>OverlapSkipped</code>, and <code>InvalidSchedule</code>.</li>
<li>Service: <code>Recasting</code>, <code>RunActive</code>, and <code>MissingGoal</code>.</li>
<li>Unknown stored mode values: <code>InvalidMode</code>. The CRD enum rejects unknown
values on normal writes.</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto"><code>AgentRun</code></h2><a id="user-content-agentrun" class="anchor" aria-label="Permalink: AgentRun" href="#agentrun"><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">One bounded execution. It maps to exactly one owned Pod unless <code>spec.delivery</code>
marks it for a standing Service runtime. <strong>Spec is immutable after creation</strong>
(snapshot semantics) so a run is self-contained and auditable.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><code>spec</code></h3><a id="user-content-spec-1" class="anchor" aria-label="Permalink: spec" href="#spec-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>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Field</th>
<th>Type</th>
<th>Req</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>agentRef.name</code></td>
<td>string</td>
<td>no</td>
<td>Owning <code>Agent</code>. CREATE admission treats a sparse user-created reference as an explicit Task or Service invocation. Omitted = standalone ad-hoc run.</td>
</tr>
<tr>
<td><code>parameters</code></td>
<td>map[string]string</td>
<td>no</td>
<td>Immutable invocation parameters retained with the resolved snapshot. Requires <code>agentRef</code>.</td>
</tr>
<tr>
<td><code>delivery.port</code></td>
<td>int</td>
<td>no</td>
<td>Immutable Service warm-delivery marker and port snapshot. Admission-controlled; requires <code>agentRef</code>.</td>
</tr>
<tr>
<td><code>goal</code></td>
<td>string</td>
<td>yes</td>
<td>Concrete, fully-resolved goal.</td>
</tr>
<tr>
<td><code>provider</code></td>
<td>string</td>
<td>no</td>
<td>Resolved from Agent at creation.</td>
</tr>
<tr>
<td><code>model</code></td>
<td>string</td>
<td>yes</td>
<td></td>
</tr>
<tr>
<td><code>tools</code></td>
<td>[]string</td>
<td>no</td>
<td></td>
</tr>
<tr>
<td><code>budget</code></td>
<td>object</td>
<td>no</td>
<td>Resolved snapshot.</td>
</tr>
<tr>
<td><code>secretRef.name</code></td>
<td>string</td>
<td>no</td>
<td></td>
</tr>
<tr>
<td><code>knowledgeConfigMapRef.name</code></td>
<td>string</td>
<td>no</td>
<td>Static ConfigMap context mounted read-only at <code>/kontext/knowledge</code>.</td>
</tr>
<tr>
<td><code>serviceAccountName</code></td>
<td>string</td>
<td>no</td>
<td></td>
</tr>
<tr>
<td><code>env</code></td>
<td>[]EnvVar</td>
<td>no</td>
<td>Resolved literal or Secret-backed env snapshot.</td>
</tr>
<tr>
<td><code>runtime.image</code></td>
<td>string</td>
<td>yes</td>
<td>Resolved from Agent.</td>
</tr>
<tr>
<td><code>runtime.command</code></td>
<td>[]string</td>
<td>no</td>
<td>Required when stdout capture is configured.</td>
</tr>
<tr>
<td><code>runtime.args</code></td>
<td>[]string</td>
<td>no</td>
<td>Appended to the declared command.</td>
</tr>
<tr>
<td><code>runtime.result</code></td>
<td>object</td>
<td>no</td>
<td>Optional stdout result capture policy.</td>
</tr>
<tr>
<td><code>runtime.delivery</code></td>
<td>object</td>
<td>no</td>
<td>Resolved runtime capability snapshot; <code>spec.delivery</code> determines this run's lifecycle.</td>
</tr>
<tr>
<td><code>runtime.securityContext</code></td>
<td>restricted security context</td>
<td>no</td>
<td>Portable non-root, capability-drop, filesystem, and seccomp settings.</td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">When created from an <code>Agent</code>, execution fields are snapshotted so the run does
not drift if the <code>Agent</code> changes later. The Service and Scheduled controllers
create fully resolved Pod-owning runs. Admission adds <code>delivery</code> only to sparse
invocations of warm-delivery-enabled Service Agents; this immutable field is
the lifecycle discriminator and prevents a delivered run from being mistaken
for the Service's standing run. Standalone runs provide a complete execution
spec directly.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Referenced invocation and resolution</h3><a id="user-content-referenced-invocation-and-resolution" class="anchor" aria-label="Permalink: Referenced invocation and resolution" href="#referenced-invocation-and-resolution"><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">Creating a Task <code>Agent</code> never starts work. A user explicitly triggers it by
submitting a user-named <code>AgentRun</code> whose <code>spec.agentRef.name</code> names that Task
Agent. Runs may be submitted concurrently; there is no generated-name or
single-active-run restriction. A user invokes a warm-delivery-enabled Service
Agent with the same sparse <code>AgentRun</code> shape. Service Agents without
<code>runtime.delivery</code> reject referenced invocations. Names matching the referenced
Service Agent followed by a canonical positive integer, such as <code>owner-1</code>, are
used for the controller's standing runs, so user invocations with those names
are rejected.</p>
<p dir="auto">A referenced invocation request is sparse: it may contain only <code>agentRef</code> and
optional <code>parameters</code>. Kubernetes
<a href="https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/" rel="nofollow">invokes mutating admission first</a>
and then validates the final object against the CRD. CREATE admission
receives the sparse request, resolves it in memory, and returns the complete
immutable execution snapshot that the API server validates and stores. The
persisted <code>AgentRun.spec</code> always includes <code>goal</code>, <code>model</code>, and <code>runtime.image</code>;
an unresolved sparse object is never valid stored state.</p>
<p dir="auto">Resolution copies runtime, provider, model, tools, budget, service account,
Secret reference, knowledge ConfigMap reference, and environment from the
Agent. For Task Agents, the concrete goal is copied from <code>goal</code> or rendered
from <code>goalTemplate</code>. For Service Agents, the standing <code>goal</code> is never
delivered; the invocation goal is rendered from <code>goalTemplate</code>, and admission
adds the immutable <code>delivery.port</code> snapshot. These execution fields are
locked: an invocation request that
supplies any of them is rejected, even when the supplied value would match the
template. Users needing execution overrides create a standalone <code>AgentRun</code> or
a separate Agent definition.</p>
<p dir="auto">A Task Agent configures exactly one of <code>goal</code> or <code>goalTemplate</code>. A static
<code>goal</code> accepts no parameters. A warm-delivery-enabled Service Agent configures
both its standing <code>goal</code> and its invocation <code>goalTemplate</code>. A template uses
only ASCII identifier
placeholders matching <code>[A-Za-z_][A-Za-z0-9_]*</code>:</p>
<ul dir="auto">
<li><code>${name}</code> inserts the exact string value of parameter <code>name</code>.</li>
<li><code>$${name}</code> emits the literal text <code>${name}</code> and does not consume a parameter.</li>
<li>Substitution is one pass: parameter values are never interpreted as
templates.</li>
<li>Repeated placeholders reuse the same parameter. Empty, Unicode, and
multiline values are valid.</li>
<li>Malformed placeholders, missing parameters, and supplied-but-unused
parameters reject the invocation. Missing and unused names are reported in
sorted order.</li>
</ul>
<p dir="auto">Resolution is all-or-nothing and does not mutate either input object. Copied
maps, slices, pointers, and nested values are isolated from later mutation.
Provider defaults and aliases are normalized while the execution snapshot is
built, once at this boundary.</p>
<p dir="auto">The pure resolver in <code>internal/runfactory</code> defines these semantics. The CREATE
webhook fetches the referenced same-namespace Agent through the API reader,
rejects invalid requests, and returns the resolver's complete object as the
admission patch. Complete standalone and controller-created runs do not match
the sparse webhook and remain independent of invocation admission.</p>
<p dir="auto">The installed <code>MutatingWebhookConfiguration</code> matches namespaced
<code>kontext.dev/v1alpha1</code> <code>AgentRun</code> CREATE requests only when <code>agentRef</code> is
present and at least one required execution field is absent. It uses
<code>failurePolicy: Fail</code>, a five-second timeout, <code>matchPolicy: Equivalent</code>,
<code>sideEffects: None</code>, and no reinvocation. Matching sparse requests therefore
fail closed when admission is unavailable; complete requests bypass the
webhook.</p>
<p dir="auto">Every rejected referenced resolution includes one stable class:</p>
<ul dir="auto">
<li><code>MissingAgent</code>: the same-namespace referenced Agent does not exist.</li>
<li><code>WrongMode</code>: the reference names a Scheduled or unknown-mode Agent.</li>
<li><code>DeliveryDisabled</code>: the reference names a Service Agent without
<code>runtime.delivery</code>.</li>
<li><code>InvalidDelivery</code>: the Service delivery configuration is invalid.</li>
<li><code>ReservedName</code>: a Service invocation uses the standing-run name pattern
<code>&lt;agent&gt;-&lt;positive integer&gt;</code> managed by the controller.</li>
<li><code>InvalidTemplate</code>: the Agent definition has invalid goal/template shape or
placeholder syntax.</li>
<li><code>MissingParameters</code>: required placeholder names have no supplied value.</li>
<li><code>UnusedParameters</code>: supplied names are unused, including any parameter map
on a static goal.</li>
<li><code>ConflictingFields</code>: the invocation supplies one or more locked execution
fields.</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto"><code>status</code></h3><a id="user-content-status-1" class="anchor" aria-label="Permalink: status" href="#status-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>
<markdown-accessiblity-table><table>
<thead>
<tr>
<th>Field</th>
<th>Type</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>phase</code></td>
<td>enum <code>Pending</code></td>
<td><code>Running</code></td>
</tr>
<tr>
<td><code>podName</code></td>
<td>string</td>
<td>Owned execution Pod, or the standing Service Pod selected for delivery.</td>
</tr>
<tr>
<td><code>output.mediaType</code></td>
<td>string</td>
<td>Media type for the structured terminal output.</td>
</tr>
<tr>
<td><code>output.value</code></td>
<td>arbitrary JSON</td>
<td>Authoritative structured output.</td>
</tr>
<tr>
<td><code>result</code></td>
<td>string</td>
<td>Backward-compatible deterministic projection of <code>output</code>.</td>
</tr>
<tr>
<td><code>usage.tokens</code></td>
<td>int</td>
<td>Total tokens when measured.</td>
</tr>
<tr>
<td><code>usage.inputTokens</code></td>
<td>int</td>
<td>Input tokens when measured.</td>
</tr>
<tr>
<td><code>usage.outputTokens</code></td>
<td>int</td>
<td>Output tokens when measured.</td>
</tr>
<tr>
<td><code>usage.dollars</code></td>
<td>number</td>
<td>Authoritative reported cost when measured.</td>
</tr>
<tr>
<td><code>startTime</code></td>
<td>time</td>
<td></td>
</tr>
<tr>
<td><code>completionTime</code></td>
<td>time</td>
<td></td>
</tr>
<tr>
<td><code>message</code></td>
<td>string</td>
<td>Human-readable status/error.</td>
</tr>
<tr>
<td><code>conditions</code></td>
<td>[]Condition</td>
<td></td>
</tr>
</tbody>
</table></markdown-accessiblity-table>
<p dir="auto">Usage fields are optional independently. A missing field means the runtime or
provider did not measure it; a present zero means it measured zero.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Ownership</h3><a id="user-content-ownership" class="anchor" aria-label="Permalink: Ownership" href="#ownership"><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>AgentRun</code> created from or resolved against an <code>Agent</code> carries an owner
reference to it → standard GC cascade. Standalone <code>AgentRun</code>s are allowed for
ad-hoc execution, demos, and direct task dispatch.</p>
<p dir="auto">For Task Agents, <code>status.lastRunName</code> is the newest retained owned Task run by
creation time. <code>status.runsCreated</code> is the exact number of currently retained
owned Task runs, not a lifetime counter. Deleting an owned run can therefore
decrease <code>runsCreated</code> and can move or clear <code>lastRunName</code>. These Task meanings
do not change the existing Service status semantics. Delivered Service runs do
not participate in standing-run suffixes, <code>currentRunName</code>, <code>lastRunName</code>,
<code>runsCreated</code>, or <code>restarts</code>. <code>currentRunName</code> and <code>restarts</code> stay empty for
Task Agents.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Contract evolution policy</h3><a id="user-content-contract-evolution-policy" class="anchor" aria-label="Permalink: Contract evolution policy" href="#contract-evolution-policy"><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 four public contract surfaces evolve differently:</p>
<ul dir="auto">
<li><strong>Result envelopes are lenient at the top level.</strong> Consumers ignore unknown
top-level fields so producers can add optional result metadata without
breaking older readers. Known fields are still fully validated.
Runtime/provider-specific JSON belongs in <code>extensions</code> under namespaced keys
such as <code>anthropic.com/request</code>.</li>
<li><strong>Event envelopes are strict.</strong> Consumers reject unknown top-level fields and
trailing JSON. Changing the event envelope shape requires a new event
contract version so streaming observers never silently interpret a different
record shape.</li>
<li><strong>Delivery request envelopes are strict.</strong> Service runtimes reject unknown
fields and trailing JSON. Changing the request shape requires a new delivery
contract version.</li>
<li><strong>CRDs evolve additively within <code>v1alpha1</code>.</strong> Existing fields keep their
meaning and new fields are optional. Kubernetes structurally validates CRD
data; arbitrary JSON is confined to fields explicitly documented as
schemaless, currently <code>AgentRun.status.output.value</code>.</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Runtime image contract</h2><a id="user-content-runtime-image-contract" class="anchor" aria-label="Permalink: Runtime image contract" href="#runtime-image-contract"><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">Any container can be a Kontext agent if it follows this. Kontext never inspects what the agent <em>does</em> — only this I/O boundary.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Inputs</h3><a id="user-content-inputs" class="anchor" aria-label="Permalink: Inputs" href="#inputs"><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 controller injects, on the Pod:</p>
<ul dir="auto">
<li>Env vars: <code>KONTEXT_GOAL</code>, <code>KONTEXT_MODEL</code>, <code>KONTEXT_PROVIDER</code>, <code>KONTEXT_TOOLS</code> (comma-separated), <code>KONTEXT_BUDGET_TOKENS</code>, <code>KONTEXT_BUDGET_WALLCLOCK</code>, <code>KONTEXT_BUDGET_DOLLARS</code>, <code>KONTEXT_AGENT_NAME</code>, <code>KONTEXT_RUN_NAME</code>. Warm-delivery Service Pods additionally receive the Secret-backed <code>KONTEXT_DELIVERY_TOKEN</code>.</li>
<li>Provider credentials mounted from <code>secretRef</code> as env (e.g. <code>ANTHROPIC_API_KEY</code>).</li>
<li>Optional static ConfigMap context from <code>knowledgeConfigMapRef</code>, mounted
read-only at <code>/kontext/knowledge</code>. This is not RAG: the control plane does no
ingestion, embedding, ranking, or retrieval.</li>
<li>Generic <code>spec.env</code> entries. Each entry selects exactly one literal <code>value</code> or
<code>valueFrom.secretKeyRef{name,key}</code>. Controller-managed variables cannot be
overridden through either form. Secret values remain Kubernetes Secret data;
they are not copied into Agent/AgentRun fields or controller logs.</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Input — Service warm delivery</h3><a id="user-content-input--service-warm-delivery" class="anchor" aria-label="Permalink: Input — Service warm delivery" href="#input--service-warm-delivery"><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">A Service runtime opts in by configuring <code>spec.runtime.delivery.port</code>. The
runtime listens on that port on the Pod network interface and exposes:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="POST /kontext.dev/v1alpha1/agent-runs
Host: &lt;standing Pod name&gt;
Content-Type: application/json
Accept: application/json"><pre lang="text" class="notranslate"><code>POST /kontext.dev/v1alpha1/agent-runs
Host: &lt;standing Pod name&gt;
Content-Type: application/json
Accept: application/json
</code></pre></div>
<p dir="auto">The request is one strict JSON object:</p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{
  &quot;apiVersion&quot;: &quot;kontext.dev/delivery/v1alpha1&quot;,
  &quot;run&quot;: {
    &quot;name&quot;: &quot;review-42&quot;,
    &quot;namespace&quot;: &quot;default&quot;,
    &quot;uid&quot;: &quot;6d291c0e-3a2d-4b33-956e-8d4ec30f1ac3&quot;
  },
  &quot;target&quot;: {
    &quot;name&quot;: &quot;owner-1-pod&quot;,
    &quot;uid&quot;: &quot;481b6787-bc93-4eae-9d23-e8253c99d481&quot;
  },
  &quot;goal&quot;: &quot;the fully resolved invocation goal&quot;
}"><pre>{
  <span class="pl-ent">"apiVersion"</span>: <span class="pl-s"><span class="pl-pds">"</span>kontext.dev/delivery/v1alpha1<span class="pl-pds">"</span></span>,
  <span class="pl-ent">"run"</span>: {
    <span class="pl-ent">"name"</span>: <span class="pl-s"><span class="pl-pds">"</span>review-42<span class="pl-pds">"</span></span>,
    <span class="pl-ent">"namespace"</span>: <span class="pl-s"><span class="pl-pds">"</span>default<span class="pl-pds">"</span></span>,
    <span class="pl-ent">"uid"</span>: <span class="pl-s"><span class="pl-pds">"</span>6d291c0e-3a2d-4b33-956e-8d4ec30f1ac3<span class="pl-pds">"</span></span>
  },
  <span class="pl-ent">"target"</span>: {
    <span class="pl-ent">"name"</span>: <span class="pl-s"><span class="pl-pds">"</span>owner-1-pod<span class="pl-pds">"</span></span>,
    <span class="pl-ent">"uid"</span>: <span class="pl-s"><span class="pl-pds">"</span>481b6787-bc93-4eae-9d23-e8253c99d481<span class="pl-pds">"</span></span>
  },
  <span class="pl-ent">"goal"</span>: <span class="pl-s"><span class="pl-pds">"</span>the fully resolved invocation goal<span class="pl-pds">"</span></span>
}</pre></div>
<p dir="auto"><code>run</code> identifies the persisted <code>AgentRun</code> audit record. Its Kubernetes UID is
the delivery idempotency identity; runtimes must not execute the same UID
concurrently and should replay a cached terminal response when they still have
one. The controller does not promise exactly-once execution across ambiguous
network failures or Service Pod replacement. Runtimes performing non-idempotent
external effects must persist whatever stronger deduplication their workload
requires.</p>
<p dir="auto"><code>target</code> identifies the verified standing Service Pod selected for this
attempt. The controller also sets the HTTP <code>Host</code> header to that Pod name. A
runtime must reject a request whose Host does not match its own Kubernetes
hostname before accepting the delivery. The controller verifies the target Pod
name, UID, IP, readiness, and owner chain again after the HTTP exchange and
discards the response if that identity changed.</p>
<p dir="auto">Each standing warm-delivery Pod receives a controller-generated random
credential through the Secret-backed <code>KONTEXT_DELIVERY_TOKEN</code> environment
variable. The credential never appears in an Agent or AgentRun, request,
status, or log. For every attempt, the controller sends a fresh base64url
nonce in <code>Kontext-Delivery-Challenge</code>. A successful runtime response includes
<code>Kontext-Delivery-Signature</code>, computed as unpadded base64url of:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="HMAC-SHA256(
  KONTEXT_DELIVERY_TOKEN,
  apiVersion || 0x00 || challenge || 0x00 || run.uid || 0x00 || exact-response-body
)"><pre lang="text" class="notranslate"><code>HMAC-SHA256(
  KONTEXT_DELIVERY_TOKEN,
  apiVersion || 0x00 || challenge || 0x00 || run.uid || 0x00 || exact-response-body
)
</code></pre></div>
<p dir="auto">The controller verifies that signature before parsing or projecting the result
envelope. Missing or invalid signatures fail the run. This challenge-response
binds the accepted result to the credential mounted only into the verified
standing Pod without transmitting that credential over plaintext Pod HTTP.</p>
<p dir="auto">The request contains the resolved goal, not template parameters. Parameter
rendering and execution-field snapshotting have already completed in
admission. Unknown fields, a missing run or target identity or goal, an unsupported
<code>apiVersion</code>, and trailing JSON are invalid requests.</p>
<p dir="auto">The runtime returns HTTP <code>200 OK</code> only with one terminal
<code>kontext.dev/result/v1alpha1</code> envelope as the response body. The envelope is
validated and projected into <code>status.output</code>, <code>status.result</code>, and
<code>status.usage</code> exactly like a native termination-log envelope. Legacy result
payloads and plain text are not accepted on this new endpoint. The complete
response body must not exceed 4096 bytes. A non-2xx response or malformed or
oversized body fails the run with an actionable status message. A transport
failure without a response returns the run to <code>Pending</code> and retries against
the current standing Pod using the stable run UID. Exhausting the bounded
delivery window fails the run.</p>
<p dir="auto">Delivery uses the existing phases; it does not add a <code>Delivered</code> phase:</p>
<ul dir="auto">
<li><code>Pending</code> — waiting for the referenced Service Agent to have a live, Ready
standing Pod, or waiting to retry a connection that was not established.</li>
<li><code>Running</code> — the controller has started the HTTP request against the selected
Pod. <code>status.startTime</code> is set and <code>status.podName</code> records that standing Pod.</li>
<li><code>Succeeded</code> or <code>Failed</code> — projected from a valid terminal response envelope,
or failed by the controller for a delivery/protocol error.</li>
<li><code>BudgetExceeded</code> — the delivered run exceeded its wallclock budget.</li>
</ul>
<p dir="auto">A missing, unready, unreachable, or mid-recast target remains or returns to
<code>Pending</code> and is retried with bounded backoff until the delivery window
expires. Kontext does not create a replacement Pod for a delivered run;
Service recast remains the <code>Agent</code> controller's responsibility. The delivery
window is five minutes from <code>AgentRun</code> creation. Once the first HTTP attempt
starts, <code>budget.wallclock</code> also runs across transport retries and wins when it
expires sooner. Request cancellation closes the HTTP request; runtimes should
stop work when the request context is canceled.</p>
<p dir="auto">The control plane sends one delivery to one standing runtime and records its
outcome. Queueing, prioritization, fan-out, and workload-specific backpressure
remain runtime-image concerns.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Output — logs and execution events</h3><a id="user-content-output--logs-and-execution-events" class="anchor" aria-label="Permalink: Output — logs and execution events" href="#output--logs-and-execution-events"><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>Write operational progress to <strong>stdout</strong> and diagnostics to <strong>stderr</strong>,
line-buffered. Both remain ordinary container logs observable with
<code>kubectl logs</code>.</li>
<li>Runtimes that expose detailed execution events write one JSON object per line.
Event objects use <code>apiVersion: kontext.dev/event/v1alpha1</code>, an RFC3339
<code>timestamp</code>, a <code>type</code> (<code>lifecycle</code>, <code>output</code>, <code>usage</code>, <code>tool</code>, or <code>error</code>),
and type-specific <code>data</code>. Events may include tool calls, bounded tool output,
timing, provider usage, errors, and final responses.</li>
<li>Do not emit private chain-of-thought. Operational summaries and explicit
model/tool outputs are sufficient.</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Output — result</h3><a id="user-content-output--result" class="anchor" aria-label="Permalink: Output — result" href="#output--result"><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 terminal envelope is optional at the control-plane boundary. An empty or
whitespace-only termination message is normalized internally to the current
result API version with outcome <code>Succeeded</code> and no output, usage, or error; it
is not a legacy wire payload. An unchanged plain image that exits <code>0</code> without
writing <code>/dev/termination-log</code> therefore succeeds with absent <code>status.output</code>
and an empty <code>status.result</code>. Native runtimes and images using injected stdout
capture write richer structured output, usage, timing, and execution metadata.</p>
<p dir="auto">On completion, a one-shot runtime that provides a structured result writes a
compact versioned envelope to <code>/dev/termination-log</code> (and may also write
<code>/kontext/result.json</code>). A warm-delivery Service runtime returns the same
versioned envelope as its HTTP response body:</p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{
  &quot;apiVersion&quot;: &quot;kontext.dev/result/v1alpha1&quot;,
  &quot;outcome&quot;: &quot;Succeeded&quot;,
  &quot;output&quot;: {
    &quot;mediaType&quot;: &quot;application/json&quot;,
    &quot;value&quot;: { &quot;answer&quot;: &quot;final output&quot; }
  },
  &quot;usage&quot;: {
    &quot;inputTokens&quot;: 1000,
    &quot;outputTokens&quot;: 234,
    &quot;totalTokens&quot;: 1234,
    &quot;reasoningTokens&quot;: 180
  },
  &quot;timing&quot;: {
    &quot;durationMillis&quot;: 1750
  },
  &quot;execution&quot;: {
    &quot;provider&quot;: &quot;anthropic&quot;,
    &quot;model&quot;: &quot;provider-defined-model-id&quot;,
    &quot;requestId&quot;: &quot;request-id&quot;
  }
}"><pre>{
  <span class="pl-ent">"apiVersion"</span>: <span class="pl-s"><span class="pl-pds">"</span>kontext.dev/result/v1alpha1<span class="pl-pds">"</span></span>,
  <span class="pl-ent">"outcome"</span>: <span class="pl-s"><span class="pl-pds">"</span>Succeeded<span class="pl-pds">"</span></span>,
  <span class="pl-ent">"output"</span>: {
    <span class="pl-ent">"mediaType"</span>: <span class="pl-s"><span class="pl-pds">"</span>application/json<span class="pl-pds">"</span></span>,
    <span class="pl-ent">"value"</span>: { <span class="pl-ent">"answer"</span>: <span class="pl-s"><span class="pl-pds">"</span>final output<span class="pl-pds">"</span></span> }
  },
  <span class="pl-ent">"usage"</span>: {
    <span class="pl-ent">"inputTokens"</span>: <span class="pl-c1">1000</span>,
    <span class="pl-ent">"outputTokens"</span>: <span class="pl-c1">234</span>,
    <span class="pl-ent">"totalTokens"</span>: <span class="pl-c1">1234</span>,
    <span class="pl-ent">"reasoningTokens"</span>: <span class="pl-c1">180</span>
  },
  <span class="pl-ent">"timing"</span>: {
    <span class="pl-ent">"durationMillis"</span>: <span class="pl-c1">1750</span>
  },
  <span class="pl-ent">"execution"</span>: {
    <span class="pl-ent">"provider"</span>: <span class="pl-s"><span class="pl-pds">"</span>anthropic<span class="pl-pds">"</span></span>,
    <span class="pl-ent">"model"</span>: <span class="pl-s"><span class="pl-pds">"</span>provider-defined-model-id<span class="pl-pds">"</span></span>,
    <span class="pl-ent">"requestId"</span>: <span class="pl-s"><span class="pl-pds">"</span>request-id<span class="pl-pds">"</span></span>
  }
}</pre></div>
<p dir="auto">The envelope fields are:</p>
<ul dir="auto">
<li><code>apiVersion</code> — exactly <code>kontext.dev/result/v1alpha1</code>.</li>
<li><code>outcome</code> — <code>Succeeded</code> or <code>Failed</code>. A failed outcome includes
<code>error.message</code> and may include a stable <code>error.code</code> and <code>error.retryable</code>.</li>
<li><code>output</code> — an optional media type plus any valid JSON value.</li>
<li><code>usage</code> — optional typed metrics. <code>reasoningTokens</code> records a
provider-reported reasoning-token breakdown of output/completion usage.
Missing values are never inferred as zero, including when the provider does
not expose that breakdown; a present zero means the provider measured zero.
Visible response text can therefore tokenize to fewer tokens than
<code>outputTokens</code>: provider completion totals may also include hidden reasoning
or other provider-defined completion accounting. The count does not expose
reasoning content.</li>
<li><code>timing</code> — optional start/completion timestamps and measured durations.</li>
<li><code>execution</code> — optional non-secret provider, model, request, turn, and tool
metadata.</li>
<li><code>artifacts</code> — optional references to data stored outside Kubernetes status.</li>
<li><code>extensions</code> — optional provider/runtime-specific JSON under namespaced keys
such as <code>anthropic.com/request</code>.</li>
<li><code>truncation</code> — explicit metadata added when fields were removed to fit the
Kubernetes termination-message limit.</li>
</ul>
<p dir="auto">The termination message is a terminal summary, not a transcript. Producers
must compact it below 4096 bytes while preserving valid JSON and setting
<code>truncation</code>. Full execution events remain in the JSONL log stream.</p>
<p dir="auto">The controller projects the stable aggregate usage fields into
<code>AgentRun.status.usage</code>. Optional usage breakdowns such as <code>reasoningTokens</code>
remain in the versioned result envelope and usage events, avoiding
provider-detail growth in Kubernetes status.</p>
<p dir="auto"><code>status.output</code> preserves <code>output</code>. The compatibility field <code>status.result</code> is
projected deterministically: JSON strings with a <code>text/*</code> media type become
their unquoted value; every other JSON value becomes compact JSON text; absent
output becomes an empty string.</p>
<p dir="auto">The controller continues to accept the legacy payload during the v1alpha1
transition:</p>
<div class="highlight highlight-source-json notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="{ &quot;result&quot;: &quot;&lt;final output&gt;&quot;, &quot;tokensUsed&quot;: 1234, &quot;dollarsUsed&quot;: 0.0 }"><pre>{ <span class="pl-ent">"result"</span>: <span class="pl-s"><span class="pl-pds">"</span>&lt;final output&gt;<span class="pl-pds">"</span></span>, <span class="pl-ent">"tokensUsed"</span>: <span class="pl-c1">1234</span>, <span class="pl-ent">"dollarsUsed"</span>: <span class="pl-c1">0.0</span> }</pre></div>
<p dir="auto">Legacy text becomes <code>text/plain</code> structured output. Legacy usage fields are
recorded only when they are present in the payload. For compatibility, the
process exit code remains authoritative for legacy payloads; a legacy <code>error</code>
field is retained as diagnostic text but never determines the run outcome and
does not turn exit <code>0</code> into failure.</p>
<p dir="auto">Exit <code>0</code> with no termination payload or with a successful envelope means
success. A non-zero process exit always fails the run. A failed envelope also
fails the run even if the process exits zero. If a JSON-looking termination
payload is present, malformed or partially written JSON remains an actionable
failure rather than silently becoming a successful plain-text result.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Optional result reporter</h3><a id="user-content-optional-result-reporter" class="anchor" aria-label="Permalink: Optional result reporter" href="#optional-result-reporter"><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 maintained <code>runtimes/reporter</code> executable can supervise an explicit child
command and produce the versioned envelope without requiring the child to write
the termination log itself. It preserves child stdout, stderr, signals, and
process exit status.</p>
<p dir="auto">Reporter extraction supports:</p>
<ul dir="auto">
<li><code>last-line</code> — the last non-empty stdout line becomes <code>text/plain</code> output.</li>
<li><code>kontext-envelope</code> — the last stdout line prefixed with
<code>KONTEXT_RESULT:</code> supplies a complete versioned envelope.</li>
</ul>
<p dir="auto">The reporter bounds only captured result data; streamed logs remain unbounded.
It compacts every emitted envelope to the termination-message limit. Reporter
injection and workload configuration are control-plane concerns defined
separately from this executable.</p>
<p dir="auto">An existing Linux image opts into stdout capture with:</p>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="runtime:
  image: example/agent:v1
  command: [&quot;python&quot;, &quot;-m&quot;, &quot;agent&quot;]
  result:
    source: Stdout
    format: LastLine"><pre><span class="pl-ent">runtime</span>:
  <span class="pl-ent">image</span>: <span class="pl-s">example/agent:v1</span>
  <span class="pl-ent">command</span>: <span class="pl-s">["python", "-m", "agent"]</span>
  <span class="pl-ent">result</span>:
    <span class="pl-ent">source</span>: <span class="pl-s">Stdout</span>
    <span class="pl-ent">format</span>: <span class="pl-s">LastLine</span></pre></div>
<p dir="auto"><code>runtime.command</code> is required because reporter injection replaces the image
entrypoint; Kubernetes cannot recover that entrypoint automatically.
<code>KontextEnvelope</code> is the other supported format. Without <code>runtime.result</code>,
Kontext leaves the image entrypoint and native termination behavior unchanged.</p>
<p dir="auto">The operator installation selects the trusted reporter image. Kontext injects
its binary with an init container and mounts it read-only into the workload
container; workloads cannot select a different reporter image. The controller
does not read Pod logs and needs no <code>pods/log</code> permission. <code>LastLine</code> is
heuristic, cannot infer usage, and is discouraged for long-running Service
agents. The trusted init container runs as UID 0 only while populating the
otherwise empty shared volume; it drops capabilities, disables privilege
escalation, and uses a read-only root filesystem. The workload container's own
user and security context remain unchanged.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Runtime roles</h3><a id="user-content-runtime-roles" class="anchor" aria-label="Permalink: Runtime roles" href="#runtime-roles"><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>runtimes/echo</code> is the deterministic control-plane conformance oracle. During
the v1alpha1 transition it intentionally writes the legacy termination payload
documented above. <code>runtimes/reference</code> is the maintained model-backed runtime.
Arbitrary conforming images remain supported and need not use any of these
implementations.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Maintained reference runtime</h3><a id="user-content-maintained-reference-runtime" class="anchor" aria-label="Permalink: Maintained reference runtime" href="#maintained-reference-runtime"><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>runtimes/reference</code> is the optional maintained Go runtime. It owns a small
provider-neutral completion loop behind a normalized provider interface; it is
not an agent framework. The runtime image bundles the reporter as PID 1 and
uses the internal <code>KONTEXT_RESULT:</code> capture protocol so the reporter can write
the authoritative versioned envelope to the runtime container's termination
message. Raw logs remain an event and diagnostic stream.</p>
<p dir="auto">The initial keyless <code>fake</code> provider is deterministic and exercises the same
configuration, conversation, event, result, cancellation, and failure paths
that real HTTP transports use. The maintained real transports are Anthropic
Messages (<code>anthropic</code>) and OpenAI-compatible Chat Completions (<code>openai</code> or
<code>openai-compatible</code>). They use direct non-streaming HTTP, accept an optional
exact endpoint or base-URL override, and normalize text, function tool calls,
stop reasons, measured usage, request IDs, and actionable transport errors.
The OpenAI-compatible boundary is the documented Chat Completions request,
response, bearer-auth, and function-tool-call shape; it does not imply support
for the Responses API, streaming, Azure URL construction, or every inference
protocol. <code>KONTEXT_MODEL</code> remains opaque and is never aliased or rewritten.</p>
<p dir="auto">Credentials come from the <code>AgentRun</code> Secret policy as <code>ANTHROPIC_API_KEY</code> or
<code>OPENAI_API_KEY</code>. Authenticated acceptance is manual and environment-protected;
pull-request CI remains deterministic, keyless, and network-independent.</p>
<p dir="auto">The controller remains authoritative for wallclock enforcement. The runtime
parses <code>KONTEXT_BUDGET_WALLCLOCK</code> but does not start a competing timer; it
reacts to cancellation when the reporter forwards controller signals.
Omission means no deadline, and the runtime does not invent a five-minute
default.</p>
<p dir="auto">The maintained runtime exposes only tools named in <code>KONTEXT_TOOLS</code>. It owns a
bounded provider-neutral loop that returns normalized tool results until final
output, cancellation, failure, or a configured turn, token, tool-call, or
tool-output limit. Omitted or zero runtime limits are disabled. Built-in tools
are <code>read_knowledge</code>, <code>kubernetes_read</code>, and <code>shell</code>.</p>
<p dir="auto">The reference runtime applies <code>KONTEXT_BUDGET_TOKENS</code> to cumulative measured
provider usage across every request in the run. Each tool follow-up resends the
conversation, including prior tool calls and bounded results, so providers may
count that context again. Provider-reported reasoning or completion usage also
counts even when it does not appear in the final text. The runtime sends the
remaining budget as a provider completion limit where supported, but checks
actual usage only after each response. A response can therefore exceed the run
budget and fail with <code>token_limit_exceeded</code>. Missing usage is not estimated.
Budgets need headroom because provider and model usage can vary between live
runs.</p>
<p dir="auto"><code>read_knowledge</code> is confined to <code>/kontext/knowledge</code>. <code>kubernetes_read</code> has a
fixed current-namespace get/list allowlist and never reads Secrets. <code>shell</code>
uses an explicit working directory, filters its direct child environment,
streams logs, bounds captured output, and cleans up its process group on
cancellation. These runtime checks prevent accidental exposure; Kubernetes
RBAC, workload security context, mounted data, and container isolation remain
the security boundaries. In particular, <code>shell</code> shares the runtime container;
environment filtering does not isolate its filesystem or process view. Tool
events omit result content by default; the maintained runtime requires an
explicit opt-in before placing bounded tool content in the event stream.</p>
<p dir="auto">Configured per-result and cumulative tool-output limits bound content returned
to the model. Omission or zero disables those configured limits, but built-in
tools still enforce a fixed 8 MiB capture safety ceiling per call. Tool errors
become structured results that the model may recover from; they do not fail the
run by themselves. Only a successful terminal provider response without tool
calls becomes final output. Cancellation, execution failures, or reaching a
configured limit before final output fail the run.</p>
<p dir="auto">When tool content exceeds an effective positive byte limit, the runtime sets
the tool result's <code>truncated</code> field to <code>true</code> and normally replaces <code>content</code>
with <code>{"partial":"&lt;UTF-8 prefix&gt;"}</code>. The prefix is chosen so the complete
encoded envelope, including JSON escaping and envelope overhead, does not
exceed the limit. If the limit is too small for that envelope, the runtime
returns the deterministic minimal JSON value <code>0</code> at one byte or <code>{}</code> when at
least two bytes fit. Thus every positively bounded truncated result is valid
UTF-8, valid JSON, and no larger than its effective limit. Providers preserve
this bounded JSON as the tool-result content string alongside the explicit
truncation metadata.</p>
<p dir="auto">The reference runtime emits versioned JSONL lifecycle, usage, tool, output, and
error events to stdout. It retains conversation state only in memory for one
run and does not provide retries, planning, persistent memory, retrieval,
subagents, or background orchestration.</p>
<p dir="auto">Configured MCP servers are a maintained-runtime concern, not control-plane
vocabulary. The reference runtime uses the official MCP Go SDK v1.6.1, which
requires Go 1.25 or newer; this repository declares Go 1.26.6. The SDK
negotiates protocol <code>2025-11-25</code> and accepts <code>2025-06-18</code>, <code>2025-03-26</code>, and
<code>2024-11-05</code>. Discovered MCP tools join the same immutable allowlisted registry
and use the same turn, call-count, output, cancellation, event, and cleanup
controls as built-ins.</p>
<p dir="auto">The maintained Playwright MCP example is a separate restricted
Deployment/Service reached over HTTP <code>/mcp</code>, never an AgentRun sidecar.
Playwright MCP 0.0.78 is pinned to
<code>mcr.microsoft.com/playwright/mcp@sha256:3d871c22ea2d4cca0966e2cfb1860e1cb03eb7353725a3d6cffd133296fb04eb</code>.
The browser server has its own keyless identity, ephemeral profile and writable
storage, finite resources, and NetworkPolicy. It does not add MCP or browser
fields to either CRD. The example disables Chromium's sandbox because the
pinned image runs in a restricted container; Playwright MCP is not itself a
security boundary.</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Mode expectations for the image</h3><a id="user-content-mode-expectations-for-the-image" class="anchor" aria-label="Permalink: Mode expectations for the image" href="#mode-expectations-for-the-image"><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><strong>Task / Scheduled run image:</strong> does its work, writes result, exits. Pod <code>restartPolicy: Never</code>.</li>
<li><strong>Service run image:</strong> expected to be long-running (loop / serve / watch).
When <code>runtime.delivery</code> is configured, it also implements the warm-delivery
HTTP endpoint. When the standing process exits for any reason, the <code>Agent</code>
(Service) controller mints a fresh Pod-owning <code>AgentRun</code> — this is "instantly
re-cast on failure". Delivered <code>AgentRun</code>s never own or recast Pods.</li>
</ul>
<hr>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Anti-overfit firewall (read before adding a field)</h2><a id="user-content-anti-overfit-firewall-read-before-adding-a-field" class="anchor" aria-label="Permalink: Anti-overfit firewall (read before adding a field)" href="#anti-overfit-firewall-read-before-adding-a-field"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<p dir="auto">Kontext's vocabulary is fixed: <code>Agent</code>, <code>AgentRun</code>, runtime image, mode, budget, secret, tools, status, result. It must not gain domain-specific fields or workflow semantics for any one consumer. Consumers encode their semantics inside runtime images and orchestrate by creating generic <code>Agent</code>/<code>AgentRun</code> objects.</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>

