



  

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




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

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

  


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

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

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

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

  

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


  <title>TripChord/docs/claude-code-v1-implementation-prompt.md at main · Oxygen56/TripChord · 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:d758868d-9607-3b85-139c-711b7a9a7d08">

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


  <meta name="request-id" content="ADD8:9EBA7:B1FD06D:E7E3F3F:6ACA5E2E" data-pjax-transient="true"/><meta name="html-safe-nonce" content="6157cee4f3082b1ed8c8e04cda3796f6a6687233658806607ec62034b11b19e9" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBREQ4OjlFQkE3OkIxRkQwNkQ6RTdFM0YzRjo2QUNBNUUyRSIsInZpc2l0b3JfaWQiOiI1NDQ0Njg3MjY1MDU2NTc5MTE4IiwicmVnaW9uX2VkZ2UiOiJmcmEiLCJyZWdpb25fcmVuZGVyIjoiZnJhIn0=" data-pjax-transient="true"/><meta name="visitor-hmac" content="ded3fb7a520801e54ae90ef642c7d4ab8c6b39315b8623bf9b8363ac005f1da3" data-pjax-transient="true"/>


    <meta name="hovercard-subject-tag" content="repository:1324280045" 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="证据驱动的多 Agent 自由行规划系统：并发取证、Planner–Verifier–Repair、动态重规划与只读 OTA 实验接入 - TripChord/docs/claude-code-v1-implementation-prompt.md at main · Oxygen56/TripChord">

      <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/Oxygen56/TripChord/blob/main/docs/claude-code-v1-implementation-prompt.md" />

      <meta name="twitter:image" content="https://opengraph.githubassets.com/6bb9268620986d0c481b86d22a4d0ecc4763152153cfac7e206f6d9f8ec75642/Oxygen56/TripChord" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="TripChord/docs/claude-code-v1-implementation-prompt.md at main · Oxygen56/TripChord" /><meta name="twitter:description" content="证据驱动的多 Agent 自由行规划系统：并发取证、Planner–Verifier–Repair、动态重规划与只读 OTA 实验接入 - Oxygen56/TripChord" />
  <meta property="og:image" content="https://opengraph.githubassets.com/6bb9268620986d0c481b86d22a4d0ecc4763152153cfac7e206f6d9f8ec75642/Oxygen56/TripChord" /><meta property="og:image:alt" content="证据驱动的多 Agent 自由行规划系统：并发取证、Planner–Verifier–Repair、动态重规划与只读 OTA 实验接入 - Oxygen56/TripChord" /><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="TripChord/docs/claude-code-v1-implementation-prompt.md at main · Oxygen56/TripChord" /><meta property="og:url" content="https://github.com/Oxygen56/TripChord/blob/main/docs/claude-code-v1-implementation-prompt.md" /><meta property="og:description" content="证据驱动的多 Agent 自由行规划系统：并发取证、Planner–Verifier–Repair、动态重规划与只读 OTA 实验接入 - Oxygen56/TripChord" />
  




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



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


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

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

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

    <meta data-hydrostats="publish">

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

  <meta name="octolytics-dimension-user_id" content="100782273" /><meta name="octolytics-dimension-user_login" content="Oxygen56" /><meta name="octolytics-dimension-repository_id" content="1324280045" /><meta name="octolytics-dimension-repository_nwo" content="Oxygen56/TripChord" /><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="1324280045" /><meta name="octolytics-dimension-repository_network_root_nwo" content="Oxygen56/TripChord" />
  



    

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


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


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

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

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

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


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

  </head>

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

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

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

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





      

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

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


          

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

<react-partial
  partial-name="marketing-header"
  data-ssr="true"
  data-attempted-ssr="true"
  data-react-profiling="false"
>
  
  <script type="application/json" data-target="react-partial.embeddedData">{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2FOxygen56%2FTripChord%2Fblob%2Fmain%2Fdocs%2Fclaude-code-v1-implementation-prompt.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=Oxygen56%2FTripChord","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/Oxygen56/TripChord/blob/main/docs/claude-code-v1-implementation-prompt.md\",\"user_id\":null}}","auth_hydro_click_hmac":"2162b025051336ee4d3990b61ac783bb0dc7f725c65f0061c9d67884105c945f","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%2FOxygen56%2FTripChord%2Fblob%2Fmain%2Fdocs%2Fclaude-code-v1-implementation-prompt.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/Oxygen56/TripChord/blob/main/docs/claude-code-v1-implementation-prompt.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="2162b025051336ee4d3990b61ac783bb0dc7f725c65f0061c9d67884105c945f"><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%2FOxygen56%2FTripChord%2Fblob%2Fmain%2Fdocs%2Fclaude-code-v1-implementation-prompt.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/Oxygen56/TripChord/blob/main/docs/claude-code-v1-implementation-prompt.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="2162b025051336ee4d3990b61ac783bb0dc7f725c65f0061c9d67884105c945f"><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=Oxygen56%2FTripChord" 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/Oxygen56/TripChord/blob/main/docs/claude-code-v1-implementation-prompt.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="2162b025051336ee4d3990b61ac783bb0dc7f725c65f0061c9d67884105c945f"><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-6cab10b4-2774-4696-9c57-89adadccea43" aria-labelledby="tooltip-25d33cbb-30e4-4fe3-a3d2-68416f17e6ad" 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-25d33cbb-30e4-4fe3-a3d2-68416f17e6ad" for="icon-button-6cab10b4-2774-4696-9c57-89adadccea43" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip>


  
</div>
    </div>

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








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






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

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


    






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








  

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

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


  



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



    
      
    








<react-app
  app-name="code-view"
  initial-path="/Oxygen56/TripChord/blob/main/docs/claude-code-v1-implementation-prompt.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":"Claude Code：TripChord v0.2 → v1.0 自治实施总提示词","anchor":"claude-codetripchord-v02--v10-自治实施总提示词","htmlText":"Claude Code：TripChord v0.2 → v1.0 自治实施总提示词"},{"level":2,"text":"一、开始前必须完整阅读","anchor":"一开始前必须完整阅读","htmlText":"一、开始前必须完整阅读"},{"level":2,"text":"二、当前已知状态与声明边界","anchor":"二当前已知状态与声明边界","htmlText":"二、当前已知状态与声明边界"},{"level":2,"text":"三、你已获得和没有获得的权限","anchor":"三你已获得和没有获得的权限","htmlText":"三、你已获得和没有获得的权限"},{"level":2,"text":"四、不可改变的产品合同","anchor":"四不可改变的产品合同","htmlText":"四、不可改变的产品合同"},{"level":3,"text":"1. 本地优先","anchor":"1-本地优先","htmlText":"1. 本地优先"},{"level":3,"text":"2. 默认查询全部“当前合格”的平台，而不是全部已知平台","anchor":"2-默认查询全部当前合格的平台而不是全部已知平台","htmlText":"2. 默认查询全部“当前合格”的平台，而不是全部已知平台"},{"level":3,"text":"3. 等全部已选来源终态后再规划","anchor":"3-等全部已选来源终态后再规划","htmlText":"3. 等全部已选来源终态后再规划"},{"level":3,"text":"4. 允许跨平台混合组合","anchor":"4-允许跨平台混合组合","htmlText":"4. 允许跨平台混合组合"},{"level":3,"text":"5. 只提供官方预订交接，不提供支付能力","anchor":"5-只提供官方预订交接不提供支付能力","htmlText":"5. 只提供官方预订交接，不提供支付能力"},{"level":3,"text":"6. 已预订只来自用户声明，并成为强约束","anchor":"6-已预订只来自用户声明并成为强约束","htmlText":"6. 已预订只来自用户声明，并成为强约束"},{"level":3,"text":"7. Agent 与硬代码边界","anchor":"7-agent-与硬代码边界","htmlText":"7. Agent 与硬代码边界"},{"level":2,"text":"五、持续实施协议","anchor":"五持续实施协议","htmlText":"五、持续实施协议"},{"level":3,"text":"1. 建立可恢复的实施账本","anchor":"1-建立可恢复的实施账本","htmlText":"1. 建立可恢复的实施账本"},{"level":3,"text":"2. 先建立基线","anchor":"2-先建立基线","htmlText":"2. 先建立基线"},{"level":3,"text":"3. 实施原则","anchor":"3-实施原则","htmlText":"3. 实施原则"},{"level":3,"text":"4. 每个版本的固定检查点","anchor":"4-每个版本的固定检查点","htmlText":"4. 每个版本的固定检查点"},{"level":2,"text":"六、分版本实施与退出门","anchor":"六分版本实施与退出门","htmlText":"六、分版本实施与退出门"},{"level":3,"text":"v0.2：动态平台内核","anchor":"v02动态平台内核","htmlText":"v0.2：动态平台内核"},{"level":3,"text":"v0.3：全来源终态屏障与诚实发布","anchor":"v03全来源终态屏障与诚实发布","htmlText":"v0.3：全来源终态屏障与诚实发布"},{"level":3,"text":"v0.4：跨平台最终方案与覆盖解释","anchor":"v04跨平台最终方案与覆盖解释","htmlText":"v0.4：跨平台最终方案与覆盖解释"},{"level":3,"text":"v0.5：官方预订跳转与逐组件清单","anchor":"v05官方预订跳转与逐组件清单","htmlText":"v0.5：官方预订跳转与逐组件清单"},{"level":3,"text":"v0.6：已预订保护与事件闭环","anchor":"v06已预订保护与事件闭环","htmlText":"v0.6：已预订保护与事件闭环"},{"level":3,"text":"v0.7：Provider SDK 与认证门","anchor":"v07provider-sdk-与认证门","htmlText":"v0.7：Provider SDK 与认证门"},{"level":3,"text":"v0.8：本地优先的完整产品体验","anchor":"v08本地优先的完整产品体验","htmlText":"v0.8：本地优先的完整产品体验"},{"level":3,"text":"v0.9：公开测试版可靠性与评测","anchor":"v09公开测试版可靠性与评测","htmlText":"v0.9：公开测试版可靠性与评测"},{"level":3,"text":"v1.0：最终产品与 Done-Gate","anchor":"v10最终产品与-done-gate","htmlText":"v1.0：最终产品与 Done-Gate"},{"level":2,"text":"七、最低验证命令","anchor":"七最低验证命令","htmlText":"七、最低验证命令"},{"level":2,"text":"八、绝对禁止的伪完成方式","anchor":"八绝对禁止的伪完成方式","htmlText":"八、绝对禁止的伪完成方式"},{"level":2,"text":"九、只允许因这些事项暂停并请求用户","anchor":"九只允许因这些事项暂停并请求用户","htmlText":"九、只允许因这些事项暂停并请求用户"},{"level":2,"text":"十、最终交付报告","anchor":"十最终交付报告","htmlText":"十、最终交付报告"}]},"issueTemplate":null,"discussionTemplate":null,"richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eClaude Code：TripChord v0.2 → v1.0 自治实施总提示词\u003c/h1\u003e\u003ca id=\"user-content-claude-codetripchord-v02--v10-自治实施总提示词\" class=\"anchor\" aria-label=\"Permalink: Claude Code：TripChord v0.2 → v1.0 自治实施总提示词\" href=\"#claude-codetripchord-v02--v10-自治实施总提示词\"\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你现在是 TripChord 的主实施工程师、产品工程负责人和最终验收负责人。请直接进入并持续开发：\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003e/Users/oxygen/Documents/个人项目/tripchord\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e你的目标不是再写一份计划，也不是只做几个演示页面，而是严格依据仓库中的\n\u003ccode\u003edocs/roadmap.md\u003c/code\u003e，把当前 v0.1 参考实现逐版本推进到可独立安装和体验的 v1.0 产品形态，\n并通过机器可判定、证据可回放的最终 Done-Gate。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e除非遇到下文明确列出的“只能由用户处理的边界”，不要在每个阶段向我确认，不要因为任务规模、\n上下文长度、运行时间或测试较多而停止。你应当自行调查、实现、测试、发现偏差、修复并继续推进。\n如果当前上下文即将耗尽，先更新持久化交接文件，再在下一上下文从该文件继续，不能重新从头分析。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e一、开始前必须完整阅读\u003c/h2\u003e\u003ca id=\"user-content-一开始前必须完整阅读\" class=\"anchor\" aria-label=\"Permalink: 一、开始前必须完整阅读\" href=\"#一开始前必须完整阅读\"\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在修改代码前，完整阅读而不是只搜索摘要：\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eAGENTS.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eREADME.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/roadmap.md\u003c/code\u003e，它是本次产品化的最高优先级目标合同\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/architecture.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/providers.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/data-source-policy.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/done-gate.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/claim-ledger.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/model-context-memory-rag.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/persistent-memory.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/operations.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edocs/resume-project.md\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSECURITY.md\u003c/code\u003e、\u003ccode\u003e.github/workflows/ci.yml\u003c/code\u003e、数据库迁移、现有测试与 benchmark\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003e若旧文档与 \u003ccode\u003edocs/roadmap.md\u003c/code\u003e 冲突，不得偷偷选择更容易实现的旧语义。先查代码和证据，保留旧版本\n兼容层，在阶段评审中写明迁移方式，并以产品化路线图中已经确认的决定为目标。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e二、当前已知状态与声明边界\u003c/h2\u003e\u003ca id=\"user-content-二当前已知状态与声明边界\" class=\"anchor\" aria-label=\"Permalink: 二、当前已知状态与声明边界\" href=\"#二当前已知状态与声明边界\"\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当前仓库是完整的独立项目，不依赖 Codex、ChatGPT 或 Claude Code 才能运行；运行时模型接口必须\n保持 OpenAI-compatible、可替换和可关闭。\u003c/li\u003e\n\u003cli\u003e当前工作树可能已有 \u003ccode\u003eREADME.md\u003c/code\u003e 与 \u003ccode\u003edocs/roadmap.md\u003c/code\u003e 的未提交修改，它们是本次产品化工作的既有\n输入。先执行 \u003ccode\u003egit status --short\u003c/code\u003e 和 \u003ccode\u003egit diff\u003c/code\u003e，保护所有既有修改，不得 reset、checkout、clean、\nstash、rebase、force 或覆盖不属于你的内容。若仍在 \u003ccode\u003emain\u003c/code\u003e，在不丢失这些修改的前提下创建或复用\n本地产品化分支；核对无误后把路线图作为独立基线提交，绝不自动 push。\u003c/li\u003e\n\u003cli\u003e当前代码已有多 Agent、动态预算、Chrome Companion、Planner–Verifier–Repair–ReVerifier、\n事件重规划、回放、后训练和大量测试；优先抽取复用，不要另起一个互不相连的“v2 演示”。\u003c/li\u003e\n\u003cli\u003e当前平台集合、前端类型、Companion 权限和部分 Done-Gate 仍有固定三平台假设；这是 v0.2 的首要\n根因，不是只改 UI 文案即可完成。\u003c/li\u003e\n\u003cli\u003e当前已知真实证据中，模型调用成功、HTTP job 成功和 Source 全部进入类型化终态，都不等于业务\nDone-Gate 通过。既有 Round 17 的业务门仍失败，住宿精确可比报价不足。开始时必须重新核对仓库\n当前证据；没有新的真实证据就不得改写这一结论。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfirmed_empty\u003c/code\u003e、\u003ccode\u003ebounded_provider_pending\u003c/code\u003e、\u003ccode\u003ebounded_no_exact_quote\u003c/code\u003e、\u003ccode\u003elogin_required\u003c/code\u003e、\n\u003ccode\u003ecaptcha_required\u003c/code\u003e、\u003ccode\u003edom_drift\u003c/code\u003e、\u003ccode\u003etimed_out\u003c/code\u003e 都不能被包装成第二个价格。\u003c/li\u003e\n\u003cli\u003e当前用户已明确跳过同程海外酒店；除非用户在你的当前会话中作出新的显式决定，不得重试、恢复或\n计入覆盖。智行当前只有候选能力审计，没有稳定可审计的 PC 报价结果面，不得进入 Planner。\u003c/li\u003e\n\u003cli\u003e旧 v0.1 strict Done-Gate 的历史失败证据必须保持可回放。新路线图允许单来源有限方案，因此应新增\n版本化 product-v1 gate，不能削弱旧 strict gate、重命名旧终态或改写历史证据来制造成功。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e三、你已获得和没有获得的权限\u003c/h2\u003e\u003ca id=\"user-content-三你已获得和没有获得的权限\" class=\"anchor\" aria-label=\"Permalink: 三、你已获得和没有获得的权限\" href=\"#三你已获得和没有获得的权限\"\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你可以自主执行：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e修改本仓库内的代码、测试、迁移、文档、fixture、benchmark、CI 和本地构建配置；\u003c/li\u003e\n\u003cli\u003e安装锁文件已经声明的依赖，运行本地服务、回放、测试、静态检查、迁移和容器构建；\u003c/li\u003e\n\u003cli\u003e创建本地分支和本地阶段提交，但不得把既有用户修改混入无关提交；\u003c/li\u003e\n\u003cli\u003e使用不访问真实 OTA、不产生外部副作用的本地 fixture、干净浏览器 E2E 和模型桩；\u003c/li\u003e\n\u003cli\u003e在不改变产品边界的前提下做必要架构决策，并记录 ADR 与权衡。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e你没有自动获得以下权限；不得把其他会话对 Codex 的授权视为对你的授权：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e访问用户当前 Chrome 登录态或真实 OTA 平台；\u003c/li\u003e\n\u003cli\u003e扩大 Chrome host permissions、安装/启用扩展、恢复登录或处理验证码；\u003c/li\u003e\n\u003cli\u003e发起付费模型调用、使用未在环境变量中明确提供的 API Key；\u003c/li\u003e\n\u003cli\u003e下单、支付、使用/领取优惠券、读取订单、Cookie、密码或支付信息；\u003c/li\u003e\n\u003cli\u003e调用未公开私有接口、逆向绕过平台页面能力、风控或访问控制；\u003c/li\u003e\n\u003cli\u003e推送 GitHub、创建 PR、发布 Release、发布 Chrome Web Store 扩展或 affiliate 链接；\u003c/li\u003e\n\u003cli\u003e删除用户数据、执行破坏性 Git 操作或不可逆数据库迁移。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e只有在确实需要上述权限时才询问用户，而且一次只提出一个具体请求。等待授权期间继续完成所有\n不受阻塞的本地工程、回放、fixture、文档和安全测试，不得因为一个平台登录问题停下整个项目。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e四、不可改变的产品合同\u003c/h2\u003e\u003ca id=\"user-content-四不可改变的产品合同\" class=\"anchor\" aria-label=\"Permalink: 四、不可改变的产品合同\" href=\"#四不可改变的产品合同\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e1. 本地优先\u003c/h3\u003e\u003ca id=\"user-content-1-本地优先\" class=\"anchor\" aria-label=\"Permalink: 1. 本地优先\" href=\"#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\u003cp dir=\"auto\"\u003eAPI、Web、数据库、Browser Companion、平台登录态和用户自己的 LLM Key 默认留在用户机器上。\n首版不做托管用户浏览器、账号和支付状态的云端 OTA。可选云能力不能成为本地核心闭环的依赖。\nBrowser Bridge 必须继续只绑定 loopback，使用强随机且分权的 token、严格 CORS 与脱敏日志；不得把\nbridge/control/lease token 写入 Git、模型上下文、旅行数据或公开证据。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2. 默认查询全部“当前合格”的平台，而不是全部已知平台\u003c/h3\u003e\u003ca id=\"user-content-2-默认查询全部当前合格的平台而不是全部已知平台\" class=\"anchor\" aria-label=\"Permalink: 2. 默认查询全部“当前合格”的平台，而不是全部已知平台\" href=\"#2-默认查询全部当前合格的平台而不是全部已知平台\"\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\u003eprovider × vertical\u003c/code\u003e。默认集合必须严格等于：\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003e已认证 ∩ 支持当前垂类 ∩ 用户已授权 ∩ 当前无已知阻断 ∩ 未冷却 ∩ 用户未关闭\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e健康未知但没有已知阻断时可进入搜索；运行中发现登录、验证码或 DOM 漂移时，以相应终态结束。\n用户关闭的 scope 不得产生浏览器任务、模型工具调用、重试、刷新、failover 或事件重规划访问。\n任何 Agent 都不能自动重新开启。搜索启动时冻结不可变 Selection Snapshot 和 SHA。\nBrowser Companion 必须保持最小权限；不得为了实现方便增加 \u003ccode\u003ecookies\u003c/code\u003e、\u003ccode\u003edebugger\u003c/code\u003e、全站通配 host\npermission 或能够读取账号/支付状态的高权限。新增官方域名必须经过独立 capability/profile 版本和\n用户逐项授权。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e3. 等全部已选来源终态后再规划\u003c/h3\u003e\u003ca id=\"user-content-3-等全部已选来源终态后再规划\" class=\"anchor\" aria-label=\"Permalink: 3. 等全部已选来源终态后再规划\" href=\"#3-等全部已选来源终态后再规划\"\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\"\u003ePlanner 必须严格晚于本次所有已选 Source 的终态。等待期间 UI 只展示平台/垂类进度和原因，不展示\n部分价格、临时预算或候选方案。终态不等于报价成功；失败、登录、验证码、页面漂移、超时和取消\n也必须类型化落地。不得无限等待，不得让 LLM 修改 deadline，不得把失败伪装成成功来通过调度器。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e只有一家来源有可用报价时允许输出有限方案，但必须明确“未形成跨平台比价”。零报价时只能输出\n阻断报告和安全重试动作，预算与方案必须为空。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e4. 允许跨平台混合组合\u003c/h3\u003e\u003ca id=\"user-content-4-允许跨平台混合组合\" class=\"anchor\" aria-label=\"Permalink: 4. 允许跨平台混合组合\" href=\"#4-允许跨平台混合组合\"\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机票、每段酒店、接驳和活动可来自不同平台。不得隐藏设置“同平台优先”，不得假设组合优惠，\n除非存在同条件、可回链的明确证据。比较必须绑定人数、房间、日期、稳定商品身份、权益、税费、\n行李、早餐、退改和币种，不能把不同商品口径混为同价。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e5. 只提供官方预订交接，不提供支付能力\u003c/h3\u003e\u003ca id=\"user-content-5-只提供官方预订交接不提供支付能力\" class=\"anchor\" aria-label=\"Permalink: 5. 只提供官方预订交接，不提供支付能力\" href=\"#5-只提供官方预订交接不提供支付能力\"\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产品文案统一为“官方预订跳转”“去官方页面”。TripChord 不下单、不支付、不用优惠券、不锁库存。\n每个组件必须先完成同平台、同条件实时重核价，再经过 URL 安全门，才生成短期 handoff。价格、条款、\n身份或库存发生实质变化时旧 handoff 立即失效，并重新进入 Verifier，必要时 Repair。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e现有 \u003ccode\u003eTravelOffer.booking_url\u003c/code\u003e 和 \u003ccode\u003eBrowserQuote.page_url\u003c/code\u003e 都不能直接暴露为跳转。必须新增独立的\n\u003ccode\u003eOfficialHandoff\u003c/code\u003e / \u003ccode\u003eOfficialDetailLocator\u003c/code\u003e / receipt 合同，逐跳校验 scheme、官方 host、path、\nquery keys、redirect 和报价绑定。拒绝短链、开放重定向、账号、登录、订单、checkout、cashier、\npayment、coupon 等路径。平台不能稳定定位商品时，退化为官方搜索页加精确参数卡片，不猜 URL。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e6. 已预订只来自用户声明，并成为强约束\u003c/h3\u003e\u003ca id=\"user-content-6-已预订只来自用户声明并成为强约束\" class=\"anchor\" aria-label=\"Permalink: 6. 已预订只来自用户声明，并成为强约束\" href=\"#6-已预订只来自用户声明并成为强约束\"\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打开官方页面不等于已预订。只有用户显式点击“我已完成预订”才能生成 append-only 的本地\nBooking Fact；不得读取平台订单来自动确认。Booking Checklist、Booking Fact、\nProtected Component Constraint 和解除保护请求必须分层建模并持久化。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCandidate Generator、Optimizer、Planner、Verifier、Repair、ReVerifier、Safety Gate 和事件重规划\n都必须消费同一组已预订约束。未解除保护时，已预订组件不得被删除、换项、改日期、改人数或静默\n重定价。事件命中已预订项时，输出冲突和用户处理选项，不自动替换。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e7. Agent 与硬代码边界\u003c/h3\u003e\u003ca id=\"user-content-7-agent-与硬代码边界\" class=\"anchor\" aria-label=\"Permalink: 7. Agent 与硬代码边界\" href=\"#7-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\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAgent 负责：需求语义、偏好权重建议、查询优先级、候选评议、风险批判、修复提案和解释；\u003c/li\u003e\n\u003cli\u003e确定性代码负责：权限、Selection Snapshot、任务白名单、并发/预算、终态、超时、金额、时间、\n稳定身份、URL、硬约束、Booking Fact、发布和最终安全否决；\u003c/li\u003e\n\u003cli\u003e不要为了“更像 Agent 项目”把金额、权限、URL 或真值校验交给 LLM；\u003c/li\u003e\n\u003cli\u003e也不要把 Agent 退化成无作用的装饰调用。模型提案必须在允许范围内真实影响查询顺序、候选评议、\nRepair 或解释，并留下 proposal、applied action 与拒绝原因；\u003c/li\u003e\n\u003cli\u003eAgent 数和模型并发继续由确定性预算控制器按 D/C/G/事件范围动态派生，不能由模型无限扩容，\n当前请求级逻辑 Agent 上限 96、模型 HTTP 并发上限 12、Chrome lease 上限 6、去哪儿住宿并发\n上限 1；若要调整，必须先有版本化 benchmark 和反例证据，不能因为模型便宜就放宽。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e五、持续实施协议\u003c/h2\u003e\u003ca id=\"user-content-五持续实施协议\" class=\"anchor\" aria-label=\"Permalink: 五、持续实施协议\" href=\"#五持续实施协议\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e1. 建立可恢复的实施账本\u003c/h3\u003e\u003ca id=\"user-content-1-建立可恢复的实施账本\" class=\"anchor\" aria-label=\"Permalink: 1. 建立可恢复的实施账本\" href=\"#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\u003cp dir=\"auto\"\u003e创建并持续更新 \u003ccode\u003edocs/productization-progress.md\u003c/code\u003e，至少记录：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e当前版本、当前阶段和最后一个完成的最小任务；\u003c/li\u003e\n\u003cli\u003e当前 Git commit/branch、既有修改与本轮修改；\u003c/li\u003e\n\u003cli\u003e已完成的领域合同、迁移、API、UI、Companion、测试和 benchmark；\u003c/li\u003e\n\u003cli\u003e精确运行过的命令、结果、失败原因和证据文件；\u003c/li\u003e\n\u003cli\u003e尚未完成项、外部阻塞、下一条可直接执行的命令；\u003c/li\u003e\n\u003cli\u003e当前可对外声明与绝对不能声明的内容。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e对路线图每条工作项和退出门使用“未开始、实现中、代码完成、已验证、外部阻塞”之一，并链接到\n对应代码、测试、运行产物和提交 SHA。“代码完成”不能自动升级成“已验证”。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e每个版本创建 \u003ccode\u003edocs/phase-reviews/product-vX.Y.md\u003c/code\u003e，结论只能是：通过、有条件通过、返工、调整计划。\n每次上下文切换前先更新实施账本；下一上下文先读账本、\u003ccode\u003egit status\u003c/code\u003e 和最近 diff 后继续。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e2. 先建立基线\u003c/h3\u003e\u003ca id=\"user-content-2-先建立基线\" class=\"anchor\" aria-label=\"Permalink: 2. 先建立基线\" href=\"#2-先建立基线\"\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在业务代码修改前：\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e检查 Git 状态和当前差异，标记既有用户修改；\u003c/li\u003e\n\u003cli\u003e检查 Python、uv、Node、npm、数据库和浏览器测试环境；\u003c/li\u003e\n\u003cli\u003e安装锁定依赖；\u003c/li\u003e\n\u003cli\u003e运行当前静态检查、完整测试、Web 构建、迁移检查、benchmark 和 Companion release gate；\u003c/li\u003e\n\u003cli\u003e将基线失败与后续引入失败分开记录；\u003c/li\u003e\n\u003cli\u003e搜索所有固定三平台、\u003ccode\u003eexactly three\u003c/code\u003e、\u003ccode\u003e3/3\u003c/code\u003e、固定 provider union、固定超时和旧 \u003ccode\u003ebooking_url\u003c/code\u003e\n的代码落点，形成迁移清单。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003e不要为了得到绿色基线删除失败测试、放宽断言、改黄金结果或关闭严格模式。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e3. 实施原则\u003c/h3\u003e\u003ca id=\"user-content-3-实施原则\" class=\"anchor\" aria-label=\"Permalink: 3. 实施原则\" href=\"#3-实施原则\"\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按 v0.2 → v0.3 → … → v1.0 顺序推进，不能先做漂亮的预订 UI 再补平台真值和终态屏障；\u003c/li\u003e\n\u003cli\u003e每次先写/更新领域合同与反例测试，再迁移实现，再接 API/UI，再跑端到端；\u003c/li\u003e\n\u003cli\u003e复用现有实现，先抽取测试缝隙，避免一次性重写 10,000 行 live system 或 2,000 行前端主页面；\u003c/li\u003e\n\u003cli\u003e数据库变更必须有前向迁移、兼容读取、失败恢复和必要的回滚验证；\u003c/li\u003e\n\u003cli\u003eAPI、事件和持久化结构必须版本化，迟到的旧 generation 结果不得污染新运行；\u003c/li\u003e\n\u003cli\u003e修复真实 planning failure 时新增冻结 benchmark 或 mutation case；\u003c/li\u003e\n\u003cli\u003e测试只证明测试覆盖范围，不能自动升级成真实平台能力；\u003c/li\u003e\n\u003cli\u003e不允许留下只在 fixture 中存在、未接入生产路径的“完成”功能；\u003c/li\u003e\n\u003cli\u003e不允许用 TODO、假数据、吞异常或自动 fallback 隐藏未完成项。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e4. 每个版本的固定检查点\u003c/h3\u003e\u003ca id=\"user-content-4-每个版本的固定检查点\" class=\"anchor\" aria-label=\"Permalink: 4. 每个版本的固定检查点\" href=\"#4-每个版本的固定检查点\"\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每完成一个版本：\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e执行该版本定向测试与全部回归；\u003c/li\u003e\n\u003cli\u003e执行 \u003ccode\u003egit diff --check\u003c/code\u003e、Ruff、Mypy、Python tests、Web build/tests、迁移和 Companion 合同；\u003c/li\u003e\n\u003cli\u003e运行对应 replay、故障注入、mutation 和浏览器 fixture E2E；\u003c/li\u003e\n\u003cli\u003e对照 \u003ccode\u003edocs/roadmap.md\u003c/code\u003e 逐项列出计划、实际、偏差、证据和未验证边界；\u003c/li\u003e\n\u003cli\u003e更新 README、architecture、providers、operations、claim ledger 和 phase review；\u003c/li\u003e\n\u003cli\u003e只在退出门真的满足时标记该版本通过；\u003c/li\u003e\n\u003cli\u003e创建范围清晰的本地阶段提交，然后立即进入下一版本，不等待用户例行确认。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003e可使用子 Agent 并行完成只读审查、后端/前端/Companion 独立测试、政策调查和红队，但共享文件写入\n由主控串行整合或放在隔离 worktree。主控必须亲自审查 diff 并重跑证据门，不能因子 Agent 声称完成\n就勾选退出门。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e若测试失败，先定位根因并修复；不得仅报告失败就停止。若遇到外部阻塞，先完成其余全部可执行项，\n为阻塞点准备一条可重复的恢复命令和预期证据，再向用户请求最小权限或动作。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e六、分版本实施与退出门\u003c/h2\u003e\u003ca id=\"user-content-六分版本实施与退出门\" class=\"anchor\" aria-label=\"Permalink: 六、分版本实施与退出门\" href=\"#六分版本实施与退出门\"\u003e\u003csvg data-component=\"Octicon\" class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ev0.2：动态平台内核\u003c/h3\u003e\u003ca id=\"user-content-v02动态平台内核\" class=\"anchor\" aria-label=\"Permalink: v0.2：动态平台内核\" href=\"#v02动态平台内核\"\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必须完成：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e新增稳定的 \u003ccode\u003eProviderScopeKey(provider, vertical)\u003c/code\u003e、\u003ccode\u003eProviderCapability\u003c/code\u003e、用户选择、Eligibility 与\n不可变 Selection Snapshot（含 capability version、adapter version、SHA、排除原因）；\u003c/li\u003e\n\u003cli\u003e先形成内部统一的 \u003ccode\u003eProviderAdapter\u003c/code\u003e 接口和版本化 capability profile，再用 Registry 替代后端、\n前端、Companion、Query Planner、live system 与 Done-Gate 中固定\n三平台集合；保留显式旧 profile 兼容，不静默篡改历史证据；\u003c/li\u003e\n\u003cli\u003eCompanion 使用逐 scope 可选 host permission，心跳报告实际授权 scopes、adapter/contract version\n和 runtime instance，不再要求三平台全部在线；\u003c/li\u003e\n\u003cli\u003eAPI 与 UI 提供 \u003ccode\u003e平台 × 垂类\u003c/code\u003e 能力矩阵，默认全选合格单元格，用户可逐项关闭；\u003c/li\u003e\n\u003cli\u003e每个必需垂类至少保留一个合格来源，为 0 时在任何模型/浏览器调用前拒绝启动；\u003c/li\u003e\n\u003cli\u003e拆分必要的 Provider Policy、Source Runtime、Barrier、Planning Pipeline 和前端页面边界。\u003c/li\u003e\n\u003cli\u003e从 v0.2 起，每次修改 Companion 后立即运行其定向合同和 release gate；v0.9 负责把同一门正式\n接入远端 CI，而不是此前都不验证。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e退出门：0、1、2、3、4 平台回放都能构建正确 DAG；关闭/未授权 scope 的浏览器任务、模型工具调用\n和网络访问均为 0；伪造 provider/snapshot hash 原子拒绝；旧三平台场景兼容测试不回退。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ev0.3：全来源终态屏障与诚实发布\u003c/h3\u003e\u003ca id=\"user-content-v03全来源终态屏障与诚实发布\" class=\"anchor\" aria-label=\"Permalink: v0.3：全来源终态屏障与诚实发布\" href=\"#v03全来源终态屏障与诚实发布\"\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必须完成：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e统一跨垂类 Source 终态；\u003c/li\u003e\n\u003cli\u003e实现持久化 SearchRun、SourceAttempt、TerminalReceipt 和 Completion Barrier；\u003c/li\u003e\n\u003cli\u003e调度器新增原生 \u003ccode\u003eALL_TERMINAL\u003c/code\u003e 依赖与独立 settle node，Normalizer 依赖 settle，Planner 再依赖\nNormalizer，禁止靠 \u003ccode\u003esuccess=true\u003c/code\u003e 伪装失败来源；\u003c/li\u003e\n\u003cli\u003e新增 \u003ccode\u003eScopeCancellationTombstone\u003c/code\u003e 与 generation；普通重试、publication refresh、failover、延迟\n唤醒和 event replan 都必须检查，迟到结果不得进入 Planner；\u003c/li\u003e\n\u003cli\u003edeadline/总预算由确定性 timeout profile、波次和所选矩阵派生；到期主动物化 \u003ccode\u003etimed_out\u003c/code\u003e；\u003c/li\u003e\n\u003cli\u003eSSE 在屏障前只发送进度/终态，屏障后才一次性给最终结果；\u003c/li\u003e\n\u003cli\u003e持久化恢复、取消、幂等和重启语义明确。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e退出门：Planner 首次调用时间严格晚于最后一个已选 Source 的 \u003ccode\u003eterminal_at\u003c/code\u003e；无 queued/running/unknown\n仍可发布的路径；取消后新增任务为 0；单来源如实披露；零报价无预算和方案；无无限等待。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ev0.4：跨平台最终方案与覆盖解释\u003c/h3\u003e\u003ca id=\"user-content-v04跨平台最终方案与覆盖解释\" class=\"anchor\" aria-label=\"Permalink: v0.4：跨平台最终方案与覆盖解释\" href=\"#v04跨平台最终方案与覆盖解释\"\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必须完成：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003ePlanner 可为机票、每段酒店、接驳和活动独立选择 provider，并保留 package/component provenance；\u003c/li\u003e\n\u003cli\u003e建立稳定商品/权益比较身份和完整金额口径；\u003c/li\u003e\n\u003cli\u003eVerifier 校验分开交易、衔接、行李直挂、退改、税费、币种和不可同时满足的条件；\u003c/li\u003e\n\u003cli\u003e方案 UI 优先展示有证据的省钱、稳妥和少折腾取舍；证据不足时不凑满三个方案；\u003c/li\u003e\n\u003cli\u003e展示每组件平台、报价时间、到期时间、可比条件、跳转次数、覆盖来源和失败终态；\u003c/li\u003e\n\u003cli\u003e把 Source settlement、exact quote coverage 和 comparable component coverage 分开统计。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e退出门：固定回放能生成 A 平台机票 + B 平台酒店；返回顺序不影响确定性结果；金额/权益属性测试\n无错配；Agent 不能绕过 Hard Verifier；Repair 后独立 ReVerifier 重新计算。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ev0.5：官方预订跳转与逐组件清单\u003c/h3\u003e\u003ca id=\"user-content-v05官方预订跳转与逐组件清单\" class=\"anchor\" aria-label=\"Permalink: v0.5：官方预订跳转与逐组件清单\" href=\"#v05官方预订跳转与逐组件清单\"\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必须完成：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e新增 \u003ccode\u003eOfficialHandoff\u003c/code\u003e、\u003ccode\u003eOfficialDetailLocator\u003c/code\u003e、短期/单次 receipt、URL Policy 和失效机制；\u003c/li\u003e\n\u003cli\u003e每个平台声明详情页、预填搜索页或仅参数卡片能力；\u003c/li\u003e\n\u003cli\u003e组件级重核价只查询同 provider × component，不默认重跑整趟行程；\u003c/li\u003e\n\u003cli\u003e用户动作分两步：“重核价并查看差异”与“去官方页面”，后台不能自动打开/聚焦；\u003c/li\u003e\n\u003cli\u003e价格、权益、身份、日期、人数/房间或库存变化时撤销旧 handoff，重新验证/Repair；\u003c/li\u003e\n\u003cli\u003e逐跳拒绝非官方域名、短链、开放重定向、登录、订单、checkout、payment、coupon 和未知路径；\u003c/li\u003e\n\u003cli\u003e构建逐组件清单和建议操作顺序，但此阶段点击绝不能产生 booked 状态。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e退出门：每个 handoff 可回链同一 plan version/component/offer/query/revalidation receipt；所有危险\nURL mutation 零错误放行；旧/过期 receipt 不可用；没有稳定 deep-link 时安全降级；自动化测试绝不\n提交订单或支付。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ev0.6：已预订保护与事件闭环\u003c/h3\u003e\u003ca id=\"user-content-v06已预订保护与事件闭环\" class=\"anchor\" aria-label=\"Permalink: v0.6：已预订保护与事件闭环\" href=\"#v06已预订保护与事件闭环\"\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必须完成：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e持久化 Booking Checklist、Booking Item、User Booking Acknowledgement、append-only Booking Fact、\nProtected Constraint 和 Constraint Override Request；\u003c/li\u003e\n\u003cli\u003e只有明确用户动作能创建/撤销 Booking Fact；打开链接、Agent 输出和平台页面文字都不能；\u003c/li\u003e\n\u003cli\u003eprotected invariant 贯穿候选生成、优化、Planner、Verifier、Repair、ReVerifier、Safety Gate、\nlocal/global/event replan；\u003c/li\u003e\n\u003cli\u003e实现手动事件、用户开启的监控、预订前重核价变化和公共事件；\u003c/li\u003e\n\u003cli\u003eImpact Analyzer 先确定受影响集合，只重查必要 scope；\u003c/li\u003e\n\u003cli\u003e已预订项受影响时进入用户处理状态，未明确解除前不自动替换；\u003c/li\u003e\n\u003cli\u003e输出旧/新版本 diff、保留项、变化原因、证据和预算。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e退出门：属性/故障测试中未解除保护的已预订组件修改率为 0；局部修复保留无关组件；全局重规划仍\n继承保护；解除保护必须显式确认并留痕；实时变化只能来自新工具回执，不能来自 RAG/旧缓存。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ev0.7：Provider SDK 与认证门\u003c/h3\u003e\u003ca id=\"user-content-v07provider-sdk-与认证门\" class=\"anchor\" aria-label=\"Permalink: v0.7：Provider SDK 与认证门\" href=\"#v07provider-sdk-与认证门\"\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必须完成：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e把 v0.2 已接入生产路径的内部 ProviderAdapter 接口提炼成公开 SDK，并提供 capability profile\nschema、fixture 模板和 conformance test kit；v0.7 不是第一次发明 adapter 抽象；\u003c/li\u003e\n\u003cli\u003e实现开发、影子、测试、合格、冷却、停用状态机；只有 \u003ccode\u003ecertified_active\u003c/code\u003e 可默认全选；\u003c/li\u003e\n\u003cli\u003e认证按 \u003ccode\u003eprovider × vertical\u003c/code\u003e 独立进行，机票成功不能证明酒店；\u003c/li\u003e\n\u003cli\u003eselector/URL/permission/profile 变更都产生新版本和 SHA；\u003c/li\u003e\n\u003cli\u003e影子 adapter 不进入 Planner、覆盖分母或默认选择；\u003c/li\u003e\n\u003cli\u003e对智行、同程酒店或其他候选先做 fixture/影子能力，只有获得当前会话真实只读授权并通过 canary、\nURL 安全和报价绑定门后才能升级为合格；不能为了凑数量绕过平台边界。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e退出门：新增 provider 只需 adapter + profile，不改核心 Planner/Barrier 枚举；可按垂类一键冷却；\n历史 run 保留旧 profile；未认证来源访问数和报价贡献为 0。若缺真实授权，完成全部 SDK/影子工程并\n把该来源保持非活跃，继续后续版本，不得把外部阻塞冒充代码未完成或认证成功。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ev0.8：本地优先的完整产品体验\u003c/h3\u003e\u003ca id=\"user-content-v08本地优先的完整产品体验\" class=\"anchor\" aria-label=\"Permalink: v0.8：本地优先的完整产品体验\" href=\"#v08本地优先的完整产品体验\"\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必须完成：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e本地启动器/安装器统一管理 API、Web、数据库迁移和 Bridge；\u003c/li\u003e\n\u003cli\u003eLLM Key 使用系统安全存储或等价安全方案，不进入仓库、前端持久化、旅行数据库、模型上下文和日志；\u003c/li\u003e\n\u003cli\u003e首次设置向导覆盖本地服务、模型 smoke、Companion 配对、逐平台权限与登录健康；\u003c/li\u003e\n\u003cli\u003e首页改为旅行工作流，拆分平台设置、搜索进度、方案比较、预订清单、事件中心和证据详情；\u003c/li\u003e\n\u003cli\u003e默认折叠 Agent DAG、token 和内部回执，普通用户优先看到发生了什么、为什么、下一步；\u003c/li\u003e\n\u003cli\u003e任务/清单跨刷新和重启恢复；提供数据导出、删除、日志脱敏和默认关闭的匿名遥测；\u003c/li\u003e\n\u003cli\u003e完成键盘、屏幕阅读器、非颜色状态、可读字号和 WCAG 2.2 AA 审查；\u003c/li\u003e\n\u003cli\u003e为签名扩展/安装包准备可复现产物，但发布到商店或公网必须另行获得用户授权。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e退出门：全新机器按公开说明可完成 replay；真实模式逐项展示权限；秘密不进入日志/遥测；升级、迁移、\n备份和失败回滚有测试；Chrome 安装需要用户确认，但开发者重载不成为公众日常待办。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ev0.9：公开测试版可靠性与评测\u003c/h3\u003e\u003ca id=\"user-content-v09公开测试版可靠性与评测\" class=\"anchor\" aria-label=\"Permalink: v0.9：公开测试版可靠性与评测\" href=\"#v09公开测试版可靠性与评测\"\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必须完成：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e把 Companion JS 合同、Python control tests、build-meta/release seal 和 host permissions 加入远端 CI；\u003c/li\u003e\n\u003cli\u003e增加动态选择矩阵、ALL_TERMINAL、慢源、取消竞态、迟到结果、URL/offer binding、Prompt Injection、\n崩溃恢复、幂等和 booked invariant 的冻结 benchmark/mutation suite；\u003c/li\u003e\n\u003cli\u003e使用干净 Chrome + 本地 fixture 做浏览器 E2E，普通 CI 不依赖真实账号；\u003c/li\u003e\n\u003cli\u003ejob/monitor/清单迁入可恢复存储，验证重启和多租户隔离；\u003c/li\u003e\n\u003cli\u003e增加 secret scan、CodeQL/SAST、SBOM、依赖审计、构建 provenance 和固定第三方 Actions 版本；\u003c/li\u003e\n\u003cli\u003e提供本地可观测面板，分开记录终态、报价覆盖、Barrier 延迟、模型成本、Repair 和 handoff；\u003c/li\u003e\n\u003cli\u003e真实 OTA canary 只能在获得用户授权的发布门运行，证据脱敏并绑定 commit/profile/runtime/query SHA。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e退出门：Python、Web、Companion、迁移、benchmark、浏览器 E2E、安全和可复现构建全部进入 CI；\n未授权访问、提前发布、危险链接、错误 booked 和已预订静默变化均为 0；性能门基于冻结真实基线，\n不用拍脑袋数字。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ev1.0：最终产品与 Done-Gate\u003c/h3\u003e\u003ca id=\"user-content-v10最终产品与-done-gate\" class=\"anchor\" aria-label=\"Permalink: v1.0：最终产品与 Done-Gate\" href=\"#v10最终产品与-done-gate\"\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\u003escripts/run_product_done_gate.py\u003c/code\u003e，原子输出脱敏的\n\u003ccode\u003ebenchmarks/results/product-v1-done-gate.json\u003c/code\u003e。证据包至少记录 commit、capability/profile/adapter/\nCompanion 版本、模型模式、选择快照、每个 Source 终态、Barrier 时间、报价覆盖、最终裁决、handoff、\nbooked invariant、所有子门和证据引用。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e最终门至少分层验证：\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003efresh clone/锁文件/迁移/wheel/Web/容器/安装器可复现；\u003c/li\u003e\n\u003cli\u003ereplay 模式完整走通动态选择 → 全终态 → 跨平台方案 → handoff → 用户确认 → 带保护重规划；\u003c/li\u003e\n\u003cli\u003e干净 Chrome + 本地恶意 fixture 验证权限、配对、后台、URL 和 Prompt Injection；\u003c/li\u003e\n\u003cli\u003eOpenAI-compatible 模型在有环境变量授权时完成 required-model smoke 和结构化 Agent 链；\u003c/li\u003e\n\u003cli\u003e每个对外宣称合格的真实 \u003ccode\u003eprovider × vertical\u003c/code\u003e 都有未过期、已授权的只读 canary；\u003c/li\u003e\n\u003cli\u003e全平台真实 E2E 只在所有外部条件已满足时运行；未满足则准确指出哪个外部门未过，不能伪造。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003eDone-Gate 只有在所有\u003cstrong\u003e适用于当前发布声明\u003c/strong\u003e的门通过时，才允许 \u003ccode\u003epassed=true\u003c/code\u003e 且进程退出 0。\nHTTP job 成功、测试成功、模型调用成功或所有 Source 终态都不能单独触发通过。某个真实平台认证失败时，\n可以从 \u003ccode\u003eavailable/default-selected\u003c/code\u003e 中移除后发布核心产品，但 claim ledger 必须明确不再宣称该能力。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e七、最低验证命令\u003c/h2\u003e\u003ca id=\"user-content-七最低验证命令\" class=\"anchor\" aria-label=\"Permalink: 七、最低验证命令\" href=\"#七最低验证命令\"\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根据仓库当前实际脚本调整，但不得少于以下范围：\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git status --short\ngit diff --check\n\nuv sync --locked --all-groups\nuv run ruff check .\nuv run mypy apps/api/src\nuv run pytest\n\nnpm ci\nnpm run build\nnpm test\nnpm audit --omit=dev --audit-level=high\n\nuv run python scripts/browser_companion_release_gate.py\n\nuv run python -m training.train_sft --validate-only\nuv run python -m training.train_dpo --validate-only\nuv run python -m training.policy_reranker\n\nuv run python benchmarks/evaluate.py\nuv run python benchmarks/evaluate_planning.py\nuv run python benchmarks/evaluate_repair.py\nuv run python benchmarks/evaluate_events.py\n\ndocker compose config\ndocker compose build\"\u003e\u003cpre\u003egit status --short\ngit diff --check\n\nuv sync --locked --all-groups\nuv run ruff check \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e\nuv run mypy apps/api/src\nuv run pytest\n\nnpm ci\nnpm run build\nnpm \u003cspan class=\"pl-c1\"\u003etest\u003c/span\u003e\nnpm audit --omit=dev --audit-level=high\n\nuv run python scripts/browser_companion_release_gate.py\n\nuv run python -m training.train_sft --validate-only\nuv run python -m training.train_dpo --validate-only\nuv run python -m training.policy_reranker\n\nuv run python benchmarks/evaluate.py\nuv run python benchmarks/evaluate_planning.py\nuv run python benchmarks/evaluate_repair.py\nuv run python benchmarks/evaluate_events.py\n\ndocker compose config\ndocker compose build\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e数据库迁移必须使用临时数据库验证 \u003ccode\u003eupgrade head\u003c/code\u003e、\u003ccode\u003ealembic check\u003c/code\u003e 和必要的兼容/回滚路径。\nCompanion 源码变化后，只能在确认 diff 合理时显式运行 release gate 的 build-meta 更新模式，再重新执行\n只读 gate；同时按合同更新扩展版本。不得手工编辑 build-meta 或 release seal，也不能为了过 gate\n随意刷新封板。新增产品门、浏览器 E2E 和安全 benchmark 后，把它们加入本清单与 CI。\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"uv run python scripts/browser_companion_release_gate.py --update-build-meta\nuv run python scripts/browser_companion_release_gate.py\"\u003e\u003cpre\u003euv run python scripts/browser_companion_release_gate.py --update-build-meta\nuv run python scripts/browser_companion_release_gate.py\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e最终全门还要运行与 CI 等价的 Python/npm 依赖审计、secret scan、SBOM 与构建来源校验；不得把发现的\n高危问题静默加入 allowlist。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e最终至少保留五个反表面端到端验收：动态 0/1/2/4 provider；慢源或迟到结果绝不提前触发 Planner；\n用户关闭 scope 后浏览器任务、模型工具调用和网络访问全为 0；开放重定向/支付路径 handoff 全拒绝；\n任意事件序列下未解除保护的 booked component 修改率为 0。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e八、绝对禁止的伪完成方式\u003c/h2\u003e\u003ca id=\"user-content-八绝对禁止的伪完成方式\" class=\"anchor\" aria-label=\"Permalink: 八、绝对禁止的伪完成方式\" href=\"#八绝对禁止的伪完成方式\"\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只更新 README、路线图、接口类型或静态页面，没有把真实生产路径接通；\u003c/li\u003e\n\u003cli\u003e新增一套旁路 demo，旧 live pipeline 仍固定三平台；\u003c/li\u003e\n\u003cli\u003e用更多 Agent、更多提示词或更多模型调用代替权限、金额、终态、URL、Booking Fact 等硬合同；\u003c/li\u003e\n\u003cli\u003e让 Agent 自动恢复用户关闭的平台、登录、验证码或 host permissions；\u003c/li\u003e\n\u003cli\u003e把 pending、empty、login、timeout、DOM drift 变成报价或第二平台覆盖；\u003c/li\u003e\n\u003cli\u003e在全部已选来源终态前展示部分方案；\u003c/li\u003e\n\u003cli\u003e把 \u003ccode\u003epage_url\u003c/code\u003e、模型生成 URL 或 HTTP 200 当成安全官方详情页；\u003c/li\u003e\n\u003cli\u003e点击链接后自动标记 booked，或在重规划中静默替换已预订组件；\u003c/li\u003e\n\u003cli\u003e从 RAG、缓存或旧截图恢复“当前实时价格”；\u003c/li\u003e\n\u003cli\u003e更新 golden/benchmark 只为让失败消失，不解释行为变化；\u003c/li\u003e\n\u003cli\u003e通过删除测试、放宽 Hard Verifier、关闭 required-model 或降级严格模式来变绿；\u003c/li\u003e\n\u003cli\u003e把本地 fixture、单平台 canary、Source 完成或模型成功写成全平台真实业务通过；\u003c/li\u003e\n\u003cli\u003e在没有用户明确授权时 push、发布、访问真实平台或使用付费服务。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e九、只允许因这些事项暂停并请求用户\u003c/h2\u003e\u003ca id=\"user-content-九只允许因这些事项暂停并请求用户\" class=\"anchor\" aria-label=\"Permalink: 九、只允许因这些事项暂停并请求用户\" href=\"#九只允许因这些事项暂停并请求用户\"\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仅当剩余工作真的依赖以下条件且所有其他本地工作已完成时，才可暂停：\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003e用户需要亲自授予或扩大某个平台域名权限；\u003c/li\u003e\n\u003cli\u003e用户需要亲自登录、处理验证码或恢复平台账号状态；\u003c/li\u003e\n\u003cli\u003e需要真实 OTA、付费 LLM、签名证书、Chrome Web Store、affiliate/partner 资格；\u003c/li\u003e\n\u003cli\u003e需要公开 push/release、不可逆数据迁移或删除用户数据；\u003c/li\u003e\n\u003cli\u003e外部平台政策存在无法由代码或公开资料消除的实质性产品取舍。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp dir=\"auto\"\u003e暂停时不要泛泛说“需要你操作”。必须给出：已完成内容、精确阻塞门、为何不能替代、最小用户动作、\n完成后将执行的命令、预期成功证据。一次只问一个问题。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e十、最终交付报告\u003c/h2\u003e\u003ca id=\"user-content-十最终交付报告\" class=\"anchor\" aria-label=\"Permalink: 十、最终交付报告\" href=\"#十最终交付报告\"\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持续工作直到最终 Done-Gate 真实通过，或只剩上述用户专属外部阻塞。最终报告必须先给一句话结论，\n然后提供：\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003ev0.2 至 v1.0 每个版本的状态和证据文件；\u003c/li\u003e\n\u003cli\u003e用户实际能完成的完整流程；\u003c/li\u003e\n\u003cli\u003eAgent 真正做了哪些决策，哪些仍由确定性代码裁决；\u003c/li\u003e\n\u003cli\u003ePython/Web/Companion/迁移/benchmark/安全/安装器的精确验证结果；\u003c/li\u003e\n\u003cli\u003ereplay、fixture、模型、单平台真实 canary 和全平台真实 E2E 分层结论；\u003c/li\u003e\n\u003cli\u003e当前支持和默认选择的 \u003ccode\u003eprovider × vertical\u003c/code\u003e；\u003c/li\u003e\n\u003cli\u003e当前仍不能声称的能力；\u003c/li\u003e\n\u003cli\u003eGit 状态、本地提交和所有未公开外部动作；\u003c/li\u003e\n\u003cli\u003e若仍有外部阻塞，只列用户必须处理的最小动作，不能把普通工程问题推给用户。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e现在开始：先进入仓库，阅读全部合同，检查并保护现有修改，建立基线和\n\u003ccode\u003edocs/productization-progress.md\u003c/code\u003e，然后直接实施 v0.2。不要只回复计划。\u003c/p\u003e\n\u003c/article\u003e","richTextTruncated":false,"renderedFileInfo":null,"symbols":{"timed_out":false,"not_analyzed":false,"symbols":[{"name":"Claude Code：TripChord v0.2 → v1.0 自治实施总提示词","fully_qualified_name":"Claude Code：TripChord v0.2 → v1.0 自治实施总提示词","kind":"section_1","ident_start":2,"ident_end":64,"extent_start":0,"extent_end":29907,"ident_utf16":{"start":{"line_number":0,"utf16_col":2},"end":{"line_number":0,"utf16_col":44}},"extent_utf16":{"start":{"line_number":0,"utf16_col":0},"end":{"line_number":466,"utf16_col":0}}},{"name":"一、开始前必须完整阅读","fully_qualified_name":"一、开始前必须完整阅读","kind":"section_2","ident_start":950,"ident_end":983,"extent_start":947,"extent_end":1744,"ident_utf16":{"start":{"line_number":14,"utf16_col":3},"end":{"line_number":14,"utf16_col":14}},"extent_utf16":{"start":{"line_number":14,"utf16_col":0},"end":{"line_number":35,"utf16_col":0}}},{"name":"二、当前已知状态与声明边界","fully_qualified_name":"二、当前已知状态与声明边界","kind":"section_2","ident_start":1747,"ident_end":1786,"extent_start":1744,"extent_end":3887,"ident_utf16":{"start":{"line_number":35,"utf16_col":3},"end":{"line_number":35,"utf16_col":16}},"extent_utf16":{"start":{"line_number":35,"utf16_col":0},"end":{"line_number":57,"utf16_col":0}}},{"name":"三、你已获得和没有获得的权限","fully_qualified_name":"三、你已获得和没有获得的权限","kind":"section_2","ident_start":3890,"ident_end":3932,"extent_start":3887,"extent_end":5453,"ident_utf16":{"start":{"line_number":57,"utf16_col":3},"end":{"line_number":57,"utf16_col":17}},"extent_utf16":{"start":{"line_number":57,"utf16_col":0},"end":{"line_number":80,"utf16_col":0}}},{"name":"四、不可改变的产品合同","fully_qualified_name":"四、不可改变的产品合同","kind":"section_2","ident_start":5456,"ident_end":5489,"extent_start":5453,"extent_end":10579,"ident_utf16":{"start":{"line_number":80,"utf16_col":3},"end":{"line_number":80,"utf16_col":14}},"extent_utf16":{"start":{"line_number":80,"utf16_col":0},"end":{"line_number":150,"utf16_col":0}}},{"name":"1. 本地优先","fully_qualified_name":"1. 本地优先","kind":"section_3","ident_start":5495,"ident_end":5510,"extent_start":5491,"extent_end":5974,"ident_utf16":{"start":{"line_number":82,"utf16_col":4},"end":{"line_number":82,"utf16_col":11}},"extent_utf16":{"start":{"line_number":82,"utf16_col":0},"end":{"line_number":89,"utf16_col":0}}},{"name":"2. 默认查询全部“当前合格”的平台，而不是全部已知平台","fully_qualified_name":"2. 默认查询全部“当前合格”的平台，而不是全部已知平台","kind":"section_3","ident_start":5978,"ident_end":6056,"extent_start":5974,"extent_end":6888,"ident_utf16":{"start":{"line_number":89,"utf16_col":4},"end":{"line_number":89,"utf16_col":32}},"extent_utf16":{"start":{"line_number":89,"utf16_col":0},"end":{"line_number":102,"utf16_col":0}}},{"name":"3. 等全部已选来源终态后再规划","fully_qualified_name":"3. 等全部已选来源终态后再规划","kind":"section_3","ident_start":6892,"ident_end":6934,"extent_start":6888,"extent_end":7539,"ident_utf16":{"start":{"line_number":102,"utf16_col":4},"end":{"line_number":102,"utf16_col":20}},"extent_utf16":{"start":{"line_number":102,"utf16_col":0},"end":{"line_number":111,"utf16_col":0}}},{"name":"4. 允许跨平台混合组合","fully_qualified_name":"4. 允许跨平台混合组合","kind":"section_3","ident_start":7543,"ident_end":7573,"extent_start":7539,"extent_end":7924,"ident_utf16":{"start":{"line_number":111,"utf16_col":4},"end":{"line_number":111,"utf16_col":16}},"extent_utf16":{"start":{"line_number":111,"utf16_col":0},"end":{"line_number":117,"utf16_col":0}}},{"name":"5. 只提供官方预订交接，不提供支付能力","fully_qualified_name":"5. 只提供官方预订交接，不提供支付能力","kind":"section_3","ident_start":7928,"ident_end":7982,"extent_start":7924,"extent_end":8842,"ident_utf16":{"start":{"line_number":117,"utf16_col":4},"end":{"line_number":117,"utf16_col":24}},"extent_utf16":{"start":{"line_number":117,"utf16_col":0},"end":{"line_number":128,"utf16_col":0}}},{"name":"6. 已预订只来自用户声明，并成为强约束","fully_qualified_name":"6. 已预订只来自用户声明，并成为强约束","kind":"section_3","ident_start":8846,"ident_end":8900,"extent_start":8842,"extent_end":9546,"ident_utf16":{"start":{"line_number":128,"utf16_col":4},"end":{"line_number":128,"utf16_col":24}},"extent_utf16":{"start":{"line_number":128,"utf16_col":0},"end":{"line_number":138,"utf16_col":0}}},{"name":"7. Agent 与硬代码边界","fully_qualified_name":"7. Agent 与硬代码边界","kind":"section_3","ident_start":9550,"ident_end":9577,"extent_start":9546,"extent_end":10579,"ident_utf16":{"start":{"line_number":138,"utf16_col":4},"end":{"line_number":138,"utf16_col":19}},"extent_utf16":{"start":{"line_number":138,"utf16_col":0},"end":{"line_number":150,"utf16_col":0}}},{"name":"五、持续实施协议","fully_qualified_name":"五、持续实施协议","kind":"section_2","ident_start":10582,"ident_end":10606,"extent_start":10579,"extent_end":14375,"ident_utf16":{"start":{"line_number":150,"utf16_col":3},"end":{"line_number":150,"utf16_col":11}},"extent_utf16":{"start":{"line_number":150,"utf16_col":0},"end":{"line_number":214,"utf16_col":0}}},{"name":"1. 建立可恢复的实施账本","fully_qualified_name":"1. 建立可恢复的实施账本","kind":"section_3","ident_start":10612,"ident_end":10645,"extent_start":10608,"extent_end":11629,"ident_utf16":{"start":{"line_number":152,"utf16_col":4},"end":{"line_number":152,"utf16_col":17}},"extent_utf16":{"start":{"line_number":152,"utf16_col":0},"end":{"line_number":169,"utf16_col":0}}},{"name":"2. 先建立基线","fully_qualified_name":"2. 先建立基线","kind":"section_3","ident_start":11633,"ident_end":11651,"extent_start":11629,"extent_end":12282,"ident_utf16":{"start":{"line_number":169,"utf16_col":4},"end":{"line_number":169,"utf16_col":12}},"extent_utf16":{"start":{"line_number":169,"utf16_col":0},"end":{"line_number":183,"utf16_col":0}}},{"name":"3. 实施原则","fully_qualified_name":"3. 实施原则","kind":"section_3","ident_start":12286,"ident_end":12301,"extent_start":12282,"extent_end":13187,"ident_utf16":{"start":{"line_number":183,"utf16_col":4},"end":{"line_number":183,"utf16_col":11}},"extent_utf16":{"start":{"line_number":183,"utf16_col":0},"end":{"line_number":195,"utf16_col":0}}},{"name":"4. 每个版本的固定检查点","fully_qualified_name":"4. 每个版本的固定检查点","kind":"section_3","ident_start":13191,"ident_end":13224,"extent_start":13187,"extent_end":14375,"ident_utf16":{"start":{"line_number":195,"utf16_col":4},"end":{"line_number":195,"utf16_col":17}},"extent_utf16":{"start":{"line_number":195,"utf16_col":0},"end":{"line_number":214,"utf16_col":0}}},{"name":"六、分版本实施与退出门","fully_qualified_name":"六、分版本实施与退出门","kind":"section_2","ident_start":14378,"ident_end":14411,"extent_start":14375,"extent_end":25104,"ident_utf16":{"start":{"line_number":214,"utf16_col":3},"end":{"line_number":214,"utf16_col":14}},"extent_utf16":{"start":{"line_number":214,"utf16_col":0},"end":{"line_number":370,"utf16_col":0}}},{"name":"v0.2：动态平台内核","fully_qualified_name":"v0.2：动态平台内核","kind":"section_3","ident_start":14417,"ident_end":14442,"extent_start":14413,"extent_end":15868,"ident_utf16":{"start":{"line_number":216,"utf16_col":4},"end":{"line_number":216,"utf16_col":15}},"extent_utf16":{"start":{"line_number":216,"utf16_col":0},"end":{"line_number":236,"utf16_col":0}}},{"name":"v0.3：全来源终态屏障与诚实发布","fully_qualified_name":"v0.3：全来源终态屏障与诚实发布","kind":"section_3","ident_start":15872,"ident_end":15915,"extent_start":15868,"extent_end":16931,"ident_utf16":{"start":{"line_number":236,"utf16_col":4},"end":{"line_number":236,"utf16_col":21}},"extent_utf16":{"start":{"line_number":236,"utf16_col":0},"end":{"line_number":253,"utf16_col":0}}},{"name":"v0.4：跨平台最终方案与覆盖解释","fully_qualified_name":"v0.4：跨平台最终方案与覆盖解释","kind":"section_3","ident_start":16935,"ident_end":16978,"extent_start":16931,"extent_end":17848,"ident_utf16":{"start":{"line_number":253,"utf16_col":4},"end":{"line_number":253,"utf16_col":21}},"extent_utf16":{"start":{"line_number":253,"utf16_col":0},"end":{"line_number":267,"utf16_col":0}}},{"name":"v0.5：官方预订跳转与逐组件清单","fully_qualified_name":"v0.5：官方预订跳转与逐组件清单","kind":"section_3","ident_start":17852,"ident_end":17895,"extent_start":17848,"extent_end":18904,"ident_utf16":{"start":{"line_number":267,"utf16_col":4},"end":{"line_number":267,"utf16_col":21}},"extent_utf16":{"start":{"line_number":267,"utf16_col":0},"end":{"line_number":283,"utf16_col":0}}},{"name":"v0.6：已预订保护与事件闭环","fully_qualified_name":"v0.6：已预订保护与事件闭环","kind":"section_3","ident_start":18908,"ident_end":18945,"extent_start":18904,"extent_end":19980,"ident_utf16":{"start":{"line_number":283,"utf16_col":4},"end":{"line_number":283,"utf16_col":19}},"extent_utf16":{"start":{"line_number":283,"utf16_col":0},"end":{"line_number":300,"utf16_col":0}}},{"name":"v0.7：Provider SDK 与认证门","fully_qualified_name":"v0.7：Provider SDK 与认证门","kind":"section_3","ident_start":19984,"ident_end":20016,"extent_start":19980,"extent_end":21184,"ident_utf16":{"start":{"line_number":300,"utf16_col":4},"end":{"line_number":300,"utf16_col":26}},"extent_utf16":{"start":{"line_number":300,"utf16_col":0},"end":{"line_number":317,"utf16_col":0}}},{"name":"v0.8：本地优先的完整产品体验","fully_qualified_name":"v0.8：本地优先的完整产品体验","kind":"section_3","ident_start":21188,"ident_end":21228,"extent_start":21184,"extent_end":22404,"ident_utf16":{"start":{"line_number":317,"utf16_col":4},"end":{"line_number":317,"utf16_col":20}},"extent_utf16":{"start":{"line_number":317,"utf16_col":0},"end":{"line_number":333,"utf16_col":0}}},{"name":"v0.9：公开测试版可靠性与评测","fully_qualified_name":"v0.9：公开测试版可靠性与评测","kind":"section_3","ident_start":22408,"ident_end":22448,"extent_start":22404,"extent_end":23600,"ident_utf16":{"start":{"line_number":333,"utf16_col":4},"end":{"line_number":333,"utf16_col":20}},"extent_utf16":{"start":{"line_number":333,"utf16_col":0},"end":{"line_number":350,"utf16_col":0}}},{"name":"v1.0：最终产品与 Done-Gate","fully_qualified_name":"v1.0：最终产品与 Done-Gate","kind":"section_3","ident_start":23604,"ident_end":23636,"extent_start":23600,"extent_end":25104,"ident_utf16":{"start":{"line_number":350,"utf16_col":4},"end":{"line_number":350,"utf16_col":24}},"extent_utf16":{"start":{"line_number":350,"utf16_col":0},"end":{"line_number":370,"utf16_col":0}}},{"name":"七、最低验证命令","fully_qualified_name":"七、最低验证命令","kind":"section_2","ident_start":25107,"ident_end":25131,"extent_start":25104,"extent_end":26969,"ident_utf16":{"start":{"line_number":370,"utf16_col":3},"end":{"line_number":370,"utf16_col":11}},"extent_utf16":{"start":{"line_number":370,"utf16_col":0},"end":{"line_number":420,"utf16_col":0}}},{"name":"八、绝对禁止的伪完成方式","fully_qualified_name":"八、绝对禁止的伪完成方式","kind":"section_2","ident_start":26972,"ident_end":27008,"extent_start":26969,"extent_end":28143,"ident_utf16":{"start":{"line_number":420,"utf16_col":3},"end":{"line_number":420,"utf16_col":15}},"extent_utf16":{"start":{"line_number":420,"utf16_col":0},"end":{"line_number":436,"utf16_col":0}}},{"name":"九、只允许因这些事项暂停并请求用户","fully_qualified_name":"九、只允许因这些事项暂停并请求用户","kind":"section_2","ident_start":28146,"ident_end":28197,"extent_start":28143,"extent_end":28928,"ident_utf16":{"start":{"line_number":436,"utf16_col":3},"end":{"line_number":436,"utf16_col":20}},"extent_utf16":{"start":{"line_number":436,"utf16_col":0},"end":{"line_number":449,"utf16_col":0}}},{"name":"十、最终交付报告","fully_qualified_name":"十、最终交付报告","kind":"section_2","ident_start":28931,"ident_end":28955,"extent_start":28928,"extent_end":29907,"ident_utf16":{"start":{"line_number":449,"utf16_col":3},"end":{"line_number":449,"utf16_col":11}},"extent_utf16":{"start":{"line_number":449,"utf16_col":0},"end":{"line_number":466,"utf16_col":0}}}]}},"codeViewLayoutRoute":{"repo":{"id":1324280045,"defaultBranch":"main","name":"TripChord","ownerLogin":"Oxygen56","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2026-08-05T16:48:31.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/100782273?v=4","public":true,"private":false,"isOrgOwned":false,"isArchived":false},"currentUser":null,"uploadToken":"UIFzj7PIhSjAOQOZUVLMP3hn73k1jtV65CFkRaErYkEkYmViNqjWMssLOeTF0udHuWEaOnsgdGYOj4H0yyIuEA","allShortcutsEnabled":false,"treeExpanded":true,"path":"docs/claude-code-v1-implementation-prompt.md","symbolsExpanded":false,"refInfo":{"name":"main","listCacheKey":"v0:1787362702.0","canEdit":false,"currentOid":"a18ee80a505d2b6b1c71d94c493e3c73b532e254"},"helpUrl":"https://docs.github.com","githubDevUrl":null},"codeViewFileTreeLayoutRoute":{"fileTree":{"docs":{"items":[{"name":"evidence","path":"docs/evidence","contentType":"directory"},{"name":"phase-reviews","path":"docs/phase-reviews","contentType":"directory"},{"name":"README.md","path":"docs/README.md","contentType":"file"},{"name":"architecture-decisions.md","path":"docs/architecture-decisions.md","contentType":"file"},{"name":"architecture.md","path":"docs/architecture.md","contentType":"file"},{"name":"benchmark-agent-architectures.md","path":"docs/benchmark-agent-architectures.md","contentType":"file"},{"name":"claim-ledger.md","path":"docs/claim-ledger.md","contentType":"file"},{"name":"claude-code-v1-implementation-prompt.md","path":"docs/claude-code-v1-implementation-prompt.md","contentType":"file"},{"name":"data-source-policy.md","path":"docs/data-source-policy.md","contentType":"file"},{"name":"date-search-benchmark.md","path":"docs/date-search-benchmark.md","contentType":"file"},{"name":"date-search-hybrid-v2.md","path":"docs/date-search-hybrid-v2.md","contentType":"file"},{"name":"demo.md","path":"docs/demo.md","contentType":"file"},{"name":"done-gate.md","path":"docs/done-gate.md","contentType":"file"},{"name":"formal-source-trust-root.md","path":"docs/formal-source-trust-root.md","contentType":"file"},{"name":"handoff-c6-final-report.md","path":"docs/handoff-c6-final-report.md","contentType":"file"},{"name":"interview-guide.md","path":"docs/interview-guide.md","contentType":"file"},{"name":"interview-red-team.md","path":"docs/interview-red-team.md","contentType":"file"},{"name":"live-stage1-evidence-2026-08-23.md","path":"docs/live-stage1-evidence-2026-08-23.md","contentType":"file"},{"name":"model-context-memory-rag.md","path":"docs/model-context-memory-rag.md","contentType":"file"},{"name":"naming.md","path":"docs/naming.md","contentType":"file"},{"name":"operations.md","path":"docs/operations.md","contentType":"file"},{"name":"persistent-memory.md","path":"docs/persistent-memory.md","contentType":"file"},{"name":"post-training-boundaries.md","path":"docs/post-training-boundaries.md","contentType":"file"},{"name":"product-requirements.md","path":"docs/product-requirements.md","contentType":"file"},{"name":"productization-progress.md","path":"docs/productization-progress.md","contentType":"file"},{"name":"providers.md","path":"docs/providers.md","contentType":"file"},{"name":"real-run-maldives-2026-08-24.md","path":"docs/real-run-maldives-2026-08-24.md","contentType":"file"},{"name":"resume-project.md","path":"docs/resume-project.md","contentType":"file"},{"name":"roadmap.md","path":"docs/roadmap.md","contentType":"file"},{"name":"rtl-airport-hulhumale-audit.md","path":"docs/rtl-airport-hulhumale-audit.md","contentType":"file"},{"name":"target-architecture.md","path":"docs/target-architecture.md","contentType":"file"},{"name":"transfer-assurance-design.md","path":"docs/transfer-assurance-design.md","contentType":"file"},{"name":"upstream-baseline.md","path":"docs/upstream-baseline.md","contentType":"file"},{"name":"v1.0-acceptance.md","path":"docs/v1.0-acceptance.md","contentType":"file"},{"name":"v2.0-acceptance.md","path":"docs/v2.0-acceptance.md","contentType":"file"},{"name":"wcag-audit.md","path":"docs/wcag-audit.md","contentType":"file"}],"totalCount":36},"":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"apps","path":"apps","contentType":"directory"},{"name":"benchmarks","path":"benchmarks","contentType":"directory"},{"name":"data","path":"data","contentType":"directory"},{"name":"deploy","path":"deploy","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"experiments","path":"experiments","contentType":"directory"},{"name":"migrations","path":"migrations","contentType":"directory"},{"name":"scripts","path":"scripts","contentType":"directory"},{"name":"training","path":"training","contentType":"directory"},{"name":".dockerignore","path":".dockerignore","contentType":"file"},{"name":".env.example","path":".env.example","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".python-version","path":".python-version","contentType":"file"},{"name":"AGENTS.md","path":"AGENTS.md","contentType":"file"},{"name":"CONTRIBUTING.md","path":"CONTRIBUTING.md","contentType":"file"},{"name":"Dockerfile.api","path":"Dockerfile.api","contentType":"file"},{"name":"Dockerfile.web","path":"Dockerfile.web","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"SECURITY.md","path":"SECURITY.md","contentType":"file"},{"name":"alembic.ini","path":"alembic.ini","contentType":"file"},{"name":"compose.yaml","path":"compose.yaml","contentType":"file"},{"name":"package-lock.json","path":"package-lock.json","contentType":"file"},{"name":"package.json","path":"package.json","contentType":"file"},{"name":"pyproject.toml","path":"pyproject.toml","contentType":"file"},{"name":"uv.lock","path":"uv.lock","contentType":"file"}],"totalCount":27}},"fileTreeProcessingTime":47.078779000000004,"foldersToFetch":[]},"codeViewBlobLayoutRoute":{"codeLineWrapEnabled":false,"refInfo":{"name":"main","listCacheKey":"v0:1787362702.0","canEdit":false,"refType":"branch","currentOid":"a18ee80a505d2b6b1c71d94c493e3c73b532e254","canEditOnDefaultBranch":false,"fileExistsOnDefault":true},"path":"docs/claude-code-v1-implementation-prompt.md","blob":{"copilotSWEAgentEnabled":false,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/Oxygen56/TripChord/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"claude-code-v1-implementation-prompt.md","displayUrl":"https://github.com/Oxygen56/TripChord/blob/main/docs/claude-code-v1-implementation-prompt.md?raw=true","headerInfo":{"blobSize":"29.2 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":"ab10364","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FOxygen56%2FTripChord%2Fblob%2Fmain%2Fdocs%2Fclaude-code-v1-implementation-prompt.md","isCSV":false,"isRichtext":true,"lineInfo":{"truncatedLoc":"466","truncatedSloc":"352"},"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":"/Oxygen56/TripChord/blob/main/docs/claude-code-v1-implementation-prompt.md","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/Oxygen56/TripChord/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/Oxygen56/TripChord/raw/refs/heads/main/docs/claude-code-v1-implementation-prompt.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":["# Claude Code：TripChord v0.2 → v1.0 自治实施总提示词","","你现在是 TripChord 的主实施工程师、产品工程负责人和最终验收负责人。请直接进入并持续开发：","","`/Users/oxygen/Documents/个人项目/tripchord`","","你的目标不是再写一份计划，也不是只做几个演示页面，而是严格依据仓库中的","`docs/roadmap.md`，把当前 v0.1 参考实现逐版本推进到可独立安装和体验的 v1.0 产品形态，","并通过机器可判定、证据可回放的最终 Done-Gate。","","除非遇到下文明确列出的“只能由用户处理的边界”，不要在每个阶段向我确认，不要因为任务规模、","上下文长度、运行时间或测试较多而停止。你应当自行调查、实现、测试、发现偏差、修复并继续推进。","如果当前上下文即将耗尽，先更新持久化交接文件，再在下一上下文从该文件继续，不能重新从头分析。","","## 一、开始前必须完整阅读","","在修改代码前，完整阅读而不是只搜索摘要：","","1. `AGENTS.md`","2. `README.md`","3. `docs/roadmap.md`，它是本次产品化的最高优先级目标合同","4. `docs/architecture.md`","5. `docs/providers.md`","6. `docs/data-source-policy.md`","7. `docs/done-gate.md`","8. `docs/claim-ledger.md`","9. `docs/model-context-memory-rag.md`","10. `docs/persistent-memory.md`","11. `docs/operations.md`","12. `docs/resume-project.md`","13. `SECURITY.md`、`.github/workflows/ci.yml`、数据库迁移、现有测试与 benchmark","","若旧文档与 `docs/roadmap.md` 冲突，不得偷偷选择更容易实现的旧语义。先查代码和证据，保留旧版本","兼容层，在阶段评审中写明迁移方式，并以产品化路线图中已经确认的决定为目标。","","## 二、当前已知状态与声明边界","","- 当前仓库是完整的独立项目，不依赖 Codex、ChatGPT 或 Claude Code 才能运行；运行时模型接口必须","  保持 OpenAI-compatible、可替换和可关闭。","- 当前工作树可能已有 `README.md` 与 `docs/roadmap.md` 的未提交修改，它们是本次产品化工作的既有","  输入。先执行 `git status --short` 和 `git diff`，保护所有既有修改，不得 reset、checkout、clean、","  stash、rebase、force 或覆盖不属于你的内容。若仍在 `main`，在不丢失这些修改的前提下创建或复用","  本地产品化分支；核对无误后把路线图作为独立基线提交，绝不自动 push。","- 当前代码已有多 Agent、动态预算、Chrome Companion、Planner–Verifier–Repair–ReVerifier、","  事件重规划、回放、后训练和大量测试；优先抽取复用，不要另起一个互不相连的“v2 演示”。","- 当前平台集合、前端类型、Companion 权限和部分 Done-Gate 仍有固定三平台假设；这是 v0.2 的首要","  根因，不是只改 UI 文案即可完成。","- 当前已知真实证据中，模型调用成功、HTTP job 成功和 Source 全部进入类型化终态，都不等于业务","  Done-Gate 通过。既有 Round 17 的业务门仍失败，住宿精确可比报价不足。开始时必须重新核对仓库","  当前证据；没有新的真实证据就不得改写这一结论。","- `confirmed_empty`、`bounded_provider_pending`、`bounded_no_exact_quote`、`login_required`、","  `captcha_required`、`dom_drift`、`timed_out` 都不能被包装成第二个价格。","- 当前用户已明确跳过同程海外酒店；除非用户在你的当前会话中作出新的显式决定，不得重试、恢复或","  计入覆盖。智行当前只有候选能力审计，没有稳定可审计的 PC 报价结果面，不得进入 Planner。","- 旧 v0.1 strict Done-Gate 的历史失败证据必须保持可回放。新路线图允许单来源有限方案，因此应新增","  版本化 product-v1 gate，不能削弱旧 strict gate、重命名旧终态或改写历史证据来制造成功。","","## 三、你已获得和没有获得的权限","","你可以自主执行：","","- 修改本仓库内的代码、测试、迁移、文档、fixture、benchmark、CI 和本地构建配置；","- 安装锁文件已经声明的依赖，运行本地服务、回放、测试、静态检查、迁移和容器构建；","- 创建本地分支和本地阶段提交，但不得把既有用户修改混入无关提交；","- 使用不访问真实 OTA、不产生外部副作用的本地 fixture、干净浏览器 E2E 和模型桩；","- 在不改变产品边界的前提下做必要架构决策，并记录 ADR 与权衡。","","你没有自动获得以下权限；不得把其他会话对 Codex 的授权视为对你的授权：","","- 访问用户当前 Chrome 登录态或真实 OTA 平台；","- 扩大 Chrome host permissions、安装/启用扩展、恢复登录或处理验证码；","- 发起付费模型调用、使用未在环境变量中明确提供的 API Key；","- 下单、支付、使用/领取优惠券、读取订单、Cookie、密码或支付信息；","- 调用未公开私有接口、逆向绕过平台页面能力、风控或访问控制；","- 推送 GitHub、创建 PR、发布 Release、发布 Chrome Web Store 扩展或 affiliate 链接；","- 删除用户数据、执行破坏性 Git 操作或不可逆数据库迁移。","","只有在确实需要上述权限时才询问用户，而且一次只提出一个具体请求。等待授权期间继续完成所有","不受阻塞的本地工程、回放、fixture、文档和安全测试，不得因为一个平台登录问题停下整个项目。","","## 四、不可改变的产品合同","","### 1. 本地优先","","API、Web、数据库、Browser Companion、平台登录态和用户自己的 LLM Key 默认留在用户机器上。","首版不做托管用户浏览器、账号和支付状态的云端 OTA。可选云能力不能成为本地核心闭环的依赖。","Browser Bridge 必须继续只绑定 loopback，使用强随机且分权的 token、严格 CORS 与脱敏日志；不得把","bridge/control/lease token 写入 Git、模型上下文、旅行数据或公开证据。","","### 2. 默认查询全部“当前合格”的平台，而不是全部已知平台","","平台选择粒度是 `provider × vertical`。默认集合必须严格等于：","","`已认证 ∩ 支持当前垂类 ∩ 用户已授权 ∩ 当前无已知阻断 ∩ 未冷却 ∩ 用户未关闭`","","健康未知但没有已知阻断时可进入搜索；运行中发现登录、验证码或 DOM 漂移时，以相应终态结束。","用户关闭的 scope 不得产生浏览器任务、模型工具调用、重试、刷新、failover 或事件重规划访问。","任何 Agent 都不能自动重新开启。搜索启动时冻结不可变 Selection Snapshot 和 SHA。","Browser Companion 必须保持最小权限；不得为了实现方便增加 `cookies`、`debugger`、全站通配 host","permission 或能够读取账号/支付状态的高权限。新增官方域名必须经过独立 capability/profile 版本和","用户逐项授权。","","### 3. 等全部已选来源终态后再规划","","Planner 必须严格晚于本次所有已选 Source 的终态。等待期间 UI 只展示平台/垂类进度和原因，不展示","部分价格、临时预算或候选方案。终态不等于报价成功；失败、登录、验证码、页面漂移、超时和取消","也必须类型化落地。不得无限等待，不得让 LLM 修改 deadline，不得把失败伪装成成功来通过调度器。","","只有一家来源有可用报价时允许输出有限方案，但必须明确“未形成跨平台比价”。零报价时只能输出","阻断报告和安全重试动作，预算与方案必须为空。","","### 4. 允许跨平台混合组合","","机票、每段酒店、接驳和活动可来自不同平台。不得隐藏设置“同平台优先”，不得假设组合优惠，","除非存在同条件、可回链的明确证据。比较必须绑定人数、房间、日期、稳定商品身份、权益、税费、","行李、早餐、退改和币种，不能把不同商品口径混为同价。","","### 5. 只提供官方预订交接，不提供支付能力","","产品文案统一为“官方预订跳转”“去官方页面”。TripChord 不下单、不支付、不用优惠券、不锁库存。","每个组件必须先完成同平台、同条件实时重核价，再经过 URL 安全门，才生成短期 handoff。价格、条款、","身份或库存发生实质变化时旧 handoff 立即失效，并重新进入 Verifier，必要时 Repair。","","现有 `TravelOffer.booking_url` 和 `BrowserQuote.page_url` 都不能直接暴露为跳转。必须新增独立的","`OfficialHandoff` / `OfficialDetailLocator` / receipt 合同，逐跳校验 scheme、官方 host、path、","query keys、redirect 和报价绑定。拒绝短链、开放重定向、账号、登录、订单、checkout、cashier、","payment、coupon 等路径。平台不能稳定定位商品时，退化为官方搜索页加精确参数卡片，不猜 URL。","","### 6. 已预订只来自用户声明，并成为强约束","","打开官方页面不等于已预订。只有用户显式点击“我已完成预订”才能生成 append-only 的本地","Booking Fact；不得读取平台订单来自动确认。Booking Checklist、Booking Fact、","Protected Component Constraint 和解除保护请求必须分层建模并持久化。","","Candidate Generator、Optimizer、Planner、Verifier、Repair、ReVerifier、Safety Gate 和事件重规划","都必须消费同一组已预订约束。未解除保护时，已预订组件不得被删除、换项、改日期、改人数或静默","重定价。事件命中已预订项时，输出冲突和用户处理选项，不自动替换。","","### 7. Agent 与硬代码边界","","- Agent 负责：需求语义、偏好权重建议、查询优先级、候选评议、风险批判、修复提案和解释；","- 确定性代码负责：权限、Selection Snapshot、任务白名单、并发/预算、终态、超时、金额、时间、","  稳定身份、URL、硬约束、Booking Fact、发布和最终安全否决；","- 不要为了“更像 Agent 项目”把金额、权限、URL 或真值校验交给 LLM；","- 也不要把 Agent 退化成无作用的装饰调用。模型提案必须在允许范围内真实影响查询顺序、候选评议、","  Repair 或解释，并留下 proposal、applied action 与拒绝原因；","- Agent 数和模型并发继续由确定性预算控制器按 D/C/G/事件范围动态派生，不能由模型无限扩容，","  当前请求级逻辑 Agent 上限 96、模型 HTTP 并发上限 12、Chrome lease 上限 6、去哪儿住宿并发","  上限 1；若要调整，必须先有版本化 benchmark 和反例证据，不能因为模型便宜就放宽。","","## 五、持续实施协议","","### 1. 建立可恢复的实施账本","","创建并持续更新 `docs/productization-progress.md`，至少记录：","","- 当前版本、当前阶段和最后一个完成的最小任务；","- 当前 Git commit/branch、既有修改与本轮修改；","- 已完成的领域合同、迁移、API、UI、Companion、测试和 benchmark；","- 精确运行过的命令、结果、失败原因和证据文件；","- 尚未完成项、外部阻塞、下一条可直接执行的命令；","- 当前可对外声明与绝对不能声明的内容。","","对路线图每条工作项和退出门使用“未开始、实现中、代码完成、已验证、外部阻塞”之一，并链接到","对应代码、测试、运行产物和提交 SHA。“代码完成”不能自动升级成“已验证”。","","每个版本创建 `docs/phase-reviews/product-vX.Y.md`，结论只能是：通过、有条件通过、返工、调整计划。","每次上下文切换前先更新实施账本；下一上下文先读账本、`git status` 和最近 diff 后继续。","","### 2. 先建立基线","","在业务代码修改前：","","1. 检查 Git 状态和当前差异，标记既有用户修改；","2. 检查 Python、uv、Node、npm、数据库和浏览器测试环境；","3. 安装锁定依赖；","4. 运行当前静态检查、完整测试、Web 构建、迁移检查、benchmark 和 Companion release gate；","5. 将基线失败与后续引入失败分开记录；","6. 搜索所有固定三平台、`exactly three`、`3/3`、固定 provider union、固定超时和旧 `booking_url`","   的代码落点，形成迁移清单。","","不要为了得到绿色基线删除失败测试、放宽断言、改黄金结果或关闭严格模式。","","### 3. 实施原则","","- 按 v0.2 → v0.3 → … → v1.0 顺序推进，不能先做漂亮的预订 UI 再补平台真值和终态屏障；","- 每次先写/更新领域合同与反例测试，再迁移实现，再接 API/UI，再跑端到端；","- 复用现有实现，先抽取测试缝隙，避免一次性重写 10,000 行 live system 或 2,000 行前端主页面；","- 数据库变更必须有前向迁移、兼容读取、失败恢复和必要的回滚验证；","- API、事件和持久化结构必须版本化，迟到的旧 generation 结果不得污染新运行；","- 修复真实 planning failure 时新增冻结 benchmark 或 mutation case；","- 测试只证明测试覆盖范围，不能自动升级成真实平台能力；","- 不允许留下只在 fixture 中存在、未接入生产路径的“完成”功能；","- 不允许用 TODO、假数据、吞异常或自动 fallback 隐藏未完成项。","","### 4. 每个版本的固定检查点","","每完成一个版本：","","1. 执行该版本定向测试与全部回归；","2. 执行 `git diff --check`、Ruff、Mypy、Python tests、Web build/tests、迁移和 Companion 合同；","3. 运行对应 replay、故障注入、mutation 和浏览器 fixture E2E；","4. 对照 `docs/roadmap.md` 逐项列出计划、实际、偏差、证据和未验证边界；","5. 更新 README、architecture、providers、operations、claim ledger 和 phase review；","6. 只在退出门真的满足时标记该版本通过；","7. 创建范围清晰的本地阶段提交，然后立即进入下一版本，不等待用户例行确认。","","可使用子 Agent 并行完成只读审查、后端/前端/Companion 独立测试、政策调查和红队，但共享文件写入","由主控串行整合或放在隔离 worktree。主控必须亲自审查 diff 并重跑证据门，不能因子 Agent 声称完成","就勾选退出门。","","若测试失败，先定位根因并修复；不得仅报告失败就停止。若遇到外部阻塞，先完成其余全部可执行项，","为阻塞点准备一条可重复的恢复命令和预期证据，再向用户请求最小权限或动作。","","## 六、分版本实施与退出门","","### v0.2：动态平台内核","","必须完成：","","- 新增稳定的 `ProviderScopeKey(provider, vertical)`、`ProviderCapability`、用户选择、Eligibility 与","  不可变 Selection Snapshot（含 capability version、adapter version、SHA、排除原因）；","- 先形成内部统一的 `ProviderAdapter` 接口和版本化 capability profile，再用 Registry 替代后端、","  前端、Companion、Query Planner、live system 与 Done-Gate 中固定","  三平台集合；保留显式旧 profile 兼容，不静默篡改历史证据；","- Companion 使用逐 scope 可选 host permission，心跳报告实际授权 scopes、adapter/contract version","  和 runtime instance，不再要求三平台全部在线；","- API 与 UI 提供 `平台 × 垂类` 能力矩阵，默认全选合格单元格，用户可逐项关闭；","- 每个必需垂类至少保留一个合格来源，为 0 时在任何模型/浏览器调用前拒绝启动；","- 拆分必要的 Provider Policy、Source Runtime、Barrier、Planning Pipeline 和前端页面边界。","- 从 v0.2 起，每次修改 Companion 后立即运行其定向合同和 release gate；v0.9 负责把同一门正式","  接入远端 CI，而不是此前都不验证。","","退出门：0、1、2、3、4 平台回放都能构建正确 DAG；关闭/未授权 scope 的浏览器任务、模型工具调用","和网络访问均为 0；伪造 provider/snapshot hash 原子拒绝；旧三平台场景兼容测试不回退。","","### v0.3：全来源终态屏障与诚实发布","","必须完成：","","- 统一跨垂类 Source 终态；","- 实现持久化 SearchRun、SourceAttempt、TerminalReceipt 和 Completion Barrier；","- 调度器新增原生 `ALL_TERMINAL` 依赖与独立 settle node，Normalizer 依赖 settle，Planner 再依赖","  Normalizer，禁止靠 `success=true` 伪装失败来源；","- 新增 `ScopeCancellationTombstone` 与 generation；普通重试、publication refresh、failover、延迟","  唤醒和 event replan 都必须检查，迟到结果不得进入 Planner；","- deadline/总预算由确定性 timeout profile、波次和所选矩阵派生；到期主动物化 `timed_out`；","- SSE 在屏障前只发送进度/终态，屏障后才一次性给最终结果；","- 持久化恢复、取消、幂等和重启语义明确。","","退出门：Planner 首次调用时间严格晚于最后一个已选 Source 的 `terminal_at`；无 queued/running/unknown","仍可发布的路径；取消后新增任务为 0；单来源如实披露；零报价无预算和方案；无无限等待。","","### v0.4：跨平台最终方案与覆盖解释","","必须完成：","","- Planner 可为机票、每段酒店、接驳和活动独立选择 provider，并保留 package/component provenance；","- 建立稳定商品/权益比较身份和完整金额口径；","- Verifier 校验分开交易、衔接、行李直挂、退改、税费、币种和不可同时满足的条件；","- 方案 UI 优先展示有证据的省钱、稳妥和少折腾取舍；证据不足时不凑满三个方案；","- 展示每组件平台、报价时间、到期时间、可比条件、跳转次数、覆盖来源和失败终态；","- 把 Source settlement、exact quote coverage 和 comparable component coverage 分开统计。","","退出门：固定回放能生成 A 平台机票 + B 平台酒店；返回顺序不影响确定性结果；金额/权益属性测试","无错配；Agent 不能绕过 Hard Verifier；Repair 后独立 ReVerifier 重新计算。","","### v0.5：官方预订跳转与逐组件清单","","必须完成：","","- 新增 `OfficialHandoff`、`OfficialDetailLocator`、短期/单次 receipt、URL Policy 和失效机制；","- 每个平台声明详情页、预填搜索页或仅参数卡片能力；","- 组件级重核价只查询同 provider × component，不默认重跑整趟行程；","- 用户动作分两步：“重核价并查看差异”与“去官方页面”，后台不能自动打开/聚焦；","- 价格、权益、身份、日期、人数/房间或库存变化时撤销旧 handoff，重新验证/Repair；","- 逐跳拒绝非官方域名、短链、开放重定向、登录、订单、checkout、payment、coupon 和未知路径；","- 构建逐组件清单和建议操作顺序，但此阶段点击绝不能产生 booked 状态。","","退出门：每个 handoff 可回链同一 plan version/component/offer/query/revalidation receipt；所有危险","URL mutation 零错误放行；旧/过期 receipt 不可用；没有稳定 deep-link 时安全降级；自动化测试绝不","提交订单或支付。","","### v0.6：已预订保护与事件闭环","","必须完成：","","- 持久化 Booking Checklist、Booking Item、User Booking Acknowledgement、append-only Booking Fact、","  Protected Constraint 和 Constraint Override Request；","- 只有明确用户动作能创建/撤销 Booking Fact；打开链接、Agent 输出和平台页面文字都不能；","- protected invariant 贯穿候选生成、优化、Planner、Verifier、Repair、ReVerifier、Safety Gate、","  local/global/event replan；","- 实现手动事件、用户开启的监控、预订前重核价变化和公共事件；","- Impact Analyzer 先确定受影响集合，只重查必要 scope；","- 已预订项受影响时进入用户处理状态，未明确解除前不自动替换；","- 输出旧/新版本 diff、保留项、变化原因、证据和预算。","","退出门：属性/故障测试中未解除保护的已预订组件修改率为 0；局部修复保留无关组件；全局重规划仍","继承保护；解除保护必须显式确认并留痕；实时变化只能来自新工具回执，不能来自 RAG/旧缓存。","","### v0.7：Provider SDK 与认证门","","必须完成：","","- 把 v0.2 已接入生产路径的内部 ProviderAdapter 接口提炼成公开 SDK，并提供 capability profile","  schema、fixture 模板和 conformance test kit；v0.7 不是第一次发明 adapter 抽象；","- 实现开发、影子、测试、合格、冷却、停用状态机；只有 `certified_active` 可默认全选；","- 认证按 `provider × vertical` 独立进行，机票成功不能证明酒店；","- selector/URL/permission/profile 变更都产生新版本和 SHA；","- 影子 adapter 不进入 Planner、覆盖分母或默认选择；","- 对智行、同程酒店或其他候选先做 fixture/影子能力，只有获得当前会话真实只读授权并通过 canary、","  URL 安全和报价绑定门后才能升级为合格；不能为了凑数量绕过平台边界。","","退出门：新增 provider 只需 adapter + profile，不改核心 Planner/Barrier 枚举；可按垂类一键冷却；","历史 run 保留旧 profile；未认证来源访问数和报价贡献为 0。若缺真实授权，完成全部 SDK/影子工程并","把该来源保持非活跃，继续后续版本，不得把外部阻塞冒充代码未完成或认证成功。","","### v0.8：本地优先的完整产品体验","","必须完成：","","- 本地启动器/安装器统一管理 API、Web、数据库迁移和 Bridge；","- LLM Key 使用系统安全存储或等价安全方案，不进入仓库、前端持久化、旅行数据库、模型上下文和日志；","- 首次设置向导覆盖本地服务、模型 smoke、Companion 配对、逐平台权限与登录健康；","- 首页改为旅行工作流，拆分平台设置、搜索进度、方案比较、预订清单、事件中心和证据详情；","- 默认折叠 Agent DAG、token 和内部回执，普通用户优先看到发生了什么、为什么、下一步；","- 任务/清单跨刷新和重启恢复；提供数据导出、删除、日志脱敏和默认关闭的匿名遥测；","- 完成键盘、屏幕阅读器、非颜色状态、可读字号和 WCAG 2.2 AA 审查；","- 为签名扩展/安装包准备可复现产物，但发布到商店或公网必须另行获得用户授权。","","退出门：全新机器按公开说明可完成 replay；真实模式逐项展示权限；秘密不进入日志/遥测；升级、迁移、","备份和失败回滚有测试；Chrome 安装需要用户确认，但开发者重载不成为公众日常待办。","","### v0.9：公开测试版可靠性与评测","","必须完成：","","- 把 Companion JS 合同、Python control tests、build-meta/release seal 和 host permissions 加入远端 CI；","- 增加动态选择矩阵、ALL_TERMINAL、慢源、取消竞态、迟到结果、URL/offer binding、Prompt Injection、","  崩溃恢复、幂等和 booked invariant 的冻结 benchmark/mutation suite；","- 使用干净 Chrome + 本地 fixture 做浏览器 E2E，普通 CI 不依赖真实账号；","- job/monitor/清单迁入可恢复存储，验证重启和多租户隔离；","- 增加 secret scan、CodeQL/SAST、SBOM、依赖审计、构建 provenance 和固定第三方 Actions 版本；","- 提供本地可观测面板，分开记录终态、报价覆盖、Barrier 延迟、模型成本、Repair 和 handoff；","- 真实 OTA canary 只能在获得用户授权的发布门运行，证据脱敏并绑定 commit/profile/runtime/query SHA。","","退出门：Python、Web、Companion、迁移、benchmark、浏览器 E2E、安全和可复现构建全部进入 CI；","未授权访问、提前发布、危险链接、错误 booked 和已预订静默变化均为 0；性能门基于冻结真实基线，","不用拍脑袋数字。","","### v1.0：最终产品与 Done-Gate","","实现机器可执行的最终产品门，例如 `scripts/run_product_done_gate.py`，原子输出脱敏的","`benchmarks/results/product-v1-done-gate.json`。证据包至少记录 commit、capability/profile/adapter/","Companion 版本、模型模式、选择快照、每个 Source 终态、Barrier 时间、报价覆盖、最终裁决、handoff、","booked invariant、所有子门和证据引用。","","最终门至少分层验证：","","1. fresh clone/锁文件/迁移/wheel/Web/容器/安装器可复现；","2. replay 模式完整走通动态选择 → 全终态 → 跨平台方案 → handoff → 用户确认 → 带保护重规划；","3. 干净 Chrome + 本地恶意 fixture 验证权限、配对、后台、URL 和 Prompt Injection；","4. OpenAI-compatible 模型在有环境变量授权时完成 required-model smoke 和结构化 Agent 链；","5. 每个对外宣称合格的真实 `provider × vertical` 都有未过期、已授权的只读 canary；","6. 全平台真实 E2E 只在所有外部条件已满足时运行；未满足则准确指出哪个外部门未过，不能伪造。","","Done-Gate 只有在所有**适用于当前发布声明**的门通过时，才允许 `passed=true` 且进程退出 0。","HTTP job 成功、测试成功、模型调用成功或所有 Source 终态都不能单独触发通过。某个真实平台认证失败时，","可以从 `available/default-selected` 中移除后发布核心产品，但 claim ledger 必须明确不再宣称该能力。","","## 七、最低验证命令","","根据仓库当前实际脚本调整，但不得少于以下范围：","","```bash","git status --short","git diff --check","","uv sync --locked --all-groups","uv run ruff check .","uv run mypy apps/api/src","uv run pytest","","npm ci","npm run build","npm test","npm audit --omit=dev --audit-level=high","","uv run python scripts/browser_companion_release_gate.py","","uv run python -m training.train_sft --validate-only","uv run python -m training.train_dpo --validate-only","uv run python -m training.policy_reranker","","uv run python benchmarks/evaluate.py","uv run python benchmarks/evaluate_planning.py","uv run python benchmarks/evaluate_repair.py","uv run python benchmarks/evaluate_events.py","","docker compose config","docker compose build","```","","数据库迁移必须使用临时数据库验证 `upgrade head`、`alembic check` 和必要的兼容/回滚路径。","Companion 源码变化后，只能在确认 diff 合理时显式运行 release gate 的 build-meta 更新模式，再重新执行","只读 gate；同时按合同更新扩展版本。不得手工编辑 build-meta 或 release seal，也不能为了过 gate","随意刷新封板。新增产品门、浏览器 E2E 和安全 benchmark 后，把它们加入本清单与 CI。","","```bash","uv run python scripts/browser_companion_release_gate.py --update-build-meta","uv run python scripts/browser_companion_release_gate.py","```","","最终全门还要运行与 CI 等价的 Python/npm 依赖审计、secret scan、SBOM 与构建来源校验；不得把发现的","高危问题静默加入 allowlist。","","最终至少保留五个反表面端到端验收：动态 0/1/2/4 provider；慢源或迟到结果绝不提前触发 Planner；","用户关闭 scope 后浏览器任务、模型工具调用和网络访问全为 0；开放重定向/支付路径 handoff 全拒绝；","任意事件序列下未解除保护的 booked component 修改率为 0。","","## 八、绝对禁止的伪完成方式","","- 只更新 README、路线图、接口类型或静态页面，没有把真实生产路径接通；","- 新增一套旁路 demo，旧 live pipeline 仍固定三平台；","- 用更多 Agent、更多提示词或更多模型调用代替权限、金额、终态、URL、Booking Fact 等硬合同；","- 让 Agent 自动恢复用户关闭的平台、登录、验证码或 host permissions；","- 把 pending、empty、login、timeout、DOM drift 变成报价或第二平台覆盖；","- 在全部已选来源终态前展示部分方案；","- 把 `page_url`、模型生成 URL 或 HTTP 200 当成安全官方详情页；","- 点击链接后自动标记 booked，或在重规划中静默替换已预订组件；","- 从 RAG、缓存或旧截图恢复“当前实时价格”；","- 更新 golden/benchmark 只为让失败消失，不解释行为变化；","- 通过删除测试、放宽 Hard Verifier、关闭 required-model 或降级严格模式来变绿；","- 把本地 fixture、单平台 canary、Source 完成或模型成功写成全平台真实业务通过；","- 在没有用户明确授权时 push、发布、访问真实平台或使用付费服务。","","## 九、只允许因这些事项暂停并请求用户","","仅当剩余工作真的依赖以下条件且所有其他本地工作已完成时，才可暂停：","","1. 用户需要亲自授予或扩大某个平台域名权限；","2. 用户需要亲自登录、处理验证码或恢复平台账号状态；","3. 需要真实 OTA、付费 LLM、签名证书、Chrome Web Store、affiliate/partner 资格；","4. 需要公开 push/release、不可逆数据迁移或删除用户数据；","5. 外部平台政策存在无法由代码或公开资料消除的实质性产品取舍。","","暂停时不要泛泛说“需要你操作”。必须给出：已完成内容、精确阻塞门、为何不能替代、最小用户动作、","完成后将执行的命令、预期成功证据。一次只问一个问题。","","## 十、最终交付报告","","持续工作直到最终 Done-Gate 真实通过，或只剩上述用户专属外部阻塞。最终报告必须先给一句话结论，","然后提供：","","- v0.2 至 v1.0 每个版本的状态和证据文件；","- 用户实际能完成的完整流程；","- Agent 真正做了哪些决策，哪些仍由确定性代码裁决；","- Python/Web/Companion/迁移/benchmark/安全/安装器的精确验证结果；","- replay、fixture、模型、单平台真实 canary 和全平台真实 E2E 分层结论；","- 当前支持和默认选择的 `provider × vertical`；","- 当前仍不能声称的能力；","- Git 状态、本地提交和所有未公开外部动作；","- 若仍有外部阻塞，只列用户必须处理的最小动作，不能把普通工程问题推给用户。","","现在开始：先进入仓库，阅读全部合同，检查并保护现有修改，建立基线和","`docs/productization-progress.md`，然后直接实施 v0.2。不要只回复计划。"],"stylingDirectives":[[[0,44,"pl-mh"],[2,44,"pl-en"]],[],[],[],[[0,1,"pl-s"],[1,39,"pl-c1"],[39,40,"pl-s"]],[],[],[[0,1,"pl-s"],[1,16,"pl-c1"],[16,17,"pl-s"]],[],[],[],[],[],[],[[0,14,"pl-mh"],[3,14,"pl-en"]],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"],[3,4,"pl-s"],[4,13,"pl-c1"],[13,14,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,4,"pl-s"],[4,13,"pl-c1"],[13,14,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,4,"pl-s"],[4,19,"pl-c1"],[19,20,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,4,"pl-s"],[4,24,"pl-c1"],[24,25,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,4,"pl-s"],[4,21,"pl-c1"],[21,22,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,4,"pl-s"],[4,30,"pl-c1"],[30,31,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,4,"pl-s"],[4,21,"pl-c1"],[21,22,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,4,"pl-s"],[4,24,"pl-c1"],[24,25,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"],[3,4,"pl-s"],[4,36,"pl-c1"],[36,37,"pl-s"]],[[0,2,"pl-s"],[2,3,"pl-v"],[4,5,"pl-s"],[5,30,"pl-c1"],[30,31,"pl-s"]],[[0,2,"pl-s"],[2,3,"pl-v"],[4,5,"pl-s"],[5,23,"pl-c1"],[23,24,"pl-s"]],[[0,2,"pl-s"],[2,3,"pl-v"],[4,5,"pl-s"],[5,27,"pl-c1"],[27,28,"pl-s"]],[[0,2,"pl-s"],[2,3,"pl-v"],[4,5,"pl-s"],[5,16,"pl-c1"],[16,17,"pl-s"],[18,19,"pl-s"],[19,43,"pl-c1"],[43,44,"pl-s"]],[],[[6,7,"pl-s"],[7,22,"pl-c1"],[22,23,"pl-s"]],[],[],[[0,16,"pl-mh"],[3,16,"pl-en"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"],[12,13,"pl-s"],[13,22,"pl-c1"],[22,23,"pl-s"],[26,27,"pl-s"],[27,42,"pl-c1"],[42,43,"pl-s"]],[[9,10,"pl-s"],[10,28,"pl-c1"],[28,29,"pl-s"],[32,33,"pl-s"],[33,41,"pl-c1"],[41,42,"pl-s"]],[[36,37,"pl-s"],[37,41,"pl-c1"],[41,42,"pl-s"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[],[[0,1,"pl-v"],[2,3,"pl-s"],[3,18,"pl-c1"],[18,19,"pl-s"],[20,21,"pl-s"],[21,45,"pl-c1"],[45,46,"pl-s"],[47,48,"pl-s"],[48,70,"pl-c1"],[70,71,"pl-s"],[72,73,"pl-s"],[73,87,"pl-c1"],[87,88,"pl-s"]],[[2,3,"pl-s"],[3,19,"pl-c1"],[19,20,"pl-s"],[21,22,"pl-s"],[22,31,"pl-c1"],[31,32,"pl-s"],[33,34,"pl-s"],[34,43,"pl-c1"],[43,44,"pl-s"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[],[[0,17,"pl-mh"],[3,17,"pl-en"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[[0,14,"pl-mh"],[3,14,"pl-en"]],[],[[0,11,"pl-mh"],[4,11,"pl-en"]],[],[],[],[],[],[],[[0,32,"pl-mh"],[4,32,"pl-en"]],[],[[8,9,"pl-s"],[9,28,"pl-c1"],[28,29,"pl-s"]],[],[[0,1,"pl-s"],[1,45,"pl-c1"],[45,46,"pl-s"]],[],[],[],[],[[38,39,"pl-s"],[39,46,"pl-c1"],[46,47,"pl-s"],[48,49,"pl-s"],[49,57,"pl-c1"],[57,58,"pl-s"]],[],[],[],[[0,20,"pl-mh"],[4,20,"pl-en"]],[],[],[],[],[],[],[],[],[[0,16,"pl-mh"],[4,16,"pl-en"]],[],[],[],[],[],[[0,24,"pl-mh"],[4,24,"pl-en"]],[],[],[],[],[],[[3,4,"pl-s"],[4,27,"pl-c1"],[27,28,"pl-s"],[31,32,"pl-s"],[32,53,"pl-c1"],[53,54,"pl-s"]],[[0,1,"pl-s"],[1,16,"pl-c1"],[16,17,"pl-s"],[20,21,"pl-s"],[21,42,"pl-c1"],[42,43,"pl-s"]],[],[],[],[[0,24,"pl-mh"],[4,24,"pl-en"]],[],[],[],[],[],[],[],[],[],[[0,19,"pl-mh"],[4,19,"pl-en"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[],[],[],[[0,11,"pl-mh"],[3,11,"pl-en"]],[],[[0,17,"pl-mh"],[4,17,"pl-en"]],[],[[8,9,"pl-s"],[9,40,"pl-c1"],[40,41,"pl-s"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[[7,8,"pl-s"],[8,42,"pl-c1"],[42,43,"pl-s"]],[[26,27,"pl-s"],[27,37,"pl-c1"],[37,38,"pl-s"]],[],[[0,12,"pl-mh"],[4,12,"pl-en"]],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"],[13,14,"pl-s"],[14,27,"pl-c1"],[27,28,"pl-s"],[29,30,"pl-s"],[30,33,"pl-c1"],[33,34,"pl-s"],[60,61,"pl-s"],[61,72,"pl-c1"],[72,73,"pl-s"]],[],[],[],[],[[0,11,"pl-mh"],[4,11,"pl-en"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,17,"pl-mh"],[4,17,"pl-en"]],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"],[6,7,"pl-s"],[7,23,"pl-c1"],[23,24,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"],[6,7,"pl-s"],[7,22,"pl-c1"],[22,23,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[],[],[],[],[],[],[],[[0,14,"pl-mh"],[3,14,"pl-en"]],[],[[0,15,"pl-mh"],[4,15,"pl-en"]],[],[],[],[[0,1,"pl-v"],[8,9,"pl-s"],[9,45,"pl-c1"],[45,46,"pl-s"],[47,48,"pl-s"],[48,66,"pl-c1"],[66,67,"pl-s"]],[],[[0,1,"pl-v"],[11,12,"pl-s"],[12,27,"pl-c1"],[27,28,"pl-s"]],[],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"],[14,15,"pl-s"],[15,22,"pl-c1"],[22,23,"pl-s"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[],[[0,21,"pl-mh"],[4,21,"pl-en"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"],[10,11,"pl-s"],[11,23,"pl-c1"],[23,24,"pl-s"]],[[17,18,"pl-s"],[18,30,"pl-c1"],[30,31,"pl-s"]],[[0,1,"pl-v"],[5,6,"pl-s"],[6,32,"pl-c1"],[32,33,"pl-s"]],[],[[0,1,"pl-v"],[52,53,"pl-s"],[53,62,"pl-c1"],[62,63,"pl-s"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[38,39,"pl-s"],[39,50,"pl-c1"],[50,51,"pl-s"]],[],[],[[0,21,"pl-mh"],[4,21,"pl-en"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[[0,21,"pl-mh"],[4,21,"pl-en"]],[],[],[],[[0,1,"pl-v"],[5,6,"pl-s"],[6,21,"pl-c1"],[21,22,"pl-s"],[23,24,"pl-s"],[24,45,"pl-c1"],[45,46,"pl-s"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[],[[0,19,"pl-mh"],[4,19,"pl-en"]],[],[],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[[0,26,"pl-mh"],[4,26,"pl-en"]],[],[],[],[[0,1,"pl-v"]],[],[[0,1,"pl-v"],[28,29,"pl-s"],[29,45,"pl-c1"],[45,46,"pl-s"]],[[0,1,"pl-v"],[6,7,"pl-s"],[7,26,"pl-c1"],[26,27,"pl-s"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[],[],[[0,20,"pl-mh"],[4,20,"pl-en"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[[0,20,"pl-mh"],[4,20,"pl-en"]],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[],[],[],[[0,24,"pl-mh"],[4,24,"pl-en"]],[],[[17,18,"pl-s"],[18,50,"pl-c1"],[50,51,"pl-s"]],[[0,1,"pl-s"],[1,45,"pl-c1"],[45,46,"pl-s"]],[],[],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"],[15,16,"pl-s"],[16,35,"pl-c1"],[35,36,"pl-s"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[[15,17,"pl-s"],[26,28,"pl-s"],[38,39,"pl-s"],[39,50,"pl-c1"],[50,51,"pl-s"]],[],[[4,5,"pl-s"],[5,31,"pl-c1"],[31,32,"pl-s"]],[],[[0,11,"pl-mh"],[3,11,"pl-en"]],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[],[],[[18,19,"pl-c1"]],[],[],[],[],[],[[4,8,"pl-c1"]],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[[0,3,"pl-s"]],[],[[17,18,"pl-s"],[18,30,"pl-c1"],[30,31,"pl-s"],[32,33,"pl-s"],[33,46,"pl-c1"],[46,47,"pl-s"]],[],[],[],[],[[0,3,"pl-s"],[3,7,"pl-en"]],[],[],[[0,3,"pl-s"]],[],[],[],[],[],[],[],[],[[0,15,"pl-mh"],[3,15,"pl-en"]],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"],[4,5,"pl-s"],[5,13,"pl-c1"],[13,14,"pl-s"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[[0,20,"pl-mh"],[3,20,"pl-en"]],[],[],[],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[[0,1,"pl-s"],[1,2,"pl-v"]],[],[],[],[],[[0,11,"pl-mh"],[3,11,"pl-en"]],[],[],[],[],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"],[13,14,"pl-s"],[14,33,"pl-c1"],[33,34,"pl-s"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[[0,1,"pl-v"]],[],[],[[0,1,"pl-s"],[1,32,"pl-c1"],[32,33,"pl-s"]]],"colorizedLines":null}},"title":"TripChord/docs/claude-code-v1-implementation-prompt.md at main · Oxygen56/TripChord","appPayload":{},"meta":{"title":"TripChord/docs/claude-code-v1-implementation-prompt.md at main · Oxygen56/TripChord"}}</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="/Oxygen56/TripChord" 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="/Oxygen56/TripChord/tree/main" data-discover="true">TripChord</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__lg__Rjz0A" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/Oxygen56/TripChord/tree/main/docs" data-discover="true">docs</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">claude-code-v1-implementation-prompt.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="/Oxygen56/TripChord/commits/main/docs/claude-code-v1-implementation-prompt.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="/Oxygen56/TripChord/commits/main/docs/claude-code-v1-implementation-prompt.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="29.2 KB" style="--truncate-max-width:100%"><span>466 lines (352 loc) · 29.2 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="/Oxygen56/TripChord/tree/main" data-discover="true">TripChord</a></li><li class="Breadcrumb-module__listItem__Ib0x_"><span class="Breadcrumb-module__separator__eNwsI Breadcrumb-module__md__Wb1Gs" aria-hidden="true">/</span><a class="Breadcrumb-module__directoryLink__kQy_t prc-Link-Link-9ZwDx" data-component="Link" href="/Oxygen56/TripChord/tree/main/docs" data-discover="true">docs</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">claude-code-v1-implementation-prompt.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="29.2 KB" style="--truncate-max-width:100%"><span>466 lines (352 loc) · 29.2 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/Oxygen56/TripChord/raw/refs/heads/main/docs/claude-code-v1-implementation-prompt.md" data-testid="raw-button" class="prc-Button-ButtonBase-9n-Xk LinkButton-module__linkButton__nFnov BlobViewHeader-module__LinkButton__X9kx2" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-Iohp5"><span data-component="text" class="prc-Button-Label-FWkx3">Raw</span></span></a></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="copy-raw-button" class="prc-Button-ButtonBase-9n-Xk prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_qaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-copy" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_qaucpala9lik5_">Copy raw file</span></div><div class="prc-ButtonGroup-Item-PqvDl"><button data-component="IconButton" type="button" data-testid="download-raw-button" class="prc-Button-ButtonBase-9n-Xk BlobViewHeader-module__downloadButton__ef459 prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="default" aria-labelledby="_R_eaucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-download" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2.75 14A1.75 1.75 0 0 1 1 12.25v-2.5a.75.75 0 0 1 1.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25v-2.5a.75.75 0 0 1 1.5 0v2.5A1.75 1.75 0 0 1 13.25 14Z"></path><path d="M7.25 7.689V2a.75.75 0 0 1 1.5 0v5.689l1.97-1.969a.749.749 0 1 1 1.06 1.06l-3.25 3.25a.749.749 0 0 1-1.06 0L4.22 6.78a.749.749 0 1 1 1.06-1.06l1.97 1.969Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_eaucpala9lik5_">Download raw file</span></div></div></div><button data-component="IconButton" type="button" aria-pressed="false" class="prc-Button-ButtonBase-9n-Xk tmp-mr-2 TableOfContents-module__IconButton__jrlNM prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_3ucpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="n" data-component="Tooltip" aria-hidden="true" id="_R_3ucpala9lik5_">Outline</span><div class="react-blob-header-edit-and-raw-actions-combined"><button data-component="IconButton" type="button" title="More file actions" data-testid="more-file-actions-button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-9n-Xk js-blob-dropdown-click BlobViewHeader-module__IconButton__XrMQY prc-Button-IconButton-fyge7" data-loading="false" data-no-visuals="true" data-size="small" data-variant="invisible" aria-labelledby="_R_fkecpala9lik5_" id="_R_kecpala9lik5_"><svg data-component="Octicon" aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button><span class="prc-TooltipV2-Tooltip-tLeuB" data-direction="nw" data-component="Tooltip" aria-hidden="true" id="_R_fkecpala9lik5_">Edit and raw actions</span></div></div></div></div><div></div></div><div class="BlobViewContent-module__blobContentWrapper__JS0W6"><section aria-labelledby="file-name-id-wide file-name-id-mobile" class="BlobContent-module__blobContentSection__VOgZq BlobContent-module__blobContentSectionMarkdown__mPLOK" style="margin-top:46px"><div class="js-snippet-clipboard-copy-unpositioned BlobContent-module__markdownBlob__T8jpG" data-hpc="true" containertiming="hpc"><article class="markdown-body entry-content container-lg" itemprop="text"><div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Claude Code：TripChord v0.2 → v1.0 自治实施总提示词</h1><a id="user-content-claude-codetripchord-v02--v10-自治实施总提示词" class="anchor" aria-label="Permalink: Claude Code：TripChord v0.2 → v1.0 自治实施总提示词" href="#claude-codetripchord-v02--v10-自治实施总提示词"><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">你现在是 TripChord 的主实施工程师、产品工程负责人和最终验收负责人。请直接进入并持续开发：</p>
<p dir="auto"><code>/Users/oxygen/Documents/个人项目/tripchord</code></p>
<p dir="auto">你的目标不是再写一份计划，也不是只做几个演示页面，而是严格依据仓库中的
<code>docs/roadmap.md</code>，把当前 v0.1 参考实现逐版本推进到可独立安装和体验的 v1.0 产品形态，
并通过机器可判定、证据可回放的最终 Done-Gate。</p>
<p dir="auto">除非遇到下文明确列出的“只能由用户处理的边界”，不要在每个阶段向我确认，不要因为任务规模、
上下文长度、运行时间或测试较多而停止。你应当自行调查、实现、测试、发现偏差、修复并继续推进。
如果当前上下文即将耗尽，先更新持久化交接文件，再在下一上下文从该文件继续，不能重新从头分析。</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">一、开始前必须完整阅读</h2><a id="user-content-一开始前必须完整阅读" class="anchor" aria-label="Permalink: 一、开始前必须完整阅读" href="#一开始前必须完整阅读"><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">在修改代码前，完整阅读而不是只搜索摘要：</p>
<ol dir="auto">
<li><code>AGENTS.md</code></li>
<li><code>README.md</code></li>
<li><code>docs/roadmap.md</code>，它是本次产品化的最高优先级目标合同</li>
<li><code>docs/architecture.md</code></li>
<li><code>docs/providers.md</code></li>
<li><code>docs/data-source-policy.md</code></li>
<li><code>docs/done-gate.md</code></li>
<li><code>docs/claim-ledger.md</code></li>
<li><code>docs/model-context-memory-rag.md</code></li>
<li><code>docs/persistent-memory.md</code></li>
<li><code>docs/operations.md</code></li>
<li><code>docs/resume-project.md</code></li>
<li><code>SECURITY.md</code>、<code>.github/workflows/ci.yml</code>、数据库迁移、现有测试与 benchmark</li>
</ol>
<p dir="auto">若旧文档与 <code>docs/roadmap.md</code> 冲突，不得偷偷选择更容易实现的旧语义。先查代码和证据，保留旧版本
兼容层，在阶段评审中写明迁移方式，并以产品化路线图中已经确认的决定为目标。</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">二、当前已知状态与声明边界</h2><a id="user-content-二当前已知状态与声明边界" class="anchor" aria-label="Permalink: 二、当前已知状态与声明边界" href="#二当前已知状态与声明边界"><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>当前仓库是完整的独立项目，不依赖 Codex、ChatGPT 或 Claude Code 才能运行；运行时模型接口必须
保持 OpenAI-compatible、可替换和可关闭。</li>
<li>当前工作树可能已有 <code>README.md</code> 与 <code>docs/roadmap.md</code> 的未提交修改，它们是本次产品化工作的既有
输入。先执行 <code>git status --short</code> 和 <code>git diff</code>，保护所有既有修改，不得 reset、checkout、clean、
stash、rebase、force 或覆盖不属于你的内容。若仍在 <code>main</code>，在不丢失这些修改的前提下创建或复用
本地产品化分支；核对无误后把路线图作为独立基线提交，绝不自动 push。</li>
<li>当前代码已有多 Agent、动态预算、Chrome Companion、Planner–Verifier–Repair–ReVerifier、
事件重规划、回放、后训练和大量测试；优先抽取复用，不要另起一个互不相连的“v2 演示”。</li>
<li>当前平台集合、前端类型、Companion 权限和部分 Done-Gate 仍有固定三平台假设；这是 v0.2 的首要
根因，不是只改 UI 文案即可完成。</li>
<li>当前已知真实证据中，模型调用成功、HTTP job 成功和 Source 全部进入类型化终态，都不等于业务
Done-Gate 通过。既有 Round 17 的业务门仍失败，住宿精确可比报价不足。开始时必须重新核对仓库
当前证据；没有新的真实证据就不得改写这一结论。</li>
<li><code>confirmed_empty</code>、<code>bounded_provider_pending</code>、<code>bounded_no_exact_quote</code>、<code>login_required</code>、
<code>captcha_required</code>、<code>dom_drift</code>、<code>timed_out</code> 都不能被包装成第二个价格。</li>
<li>当前用户已明确跳过同程海外酒店；除非用户在你的当前会话中作出新的显式决定，不得重试、恢复或
计入覆盖。智行当前只有候选能力审计，没有稳定可审计的 PC 报价结果面，不得进入 Planner。</li>
<li>旧 v0.1 strict Done-Gate 的历史失败证据必须保持可回放。新路线图允许单来源有限方案，因此应新增
版本化 product-v1 gate，不能削弱旧 strict gate、重命名旧终态或改写历史证据来制造成功。</li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">三、你已获得和没有获得的权限</h2><a id="user-content-三你已获得和没有获得的权限" class="anchor" aria-label="Permalink: 三、你已获得和没有获得的权限" href="#三你已获得和没有获得的权限"><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">你可以自主执行：</p>
<ul dir="auto">
<li>修改本仓库内的代码、测试、迁移、文档、fixture、benchmark、CI 和本地构建配置；</li>
<li>安装锁文件已经声明的依赖，运行本地服务、回放、测试、静态检查、迁移和容器构建；</li>
<li>创建本地分支和本地阶段提交，但不得把既有用户修改混入无关提交；</li>
<li>使用不访问真实 OTA、不产生外部副作用的本地 fixture、干净浏览器 E2E 和模型桩；</li>
<li>在不改变产品边界的前提下做必要架构决策，并记录 ADR 与权衡。</li>
</ul>
<p dir="auto">你没有自动获得以下权限；不得把其他会话对 Codex 的授权视为对你的授权：</p>
<ul dir="auto">
<li>访问用户当前 Chrome 登录态或真实 OTA 平台；</li>
<li>扩大 Chrome host permissions、安装/启用扩展、恢复登录或处理验证码；</li>
<li>发起付费模型调用、使用未在环境变量中明确提供的 API Key；</li>
<li>下单、支付、使用/领取优惠券、读取订单、Cookie、密码或支付信息；</li>
<li>调用未公开私有接口、逆向绕过平台页面能力、风控或访问控制；</li>
<li>推送 GitHub、创建 PR、发布 Release、发布 Chrome Web Store 扩展或 affiliate 链接；</li>
<li>删除用户数据、执行破坏性 Git 操作或不可逆数据库迁移。</li>
</ul>
<p dir="auto">只有在确实需要上述权限时才询问用户，而且一次只提出一个具体请求。等待授权期间继续完成所有
不受阻塞的本地工程、回放、fixture、文档和安全测试，不得因为一个平台登录问题停下整个项目。</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">四、不可改变的产品合同</h2><a id="user-content-四不可改变的产品合同" class="anchor" aria-label="Permalink: 四、不可改变的产品合同" href="#四不可改变的产品合同"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">1. 本地优先</h3><a id="user-content-1-本地优先" class="anchor" aria-label="Permalink: 1. 本地优先" href="#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>
<p dir="auto">API、Web、数据库、Browser Companion、平台登录态和用户自己的 LLM Key 默认留在用户机器上。
首版不做托管用户浏览器、账号和支付状态的云端 OTA。可选云能力不能成为本地核心闭环的依赖。
Browser Bridge 必须继续只绑定 loopback，使用强随机且分权的 token、严格 CORS 与脱敏日志；不得把
bridge/control/lease token 写入 Git、模型上下文、旅行数据或公开证据。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">2. 默认查询全部“当前合格”的平台，而不是全部已知平台</h3><a id="user-content-2-默认查询全部当前合格的平台而不是全部已知平台" class="anchor" aria-label="Permalink: 2. 默认查询全部“当前合格”的平台，而不是全部已知平台" href="#2-默认查询全部当前合格的平台而不是全部已知平台"><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>provider × vertical</code>。默认集合必须严格等于：</p>
<p dir="auto"><code>已认证 ∩ 支持当前垂类 ∩ 用户已授权 ∩ 当前无已知阻断 ∩ 未冷却 ∩ 用户未关闭</code></p>
<p dir="auto">健康未知但没有已知阻断时可进入搜索；运行中发现登录、验证码或 DOM 漂移时，以相应终态结束。
用户关闭的 scope 不得产生浏览器任务、模型工具调用、重试、刷新、failover 或事件重规划访问。
任何 Agent 都不能自动重新开启。搜索启动时冻结不可变 Selection Snapshot 和 SHA。
Browser Companion 必须保持最小权限；不得为了实现方便增加 <code>cookies</code>、<code>debugger</code>、全站通配 host
permission 或能够读取账号/支付状态的高权限。新增官方域名必须经过独立 capability/profile 版本和
用户逐项授权。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">3. 等全部已选来源终态后再规划</h3><a id="user-content-3-等全部已选来源终态后再规划" class="anchor" aria-label="Permalink: 3. 等全部已选来源终态后再规划" href="#3-等全部已选来源终态后再规划"><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">Planner 必须严格晚于本次所有已选 Source 的终态。等待期间 UI 只展示平台/垂类进度和原因，不展示
部分价格、临时预算或候选方案。终态不等于报价成功；失败、登录、验证码、页面漂移、超时和取消
也必须类型化落地。不得无限等待，不得让 LLM 修改 deadline，不得把失败伪装成成功来通过调度器。</p>
<p dir="auto">只有一家来源有可用报价时允许输出有限方案，但必须明确“未形成跨平台比价”。零报价时只能输出
阻断报告和安全重试动作，预算与方案必须为空。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">4. 允许跨平台混合组合</h3><a id="user-content-4-允许跨平台混合组合" class="anchor" aria-label="Permalink: 4. 允许跨平台混合组合" href="#4-允许跨平台混合组合"><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">机票、每段酒店、接驳和活动可来自不同平台。不得隐藏设置“同平台优先”，不得假设组合优惠，
除非存在同条件、可回链的明确证据。比较必须绑定人数、房间、日期、稳定商品身份、权益、税费、
行李、早餐、退改和币种，不能把不同商品口径混为同价。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">5. 只提供官方预订交接，不提供支付能力</h3><a id="user-content-5-只提供官方预订交接不提供支付能力" class="anchor" aria-label="Permalink: 5. 只提供官方预订交接，不提供支付能力" href="#5-只提供官方预订交接不提供支付能力"><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">产品文案统一为“官方预订跳转”“去官方页面”。TripChord 不下单、不支付、不用优惠券、不锁库存。
每个组件必须先完成同平台、同条件实时重核价，再经过 URL 安全门，才生成短期 handoff。价格、条款、
身份或库存发生实质变化时旧 handoff 立即失效，并重新进入 Verifier，必要时 Repair。</p>
<p dir="auto">现有 <code>TravelOffer.booking_url</code> 和 <code>BrowserQuote.page_url</code> 都不能直接暴露为跳转。必须新增独立的
<code>OfficialHandoff</code> / <code>OfficialDetailLocator</code> / receipt 合同，逐跳校验 scheme、官方 host、path、
query keys、redirect 和报价绑定。拒绝短链、开放重定向、账号、登录、订单、checkout、cashier、
payment、coupon 等路径。平台不能稳定定位商品时，退化为官方搜索页加精确参数卡片，不猜 URL。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">6. 已预订只来自用户声明，并成为强约束</h3><a id="user-content-6-已预订只来自用户声明并成为强约束" class="anchor" aria-label="Permalink: 6. 已预订只来自用户声明，并成为强约束" href="#6-已预订只来自用户声明并成为强约束"><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">打开官方页面不等于已预订。只有用户显式点击“我已完成预订”才能生成 append-only 的本地
Booking Fact；不得读取平台订单来自动确认。Booking Checklist、Booking Fact、
Protected Component Constraint 和解除保护请求必须分层建模并持久化。</p>
<p dir="auto">Candidate Generator、Optimizer、Planner、Verifier、Repair、ReVerifier、Safety Gate 和事件重规划
都必须消费同一组已预订约束。未解除保护时，已预订组件不得被删除、换项、改日期、改人数或静默
重定价。事件命中已预订项时，输出冲突和用户处理选项，不自动替换。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">7. Agent 与硬代码边界</h3><a id="user-content-7-agent-与硬代码边界" class="anchor" aria-label="Permalink: 7. Agent 与硬代码边界" href="#7-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>
<ul dir="auto">
<li>Agent 负责：需求语义、偏好权重建议、查询优先级、候选评议、风险批判、修复提案和解释；</li>
<li>确定性代码负责：权限、Selection Snapshot、任务白名单、并发/预算、终态、超时、金额、时间、
稳定身份、URL、硬约束、Booking Fact、发布和最终安全否决；</li>
<li>不要为了“更像 Agent 项目”把金额、权限、URL 或真值校验交给 LLM；</li>
<li>也不要把 Agent 退化成无作用的装饰调用。模型提案必须在允许范围内真实影响查询顺序、候选评议、
Repair 或解释，并留下 proposal、applied action 与拒绝原因；</li>
<li>Agent 数和模型并发继续由确定性预算控制器按 D/C/G/事件范围动态派生，不能由模型无限扩容，
当前请求级逻辑 Agent 上限 96、模型 HTTP 并发上限 12、Chrome lease 上限 6、去哪儿住宿并发
上限 1；若要调整，必须先有版本化 benchmark 和反例证据，不能因为模型便宜就放宽。</li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">五、持续实施协议</h2><a id="user-content-五持续实施协议" class="anchor" aria-label="Permalink: 五、持续实施协议" href="#五持续实施协议"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">1. 建立可恢复的实施账本</h3><a id="user-content-1-建立可恢复的实施账本" class="anchor" aria-label="Permalink: 1. 建立可恢复的实施账本" href="#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>
<p dir="auto">创建并持续更新 <code>docs/productization-progress.md</code>，至少记录：</p>
<ul dir="auto">
<li>当前版本、当前阶段和最后一个完成的最小任务；</li>
<li>当前 Git commit/branch、既有修改与本轮修改；</li>
<li>已完成的领域合同、迁移、API、UI、Companion、测试和 benchmark；</li>
<li>精确运行过的命令、结果、失败原因和证据文件；</li>
<li>尚未完成项、外部阻塞、下一条可直接执行的命令；</li>
<li>当前可对外声明与绝对不能声明的内容。</li>
</ul>
<p dir="auto">对路线图每条工作项和退出门使用“未开始、实现中、代码完成、已验证、外部阻塞”之一，并链接到
对应代码、测试、运行产物和提交 SHA。“代码完成”不能自动升级成“已验证”。</p>
<p dir="auto">每个版本创建 <code>docs/phase-reviews/product-vX.Y.md</code>，结论只能是：通过、有条件通过、返工、调整计划。
每次上下文切换前先更新实施账本；下一上下文先读账本、<code>git status</code> 和最近 diff 后继续。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">2. 先建立基线</h3><a id="user-content-2-先建立基线" class="anchor" aria-label="Permalink: 2. 先建立基线" href="#2-先建立基线"><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">在业务代码修改前：</p>
<ol dir="auto">
<li>检查 Git 状态和当前差异，标记既有用户修改；</li>
<li>检查 Python、uv、Node、npm、数据库和浏览器测试环境；</li>
<li>安装锁定依赖；</li>
<li>运行当前静态检查、完整测试、Web 构建、迁移检查、benchmark 和 Companion release gate；</li>
<li>将基线失败与后续引入失败分开记录；</li>
<li>搜索所有固定三平台、<code>exactly three</code>、<code>3/3</code>、固定 provider union、固定超时和旧 <code>booking_url</code>
的代码落点，形成迁移清单。</li>
</ol>
<p dir="auto">不要为了得到绿色基线删除失败测试、放宽断言、改黄金结果或关闭严格模式。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">3. 实施原则</h3><a id="user-content-3-实施原则" class="anchor" aria-label="Permalink: 3. 实施原则" href="#3-实施原则"><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>按 v0.2 → v0.3 → … → v1.0 顺序推进，不能先做漂亮的预订 UI 再补平台真值和终态屏障；</li>
<li>每次先写/更新领域合同与反例测试，再迁移实现，再接 API/UI，再跑端到端；</li>
<li>复用现有实现，先抽取测试缝隙，避免一次性重写 10,000 行 live system 或 2,000 行前端主页面；</li>
<li>数据库变更必须有前向迁移、兼容读取、失败恢复和必要的回滚验证；</li>
<li>API、事件和持久化结构必须版本化，迟到的旧 generation 结果不得污染新运行；</li>
<li>修复真实 planning failure 时新增冻结 benchmark 或 mutation case；</li>
<li>测试只证明测试覆盖范围，不能自动升级成真实平台能力；</li>
<li>不允许留下只在 fixture 中存在、未接入生产路径的“完成”功能；</li>
<li>不允许用 TODO、假数据、吞异常或自动 fallback 隐藏未完成项。</li>
</ul>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">4. 每个版本的固定检查点</h3><a id="user-content-4-每个版本的固定检查点" class="anchor" aria-label="Permalink: 4. 每个版本的固定检查点" href="#4-每个版本的固定检查点"><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">每完成一个版本：</p>
<ol dir="auto">
<li>执行该版本定向测试与全部回归；</li>
<li>执行 <code>git diff --check</code>、Ruff、Mypy、Python tests、Web build/tests、迁移和 Companion 合同；</li>
<li>运行对应 replay、故障注入、mutation 和浏览器 fixture E2E；</li>
<li>对照 <code>docs/roadmap.md</code> 逐项列出计划、实际、偏差、证据和未验证边界；</li>
<li>更新 README、architecture、providers、operations、claim ledger 和 phase review；</li>
<li>只在退出门真的满足时标记该版本通过；</li>
<li>创建范围清晰的本地阶段提交，然后立即进入下一版本，不等待用户例行确认。</li>
</ol>
<p dir="auto">可使用子 Agent 并行完成只读审查、后端/前端/Companion 独立测试、政策调查和红队，但共享文件写入
由主控串行整合或放在隔离 worktree。主控必须亲自审查 diff 并重跑证据门，不能因子 Agent 声称完成
就勾选退出门。</p>
<p dir="auto">若测试失败，先定位根因并修复；不得仅报告失败就停止。若遇到外部阻塞，先完成其余全部可执行项，
为阻塞点准备一条可重复的恢复命令和预期证据，再向用户请求最小权限或动作。</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">六、分版本实施与退出门</h2><a id="user-content-六分版本实施与退出门" class="anchor" aria-label="Permalink: 六、分版本实施与退出门" href="#六分版本实施与退出门"><svg data-component="Octicon" class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">v0.2：动态平台内核</h3><a id="user-content-v02动态平台内核" class="anchor" aria-label="Permalink: v0.2：动态平台内核" href="#v02动态平台内核"><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">必须完成：</p>
<ul dir="auto">
<li>新增稳定的 <code>ProviderScopeKey(provider, vertical)</code>、<code>ProviderCapability</code>、用户选择、Eligibility 与
不可变 Selection Snapshot（含 capability version、adapter version、SHA、排除原因）；</li>
<li>先形成内部统一的 <code>ProviderAdapter</code> 接口和版本化 capability profile，再用 Registry 替代后端、
前端、Companion、Query Planner、live system 与 Done-Gate 中固定
三平台集合；保留显式旧 profile 兼容，不静默篡改历史证据；</li>
<li>Companion 使用逐 scope 可选 host permission，心跳报告实际授权 scopes、adapter/contract version
和 runtime instance，不再要求三平台全部在线；</li>
<li>API 与 UI 提供 <code>平台 × 垂类</code> 能力矩阵，默认全选合格单元格，用户可逐项关闭；</li>
<li>每个必需垂类至少保留一个合格来源，为 0 时在任何模型/浏览器调用前拒绝启动；</li>
<li>拆分必要的 Provider Policy、Source Runtime、Barrier、Planning Pipeline 和前端页面边界。</li>
<li>从 v0.2 起，每次修改 Companion 后立即运行其定向合同和 release gate；v0.9 负责把同一门正式
接入远端 CI，而不是此前都不验证。</li>
</ul>
<p dir="auto">退出门：0、1、2、3、4 平台回放都能构建正确 DAG；关闭/未授权 scope 的浏览器任务、模型工具调用
和网络访问均为 0；伪造 provider/snapshot hash 原子拒绝；旧三平台场景兼容测试不回退。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">v0.3：全来源终态屏障与诚实发布</h3><a id="user-content-v03全来源终态屏障与诚实发布" class="anchor" aria-label="Permalink: v0.3：全来源终态屏障与诚实发布" href="#v03全来源终态屏障与诚实发布"><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">必须完成：</p>
<ul dir="auto">
<li>统一跨垂类 Source 终态；</li>
<li>实现持久化 SearchRun、SourceAttempt、TerminalReceipt 和 Completion Barrier；</li>
<li>调度器新增原生 <code>ALL_TERMINAL</code> 依赖与独立 settle node，Normalizer 依赖 settle，Planner 再依赖
Normalizer，禁止靠 <code>success=true</code> 伪装失败来源；</li>
<li>新增 <code>ScopeCancellationTombstone</code> 与 generation；普通重试、publication refresh、failover、延迟
唤醒和 event replan 都必须检查，迟到结果不得进入 Planner；</li>
<li>deadline/总预算由确定性 timeout profile、波次和所选矩阵派生；到期主动物化 <code>timed_out</code>；</li>
<li>SSE 在屏障前只发送进度/终态，屏障后才一次性给最终结果；</li>
<li>持久化恢复、取消、幂等和重启语义明确。</li>
</ul>
<p dir="auto">退出门：Planner 首次调用时间严格晚于最后一个已选 Source 的 <code>terminal_at</code>；无 queued/running/unknown
仍可发布的路径；取消后新增任务为 0；单来源如实披露；零报价无预算和方案；无无限等待。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">v0.4：跨平台最终方案与覆盖解释</h3><a id="user-content-v04跨平台最终方案与覆盖解释" class="anchor" aria-label="Permalink: v0.4：跨平台最终方案与覆盖解释" href="#v04跨平台最终方案与覆盖解释"><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">必须完成：</p>
<ul dir="auto">
<li>Planner 可为机票、每段酒店、接驳和活动独立选择 provider，并保留 package/component provenance；</li>
<li>建立稳定商品/权益比较身份和完整金额口径；</li>
<li>Verifier 校验分开交易、衔接、行李直挂、退改、税费、币种和不可同时满足的条件；</li>
<li>方案 UI 优先展示有证据的省钱、稳妥和少折腾取舍；证据不足时不凑满三个方案；</li>
<li>展示每组件平台、报价时间、到期时间、可比条件、跳转次数、覆盖来源和失败终态；</li>
<li>把 Source settlement、exact quote coverage 和 comparable component coverage 分开统计。</li>
</ul>
<p dir="auto">退出门：固定回放能生成 A 平台机票 + B 平台酒店；返回顺序不影响确定性结果；金额/权益属性测试
无错配；Agent 不能绕过 Hard Verifier；Repair 后独立 ReVerifier 重新计算。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">v0.5：官方预订跳转与逐组件清单</h3><a id="user-content-v05官方预订跳转与逐组件清单" class="anchor" aria-label="Permalink: v0.5：官方预订跳转与逐组件清单" href="#v05官方预订跳转与逐组件清单"><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">必须完成：</p>
<ul dir="auto">
<li>新增 <code>OfficialHandoff</code>、<code>OfficialDetailLocator</code>、短期/单次 receipt、URL Policy 和失效机制；</li>
<li>每个平台声明详情页、预填搜索页或仅参数卡片能力；</li>
<li>组件级重核价只查询同 provider × component，不默认重跑整趟行程；</li>
<li>用户动作分两步：“重核价并查看差异”与“去官方页面”，后台不能自动打开/聚焦；</li>
<li>价格、权益、身份、日期、人数/房间或库存变化时撤销旧 handoff，重新验证/Repair；</li>
<li>逐跳拒绝非官方域名、短链、开放重定向、登录、订单、checkout、payment、coupon 和未知路径；</li>
<li>构建逐组件清单和建议操作顺序，但此阶段点击绝不能产生 booked 状态。</li>
</ul>
<p dir="auto">退出门：每个 handoff 可回链同一 plan version/component/offer/query/revalidation receipt；所有危险
URL mutation 零错误放行；旧/过期 receipt 不可用；没有稳定 deep-link 时安全降级；自动化测试绝不
提交订单或支付。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">v0.6：已预订保护与事件闭环</h3><a id="user-content-v06已预订保护与事件闭环" class="anchor" aria-label="Permalink: v0.6：已预订保护与事件闭环" href="#v06已预订保护与事件闭环"><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">必须完成：</p>
<ul dir="auto">
<li>持久化 Booking Checklist、Booking Item、User Booking Acknowledgement、append-only Booking Fact、
Protected Constraint 和 Constraint Override Request；</li>
<li>只有明确用户动作能创建/撤销 Booking Fact；打开链接、Agent 输出和平台页面文字都不能；</li>
<li>protected invariant 贯穿候选生成、优化、Planner、Verifier、Repair、ReVerifier、Safety Gate、
local/global/event replan；</li>
<li>实现手动事件、用户开启的监控、预订前重核价变化和公共事件；</li>
<li>Impact Analyzer 先确定受影响集合，只重查必要 scope；</li>
<li>已预订项受影响时进入用户处理状态，未明确解除前不自动替换；</li>
<li>输出旧/新版本 diff、保留项、变化原因、证据和预算。</li>
</ul>
<p dir="auto">退出门：属性/故障测试中未解除保护的已预订组件修改率为 0；局部修复保留无关组件；全局重规划仍
继承保护；解除保护必须显式确认并留痕；实时变化只能来自新工具回执，不能来自 RAG/旧缓存。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">v0.7：Provider SDK 与认证门</h3><a id="user-content-v07provider-sdk-与认证门" class="anchor" aria-label="Permalink: v0.7：Provider SDK 与认证门" href="#v07provider-sdk-与认证门"><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">必须完成：</p>
<ul dir="auto">
<li>把 v0.2 已接入生产路径的内部 ProviderAdapter 接口提炼成公开 SDK，并提供 capability profile
schema、fixture 模板和 conformance test kit；v0.7 不是第一次发明 adapter 抽象；</li>
<li>实现开发、影子、测试、合格、冷却、停用状态机；只有 <code>certified_active</code> 可默认全选；</li>
<li>认证按 <code>provider × vertical</code> 独立进行，机票成功不能证明酒店；</li>
<li>selector/URL/permission/profile 变更都产生新版本和 SHA；</li>
<li>影子 adapter 不进入 Planner、覆盖分母或默认选择；</li>
<li>对智行、同程酒店或其他候选先做 fixture/影子能力，只有获得当前会话真实只读授权并通过 canary、
URL 安全和报价绑定门后才能升级为合格；不能为了凑数量绕过平台边界。</li>
</ul>
<p dir="auto">退出门：新增 provider 只需 adapter + profile，不改核心 Planner/Barrier 枚举；可按垂类一键冷却；
历史 run 保留旧 profile；未认证来源访问数和报价贡献为 0。若缺真实授权，完成全部 SDK/影子工程并
把该来源保持非活跃，继续后续版本，不得把外部阻塞冒充代码未完成或认证成功。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">v0.8：本地优先的完整产品体验</h3><a id="user-content-v08本地优先的完整产品体验" class="anchor" aria-label="Permalink: v0.8：本地优先的完整产品体验" href="#v08本地优先的完整产品体验"><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">必须完成：</p>
<ul dir="auto">
<li>本地启动器/安装器统一管理 API、Web、数据库迁移和 Bridge；</li>
<li>LLM Key 使用系统安全存储或等价安全方案，不进入仓库、前端持久化、旅行数据库、模型上下文和日志；</li>
<li>首次设置向导覆盖本地服务、模型 smoke、Companion 配对、逐平台权限与登录健康；</li>
<li>首页改为旅行工作流，拆分平台设置、搜索进度、方案比较、预订清单、事件中心和证据详情；</li>
<li>默认折叠 Agent DAG、token 和内部回执，普通用户优先看到发生了什么、为什么、下一步；</li>
<li>任务/清单跨刷新和重启恢复；提供数据导出、删除、日志脱敏和默认关闭的匿名遥测；</li>
<li>完成键盘、屏幕阅读器、非颜色状态、可读字号和 WCAG 2.2 AA 审查；</li>
<li>为签名扩展/安装包准备可复现产物，但发布到商店或公网必须另行获得用户授权。</li>
</ul>
<p dir="auto">退出门：全新机器按公开说明可完成 replay；真实模式逐项展示权限；秘密不进入日志/遥测；升级、迁移、
备份和失败回滚有测试；Chrome 安装需要用户确认，但开发者重载不成为公众日常待办。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">v0.9：公开测试版可靠性与评测</h3><a id="user-content-v09公开测试版可靠性与评测" class="anchor" aria-label="Permalink: v0.9：公开测试版可靠性与评测" href="#v09公开测试版可靠性与评测"><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">必须完成：</p>
<ul dir="auto">
<li>把 Companion JS 合同、Python control tests、build-meta/release seal 和 host permissions 加入远端 CI；</li>
<li>增加动态选择矩阵、ALL_TERMINAL、慢源、取消竞态、迟到结果、URL/offer binding、Prompt Injection、
崩溃恢复、幂等和 booked invariant 的冻结 benchmark/mutation suite；</li>
<li>使用干净 Chrome + 本地 fixture 做浏览器 E2E，普通 CI 不依赖真实账号；</li>
<li>job/monitor/清单迁入可恢复存储，验证重启和多租户隔离；</li>
<li>增加 secret scan、CodeQL/SAST、SBOM、依赖审计、构建 provenance 和固定第三方 Actions 版本；</li>
<li>提供本地可观测面板，分开记录终态、报价覆盖、Barrier 延迟、模型成本、Repair 和 handoff；</li>
<li>真实 OTA canary 只能在获得用户授权的发布门运行，证据脱敏并绑定 commit/profile/runtime/query SHA。</li>
</ul>
<p dir="auto">退出门：Python、Web、Companion、迁移、benchmark、浏览器 E2E、安全和可复现构建全部进入 CI；
未授权访问、提前发布、危险链接、错误 booked 和已预订静默变化均为 0；性能门基于冻结真实基线，
不用拍脑袋数字。</p>
<div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">v1.0：最终产品与 Done-Gate</h3><a id="user-content-v10最终产品与-done-gate" class="anchor" aria-label="Permalink: v1.0：最终产品与 Done-Gate" href="#v10最终产品与-done-gate"><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>scripts/run_product_done_gate.py</code>，原子输出脱敏的
<code>benchmarks/results/product-v1-done-gate.json</code>。证据包至少记录 commit、capability/profile/adapter/
Companion 版本、模型模式、选择快照、每个 Source 终态、Barrier 时间、报价覆盖、最终裁决、handoff、
booked invariant、所有子门和证据引用。</p>
<p dir="auto">最终门至少分层验证：</p>
<ol dir="auto">
<li>fresh clone/锁文件/迁移/wheel/Web/容器/安装器可复现；</li>
<li>replay 模式完整走通动态选择 → 全终态 → 跨平台方案 → handoff → 用户确认 → 带保护重规划；</li>
<li>干净 Chrome + 本地恶意 fixture 验证权限、配对、后台、URL 和 Prompt Injection；</li>
<li>OpenAI-compatible 模型在有环境变量授权时完成 required-model smoke 和结构化 Agent 链；</li>
<li>每个对外宣称合格的真实 <code>provider × vertical</code> 都有未过期、已授权的只读 canary；</li>
<li>全平台真实 E2E 只在所有外部条件已满足时运行；未满足则准确指出哪个外部门未过，不能伪造。</li>
</ol>
<p dir="auto">Done-Gate 只有在所有<strong>适用于当前发布声明</strong>的门通过时，才允许 <code>passed=true</code> 且进程退出 0。
HTTP job 成功、测试成功、模型调用成功或所有 Source 终态都不能单独触发通过。某个真实平台认证失败时，
可以从 <code>available/default-selected</code> 中移除后发布核心产品，但 claim ledger 必须明确不再宣称该能力。</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">七、最低验证命令</h2><a id="user-content-七最低验证命令" class="anchor" aria-label="Permalink: 七、最低验证命令" href="#七最低验证命令"><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">根据仓库当前实际脚本调整，但不得少于以下范围：</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git status --short
git diff --check

uv sync --locked --all-groups
uv run ruff check .
uv run mypy apps/api/src
uv run pytest

npm ci
npm run build
npm test
npm audit --omit=dev --audit-level=high

uv run python scripts/browser_companion_release_gate.py

uv run python -m training.train_sft --validate-only
uv run python -m training.train_dpo --validate-only
uv run python -m training.policy_reranker

uv run python benchmarks/evaluate.py
uv run python benchmarks/evaluate_planning.py
uv run python benchmarks/evaluate_repair.py
uv run python benchmarks/evaluate_events.py

docker compose config
docker compose build"><pre>git status --short
git diff --check

uv sync --locked --all-groups
uv run ruff check <span class="pl-c1">.</span>
uv run mypy apps/api/src
uv run pytest

npm ci
npm run build
npm <span class="pl-c1">test</span>
npm audit --omit=dev --audit-level=high

uv run python scripts/browser_companion_release_gate.py

uv run python -m training.train_sft --validate-only
uv run python -m training.train_dpo --validate-only
uv run python -m training.policy_reranker

uv run python benchmarks/evaluate.py
uv run python benchmarks/evaluate_planning.py
uv run python benchmarks/evaluate_repair.py
uv run python benchmarks/evaluate_events.py

docker compose config
docker compose build</pre></div>
<p dir="auto">数据库迁移必须使用临时数据库验证 <code>upgrade head</code>、<code>alembic check</code> 和必要的兼容/回滚路径。
Companion 源码变化后，只能在确认 diff 合理时显式运行 release gate 的 build-meta 更新模式，再重新执行
只读 gate；同时按合同更新扩展版本。不得手工编辑 build-meta 或 release seal，也不能为了过 gate
随意刷新封板。新增产品门、浏览器 E2E 和安全 benchmark 后，把它们加入本清单与 CI。</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="uv run python scripts/browser_companion_release_gate.py --update-build-meta
uv run python scripts/browser_companion_release_gate.py"><pre>uv run python scripts/browser_companion_release_gate.py --update-build-meta
uv run python scripts/browser_companion_release_gate.py</pre></div>
<p dir="auto">最终全门还要运行与 CI 等价的 Python/npm 依赖审计、secret scan、SBOM 与构建来源校验；不得把发现的
高危问题静默加入 allowlist。</p>
<p dir="auto">最终至少保留五个反表面端到端验收：动态 0/1/2/4 provider；慢源或迟到结果绝不提前触发 Planner；
用户关闭 scope 后浏览器任务、模型工具调用和网络访问全为 0；开放重定向/支付路径 handoff 全拒绝；
任意事件序列下未解除保护的 booked component 修改率为 0。</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">八、绝对禁止的伪完成方式</h2><a id="user-content-八绝对禁止的伪完成方式" class="anchor" aria-label="Permalink: 八、绝对禁止的伪完成方式" href="#八绝对禁止的伪完成方式"><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>只更新 README、路线图、接口类型或静态页面，没有把真实生产路径接通；</li>
<li>新增一套旁路 demo，旧 live pipeline 仍固定三平台；</li>
<li>用更多 Agent、更多提示词或更多模型调用代替权限、金额、终态、URL、Booking Fact 等硬合同；</li>
<li>让 Agent 自动恢复用户关闭的平台、登录、验证码或 host permissions；</li>
<li>把 pending、empty、login、timeout、DOM drift 变成报价或第二平台覆盖；</li>
<li>在全部已选来源终态前展示部分方案；</li>
<li>把 <code>page_url</code>、模型生成 URL 或 HTTP 200 当成安全官方详情页；</li>
<li>点击链接后自动标记 booked，或在重规划中静默替换已预订组件；</li>
<li>从 RAG、缓存或旧截图恢复“当前实时价格”；</li>
<li>更新 golden/benchmark 只为让失败消失，不解释行为变化；</li>
<li>通过删除测试、放宽 Hard Verifier、关闭 required-model 或降级严格模式来变绿；</li>
<li>把本地 fixture、单平台 canary、Source 完成或模型成功写成全平台真实业务通过；</li>
<li>在没有用户明确授权时 push、发布、访问真实平台或使用付费服务。</li>
</ul>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">九、只允许因这些事项暂停并请求用户</h2><a id="user-content-九只允许因这些事项暂停并请求用户" class="anchor" aria-label="Permalink: 九、只允许因这些事项暂停并请求用户" href="#九只允许因这些事项暂停并请求用户"><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">仅当剩余工作真的依赖以下条件且所有其他本地工作已完成时，才可暂停：</p>
<ol dir="auto">
<li>用户需要亲自授予或扩大某个平台域名权限；</li>
<li>用户需要亲自登录、处理验证码或恢复平台账号状态；</li>
<li>需要真实 OTA、付费 LLM、签名证书、Chrome Web Store、affiliate/partner 资格；</li>
<li>需要公开 push/release、不可逆数据迁移或删除用户数据；</li>
<li>外部平台政策存在无法由代码或公开资料消除的实质性产品取舍。</li>
</ol>
<p dir="auto">暂停时不要泛泛说“需要你操作”。必须给出：已完成内容、精确阻塞门、为何不能替代、最小用户动作、
完成后将执行的命令、预期成功证据。一次只问一个问题。</p>
<div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">十、最终交付报告</h2><a id="user-content-十最终交付报告" class="anchor" aria-label="Permalink: 十、最终交付报告" href="#十最终交付报告"><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">持续工作直到最终 Done-Gate 真实通过，或只剩上述用户专属外部阻塞。最终报告必须先给一句话结论，
然后提供：</p>
<ul dir="auto">
<li>v0.2 至 v1.0 每个版本的状态和证据文件；</li>
<li>用户实际能完成的完整流程；</li>
<li>Agent 真正做了哪些决策，哪些仍由确定性代码裁决；</li>
<li>Python/Web/Companion/迁移/benchmark/安全/安装器的精确验证结果；</li>
<li>replay、fixture、模型、单平台真实 canary 和全平台真实 E2E 分层结论；</li>
<li>当前支持和默认选择的 <code>provider × vertical</code>；</li>
<li>当前仍不能声称的能力；</li>
<li>Git 状态、本地提交和所有未公开外部动作；</li>
<li>若仍有外部阻塞，只列用户必须处理的最小动作，不能把普通工程问题推给用户。</li>
</ul>
<p dir="auto">现在开始：先进入仓库，阅读全部合同，检查并保护现有修改，建立基线和
<code>docs/productization-progress.md</code>，然后直接实施 v0.2。不要只回复计划。</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>

