{"id":17342,"date":"2026-07-29T03:45:01","date_gmt":"2026-07-29T07:45:01","guid":{"rendered":"https:\/\/wp.glbgpt.com\/?p=17342"},"modified":"2026-07-29T03:45:12","modified_gmt":"2026-07-29T07:45:12","slug":"codex-vs-claude-code","status":"publish","type":"post","link":"https:\/\/wp.glbgpt.com\/hub\/zh\/codex-vs-claude-code","title":{"rendered":"Codex \u4e0e Claude \u7f16\u7801\u5242\uff1a\u54ea\u79cd\u7f16\u7801\u5242\u66f4\u9002\u5408\u60a8\u7684\u5de5\u4f5c\u6d41\u7a0b\uff1f"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>Codex \u4e0e Claude Code \u7684\u5bf9\u6bd4\uff0c\u4e0e\u5176\u8bf4\u662f\u4e3a\u4e86\u627e\u51fa\u4e00\u4e2a\u653e\u4e4b\u56db\u6d77\u7686\u51c6\u7684\u8d62\u5bb6\uff0c\u4e0d\u5982\u8bf4\u662f\u4e3a\u4e86\u9009\u62e9\u4e00\u79cd\u4f60\u80fd\u6bcf\u5929\u4fe1\u8d56\u7684\u5de5\u4f5c\u65b9\u5f0f\u3002.<\/strong> \u8fd9\u4e24\u6b3e\u4ea7\u54c1\u90fd\u80fd\u68c0\u67e5\u4ee3\u7801\u5e93\u3001\u7f16\u8f91\u591a\u4e2a\u6587\u4ef6\u3001\u8fd0\u884c\u547d\u4ee4\u3001\u6267\u884c\u6d4b\u8bd5\u4ee5\u53ca\u89e3\u91ca\u8865\u4e01\u3002\u5b83\u4eec\u4e4b\u95f4\u7684\u5b9e\u8d28\u6027\u5dee\u5f02\u4f53\u73b0\u5728\uff1a\u5de5\u4f5c\u5206\u914d\u7684\u65b9\u5f0f\u3001\u5bf9\u4ee3\u7406\u7684\u5e72\u9884\u9891\u7387\u3001\u53ef\u67e5\u9605\u7684\u8bc1\u636e\u91cf\uff0c\u4ee5\u53ca\u6bcf\u6b3e\u5de5\u5177\u4e0e\u60a8\u73b0\u6709\u5f00\u53d1\u73af\u5883\u7684\u5951\u5408\u7a0b\u5ea6\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u6211\u4eec\u8fdb\u884c\u7684\u56db\u9879\u4efb\u52a1\u53d7\u63a7\u4ed3\u5e93\u6d4b\u8bd5\u4e2d\uff0cCodex \u5f97\u5206 98\/100\uff0c\u800c Claude Code \u5f97\u5206 99\/100\u3002 \u4e24\u8005\u5747\u5b8c\u6210\u4e86\u6838\u5fc3\u5de5\u4f5c\u3002Claude Code \u5c55\u73b0\u51fa\u66f4\u5e7f\u6cdb\u7684\u5ba1\u67e5\u8303\u56f4\u548c\u8fb9\u754c\u60c5\u51b5\u8986\u76d6\uff0c\u800c Codex \u5728\u6211\u4eec\u7684\u6d4b\u8bd5\u73af\u5883\u4e2d\u5f80\u5f80\u4ee5\u66f4\u5c0f\u7684\u8303\u56f4\u5c31\u8fbe\u5230\u4e86\u6240\u9700\u7ed3\u679c\uff0c\u5e76\u4ea7\u751f\u4e86\u66f4\u5f3a\u6709\u529b\u7684\u8fd0\u884c\u7ea7\u8bc1\u636e\u3002\u5728\u4e00\u4e2a\u5c0f\u578b Python \u6d4b\u8bd5\u7528\u4f8b\u4e0a\u4ec5\u6709\u4e00\u5206\u7684\u5dee\u8ddd\uff0c\u5c1a\u4e0d\u8db3\u4ee5\u5ba3\u5e03\u5168\u7403\u80dc\u8005\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0d\u5e0c\u671b\u5de5\u4f5c\u6d41\u7684\u5176\u4ed6\u90e8\u5206\u88ab\u7ed1\u5b9a\u5230\u67d0\u4e2a\u7279\u5b9a\u7f16\u7801\u4ee3\u7406\u7684\u5f00\u53d1\u8005\uff0c\u53ef\u4ee5\u5c06 GlobalGPT \u4f5c\u4e3a\u72ec\u7acb\u7684\u591a\u6a21\u578b\u548c\u591a\u6a21\u6001\u5c42\u8fdb\u884c\u96c6\u6210\u3002 GlobalGPT \u5c06 100 \u591a\u4e2a\u9876\u7ea7\u6a21\u578b\uff08\u5982 GPT 5.6\u3001Claude Opus 5 \u548c GPT Image 2\uff09\u6574\u5408\u5230\u4e00\u4e2a\u4eea\u8868\u76d8\u4e2d\u3002\u6b64\u5916\uff0c\u8be5 <a href=\"https:\/\/www.glbgpt.com\/home\/cli?inviter=hub_content_cli&amp;login=1\">GlobalGPT CLI<\/a>, MCP \u548c Skill \u8def\u5f84\u53ef\u901a\u8fc7 Codex \u6216 Claude Code \u7528\u4e8e\u5bfb\u6c42\u7b2c\u4e8c\u610f\u89c1\u3001\u89c4\u5212\u3001\u6587\u6863\u7f16\u5236\u6216\u5176\u4ed6\u53d7\u652f\u6301\u7684\u6a21\u578b\uff0c\u800c\u539f\u751f\u7f16\u7801\u4e3b\u673a\u5219\u7ee7\u7eed\u63a7\u5236\u4ee3\u7801\u5e93\u7684\u7f16\u8f91\u548c\u6d4b\u8bd5\u3002.<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"645\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-1024x645.png\" alt=\"globalgpt \u4eea\u8868\u76d8\" class=\"wp-image-19280\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-1024x645.png 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-300x189.png 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-18x11.png 18w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-767x483.png 767w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-1536x967.png 1536w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/glb-2048x1289.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-3e41869c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link has-black-color has-text-color has-background has-link-color wp-element-button\" href=\"https:\/\/www.glbgpt.com\/home?inviter=hub_popup&amp;login=1\" style=\"background:linear-gradient(135deg,rgba(250,183,0,0.55) 0%,rgba(255,106,0,0.66) 96%)\"><strong>\u5728 GlobalGPT \u4e0a\u8bd5\u7528 100 \u591a\u79cd\u9876\u7ea7\u6a21\u578b<\/strong><\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u8be5\u5bf9\u6bd4\u7efc\u5408\u4e86\u5b98\u65b9\u8ba1\u5212\u4fe1\u606f\u3001\u5b9e\u9645\u7684\u4ee3\u7801\u5e93\u64cd\u4f5c\u3001\u5b8c\u6574\u4e14\u53ef\u6269\u5c55\u7684\u8f93\u51fa\u7ed3\u679c\uff0c\u4ee5\u53ca\u6807\u6ce8\u6e05\u6670\u7684\u793e\u533a\u4f7f\u7528\u4f53\u9a8c\u3002\u5176\u76ee\u7684\u662f\u5e2e\u52a9\u72ec\u7acb\u5f00\u53d1\u8005\u9009\u62e9\u4e3b\u8981\u7f16\u7801\u5de5\u5177\uff0c\u540c\u65f6\u907f\u514d\u56e0\u8ba2\u9605\u8bbf\u95ee\u6743\u9650\u3001\u989d\u5916\u79ef\u5206\u548cAPI\u8ba1\u8d39\u7b49\u95ee\u9898\u800c\u611f\u5230\u56f0\u60d1\u3002.<\/p>\n\n\n\n<style>\n.cvc-toc{margin:28px 0;padding:22px;border:1px solid #e2e6ec;border-radius:8px;background:linear-gradient(145deg,#fff 0%,#f7f9fc 100%);color:#18202b;font:14px\/1.4 Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif}.cvc-toc *{box-sizing:border-box}.cvc-toc .head{display:flex;align-items:end;justify-content:space-between;gap:16px;margin-bottom:16px}.cvc-toc h2{margin:0;font-size:20px}.cvc-toc .hint{color:#667085;font-size:12px}.cvc-toc ol{display:grid;grid-template-columns:1fr 1fr;gap:8px 18px;margin:0;padding:0;list-style:none;counter-reset:toc}.cvc-toc li{counter-increment:toc}.cvc-toc a{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:6px;color:#344054;text-decoration:none;transition:background .15s ease,color .15s ease}.cvc-toc a:before{content:counter(toc,decimal-leading-zero);min-width:24px;color:#2563eb;font-size:11px;font-weight:800;letter-spacing:.04em}.cvc-toc a:hover{background:#eef4ff;color:#174ea6}@media(max-width:720px){.cvc-toc ol{grid-template-columns:1fr}.cvc-toc .head{align-items:start;flex-direction:column}.cvc-toc{padding:18px}}\n<\/style>\n<nav class=\"cvc-toc\" aria-label=\"\u76ee\u5f55\">\n  <div class=\"head\"><h2>\u5728\u6b64\u6bd4\u8f83\u4e2d<\/h2><span class=\"hint\">\u8df3\u8f6c\u5230\u67d0\u4e00\u5c0f\u8282<\/span><\/div>\n  <ol>\n    <li><a href=\"#quick-comparison\">\u5feb\u901f\u5bf9\u6bd4<\/a><\/li><li><a href=\"#what-they-are\">\u8fd9\u4e9b\u5de5\u5177\u662f\u4ec0\u4e48<\/a><\/li><li><a href=\"#workflow-control\">\u5de5\u4f5c\u6d41\u7a0b\u4e0e\u63a7\u5236<\/a><\/li><li><a href=\"#repository-understanding\">\u5bf9\u4ee3\u7801\u5e93\u7684\u7406\u89e3<\/a><\/li><li><a href=\"#implementation\">\u5b9e\u73b0\u4e0e\u9519\u8bef\u4fee\u590d<\/a><\/li><li><a href=\"#code-review\">\u4ee3\u7801\u5ba1\u67e5\u8d28\u91cf<\/a><\/li><li><a href=\"#safety\">\u6743\u9650\u4e0e\u5b89\u5168<\/a><\/li><li><a href=\"#customization\">MCP\u3001\u6280\u80fd\u548c\u81ea\u5b9a\u4e49<\/a><\/li><li><a href=\"#pricing\">\u5b9a\u4ef7\u4e0e\u9650\u5236<\/a><\/li><li><a href=\"#controlled-test\">\u5bf9\u7167\u8bd5\u9a8c<\/a><\/li><li><a href=\"#user-experience\">\u7528\u6237\u62a5\u544a<\/a><\/li><li><a href=\"#globalgpt\">GlobalGPT \u6269\u5c55\u5c42<\/a><\/li><li><a href=\"#which-one\">\u8be5\u9009\u54ea\u4e00\u4e2a<\/a><\/li><li><a href=\"#faq\">\u5e38\u89c1\u95ee\u9898<\/a><\/li>\n  <\/ol>\n<\/nav>\n\n\n\n<h2 id=\"quick-comparison\" class=\"wp-block-heading\">Codex \u4e0e Claude \u4ee3\u7801\u4e00\u89c8<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u51b3\u7b56\u56e0\u7d20<\/th><th>\u300a\u6cd5\u5178\u300b<\/th><th>\u514b\u52b3\u5fb7\u4ee3\u7801<\/th><\/tr><\/thead><tbody><tr><td>\u6838\u5fc3\u4ee3\u7801\u5e93\u76f8\u5173\u5de5\u4f5c<\/td><td>\u53ef\u5728\u53d7\u652f\u6301\u7684 Codex \u754c\u9762\u4e0a\u8bfb\u53d6\u3001\u7f16\u8f91\u3001\u6267\u884c\u547d\u4ee4\u5e76\u9a8c\u8bc1\u66f4\u6539<\/td><td>\u7528\u4e8e\u9605\u8bfb\u3001\u7f16\u8f91\u3001\u6267\u884c\u547d\u4ee4\u4ee5\u53ca\u9a8c\u8bc1\u66f4\u6539\u7684\u5bf9\u8bdd\u5f0f\u7ec8\u7aef\u4ee3\u7406<\/td><\/tr><tr><td>\u6211\u4eec\u5728\u6d4b\u8bd5\u4e2d\u89c2\u5bdf\u5230\u7684\u98ce\u683c<\/td><td>\u5728\u90e8\u5206\u5b9e\u73b0\u548c\u9519\u8bef\u4fee\u590d\u65b9\u9762\u66f4\u52a0\u7cbe\u7b80<\/td><td>\u5728\u4ee3\u7801\u5e93\u5206\u6790\u3001\u6d4b\u8bd5\u548c\u4ee3\u7801\u5ba1\u67e5\u7684\u5e7f\u5ea6\u65b9\u9762\u66f4\u4e3a\u5168\u9762<\/td><\/tr><tr><td>\u5bf9\u4ee3\u7801\u5e93\u7684\u7406\u89e3<\/td><td colspan=\"2\">\u5173\u4e8e\u201c\u51bb\u7ed3\u4efb\u52a1\u201d\u7684\u529f\u80fd\u6027\u5173\u8054<\/td><\/tr><tr><td>\u4ee3\u7801\u5ba1\u67e5<\/td><td>\u53d1\u73b0\u5e76\u4fee\u590d\u4e86\u4e24\u4e2a\u6709\u6548\u7684\u3001\u4e25\u91cd\u7a0b\u5ea6\u8f83\u9ad8\u7684\u7f3a\u9677<\/td><td>\u62a5\u544a\u4e86\u66f4\u591a\u53ef\u91cd\u73b0\u7684\u95ee\u9898\uff0c\u5e76\u5c06\u95ee\u9898\u6570\u91cf\u4ece19\/20\u964d\u81f318\/20<\/td><\/tr><tr><td>\u89c2\u6d4b\u901f\u5ea6<\/td><td colspan=\"2\">\u7ed3\u679c\u53c2\u5dee\u4e0d\u9f50\uff1b\u5404\u8d5b\u533a\u7684\u73af\u5883\u5dee\u5f02\u8f83\u5927\uff0c\u96be\u4ee5\u4ea7\u751f\u4e00\u540d\u7edd\u5bf9\u7684\u51a0\u519b<\/td><\/tr><tr><td>\u6d88\u8d39\u7ea7\u5165\u95e8\u4ea7\u54c1<\/td><td>\u6bcf\u6708$20\uff0c\u901a\u8fc7\u76f8\u5173\u7684ChatGPT\u8ba1\u5212<\/td><td>Claude Pro\uff1a\u5728\u7f8e\u56fd\u6bcf\u6708$20<\/td><\/tr><tr><td>\u4f7f\u7528\u91cf\u8f83\u9ad8\u7684\u7b49\u7ea7<\/td><td>$100 \u548c $200 \u7b49\u7ea7<\/td><td>\u5728 $100 \u65f6\u6700\u5927 5 \u500d\uff0c\u5728 $200 \u65f6\u6700\u5927 20 \u500d<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u8be5\u8868\u683c\u63cf\u8ff0\u7684\u662f\u4e00\u4e2a\u8d2d\u4e70\u51b3\u7b56\uff0c\u800c\u975e\u6a21\u578b\u6392\u540d\u699c\u3002\u4e0d\u540c\u7684\u6a21\u578b\u8bbe\u7f6e\u3001\u4ee3\u7801\u4ed3\u5e93\u3001\u6743\u9650\u914d\u7f6e\u6216\u4efb\u52a1\u89c4\u8303\u90fd\u53ef\u80fd\u5bfc\u81f4\u7ed3\u679c\u53d1\u751f\u53d8\u5316\u3002\u5982\u679c\u60a8\u5df2\u7ecf\u5728\u4f7f\u7528\u67d0\u6b3e\u4ea7\u54c1\uff0c\u6700\u5408\u9002\u7684\u5bf9\u6bd4\u65b9\u5f0f\u662f\u4f7f\u7528\u60a8\u81ea\u5df1\u4ee3\u7801\u5e93\u4e2d\u4e00\u4e2a\u5177\u6709\u76f8\u540c\u6210\u529f\u547d\u4ee4\u4e14\u4e0d\u8fdb\u884c\u8d28\u91cf\u91cd\u8bd5\u7684\u9650\u5b9a\u4efb\u52a1\u3002.<\/p>\n\n\n\n<style>\n.cvc-profile{--ink:#18202b;--muted:#667085;--line:#e5e8ee;--codex:#2563eb;--claude:#d97706;margin:28px 0;padding:22px;border:1px solid var(--line);border-radius:8px;background:linear-gradient(145deg,#fff 0%,#f8fafc 100%);color:var(--ink);font:14px\/1.45 Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif}.cvc-profile *{box-sizing:border-box}.cvc-profile h3{margin:0 0 4px;font-size:20px}.cvc-profile .sub{margin:0 0 20px;color:var(--muted)}.cvc-profile .legend{display:flex;gap:18px;margin-bottom:18px;font-weight:700}.cvc-profile .dot{display:inline-block;width:9px;height:9px;margin-right:7px;border-radius:2px}.cvc-profile .task{display:grid;grid-template-columns:190px 1fr 52px;gap:12px;align-items:center;margin:13px 0}.cvc-profile .task strong{font-size:13px}.cvc-profile .tracks{display:grid;gap:5px}.cvc-profile .track{height:9px;overflow:hidden;border-radius:5px;background:#e9edf3}.cvc-profile .fill{height:100%;border-radius:5px}.cvc-profile .codex{background:var(--codex)}.cvc-profile .claude{background:var(--claude)}.cvc-profile .score{text-align:right;font-variant-numeric:tabular-nums;font-weight:800}.cvc-profile .note{margin:18px 0 0;padding-top:14px;border-top:1px solid var(--line);color:var(--muted);font-size:12px}@media(max-width:650px){.cvc-profile .task{grid-template-columns:1fr 46px}.cvc-profile .task>strong{grid-column:1\/-1}.cvc-profile{padding:18px}}\n<\/style>\n<section class=\"cvc-profile\" aria-label=\"\u53d7\u63a7\u6d4b\u8bd5\u6210\u7ee9\u5206\u5e03\u60c5\u51b5\">\n  <h3>\u53d7\u63a7\u6d4b\u8bd5\u914d\u7f6e\u6587\u4ef6<\/h3>\n  <p class=\"sub\">\u7b2c\u4e00\u4e2a\u6709\u6548\u7ed3\u679c\uff0c\u91c7\u7528\u76f8\u540c\u7684\u56fa\u5b9a\u8bc4\u5206\u6807\u51c6\u3002\u5404\u6761\u67f1\u72b6\u56fe\u5747\u6309\u6bcf\u9879\u4efb\u52a1\u7684\u6ee1\u5206\u8fdb\u884c\u4e86\u5f52\u4e00\u5316\u5904\u7406\u3002.<\/p>\n  <div class=\"legend\"><span><i class=\"dot\" style=\"background:#2563eb\"><\/i>\u300a\u6cd5\u5178\u300b<\/span><span><i class=\"dot\" style=\"background:#d97706\"><\/i>\u514b\u52b3\u5fb7\u4ee3\u7801<\/span><\/div>\n  <div class=\"task\"><strong>T1 \u00b7 \u5bf9\u4ee3\u7801\u5e93\u7684\u7406\u89e3<\/strong><div class=\"tracks\"><div class=\"track\"><div class=\"fill codex\" style=\"width:100%\"><\/div><\/div><div class=\"track\"><div class=\"fill claude\" style=\"width:100%\"><\/div><\/div><\/div><span class=\"score\">20 \/ 20<\/span><\/div>\n  <div class=\"task\"><strong>T2 \u00b7 \u591a\u6587\u4ef6\u529f\u80fd<\/strong><div class=\"tracks\"><div class=\"track\"><div class=\"fill codex\" style=\"width:100%\"><\/div><\/div><div class=\"track\"><div class=\"fill claude\" style=\"width:100%\"><\/div><\/div><\/div><span class=\"score\">30 \/ 30<\/span><\/div>\n  <div class=\"task\"><strong>T3 \u00b7 \u590f\u4ee4\u65f6\u6f0f\u6d1e\u4fee\u590d<\/strong><div class=\"tracks\"><div class=\"track\"><div class=\"fill codex\" style=\"width:100%\"><\/div><\/div><div class=\"track\"><div class=\"fill claude\" style=\"width:100%\"><\/div><\/div><\/div><span class=\"score\">30 \/ 30<\/span><\/div>\n  <div class=\"task\"><strong>T4 \u00b7 \u68c0\u67e5\u4e0e\u7ef4\u4fee<\/strong><div class=\"tracks\"><div class=\"track\"><div class=\"fill codex\" style=\"width:90%\"><\/div><\/div><div class=\"track\"><div class=\"fill claude\" style=\"width:95%\"><\/div><\/div><\/div><span class=\"score\">18 \/ 19<\/span><\/div>\n  <p class=\"note\">\u8be5\u56fe\u8868\u5c55\u793a\u4e86\u8fd9\u4e00\u5206\u4e4b\u5dee\u7684\u6765\u6e90\uff1b\u5b83\u5e76\u4e0d\u80fd\u5c06\u4e00\u573a\u5c0f\u6bd4\u8d5b\u8f6c\u5316\u4e3a\u4e00\u9879\u7efc\u5408\u6392\u540d\u3002.<\/p>\n<\/section>\n\n\n\n<h2 id=\"what-they-are\" class=\"wp-block-heading\">\u201cCodex\u201d\u548c\u201cClaude\u201d\u4ee3\u7801\u7a76\u7adf\u662f\u4ec0\u4e48<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Codex \u548c Claude Code \u662f\u4ee3\u7406\u4ea7\u54c1\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u578b\u53f7\u540d\u79f0\u3002\u5176\u5e95\u5c42 <a href=\"https:\/\/www.glbgpt.com\/hub\/best-ai-model-for-coding\/\">\u7528\u4e8e\u7f16\u7801\u7684AI\u6a21\u578b<\/a> \u867d\u7136\u6a21\u578b\u5f88\u91cd\u8981\uff0c\u4f46\u5468\u56f4\u7684\u6846\u67b6\u4e5f\u51b3\u5b9a\u4e86\u4ee3\u7406\u80fd\u591f\u67e5\u770b\u54ea\u4e9b\u6587\u4ef6\u3001\u53ef\u4ee5\u6267\u884c\u54ea\u4e9b\u547d\u4ee4\u3001\u5ba1\u6279\u673a\u5236\u5982\u4f55\u8fd0\u4f5c\u3001\u4e0a\u4e0b\u6587\u5982\u4f55\u4fdd\u7559\uff0c\u4ee5\u53ca\u4efb\u52a1\u5b8c\u6210\u540e\u54ea\u4e9b\u8bc1\u636e\u4f1a\u88ab\u4fdd\u7559\u3002\u5982\u679c\u4ec5\u6bd4\u8f83\u6a21\u578b\u7684\u58f0\u8a89\uff0c\u5c31\u4f1a\u5ffd\u7565\u5f00\u53d1\u8005\u6240\u83b7\u5f97\u7684\u5927\u90e8\u5206\u4f7f\u7528\u4f53\u9a8c\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Codex \u6db5\u76d6\u4e86\u547d\u4ee4\u884c\u3001IDE\u3001\u684c\u9762\u548c\u4e91\u7aef\u5de5\u4f5c\u6d41\u3002\u8fd9\u79cd\u5e7f\u6cdb\u7684\u5e94\u7528\u8303\u56f4\u4f7f\u5176\u65e2\u9002\u5408\u76f4\u63a5\u7684\u672c\u5730\u534f\u4f5c\uff0c\u4e5f\u9002\u5408\u8303\u56f4\u66f4\u6709\u9650\u7684\u4efb\u52a1\u59d4\u6d3e\u3002Claude Code \u4ee5\u5bf9\u8bdd\u5f0f\u7ec8\u7aef\u5de5\u4f5c\u6d41\u4e3a\u6838\u5fc3\uff0c\u652f\u6301\u591a\u79cd\u96c6\u6210\uff0c\u5e76\u63d0\u4f9b\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u529f\u80fd\uff1b\u8fd9 <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-claude-ai-for-coding\/\">Claude\u7f16\u7801\u4f7f\u7528\u6307\u5357<\/a> \u5bf9\u8be5\u5de5\u4f5c\u6d41\u8fdb\u884c\u4e86\u66f4\u5168\u9762\u7684\u4ecb\u7ecd\u3002\u5bf9\u4e8e\u4e00\u4e9b\u5f00\u53d1\u8005\u6765\u8bf4\uff0c\u5728\u7ec8\u7aef\u4e2d\u89c2\u5bdf\u4ee3\u7406\u7a0b\u5e8f\u7684\u5de5\u4f5c\u8fc7\u7a0b\u4f1a\u8ba9\u4ed6\u4eec\u611f\u5230\u5b89\u5fc3\u3002\u800c\u5bf9\u53e6\u4e00\u4e9b\u5f00\u53d1\u8005\u800c\u8a00\uff0c\u91cd\u8981\u7684\u6210\u679c\u662f\u6700\u7ec8\u7684\u5dee\u5f02\u62a5\u544a\u3001\u6d4b\u8bd5\u7ed3\u679c\u548c\u5ba1\u8ba1\u65e5\u5fd7\uff0c\u800c\u975e\u6301\u7eed\u7684\u4ea4\u4e92\u8fc7\u7a0b\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e00\u533a\u522b\u8fd8\u89e3\u91ca\u4e86\u4e3a\u4ec0\u4e48\u4e24\u4e2a\u4f7f\u7528\u540d\u4e49\u4e0a\u540c\u6837\u5f3a\u5927\u7684\u6a21\u578b\u7684\u6d4b\u8bd5\uff0c\u5176\u8868\u73b0\u5374\u53ef\u80fd\u4e0d\u540c\u3002\u6d4b\u8bd5\u5e73\u53f0\u51b3\u5b9a\u4e86\u6307\u4ee4\u7684\u5448\u73b0\u65b9\u5f0f\u3001\u5de5\u5177\u7684\u8c03\u7528\u65b9\u5f0f\uff0c\u4ee5\u53ca\u4f55\u65f6\u9700\u8981\u4eba\u5de5\u6279\u51c6\u67d0\u9879\u64cd\u4f5c\u3002\u5982\u679c\u793e\u533a\u6bd4\u8f83\u65f6\u5ffd\u7565\u4e86\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5c31\u53ef\u80fd\u5c06\u4ea7\u54c1\u5c42\u9762\u7684\u884c\u4e3a\u8bef\u8ba4\u4e3a\u662f\u6a21\u578b\u5c42\u9762\u7684\u771f\u5b9e\u60c5\u51b5\u3002.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6a21\u5f0f<\/strong> \u63d0\u4f9b\u4e86\u63a8\u7406\u548c\u751f\u6210\u80fd\u529b\u3002.<\/li>\n\n\n\n<li><strong>\u4ee3\u7406\u7ebf\u675f<\/strong> \u7ba1\u7406\u6587\u4ef6\u3001\u547d\u4ee4\u3001\u4e0a\u4e0b\u6587\u3001\u5ba1\u6279\u548c\u6062\u590d\u3002.<\/li>\n\n\n\n<li><strong>\u7528\u6237\u7684\u4efb\u52a1\u5408\u540c<\/strong> \u786e\u5b9a\u4f5c\u7528\u8303\u56f4\u3001\u6210\u529f\u5224\u5b9a\u4ee5\u53ca\u4ee3\u7406\u4f55\u65f6\u5e94\u505c\u6b62\u3002.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1280\" height=\"800\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated.webp\" alt=\"\u4e00\u7bc7\u5e26\u6ce8\u91ca\u7684X\u5e16\u5b50\u6307\u51fa\uff0c\u4ee3\u7406\u6846\u67b6\u53ef\u80fd\u4f1a\u5f71\u54cd\u7f16\u7801\u4e0e\u4ee3\u7406\u4e4b\u95f4\u7684\u6bd4\u8f83\" class=\"wp-image-17390\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated.webp 1280w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated-300x188.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated-1024x640.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated-768x480.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/x-harness-vs-model-caveat-annotated-18x12.webp 18w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\">\u67d0\u4f4d\u7f51\u53cbX\u7684\u8bc4\u8bba\u6307\u51fa\u4e86\u4e00\u4e2a\u91cd\u8981\u7684\u6bd4\u8f83\u6ce8\u610f\u4e8b\u9879\uff1a\u6d4b\u8bd5\u73af\u5883\u53ef\u80fd\u4f1a\u5f71\u54cd\u7ed3\u679c\u3002\u8fd9\u53ea\u662f\u6709\u7528\u7684\u80cc\u666f\u4fe1\u606f\uff0c\u5e76\u975e\u80fd\u8bc1\u660e\u67d0\u6b3e\u4ea7\u54c1\u66f4\u4f18\u7684\u4e25\u8c28\u8bc1\u636e\u3002.<\/figcaption><\/figure>\n\n\n\n<h2 id=\"workflow-control\" class=\"wp-block-heading\">\u5de5\u4f5c\u6d41\u7a0b\u4e0e\u7ba1\u63a7\uff1a\u6388\u6743\u8fd8\u662f\u6301\u7eed\u5f15\u5bfc\uff1f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5173\u4e8e Codex \u4e0e Claude \u4ee3\u7801\u98ce\u683c\u7684\u8ba8\u8bba\u4e2d\uff0c\u6700\u6709\u4ef7\u503c\u7684\u95ee\u9898\u5f80\u5f80\u4e0d\u662f\u201c\u54ea\u79cd\u80fd\u5199\u51fa\u66f4\u597d\u7684\u4ee3\u7801\uff1f\u201d\uff0c\u800c\u662f\u201c\u6211\u5e0c\u671b\u5982\u4f55\u4f7f\u7528\u5b83\uff1f\u201d \u5bf9\u4e8e\u660e\u786e\u4e14\u8303\u56f4\u6709\u9650\u7684\u4efb\u52a1\uff0c\u53ef\u4ee5\u5c06\u5176\u59d4\u6d3e\u51fa\u53bb\uff0c\u5e76\u8bbe\u5b9a\u7cbe\u786e\u7684\u76ee\u6807\u3001\u5141\u8bb8\u7684\u8303\u56f4\u4ee5\u53ca\u9a8c\u8bc1\u6307\u4ee4\u3002\u800c\u5bf9\u4e8e\u6a21\u7cca\u7684\u91cd\u6784\u4efb\u52a1\uff0c\u5219\u9700\u8981\u901a\u8fc7\u8ba8\u8bba\u3001\u9636\u6bb5\u6027\u5ba1\u67e5\uff0c\u5e76\u5728\u4ee3\u7406\u8fdb\u884c\u8fc7\u591a\u66f4\u6539\u4e4b\u524d\u53ca\u65f6\u8c03\u6574\u5176\u65b9\u5411\uff0c\u624d\u80fd\u53d6\u5f97\u66f4\u597d\u7684\u6548\u679c\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u9700\u6c42\u4e0d\u65ad\u6f14\u53d8\u6216\u67b6\u6784\u51b3\u7b56\u4ecd\u5728\u534f\u5546\u4e2d\u65f6\uff0c\u6301\u7eed\u6307\u5bfc\u5177\u6709\u91cd\u8981\u4ef7\u503c\u3002\u4f46\u5f53\u4ee3\u7406\u53cd\u590d\u8981\u6c42\u505a\u51fa\u672c\u53ef\u901a\u8fc7\u5b58\u50a8\u5e93\u6307\u4ee4\u89e3\u51b3\u7684\u51b3\u7b56\u65f6\uff0c\u8fd9\u79cd\u6307\u5bfc\u5c31\u4f1a\u53d8\u6210\u4e00\u79cd\u6210\u672c\u3002\u5f53\u4efb\u52a1\u5951\u7ea6\u4fdd\u6301\u7a33\u5b9a\u65f6\uff0c\u81ea\u4e3b\u6267\u884c\u5177\u6709\u91cd\u8981\u4ef7\u503c\u3002\u4f46\u5f53\u4ee3\u7406\u505a\u51fa\u672a\u7ecf\u6838\u5b9e\u7684\u5047\u8bbe\uff0c\u6216\u5728\u6ca1\u6709\u660e\u786e\u56de\u6eda\u8def\u5f84\u7684\u60c5\u51b5\u4e0b\u6269\u5927\u8303\u56f4\u65f6\uff0c\u81ea\u4e3b\u6267\u884c\u5c31\u4f1a\u5e26\u6765\u98ce\u9669\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2026\u5e744\u670813\u65e5\u53d1\u5e03\u7684\u4e00\u7bc7\u8be6\u7ec6\u7684Reddit\u62a5\u544a\u63cf\u8ff0\u4e86\u5728\u67d0\u4e2a\u5305\u542b\u7ea680,000\u884cPython\u548cTypeScript\u4ee3\u7801\u3001\u7ea62,800\u4e2a\u6d4b\u8bd5\u7528\u4f8b\u7684\u9879\u76ee\u4e2d\uff0c\u4f7f\u7528Claude Code\u5927\u7ea6\u82b1\u8d39\u4e86100\u5c0f\u65f6\uff0c\u800c\u4f7f\u7528Codex\u5219\u82b1\u8d39\u4e8620\u5c0f\u65f6\u3002 \u4f5c\u8005\u8ba4\u4e3a\uff0cClaude \u901f\u5ea6\u66f4\u5feb\u3001\u4ea4\u4e92\u6027\u66f4\u5f3a\uff0c\u4f46\u9700\u8981\u66f4\u591a\u4eba\u5de5\u5e72\u9884\uff1b\u800c Codex \u5219\u901f\u5ea6\u8f83\u6162\uff0c\u4f46\u64cd\u4f5c\u66f4\u7a33\u59a5\u3002\u8be5\u62a5\u544a\u4e4b\u6240\u4ee5\u7279\u522b\u6709\u4ef7\u503c\uff0c\u662f\u56e0\u4e3a\u5b83\u5305\u542b\u4e86\u9879\u76ee\u80cc\u666f\u548c\u7ecf\u9a8c\u80cc\u666f\uff0c\u4f46\u5b83\u4ecd\u7136\u4ec5\u4ee3\u8868\u4e86\u4e00\u4f4d\u5f00\u53d1\u8005\u7684\u5de5\u4f5c\u6d41\u7a0b\u3002.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1280\" height=\"800\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated.webp\" alt=\"\u4e00\u7bc7\u9644\u6709\u6ce8\u91ca\u7684Reddit\u5e16\u5b50\uff0c\u5bf9\u6bd4\u4e86\u57288\u4e07\u884c\u4ee3\u7801\u7684\u9879\u76ee\u4e2d\u4f7f\u7528Claude Code\u548cCodex\u7684\u4f53\u9a8c\" class=\"wp-image-17391\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated.webp 1280w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated-300x188.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated-1024x640.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated-768x480.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/reddit-claude-code-vs-codex-experience-annotated-18x12.webp 18w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\">\u4e00\u4f4d\u5f00\u53d1\u4eba\u5458\u5728Claude Code\u548cCodex\u4e0a\u7684\u5177\u4f53\u9879\u76ee\u7ecf\u9a8c\u3002\u6587\u4e2d\u5f3a\u8c03\u7684\u89c2\u5bdf\u7ed3\u679c\u5e94\u89c6\u4e3a\u5f85\u9a8c\u8bc1\u7684\u5047\u8bbe\uff0c\u800c\u975e\u8be5\u4ea7\u54c1\u6574\u4f53\u7684\u6027\u80fd\u6570\u636e\u3002.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u81ea\u5df1\u7684\u6d4b\u8bd5\u7ed3\u679c\u5e76\u672a\u5f97\u51fa\u4e00\u4e2a\u660e\u786e\u7684\u8d62\u5bb6\u3002Claude\u5728\u524d\u4e24\u9879\u4efb\u52a1\u4e2d\u5b8c\u6210\u5f97\u66f4\u5feb\uff0c\u800cCodex\u5728\u540e\u4e24\u9879\u4efb\u52a1\u4e2d\u5b8c\u6210\u5f97\u66f4\u5feb\u3002\u6b64\u5916\uff0c\u5f53Claude\u7684CLI\u8eab\u4efd\u9a8c\u8bc1\u8def\u5f84\u4e0d\u53ef\u7528\u65f6\uff0c\u5b83\u542f\u7528\u4e86\u5b50\u4ee3\u7406\u4f5c\u4e3a\u5907\u7528\u65b9\u6848\uff0c\u56e0\u6b64\u4e24\u8005\u7684\u6267\u884c\u8def\u5f84\u5e76\u4e0d\u5b8c\u5168\u7b49\u540c\u4e8e\u5b9e\u9a8c\u5ba4\u73af\u5883\u3002 \u5408\u7406\u7684\u7ed3\u8bba\u662f\uff1a\u901f\u5ea6\u53d6\u51b3\u4e8e\u4efb\u52a1\u3001\u6240\u9009\u6a21\u578b\u3001\u5de5\u4f5c\u91cf\u8bbe\u7f6e\u3001\u4e0a\u4e0b\u6587\u4ee5\u53ca\u4e3b\u673a\u2014\u2014\u800c\u975e\u67d0\u6b3e\u4ea7\u54c1\u603b\u662f\u66f4\u5feb\u3002.<\/p>\n\n\n\n<h2 id=\"repository-understanding\" class=\"wp-block-heading\">\u5bf9\u5b58\u50a8\u5e93\u7684\u7406\u89e3\u4e0e\u4e0a\u4e0b\u6587\u7ba1\u7406<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u4ee3\u7801\u5e93\u7684\u7406\u89e3\u8fdc\u4e0d\u6b62\u4e8e\u7ed9\u6587\u4ef6\u5939\u547d\u540d\u3002\u4e00\u4e2a\u6709\u7528\u7684\u5206\u6790\u5de5\u5177\u5fc5\u987b\u80fd\u591f\u8ffd\u8e2a\u6570\u636e\u5728\u6587\u4ef6\u4e4b\u95f4\u7684\u6d41\u52a8\u8def\u5f84\uff0c\u8bc6\u522b\u9650\u5236\u53d8\u66f4\u7684\u5951\u7ea6\uff0c\u5b9a\u4f4d\u6d4b\u8bd5\u7528\u4f8b\uff0c\u533a\u5206\u75c7\u72b6\u4e0e\u5176\u53ef\u80fd\u7684\u6839\u6e90\uff0c\u5e76\u8bf4\u660e\u7f16\u8f91\u9519\u8bef\u5c42\u7ea7\u6240\u5e26\u6765\u7684\u98ce\u9669\u3002\u8be6\u5c3d\u7684\u6620\u5c04\u56fe\u53ef\u4ee5\u63ed\u793a\u9690\u85cf\u7684\u4e0d\u4e00\u81f4\u4e4b\u5904\uff1b\u800c\u7b80\u6d01\u7684\u6620\u5c04\u56fe\u5219\u80fd\u5e2e\u52a9\u5f00\u53d1\u8005\u66f4\u5feb\u5730\u505a\u51fa\u5b89\u5168\u7684\u5b9e\u73b0\u51b3\u7b56\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u6211\u4eec\u7684\u53ea\u8bfb T1 \u4efb\u52a1\u4e2d\uff0c\u4e24\u4e2a\u4ee3\u7406\u5747\u53d6\u5f97\u4e86 20\/20 \u7684\u6ee1\u5206\uff0c\u4e14\u5176\u7b54\u6848\u5747\u6709\u636e\u53ef\u67e5\u3002Claude Code \u7684\u5206\u6790\u66f4\u4e3a\u5168\u9762\uff0c\u53d1\u73b0\u4e86\u66f4\u591a\u5408\u540c\u4e0d\u4e00\u81f4\u4e4b\u5904\uff1bCodex \u7684\u8868\u8fbe\u66f4\u4e3a\u7b80\u6d01\uff0c\u4f46\u4ecd\u80fd\u51c6\u786e\u8bc6\u522b\u51fa\u76f8\u5173\u6587\u4ef6\u3001\u98ce\u9669\u53ca\u5b9e\u65bd\u65b9\u6848\u3002\u8fd9\u4e24\u79cd\u98ce\u683c\u5747\u65e0\u7edd\u5bf9\u4f18\u52a3\u4e4b\u5206\u3002 \u5728\u5904\u7406\u4e0d\u719f\u6089\u7684\u8fc1\u79fb\u548c\u5ba1\u8ba1\u65f6\uff0c\u8be6\u5c3d\u6027\u66f4\u6709\u5e2e\u52a9\uff1b\u800c\u5f53\u5f00\u53d1\u4eba\u5458\u5df2\u7ecf\u4e86\u89e3\u67b6\u6784\u5e76\u5e0c\u671b\u83b7\u5f97\u9488\u5bf9\u6027\u7684\u53d8\u66f4\u8ba1\u5212\u65f6\uff0c\u7b80\u6d01\u6027\u5219\u66f4\u5177\u4f18\u52bf\u3002.<\/p>\n\n\n\n<style>\n.evidence-t1-repository-understanding{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}\n.evidence-t1-repository-understanding *{box-sizing:border-box}.evidence-t1-repository-understanding .d-head{display:flex;align-items:flex-start;justify-content:space-between;gap:22px;padding:24px 26px 20px;border-bottom:1px solid var(--line)}\n.evidence-t1-repository-understanding .d-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.evidence-t1-repository-understanding .d-title{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.evidence-t1-repository-understanding .d-sub{margin:7px 0 0;color:var(--body);font-size:13px}.evidence-t1-repository-understanding .d-pill{flex:0 0 auto;padding:6px 10px;border:1px solid #ccd6ff;border-radius:999px;color:#2448ca;background:#f0f3ff;font-size:11px;font-weight:800}.evidence-t1-repository-understanding .d-grid{display:grid;grid-template-columns:1fr 1fr}.evidence-t1-repository-understanding .d-side{min-width:0;padding:24px 26px}.evidence-t1-repository-understanding .d-side+.d-side{border-left:1px solid var(--line)}.evidence-t1-repository-understanding .d-product{display:flex;align-items:baseline;justify-content:space-between;gap:14px;font-weight:800}.evidence-t1-repository-understanding .d-score{font-size:34px;line-height:1;letter-spacing:-.05em}.evidence-t1-repository-understanding .d-score small{color:var(--muted);font-size:12px;letter-spacing:0}.evidence-t1-repository-understanding .d-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:18px 0}.evidence-t1-repository-understanding .d-metric{padding:10px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.evidence-t1-repository-understanding .d-metric span{display:block;color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.evidence-t1-repository-understanding .d-metric strong{display:block;margin-top:3px;font-size:13px}.evidence-t1-repository-understanding .d-preview{position:relative;height:192px;overflow:hidden;border:1px solid #29313f;border-radius:6px;background:#11151d;color:#edf0f5}.evidence-t1-repository-understanding .d-preview-label{padding:11px 13px;border-bottom:1px solid rgba(255,255,255,.1);color:#aeb7c7;font:750 9px\/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.06em;text-transform:uppercase}.evidence-t1-repository-understanding .d-preview pre,.evidence-t1-repository-understanding .d-full pre{margin:0;white-space:pre-wrap;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.evidence-t1-repository-understanding .d-preview pre{padding:13px}.evidence-t1-repository-understanding .d-preview:after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:55px;background:linear-gradient(transparent,#11151d)}.evidence-t1-repository-understanding .d-take{margin:14px 0 0;color:var(--body);font-size:12px}.evidence-t1-repository-understanding .d-fulls{padding:0 26px 22px}.evidence-t1-repository-understanding .d-full{margin-top:10px;border:1px solid var(--line);border-radius:6px}.evidence-t1-repository-understanding .d-full summary{cursor:pointer;padding:13px 14px;font-size:12px;font-weight:800;list-style:none}.evidence-t1-repository-understanding .d-full summary::-webkit-details-marker{display:none}.evidence-t1-repository-understanding .d-full summary:after{content:\"+\";float:right;color:var(--blue);font-size:17px}.evidence-t1-repository-understanding .d-full[open] summary:after{content:\"\u2212\"}.evidence-t1-repository-understanding .d-full-pane{padding:0 14px 14px}.evidence-t1-repository-understanding .d-full-note{margin:0 0 9px;color:var(--muted);font-size:10px}.evidence-t1-repository-understanding .d-full pre{max-height:620px;overflow:auto;padding:15px;border-radius:5px;background:#f5f6f8;color:#222936;border:1px solid #e0e3e8}.evidence-t1-repository-understanding .d-limit{margin:0;padding:12px 26px;border-top:1px solid var(--line);color:#5a6270;background:#fafbfc;font-size:11px}\n@media(max-width:760px){.evidence-t1-repository-understanding .d-head{display:block}.evidence-t1-repository-understanding .d-pill{display:inline-block;margin-top:12px}.evidence-t1-repository-understanding .d-grid{grid-template-columns:1fr}.evidence-t1-repository-understanding .d-side+.d-side{border-left:0;border-top:1px solid var(--line)}}@media(max-width:480px){.evidence-t1-repository-understanding .d-head,.evidence-t1-repository-understanding .d-side{padding:20px}.evidence-t1-repository-understanding .d-fulls{padding:0 20px 20px}.evidence-t1-repository-understanding .d-metrics{grid-template-columns:1fr}}\n<\/style><article class=\"evidence-t1-repository-understanding\"><header class=\"d-head\"><div><p class=\"d-kicker\">T1 \u00b7 \u53d7\u63a7\u5b58\u50a8\u5e93\u6d4b\u8bd5<\/p><h3 class=\"d-title\">\u5728\u4fee\u6539\u4e00\u4e2a\u4e0d\u719f\u6089\u7684\u4ee3\u7801\u5e93\u4e4b\u524d\uff0c\u5148\u5bf9\u5176\u8fdb\u884c\u4e86\u89e3<\/h3><p class=\"d-sub\">\u7ed8\u5236\u67b6\u6784\u56fe\u3001\u8ffd\u8e2a\u6570\u636e\u6d41\u3001\u8bc6\u522b\u4f18\u5148\u7ea7\u529f\u80fd\u7684\u98ce\u9669\uff0c\u4e14\u4e0d\u4fee\u6539\u4efb\u4f55\u6587\u4ef6\u3002.<\/p><\/div><span class=\"d-pill\">\u9886\u5e26<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"Codex \u7ed3\u679c\"><div class=\"d-product\"><span>\u300a\u6cd5\u5178\u300b<\/span><span class=\"d-score\">20<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7eed\u65f6\u95f4<\/span><strong>108 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>2 \u57fa\u7ebf<\/strong><\/div><div class=\"d-metric\"><span>\u8303\u56f4<\/span><strong>\u53ea\u8bfb<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u4e2a\u6709\u6548\u7684\u8f93\u51fa\u7247\u6bb5<\/div><pre>\u67b6\u6784\uff1a\u6a21\u578b\u3001\u5b58\u50a8\u5e93\u3001\u670d\u52a1\u4ee5\u53ca\u4e00\u4e2a\u672a\u8fde\u63a5\u7684\u65f6\u95f4\u5b9e\u7528\u7a0b\u5e8f\u3002\n\n\u4e3b\u8981\u98ce\u9669\uff1a\u4f18\u5148\u7ea7\u8bed\u4e49\u672a\u5b9a\u4e49\u3001\u517c\u5bb9\u6027\u3001\u6392\u5e8f\u3001\u9a8c\u8bc1\u4ee5\u53ca\u4f5c\u7528\u57df\u4e0d\u5339\u914d\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8bc4\u8bba\u8005\u89c2\u70b9\uff1a<\/strong> \u7b80\u6d01\u3001\u4ee5\u6587\u4ef6\u4e3a\u4f9d\u636e\uff0c\u4e14\u8db3\u4ee5\u652f\u6301\u8be5\u51bb\u7ed3\u51b3\u5b9a\u3002.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \u4ee3\u7801\u7ed3\u679c\"><div class=\"d-product\"><span>\u514b\u52b3\u5fb7\u4ee3\u7801<\/span><span class=\"d-score\">20<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7eed\u65f6\u95f4<\/span><strong>61 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>2 \u57fa\u7ebf<\/strong><\/div><div class=\"d-metric\"><span>\u8303\u56f4<\/span><strong>\u53ea\u8bfb<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u4e2a\u6709\u6548\u7684\u8f93\u51fa\u7247\u6bb5<\/div><pre>\u4e09\u5c42\u67b6\u6784\u52a0\u4e00\u4e2a\u5b64\u7acb\u6a21\u5757\u3002\u65e0\u5faa\u73af\uff1b\u4f9d\u8d56\u6ce8\u5165\u6781\u5c11\u3002\n\n\u6b64\u5916\uff0c\u8fd8\u66b4\u9732\u51fa\u6807\u8bc6\u7b26\u5206\u914d\u3001\u975e\u5bf9\u79f0\u9519\u8bef\u5951\u7ea6\u4ee5\u53ca\u6d4b\u8bd5\u8986\u76d6\u7387\u4e0d\u8db3\u7b49\u95ee\u9898\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8bc4\u8bba\u8005\u89c2\u70b9\uff1a<\/strong> \u66f4\u5168\u9762\uff0c\u540c\u65f6\u4ecd\u6ee1\u8db3\u76f8\u540c\u7684\u53ea\u8bfb\u7ea6\u5b9a\u3002.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>\u67e5\u770b\u5b8c\u6574\u7684Codex\u8f93\u51fa\u7ed3\u679c<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u3001\u7ecf\u8fc7\u5b89\u5168\u5904\u7406\u7684\u3001\u9996\u6b21\u6709\u6548\u7684\u8f93\u51fa<\/p><pre>## \u67b6\u6784\n\n\u8fd9\u662f\u4e00\u4e2a\u4ec5\u4f7f\u7528\u6807\u51c6\u5e93\u7684\u5c0f\u578b Python \u5305\uff0c\u5305\u542b\u56db\u4e2a\u529f\u80fd\u5c42\uff1a\n\n- **\u6570\u636e\u6a21\u578b\uff1a** [`Job`]() \u662f\u4e00\u4e2a\u4e0d\u53ef\u53d8\u7684\u6570\u636e\u7c7b\uff0c\u5305\u542b `identifier`\u3001`name` \u548c `owner`\u3002`Job.to_dict()` \u901a\u8fc7 `dataclasses.asdict()` \u5bf9\u5176\u8fdb\u884c\u5e8f\u5217\u5316\u3002\n- **\u5b58\u50a8\u5e93\uff1a** [`JobRepository`]() \u5c06\u4efb\u52a1\u5b58\u50a8\u5728\u5185\u5b58\u5b57\u5178\u4e2d\uff0c\u4ee5\u6807\u8bc6\u7b26\u4f5c\u4e3a\u952e\u3002\u8be5\u5b9e\u73b0\u4e0d\u4f7f\u7528\u6570\u636e\u5e93\uff0c\u4e5f\u4e0d\u63d0\u4f9b\u6301\u4e45\u5316\u5b58\u50a8\u3002\n- **\u670d\u52a1\uff1a** [`SchedulerService`]() \u8d1f\u8d23\u6807\u8bc6\u7b26\u5206\u914d\u3001\u8f93\u5165\u89c4\u8303\u5316\u3001\u4efb\u52a1\u521b\u5efa\u3001\u5217\u51fa\u53ca\u5220\u9664\u3002\n- **\u65f6\u95f4\u5b9e\u7528\u51fd\u6570\uff1a** [`next_daily_run()`]() \u7528\u4e8e\u8ba1\u7b97\u4e0b\u4e00\u6b21\u8fd0\u884c\u65f6\u95f4\uff0c\u4f46\u6ca1\u6709\u4efb\u4f55\u4ee3\u7801\u5c06\u5176\u5bfc\u5165\u6216\u4e0e `Job`\u3001`SchedulerService` \u6216 `JobRepository` \u5173\u8054\u3002\n- **\u516c\u5171 API\uff1a** [`scheduler.__init__`]() \u4ec5\u5bfc\u51fa `SchedulerService`\u3002\n\n\u5c3d\u7ba1\u4ed3\u5e93\u540d\u79f0\u5982\u6b64\uff0c\u4f46\u4efb\u52a1\u76ee\u524d\u5e76\u4e0d\u5305\u542b\u8c03\u5ea6\u4fe1\u606f\uff0c\u4e14\u4e0d\u5b58\u5728\u6267\u884c\u961f\u5217\u3002 \u56e0\u6b64\uff0c\u4f18\u5148\u7ea7\u867d\u7136\u4f1a\u5f71\u54cd\u5b58\u50a8\u7684\u5143\u6570\u636e\u548c\u5217\u8868\u6392\u5e8f\uff0c\u4f46\u5728\u4e0d\u5927\u5e45\u6269\u5c55\u7cfb\u7edf\u7684\u60c5\u51b5\u4e0b\uff0c\u65e0\u6cd5\u5f71\u54cd\u5b9e\u9645\u4efb\u52a1\u7684\u6267\u884c\u3002\n\n## \u521b\u5efa\u4e0e\u5217\u51fa\u7684\u6570\u636e\u6d41\n\n\u901a\u8fc7 `SchedulerService.create_job(name, owner)` \u8fdb\u884c\u521b\u5efa\uff1a\n\n1. [`create_job()`]() \u4f1a\u62d2\u7edd\u4ec5\u7531\u7a7a\u683c\u7ec4\u6210\u7684\u540d\u79f0\u3002\n2. \u5b83\u4f1a\u622a\u53d6 `name` \u548c `owner`\uff0c\u7136\u540e\u4f7f\u7528\u670d\u52a1\u7684 `_next_identifier` \u6784\u5efa\u4e00\u4e2a\u4e0d\u53ef\u53d8\u7684 `Job` \u5bf9\u8c61\u3002\n3. [`JobRepository.save()`]() \u5c06\u8be5\u5bf9\u8c61\u5199\u5165 `_jobs[job.identifier]`\u3002\n4. \u8be5\u670d\u52a1\u5c06 `_next_identifier` \u9012\u589e\uff0c\u5e76\u8fd4\u56de\u76f8\u540c\u7684 `Job` \u5bf9\u8c61\u3002\n\n\u901a\u8fc7 `SchedulerService.list_jobs()` \u5217\u51fa\u4efb\u52a1\uff1a\n\n1. [`list_jobs()`]() \u76f4\u63a5\u59d4\u6258\u7ed9 `repository.all()`\u3002\n2. [`JobRepository.all()`]() \u6309\u5b57\u5178\u952e\u7684\u6570\u503c\u5bf9\u7ed3\u679c\u8fdb\u884c\u6392\u5e8f\u3002\n3. \u56e0\u6b64\uff0c\u4efb\u52a1\u6309\u6807\u8bc6\u7b26\/\u521b\u5efa\u65f6\u95f4\u7684\u5347\u5e8f\u8fd4\u56de\uff0c\u800c\u975e\u6309\u8ba1\u5212\u65f6\u95f4\u6216\u4f18\u5148\u7ea7\u6392\u5e8f\u3002\n\n## \u53ef\u80fd\u53d7\u4efb\u52a1\u4f18\u5148\u7ea7\u5f71\u54cd\u7684\u6587\u4ef6\n\n\u5fc5\u4fee\uff1a\n\n- [`scheduler\/models.py`]()\uff1a\u6dfb\u52a0 priority \u5b57\u6bb5\u53ca\u5176\u9ed8\u8ba4\u503c\u3002 \u7531\u4e8e `to_dict()` \u4f7f\u7528 `asdict()`\uff0c\u56e0\u6b64\u4f1a\u81ea\u52a8\u5305\u542b\u8be5\u5b57\u6bb5\u3002\n- [`scheduler\/service.py`]()\uff1a\u63a5\u53d7\u3001\u9a8c\u8bc1\u5e76\u5c06\u4f18\u5148\u7ea7\u4f20\u9012\u7ed9 `Job`\u3002\n- [`tests\/test_scheduler.py`]()\uff1a\u6d4b\u8bd5\u9ed8\u8ba4\u3001\u663e\u5f0f\u3001\u65e0\u6548\u3001\u5e8f\u5217\u5316\u548c\u6392\u5e8f\u884c\u4e3a\u3002\n\n\u6761\u4ef6\u6027\u4fee\u6539\uff1a\n\n- [`scheduler\/repository.py`]()\uff1a\u4ec5\u5f53\u4f18\u5148\u7ea7\u7528\u4e8e\u63a7\u5236\u5217\u8868\u6392\u5e8f\u65f6\uff0c\u624d\u4fee\u6539 `all()`\u3002\u5e94\u4f7f\u7528 `identifier` \u7b49\u786e\u5b9a\u6027\u8f85\u52a9\u952e\u6765\u5904\u7406\u5e76\u5217\u60c5\u51b5\u3002\n- [`scheduler\/__init__.py`]()\uff1a\u4ec5\u5f53\u4f18\u5148\u7ea7\u6210\u4e3a\u516c\u5f00\u679a\u4e3e\u6216\u503c\u5bf9\u8c61\u65f6\u624d\u8fdb\u884c\u66f4\u65b0\u3002\n- [`README.md`]()\uff1a\u8bb0\u5f55\u5141\u8bb8\u7684\u503c\u3001\u9ed8\u8ba4\u503c\u4ee5\u53ca\u6392\u5e8f\u8bed\u4e49\u3002\n\n\u53ef\u80fd\u4e0d\u53d7\u5f71\u54cd\uff1a\n\n- `scheduler\/time_rules.py`\uff0c\u56e0\u4e3a\u5176\u552f\u4e00\u7684\u7b26\u53f7\u4ec5\u5bf9\u4f20\u5165\u7684\u65e5\u671f\u65f6\u95f4\u8fdb\u884c\u64cd\u4f5c\uff0c\u4e0e\u4efb\u52a1\u6216\u5217\u8868\u65e0\u5173\u3002\n\n## \u4e3b\u8981\u98ce\u9669\n\n- **\u8bed\u4e49\u672a\u5b9a\u4e49\uff1a** \u4ee3\u7801\u4e2d\u672a\u63d0\u4f9b\u4efb\u4f55\u5148\u4f8b\u8bf4\u660e\u6570\u503c\u8d8a\u5927\u8fd8\u662f\u8d8a\u5c0f\u4ee3\u8868\u4f18\u5148\u7ea7\u8d8a\u9ad8\u3001\u54ea\u4e9b\u6570\u503c\u662f\u6709\u6548\u7684\uff0c\u4ee5\u53ca\u4f18\u5148\u7ea7\u662f\u5426\u4f1a\u5f71\u54cd\u5217\u8868\u6392\u5e8f\u3002\n- **\u517c\u5bb9\u6027\uff1a** \u5411 `Job` \u6216 `create_job()` \u6dfb\u52a0\u5fc5\u586b\u53c2\u6570\u5c06\u5bfc\u81f4\u73b0\u6709\u8c03\u7528\u8005\u5931\u6548\uff0c\u4f8b\u5982\u5f53\u524d\u6d4b\u8bd5\u4e2d\u7684 `create_job(\"Daily report\", \"Alex\")`\u3002\u8bbe\u7f6e\u9ed8\u8ba4\u503c\u53ef\u4fdd\u6301\u8be5\u8c03\u7528\u7684\u517c\u5bb9\u6027\u3002\n- **\u57fa\u4e8e\u4f4d\u7f6e\u7684\u6784\u9020\u51fd\u6570\u95ee\u9898\uff1a** \u5f53\u524d\u5728 `SchedulerService.create_job()` \u4e2d\uff0c`Job` \u662f\u901a\u8fc7\u57fa\u4e8e\u4f4d\u7f6e\u7684\u65b9\u5f0f\u6784\u9020\u7684\u3002\u5b57\u6bb5\u4f4d\u7f6e\u4ee5\u53ca\u672a\u6765\u7684\u57fa\u4e8e\u4f4d\u7f6e\u7684\u8c03\u7528\u53ef\u80fd\u4f1a\u5728\u65e0\u63d0\u793a\u7684\u60c5\u51b5\u4e0b\u8d4b\u9519\u503c\uff1b\u4f7f\u7528\u5173\u952e\u5b57\u6784\u9020\u4f1a\u66f4\u5b89\u5168\u3002\n- **\u987a\u5e8f\u53d8\u66f4\uff1a** \u66ff\u6362 `JobRepository.all()` \u4e2d\u7684\u6807\u8bc6\u7b26\u987a\u5e8f\u4f1a\u6539\u53d8\u65e2\u5b9a\u884c\u4e3a\u3002\u4f18\u5148\u7ea7\u76f8\u7b49\u7684\u4efb\u52a1\u9700\u8981\u4e00\u4e2a\u7a33\u5b9a\u7684\u51b3\u80dc\u89c4\u5219\u3002\n- **\u9a8c\u8bc1\u6a21\u7cca\u6027\uff1a** \u4e0d\u53d7\u9650\u5236\u7684 Python \u503c\u53ef\u80fd\u5305\u542b\u5b57\u7b26\u4e32\u3001\u5e03\u5c14\u503c\u6216\u4efb\u610f\u6574\u6570\uff0c\u96be\u4ee5\u8fdb\u884c\u4e00\u81f4\u7684\u6bd4\u8f83\u3002\n- **\u6267\u884c\u4f5c\u7528\u57df\u4e0d\u5339\u914d\uff1a** \u5f53\u524d\u4e0d\u5b58\u5728\u8c03\u5ea6\u5668\u6216\u8fd0\u884c\u961f\u5217\u3002\u58f0\u79f0\u4f18\u5148\u7ea7\u4f1a\u6539\u53d8\u54ea\u4e2a\u4f5c\u4e1a\u5148\u6267\u884c\uff0c\u8fd9\u4e00\u884c\u4e3a\u76ee\u524d\u6ca1\u6709\u4efb\u4f55\u7b26\u53f7\u652f\u6301\u3002\n- **\u5185\u5b58\u9650\u5236\uff1a** \u4e0e\u5176\u4ed6\u6240\u6709\u4f5c\u4e1a\u5b57\u6bb5\u4e00\u6837\uff0c\u4f18\u5148\u7ea7\u5728\u8fdb\u7a0b\u7ed3\u675f\u65f6\u4f1a\u6d88\u5931\uff0c\u56e0\u4e3a `_jobs` \u4ec5\u662f\u4e00\u4e2a\u5b9e\u4f8b\u5b57\u5178\u3002\n\n## \u5b9e\u73b0\u4e0e\u9a8c\u8bc1\u8ba1\u5212\n\n1. \u9996\u5148\u5b9a\u4e49\u5951\u7ea6\uff1a\u8868\u793a\u5f62\u5f0f\u3001\u5141\u8bb8\u7684\u503c\u3001\u9ed8\u8ba4\u503c\u3001\u4f18\u5148\u7ea7\u65b9\u5411\u3001\u5e73\u5c40\u51b3\u80dc\u89c4\u5219\uff0c\u4ee5\u53ca\u662f\u5426\u4f1a\u6539\u53d8\u5217\u8868\u6392\u5e8f\u3002\n2. \u5411 `Job` \u6dfb\u52a0 `priority` \u5b57\u6bb5\uff0c\u6700\u597d\u91c7\u7528\u5411\u540e\u517c\u5bb9\u7684\u9ed8\u8ba4\u503c\u3002\n3. \u6269\u5c55 `SchedulerService.create_job()`\uff0c\u6dfb\u52a0\u5e26\u9ed8\u8ba4\u503c\u7684\u4f18\u5148\u7ea7\u53c2\u6570\uff0c\u5bf9\u5176\u8fdb\u884c\u9a8c\u8bc1\uff0c\u5e76\u4f7f\u7528\u5173\u952e\u5b57\u53c2\u6570\u6784\u5efa `Job`\u3002\n4. \u5982\u679c\u5217\u8868\u6392\u5e8f\u8003\u8651\u4f18\u5148\u7ea7\uff0c\u5219\u5c06 `JobRepository.all()` \u4fee\u6539\u4e3a\u5148\u6309\u4f18\u5148\u7ea7\u6392\u5e8f\uff0c\u518d\u6309\u6807\u8bc6\u7b26\u6392\u5e8f\u3002\u5426\u5219\u4fdd\u6301\u5b58\u50a8\u5e93\u6392\u5e8f\u4e0d\u53d8\u3002\n5. \u6dfb\u52a0\u4ee5\u4e0b\u6d4b\u8bd5\uff1a\n   - \u73b0\u6709\u7684\u4e24\u4e2a\u53c2\u6570\u521b\u5efa\u65b9\u5f0f\u3002\n   - \u663e\u5f0f\u4f18\u5148\u7ea7\u7684\u4fdd\u7559\u3002\n   - \u9ed8\u8ba4\u4f18\u5148\u7ea7\u3002\n   - \u7c7b\u578b\u65e0\u6548\u548c\u503c\u8d85\u51fa\u8303\u56f4\u7684\u60c5\u51b5\u3002\n   - `Job.to_dict()` \u7684\u8f93\u51fa\u3002\n   - \u591a\u4f18\u5148\u7ea7\u5217\u8868\u7684\u6392\u5e8f\u987a\u5e8f\u3002\n   - \u4f18\u5148\u7ea7\u76f8\u540c\u65f6\u7684\u7a33\u5b9a\u6392\u5e8f\u3002\n   - \u73b0\u6709\u7a7a\u540d\u79f0\u7684\u884c\u4e3a\u3002\n6. \u66f4\u65b0 README\uff0c\u660e\u786e\u8bf4\u660e\u516c\u5171\u63a5\u53e3\u3002\n7. \u4f7f\u7528 `python3 -m unittest discover -s tests -v` \u8fd0\u884c\u5b8c\u6574\u7684\u79bb\u7ebf\u6d4b\u8bd5\u5957\u4ef6\u3002\n\n## \u5df2\u6267\u884c\u9a8c\u8bc1\n\n- \u57fa\u7ebf\u6d4b\u8bd5\u5957\u4ef6\uff1a**2 \u4e2a\u6d4b\u8bd5\u901a\u8fc7**\u3002\n- \u786e\u8ba4\u5168\u4ed3\u5e93\u7b26\u53f7\u641c\u7d22\u7ed3\u679c\uff1a`next_daily_run()` \u5df2\u65ad\u5f00\u8fde\u63a5\uff0c\u4e14\u4e0d\u5b58\u5728\u73b0\u6709\u7684\u4f18\u5148\u7ea7\u7b26\u53f7\u3002\n- \u6587\u4ef6\u53d8\u66f4\uff1a**\u65e0**\u3002\n- \u529f\u80fd\u5b9e\u73b0\uff1a**\u672a\u6267\u884c**\uff0c\u7b26\u5408\u8981\u6c42\u3002\n\n&gt; **\u7ed3\u8bba + \u51b3\u7b56**\n&gt;\n&gt; \u5982\u679c\u4f18\u5148\u7ea7\u4ec5\u4f5c\u4e3a\u5143\u6570\u636e\u6216\u5217\u8868\u6392\u5e8f\u4f7f\u7528\uff0c\u5219\u53d8\u66f4\u8303\u56f4\u8f83\u5c0f\uff1a\u4e3b\u8981\u6d89\u53ca `models.py`\u3001`service.py`\u3001`repository.py` \u4ee5\u53ca\u6d4b\u8bd5\u7528\u4f8b\u3002\u5728\u5b9e\u65bd\u4e4b\u524d\uff0c\u9700\u8981\u51b3\u5b9a\u7684\u662f\uff1a\u4f18\u5148\u7ea7\u662f\u4ec5\u7528\u4e8e\u63cf\u8ff0\u4efb\u52a1\uff0c\u8fd8\u662f\u4f1a\u6539\u53d8 `list_jobs()` \u7684\u6392\u5e8f\u987a\u5e8f\uff0c\u6b64\u5916\u8fd8\u9700\u786e\u5b9a\u5176\u6570\u503c\u8303\u56f4\u3001\u9ed8\u8ba4\u503c\u3001\u65b9\u5411\u4ee5\u53ca\u5e73\u5c40\u51b3\u80dc\u89c4\u5219\u3002.<\/pre><\/div><\/details><details class=\"d-full\"><summary>\u67e5\u770b\u5b8c\u6574\u7684 Claude \u4ee3\u7801\u8f93\u51fa<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u4ea4\u63a5\u8bb0\u5f55\uff0c\u5305\u62ec\u9996\u6b21\u6709\u6548\u7684\u8f93\u51fa\u539f\u6587<\/p><pre># T1 \u8fd0\u884c\u8bb0\u5f55 \u2014 \u964c\u751f\u5b58\u50a8\u5e93\u7406\u89e3\n\n## \u6267\u884c\u53c2\u6570\n\n| \u5b57\u6bb5 | \u503c |\n| --- | --- |\n| \u4efb\u52a1 | `T1` |\n| \u51bb\u7ed3\u63d0\u793a\u8bcd | `01-prompts\/T1.md` |\n| \u51bb\u7ed3\u63d0\u793a\u8bcd SHA-256 | `a571ff15c2502ec29b172ae2e77dd9ab0caca2869b91f9468d47571434d16c17` |\n| \u6267\u884c\u5355\u5143 | \u9694\u79bb\u7684 Claude \u5b50\u4ee3\u7406\uff0c`\u901a\u7528\u578b`\uff0c\u5168\u65b0\u4e0a\u4e0b\u6587 |\n| \u9694\u79bb\u65b9\u6cd5 | **\u5b50\u4ee3\u7406\u56de\u9000**\uff08\u5df2\u8bb0\u5f55\u7684\u964d\u7ea7\u64cd\u4f5c \u2014 \u53c2\u89c1 `results\/isolation-decision.md`\uff09 |\n| \u5206\u914d\u7684\u5e72\u51c0\u526f\u672c | `runtime\/workspaces\/T1` |\n| Claude \u4ee3\u7801\u7248\u672c | `2.1.220` |\n| \u6a21\u578b\u8bbe\u7f6e | `claude-opus-5` |\n| start_utc | `2026-07-28T10:27:31Z` |\n| end_utc | `2026-07-28T10:28:32Z` |\n| \u6301\u7eed\u65f6\u95f4 | 61 \u79d2\uff08\u4e0e T2\u2013T4 \u540c\u65f6\u8fdb\u884c\uff1b\u975e\u7eaf\u5ef6\u8fdf\u6d4b\u91cf\uff09 |\n| \u5c1d\u8bd5\u6b21\u6570 | 1 |\n| \u72b6\u6001 | `\u6709\u6548` |\n| \u4eba\u5de5\u5e72\u9884 | \u65e0 |\n\n## \u5b89\u5168\u5de5\u5177\u6458\u8981\n\n`date`\u3001`find`\u3001`ls`\u3001`wc`\u3001`stat`\u3001`grep`\u3001\u5bf9 7 \u4e2a\u5de5\u4f5c\u533a\u6587\u4ef6\u7684 `Read` \u64cd\u4f5c\u3001`python3 -V`\u3001\n`python3 -m unittest discover -s tests -v`\u3002\u6240\u6709\u8bfb\u53d6\u64cd\u4f5c\u5747\u9650\u5236\u5728\u6307\u5b9a\u5de5\u4f5c\u533a\u5185\u3002\n\u65e0\u7f51\u7edc\u8fde\u63a5\u3001\u65e0\u8f6f\u4ef6\u5b89\u88c5\u3001\u65e0\u5199\u5165\u64cd\u4f5c\u3002\n\n## \u79bb\u7ebf\u68c0\u67e5\u7ed3\u679c\n\n`python3 -m unittest discover -s tests -v` \u2192 2 \u4e2a\u6d4b\u8bd5\uff0c\u901a\u8fc7\uff08\u9000\u51fa\u4ee3\u7801 0\uff09\u3002 \u7531\n\u534f\u8c03\u5458\u5728\u5de5\u4f5c\u533a\u5916\u90e8\u91cd\u65b0\u9a8c\u8bc1\uff1a\u53c2\u89c1 `results\/checks\/T1-public.txt`\u3002\n\n## \u8865\u4e01\n\n\u65e0\u3002`results\/T1\/patch.diff` \u4e3a\u7a7a\uff0c\u4e14 `diff -ru 02-fixture runtime\/workspaces\/T1`\n\u672a\u8fd4\u56de\u4efb\u4f55\u5dee\u5f02\u3002\u8be5\u4efb\u52a1\u4ec5\u9700\u68c0\u67e5\u800c\u65e0\u9700\u4fee\u6539\u6587\u4ef6\uff1b\u6b64\u7ed3\u8bba\n\u7ecf\u786e\u8ba4\u800c\u975e\u901a\u8fc7\u65ad\u8a00\u5f97\u51fa\u3002\n\n## \u5df2\u5904\u7406\u7684\u9519\u8bef\n\n\u4e00\u4e2a\u53ef\u6062\u590d\u7684 shell \u9519\u8bef\uff1a\u521d\u59cb `grep` \u547d\u4ee4\u4f7f\u7528\u4e86\u672a\u52a0\u5f15\u53f7\u7684 `--include=*.py` \u6a21\u5f0f\uff0c\n\u5bfc\u81f4 shell \u5c1d\u8bd5\u8fdb\u884c\u901a\u914d\u7b26\u5339\u914d\uff1b\u5728\u6a21\u5f0f\u52a0\u5f15\u53f7\u540e\u91cd\u65b0\u8fd0\u884c\uff0c\u64cd\u4f5c\u6210\u529f\u3002\u5bf9\u68c0\u67e5\u7ed3\u679c\u65e0\u5f71\u54cd\u3002\n\n## \u53ef\u89c1\u8f93\u51fa\uff08\u539f\u6837\uff09\n\n### 1. \u8be5\u4ed3\u5e93\u7684\u7528\u9014\n\n\u4e00\u4e2a\u540d\u4e3a `local-scheduler-1.0.0`\uff08`fixture-manifest.json`\uff09\u7684\u81ea\u5305\u542b Python \u6807\u51c6\u5e93\u6d4b\u8bd5\u5957\u4ef6\uff0c\u91c7\u7528 MIT \u8bb8\u53ef\u8bc1\uff0c\u65e0\u7f51\u7edc\u6216\u751f\u4ea7\u73af\u5883\u4f9d\u8d56\uff08`README.md`\uff0c`\"network_required\": false`\uff09\u3002 \u8be5\u5e93\u975e\u5e38\u5c0f\uff1a\u5305\u542b 8 \u4e2a\u6e90\u4ee3\u7801\/\u6587\u6863\u6587\u4ef6\u4ee5\u53ca\u6e05\u5355\u6587\u4ef6\uff0c\u5171\u8ba1 103 \u884c\u3002\u5185\u7f6e\u89e3\u91ca\u5668\u4e3a **Python 3.9.6**\u3002 \u8be5\u9879\u76ee\u4e0d\u5305\u542b `pyproject.toml`\u3001`setup.py`\u3001CI \u914d\u7f6e\u3001\u4ee3\u7801\u68c0\u67e5\u5668\u6216\u7c7b\u578b\u68c0\u67e5\u5668\u914d\u7f6e\u2014\u2014\u552f\u4e00\u58f0\u660e\u7684\u5de5\u4f5c\u6d41\u662f `python3 -m unittest discover -s tests -v`\uff08`README.md`\uff09\u3002\n\n### 2. \u67b6\u6784\n\n\u4e09\u5c42\u7ed3\u6784\u52a0\u4e00\u4e2a\u5b64\u7acb\u6a21\u5757\uff0c\u5168\u90e8\u4f4d\u4e8e `scheduler\/` \u76ee\u5f55\u4e0b\uff1a\n\n| \u5c42\u7ea7 | \u6587\u4ef6 | \u7b26\u53f7 | \u804c\u8d23 |\n|---|---|---|---|\n| \u5305\u95e8\u9762 | `scheduler\/__init__.py` | `__all__ = [\"SchedulerService\"]` | \u4ec5\u91cd\u65b0\u5bfc\u51fa `SchedulerService`\uff1b`Job`\u3001`JobRepository` \u548c `time_rules` \u4e0d\u5c5e\u4e8e\u516c\u5171\u63a5\u53e3 |\n| \u9886\u57df\u6a21\u578b | `scheduler\/models.py` | `Job` (`@dataclass(frozen=True)`) | \u4e0d\u53ef\u53d8\u503c\u5bf9\u8c61\uff0c\u5305\u542b\u5b57\u6bb5 `identifier: int`\u3001`name: str`\u3001`owner: str`\uff0c\u5e76\u5b9e\u73b0 `to_dict()` \u65b9\u6cd5\uff08\u901a\u8fc7 `asdict(self)` \u5b9e\u73b0\uff09 |\n| \u6301\u4e45\u5316 | `scheduler\/repository.py` | `JobRepository` | \u4ee5 identifier \u4e3a\u952e\u7684\u5185\u5b58\u4e2d `dict`\uff1b\u63d0\u4f9b `save`\u3001`get`\u3001`all`\u3001`delete` \u65b9\u6cd5 |\n| \u5e94\u7528\u670d\u52a1 | `scheduler\/service.py` | `SchedulerService` | \u9a8c\u8bc1\u3001\u6807\u8bc6\u7b26\u5206\u914d\u3001\u534f\u8c03\uff1a`create_job`\u3001`list_jobs`\u3001`delete_job` |\n| \u5b64\u7acb\u6a21\u5757 | `scheduler\/time_rules.py` | `next_daily_run` | \u5468\u671f\u6027\u8ba1\u7b97 \u2014 **\u672a\u88ab\u4efb\u4f55\u6a21\u5757\u5bfc\u5165** |\n\n\u4f9d\u8d56\u5173\u7cfb\u65b9\u5411\u6e05\u6670\u4e14\u5355\u5411\uff1a`service.py` \u4ece `.models` \u548c `.repository` \u5bfc\u5165\uff1b`repository.py` \u4ece `.models` \u5bfc\u5165\uff1b`models.py` \u4ec5\u5bfc\u5165 `dataclasses`\u3002\u65e0\u5faa\u73af\u4f9d\u8d56\u3002 \u867d\u7136\u5b58\u5728\u4f9d\u8d56\u6ce8\u5165\uff0c\u4f46\u7a0b\u5ea6\u6781\u4f4e\u2014\u2014`SchedulerService.__init__(self, repository=None)` \u6267\u884c `self.repository = repository or JobRepository()`\uff0c\u56e0\u6b64\u53ef\u5728\u6d4b\u8bd5\u4e2d\u66ff\u6362\u4e3a\u6a21\u62df\u7684\u4ed3\u5e93\u3002\n\n\u8bf7\u6ce8\u610f\uff0c`scheduler\/time_rules.py` \u76ee\u524d\u5df2\u662f\u6b7b\u4ee3\u7801\u3002 \u6211\u4f7f\u7528 grep \u547d\u4ee4\u5728\u6574\u4e2a\u4ee3\u7801\u6811\u4e2d\u641c\u7d22\u4e86 `time_rules` \u548c `next_daily_run`\uff1b\u552f\u4e00\u5339\u914d\u7684\u7ed3\u679c\u662f\u5176\u81ea\u8eab\u7684\u5b9a\u4e49\u4ee5\u53ca\u5728 `fixture-manifest.json` \u7684 `expected_files` \u4e2d\u7684\u5217\u51fa\u3002\u8be5\u6587\u4ef6\u867d\u5df2\u6253\u5305\uff0c\u4f46\u672a\u88ab\u8c03\u7528\u3002\n\n### 3. \u6570\u636e\u6d41\n\n**\u521b\u5efa\u4efb\u52a1** \u2014 `SchedulerService.create_job(name, owner)`\uff1a\n1. \u5b88\u62a4\u6761\u4ef6\uff1a`if not name.strip(): raise ValueError('name is required\")`\u3002 \u8fd9\u662f\u7cfb\u7edf\u4e2d*\u552f\u4e00\u7684*\u9a8c\u8bc1\u2014\u2014`owner`\u4ece\u672a\u88ab\u68c0\u67e5\uff0c\u56e0\u6b64\u63a5\u53d7\u7a7a\u7684\u62e5\u6709\u8005\u3002\n2. \u6784\u9020\uff1a`Job(self._next_identifier, name.strip(), owner.strip())` \u2014\u2014 \u6309\u4f4d\u7f6e\u6784\u9020\uff0c\u4e14\u4e24\u4e2a\u5b57\u7b26\u4e32\u5747\u901a\u8fc7\u53bb\u9664\u524d\u7f00\u8fdb\u884c\u89c4\u8303\u5316\u5904\u7406\u3002\n3. \u6301\u4e45\u5316\uff1a`self.repository.save(job)`\uff0c\u8be5\u64cd\u4f5c\u6267\u884c `self._jobs[job.identifier] = job` \u5e76\u8fd4\u56de\u8be5\u4efb\u52a1\u3002\n4. \u9012\u589e\u8ba1\u6570\u5668\uff1a`self._next_identifier += 1` \u2014\u2014 \u8be5\u64cd\u4f5c\u53d1\u751f\u5728 `save` \u4e4b\u540e\uff0c\u56e0\u6b64\u82e5\u629b\u51fa\u5f02\u5e38\uff0c\u8ba1\u6570\u5668\u5c06\u4fdd\u6301\u672a\u6d88\u8017\u72b6\u6001\u3002\n5. \u8fd4\u56de `Job` \u5b9e\u4f8b\uff08\u8be5\u670d\u52a1\u8fd4\u56de\u5176\u81ea\u8eab\u7684\u672c\u5730 `job`\uff0c\u800c\u975e\u5b58\u50a8\u5e93\u7684\u8fd4\u56de\u503c\uff09\u3002\n\n\u6807\u8bc6\u7b26\u7684\u5206\u914d\u7531**\u670d\u52a1**\u8d1f\u8d23\uff0c\u800c\u975e\u5b58\u50a8\u5e93\uff08\u5728 `SchedulerService.__init__` \u4e2d\u6267\u884c `self._next_identifier = 1`\uff09\u3002\u8fd9\u662f\u4e00\u4e2a\u91cd\u8981\u7684\u63a5\u53e3\u70b9\uff1a\u5982\u679c\u6ce8\u5165\u7684\u5b58\u50a8\u5e93\u4e2d\u5df2\u7ecf\u5305\u542b\u4efb\u52a1\uff0c\u65b0\u670d\u52a1\u4f1a\u4ece 1 \u5f00\u59cb\u91cd\u65b0\u7f16\u53f7\uff0c\u4ece\u800c\u65e0\u58f0\u5730\u8986\u76d6\u539f\u6709\u4efb\u52a1\u3002\n\n**\u5217\u51fa\u4efb\u52a1** \u2014 `SchedulerService.list_jobs()` \u76f4\u63a5\u8f6c\u53d1\u7ed9 `JobRepository.all()`\uff0c\u540e\u8005\u8fd4\u56de `[self._jobs[key] for key in sorted(self._jobs)]`\u3002 \u56e0\u6b64\uff0c\u6392\u5e8f\u65b9\u5f0f\u662f**\u6309\u6574\u6570\u6807\u8bc6\u7b26\u5347\u5e8f**\uff0c\u8fd9\u76ee\u524d\u4e0e\u63d2\u5165\u987a\u5e8f\u4e00\u81f4\u3002\u6bcf\u6b21\u8c03\u7528\u90fd\u4f1a\u6784\u5efa\u4e00\u4e2a\u65b0\u7684\u5217\u8868\uff0c\u4f46 `Job` \u5bf9\u8c61\u662f\u5171\u4eab\u5f15\u7528\u2014\u2014\u4e4b\u6240\u4ee5\u5b89\u5168\uff0c\u4ec5\u4ec5\u662f\u56e0\u4e3a `Job` \u7c7b\u5df2\u88ab\u51bb\u7ed3\u3002\n\n**\u5220\u9664** \u2014 `SchedulerService.delete_job(identifier)` \u59d4\u6258\u7ed9 `JobRepository.delete`\uff0c\u8be5\u65b9\u6cd5\u5373 `self._jobs.pop(identifier)`\uff0c\u4e14\u65e0\u9ed8\u8ba4\u503c\uff0c\u56e0\u6b64\u5f53 ID \u4e0d\u5b58\u5728\u65f6\u4f1a\u5f15\u53d1 `KeyError`\u3002 \u8fd9\u4e0e `JobRepository.get` \u4e0d\u4e00\u81f4\uff0c\u540e\u8005\u5728\u76f8\u540c\u6761\u4ef6\u4e0b\u4f1a\u8fd4\u56de `None`\u3002\n\n**\u8fd9\u4e9b\u8def\u5f84\u7684\u6d4b\u8bd5\u8986\u76d6\u7387** \u2014 `tests\/test_scheduler.py` \u6070\u597d\u5305\u542b\u4e24\u4e2a\u6d4b\u8bd5\u7528\u4f8b\uff1a`test_create_and_list_jobs`\uff08\u65ad\u8a00 `job.identifier == 1` \u4e14 `[job] == service.list_jobs()`\uff09\u548c `test_blank_name_is_rejected`\u3002 \u8fd9\u4e24\u4e2a\u7528\u4f8b\u5728\u5f53\u524d\u4ee3\u7801\u6811\u4e2d\u5747\u901a\u8fc7\u3002\n\n### 4. \u6dfb\u52a0\u4efb\u52a1\u4f18\u5148\u7ea7\u53ef\u80fd\u5f71\u54cd\u7684\u6587\u4ef6\n\n\u6309\u786e\u5b9a\u6027\u4ece\u9ad8\u5230\u4f4e\u6392\u5e8f\uff1a\n\n1. **`scheduler\/models.py`** \u2014\u2014 \u786e\u5b9a\u3002`Job` \u9700\u8981\u4e00\u4e2a `priority` \u5b57\u6bb5\u3002\u7531\u4e8e\u8be5\u6570\u636e\u7c7b\u8bbe\u7f6e\u4e86 `frozen=True` \u4e14\u5b57\u6bb5\u4e3a\u4f4d\u7f6e\u53c2\u6570\uff0c\u65b0\u5b57\u6bb5\u5fc5\u987b\u5e26\u6709\u9ed8\u8ba4\u503c\uff08\u4f8b\u5982 `priority: int = 0`\uff09\uff0c\u5426\u5219\u5fc5\u987b\u5c06\u5176\u7f6e\u4e8e\u73b0\u6709\u4e09\u4e2a\u5b57\u6bb5\u4e4b\u540e\uff0c\u5426\u5219\u6240\u6709\u73b0\u6709\u7684\u4f4d\u7f6e\u53c2\u6570\u6784\u9020\u90fd\u4f1a\u5931\u6548\u3002`to_dict()` \u65e0\u9700\u4fee\u6539\u2014\u2014`asdict(self)` \u4f1a\u81ea\u52a8\u8bc6\u522b\u8be5\u5b57\u6bb5\uff0c\u8fd9\u5c5e\u4e8e\u5e8f\u5217\u5316\u5951\u7ea6\u7684\u65e0\u58f0\u53d8\u66f4\uff0c\u800c\u975e\u4ee3\u7801\u53d8\u66f4\u3002\n2. **`scheduler\/service.py`** \u2014\u2014 \u786e\u5b9a\u3002`create_job` \u9700\u8981\u4e00\u4e2a `priority` \u53c2\u6570\uff0c\u5e76\u5fc5\u987b\u5c06\u5176\u4f20\u9012\u7ed9\u7b2c 13 \u884c\u5904\u7684 `Job(...)` \u4f4d\u7f6e\u53c2\u6570\u6784\u9020\u51fd\u6570\u3002 \u5982\u679c\u9700\u8981\u5bf9\u4f18\u5148\u7ea7\u8fdb\u884c\u9a8c\u8bc1\uff08\u8303\u56f4\u3001\u679a\u4e3e\u6210\u5458\u8d44\u683c\uff09\uff0c\u5219\u8be5\u9a8c\u8bc1\u6761\u4ef6\u5e94\u7f6e\u4e8e\u73b0\u6709\u7684 `name.strip()` \u68c0\u67e5\u4e4b\u540e\u3002\u5982\u679c\u5217\u8868\u5fc5\u987b\u6309\u4f18\u5148\u7ea7\u6392\u5e8f\uff0c\u4e14\u5e0c\u671b\u8be5\u5b58\u50a8\u5e93\u4fdd\u6301\u4e3a\"\u54d1\u5b58\u50a8'\uff0c\u5219\u6392\u5e8f\u7b56\u7565\u5e94\u7f6e\u4e8e `list_jobs` \u4e2d\u3002\n3. **`scheduler\/repository.py`** \u2014 \u53ef\u80fd\u6027\u8f83\u5927\u3002`JobRepository.all()` \u4e2d\u7684 `sorted(self._jobs)` \u662f\u6309\u5b57\u5178 *\u952e*\uff08\u5373\u6807\u8bc6\u7b26\uff09\u6392\u5e8f\u7684\u3002 \u8981\u5b9e\u73b0\u6309\u4f18\u5148\u7ea7\u6392\u5e8f\u7684\u5217\u8868\uff0c\u9700\u8981\u5c06\u6b64\u5904\u4fee\u6539\u4e3a\u6309\u952e\u503c\uff08\u5982 `(-job.priority, job.identifier)`\uff09\u5bf9\u5b57\u5178\u8fdb\u884c\u6392\u5e8f\uff0c\u6216\u8005\u6dfb\u52a0\u4e00\u4e2a\u5355\u72ec\u7684\u6709\u5e8f\u8bbf\u95ee\u5668\u3002\u4e0d\u8981\u5c06\u5e73\u5c40\u51b3\u80dc\u89c4\u5219\u7559\u4f5c\u9690\u5f0f\u5904\u7406\uff1a\u5b57\u5178\u7684\u63d2\u5165\u987a\u5e8f\u5e76\u975e\u53ef\u4f9d\u8d56\u7684\u7a33\u5b9a\u5951\u7ea6\u3002\n4. **`tests\/test_scheduler.py`** \u2014 \u786e\u5b9a\u3002\u65b0\u589e\u4e86\u9488\u5bf9\u9ed8\u8ba4\u4f18\u5148\u7ea7\u3001\u663e\u5f0f\u4f18\u5148\u7ea7\u3001\u6392\u5e8f\u4ee5\u53ca\u65e0\u6548\u4f18\u5148\u7ea7\u62d2\u7edd\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u8bf7\u6ce8\u610f\uff0c\u73b0\u6709\u7684 `assertEqual([job], service.list_jobs())` \u6bd4\u8f83\u7684\u662f*\u540c\u4e00\u4e2a*\u5bf9\u8c61\uff0c\u56e0\u6b64\u5373\u4f7f\u6dfb\u52a0\u4e86\u5b57\u6bb5\u4e5f\u80fd\u901a\u8fc7\u9a8c\u8bc1\uff1b\u4f46\u5982\u679c\u5b83\u6bd4\u8f83\u7684\u662f\u4e00\u4e2a\u65b0\u6784\u5efa\u7684 `Job` \u5b57\u9762\u91cf\uff0c\u5219\u65e0\u6cd5\u901a\u8fc7\u9a8c\u8bc1\u3002\n5. **`README.md`** \u2014 \u53ef\u80fd\u9700\u8981\uff0c\u5982\u679c\u4f18\u5148\u7ea7\u8bed\u4e49\uff08\u8303\u56f4\u4e24\u7aef\u54ea\u4e2a\u4f18\u5148\u3001\u9ed8\u8ba4\u503c\uff09\u9700\u8981\u5728\u4efb\u4f55\u5730\u65b9\u8bf4\u660e\u7684\u8bdd\u3002\n6. **`scheduler\/__init__.py`** \u2014\u2014 \u4ec5\u5f53\u9700\u8981\u4e0e `SchedulerService` \u4e00\u8d77\u5bfc\u51fa\u4f18\u5148\u7ea7\u679a\u4e3e\u6216\u5e38\u91cf\u65f6\u624d\u9700\u4fee\u6539\u3002\n7. **`fixture-manifest.json`** \u2014\u2014 \u4ec5\u5f53\u60a8\u6dfb\u52a0\u65b0\u6a21\u5757\u6587\u4ef6\u65f6\u624d\u9700\u4fee\u6539\uff1b\u5176 `expected_files` \u6570\u7ec4\u662f\u663e\u5f0f\u7684\u6e05\u5355\uff0c\u5185\u5bb9\u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\u3002\n8. **`scheduler\/time_rules.py`** \u2014 \u5207\u52ff\u4fee\u6539\u3002\u4f18\u5148\u7ea7\u4e0e\u91cd\u590d\u6027\u4e92\u4e0d\u76f8\u5173\uff0c\u4e14\u8be5\u6a21\u5757\u672a\u88ab\u8c03\u7528\u3002\n\n### 5. \u4e3b\u8981\u98ce\u9669\n\n- **\u6392\u5e8f\u8bed\u4e49\u5c5e\u4e8e\u9690\u5f0f\u884c\u4e3a\u53d8\u66f4\u3002** `JobRepository.all()` \u76ee\u524d\u4fdd\u8bc1\u6309\u6807\u8bc6\u7b26\u5347\u5e8f\u6392\u5217\uff0c\u800c `list_jobs` \u7ee7\u627f\u4e86\u8fd9\u4e00\u7279\u6027\u3002\u4efb\u4f55\u4f9d\u8d56\u8be5\u4fdd\u8bc1\u7684\u8c03\u7528\u65b9\uff0c\u5176\u884c\u4e3a\u90fd\u4f1a\u56e0\u91cd\u65b0\u6392\u5e8f\u800c\u5931\u6548\u3002 \u9700\u660e\u786e\u51b3\u5b9a\uff1a\u662f\u8ba9 `list_jobs()` \u7684\u542b\u4e49\u53d1\u751f\u6539\u53d8\uff0c\u8fd8\u662f\u5728\u5b83\u65c1\u8fb9\u65b0\u589e\u4e00\u4e2a `list_jobs_by_priority()`\uff1f\u524d\u8005\u98ce\u9669\u66f4\u9ad8\uff0c\u4e14\u73b0\u6709\u7684\u6d4b\u8bd5 `test_create_and_list_jobs` \u8fc7\u4e8e\u7b80\u5355\uff0c\u65e0\u6cd5\u6355\u83b7\u56de\u5f52\u95ee\u9898\uff08\u5355\u5143\u7d20\u5217\u8868\uff09\u3002\n- **\u6392\u5e8f\u65b9\u5411\u786e\u5b9e\u5b58\u5728\u6b67\u4e49\u3002** \u5728\u67d0\u4e9b\u7cfb\u7edf\u4e2d\uff0c\"\u4f18\u5148\u7ea7 1\"\u901a\u5e38\u8868\u793a *\u6700\u9ad8*\uff0c\u800c\u5728\u5176\u4ed6\u7cfb\u7edf\u4e2d\u5219\u8868\u793a *\u6700\u4f4e*\u3002\u672c\u4ed3\u5e93\u4e2d\u6ca1\u6709\u4efb\u4f55\u5185\u5bb9\u2014\u2014\u65e0\u8bba\u662f\u6ce8\u91ca\u3001\u6587\u6863\u5b57\u7b26\u4e32\u8fd8\u662f README \u4e2d\u7684\u8bf4\u660e\u2014\u2014\u80fd\u5bf9\u6b64\u4f5c\u51fa\u660e\u786e\u89c4\u5b9a\u3002 \u8bf7\u9009\u5b9a\u4e00\u79cd\u7ea6\u5b9a\uff0c\u5728 `models.py` \u4e2d\u8fdb\u884c\u6587\u6863\u5316\uff0c\u5e76\u5728\u6d4b\u8bd5\u4e2d\u7f16\u7801\u81f3\u5c11\u4e09\u4e2a\u4e0d\u540c\u7684\u4f18\u5148\u7ea7\uff0c\u4ee5\u786e\u4fdd\u6392\u5e8f\u65b9\u5411\u88ab\u660e\u786e\u56fa\u5b9a\u3002\n- **\u6392\u5e8f\u5e73\u5c40\u5904\u7406\u4e0d\u7a33\u5b9a\u3002** \u5982\u679c\u4e24\u4e2a\u4efb\u52a1\u5177\u6709\u76f8\u540c\u7684\u4f18\u5148\u7ea7\uff0c\u7ed3\u679c\u4ecd\u5fc5\u987b\u662f\u786e\u5b9a\u6027\u7684\u3002Python \u7684 `sorted` \u51fd\u6570\u662f\u7a33\u5b9a\u7684\uff0c\u4f46\u8fd9\u79cd\u7a33\u5b9a\u6027\u53ea\u6709\u5728\u8f93\u5165\u987a\u5e8f\u672c\u8eab\u5df2\u5b9a\u4e49\u65f6\u624d\u6709\u610f\u4e49\u3002\u8bf7\u52a1\u5fc5\u5c06 `identifier` \u4f5c\u4e3a\u663e\u5f0f\u7684\u4e8c\u7ea7\u952e\u5305\u542b\u5728\u5185\u3002\n- **Frozen-dataclass \u5b57\u6bb5\u6392\u5e8f\u3002** `Job` \u91c7\u7528 `@dataclass(frozen=True)` \u5b9a\u4e49\uff0c\u5305\u542b\u4e09\u4e2a\u4f4d\u7f6e\u5b57\u6bb5\uff0c\u4e14 `service.py:13` \u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u5bf9\u5176\u8fdb\u884c\u6784\u9020\u3002\u82e5\u5c06 `priority` \u63d2\u5165\u5230\u6700\u540e\u4e00\u4e2a\u5b57\u6bb5\u4e4b\u5916\u7684\u4f4d\u7f6e\uff0c\u6216\u672a\u8bbe\u7f6e\u9ed8\u8ba4\u503c\uff0c\u5219\u4f1a\u6784\u6210\u7834\u574f\u6027\u53d8\u66f4\uff0c\u800c\u73b0\u6709\u7684\u4e24\u4e2a\u6d4b\u8bd5\u53ef\u80fd\u65e0\u6cd5\u660e\u663e\u63ed\u793a\u6b64\u95ee\u9898\u3002\n- **`to_dict()` \u5951\u7ea6\u6269\u5c55\u3002** `asdict(self)` \u4f1a\u53cd\u6620\u6240\u6709\u5b57\u6bb5\u3002\u6dfb\u52a0 `priority` \u4f1a\u6539\u53d8\u6bcf\u4e2a\u5e8f\u5217\u5316\u8d1f\u8f7d\uff0c\u800c `models.py` \u4e2d\u7684\u65b9\u6cd5\u4f53\u5374\u6ca1\u6709\u53ef\u89c1\u7684\u4fee\u6539\u3002\u4efb\u4f55\u57fa\u4e8e\u7cbe\u786e\u5b57\u5178\u7ed3\u6784\u8fdb\u884c\u65ad\u8a00\u7684\u4ee3\u7801\u90fd\u4f1a\u5931\u6548\u3002\n- **Python 3.9.6 \u7684\u9650\u5236\u3002** \u4e0d\u652f\u6301 `@dataclass(slots=True)`\uff083.10+\uff09\uff0c\u4e0d\u652f\u6301 `kw_only=True`\uff083.10+\uff09\uff0c\u4e14\u82e5\u672a\u4f7f\u7528 `from __future__ import annotations`\uff0cPEP 604 \u4e2d\u7684 `int | None` \u6ce8\u89e3\u5c06\u5728\u8fd0\u884c\u65f6\u62a5\u9519\u3002 \u5982\u679c\u5c06\u4f18\u5148\u7ea7\u5efa\u6a21\u4e3a\u679a\u4e3e\u7c7b\u578b\uff0c`enum.StrEnum` \u5c5e\u4e8e 3.11 \u53ca\u4ee5\u4e0a\u7248\u672c\u7684\u529f\u80fd\uff0c\u5f53\u524d\u4e0d\u53ef\u7528\u3002\u4e0a\u8ff0\u4efb\u4f55\u4e00\u79cd\u60c5\u51b5\u90fd\u4f1a\u5bfc\u81f4\u8be5\u89e3\u91ca\u5668\u4e0a\u7684 fixture \u65e0\u6cd5\u8fd0\u884c\u3002\n- **\u6807\u8bc6\u7b26\u5206\u914d\u4f4d\u4e8e\u9519\u8bef\u7684\u5c42\u7ea7\u3002** `SchedulerService._next_identifier` \u610f\u5473\u7740\u670d\u52a1\u8d1f\u8d23 ID \u751f\u6210\uff0c\u800c\u5b58\u50a8\u5e93\u8d1f\u8d23\u5b58\u50a8\u3002\u5982\u679c\u4f18\u5148\u7ea7\u76f8\u5173\u7684\u5de5\u4f5c\u4fc3\u4f7f\u5b9e\u73b0\u7b2c\u4e8c\u4e2a\u5b58\u50a8\u5e93\u6216\u9884\u52a0\u8f7d\u6d4b\u8bd5\u6570\u636e\uff0c\u8fd9\u79cd\u5206\u79bb\u5c06\u5bfc\u81f4 ID \u51b2\u7a81\u548c\u4efb\u52a1\u88ab\u8986\u76d6\u3002\n- **\u9519\u8bef\u5904\u7406\u7ea6\u5b9a\u4e0d\u4e00\u81f4\u3002** `JobRepository.get` \u5728\u67e5\u627e\u5931\u8d25\u65f6\u8fd4\u56de `None`\uff0c\u800c `JobRepository.delete` \u4f1a\u5f15\u53d1 `KeyError`\u3002\u4efb\u4f55\u4e0e\u4f18\u5148\u7ea7\u76f8\u5173\u7684\u65b0\u67e5\u627e\u64cd\u4f5c\u90fd\u5e94\u6709\u610f\u8bc6\u5730\u9009\u62e9\u4e00\u79cd\u7ea6\u5b9a\uff0c\u800c\u975e\u65e0\u610f\u4e2d\u7ee7\u627f\u8fd9\u79cd\u4e0d\u4e00\u81f4\u6027\u3002\n- **\u9a8c\u8bc1\u7f3a\u5931\u7684\u5148\u4f8b\u3002** `create_job` \u4f1a\u9a8c\u8bc1 `name` \u4f46\u4e0d\u9a8c\u8bc1 `owner`\u3002\u8bf7\u52ff\u5c06\u8fd9\u79cd\u5bbd\u677e\u505a\u6cd5\u590d\u5236\u5230 `priority` \u4e0a\u2014\u2014\u672a\u7ecf\u9a8c\u8bc1\u7684\u4f18\u5148\u7ea7\u4f1a\u4f20\u64ad\u5230\u6392\u5e8f\u952e\u4e2d\uff0c\u5e76\u53ef\u80fd\u5728 `sorted` \u51fd\u6570\u7684\u6df1\u5904\uff08\u4f8b\u5982\u5c06 `int` \u4e0e `None` \u8fdb\u884c\u6bd4\u8f83\uff09\u5f15\u53d1 `TypeError`\uff0c\u800c\u975e\u5728\u8c03\u7528\u5904\u89e6\u53d1\u3002\n- **\u6b7b\u4ee3\u7801\u9677\u9631\u3002** `scheduler\/time_rules.py` \u770b\u4f3c\u5305\u542b\u8c03\u5ea6\u903b\u8f91\uff0c\u56e0\u6b64\u5bb9\u6613\u5438\u5f15\u4fee\u6539\u3002\u4f46\u8be5\u6587\u4ef6\u672a\u88ab\u4efb\u4f55\u5730\u65b9\u5bfc\u5165\uff0c\u4e14\u5176\u81ea\u8eab\u7684\u6587\u6863\u5b57\u7b26\u4e32\u4e5f\u627f\u8ba4\u4e86\u8be5\u7f3a\u9677\uff1a\u5b83\u4f1a\u589e\u52a0 24 \u5c0f\u65f6\u7684 UTC \u7ecf\u8fc7\u65f6\u95f4\uff0c\u5e76'\u5728\u590f\u4ee4\u65f6\u8f6c\u6362\u671f\u95f4\u8c03\u6574\u672c\u5730\u5899\u949f\u65f6\u95f4\"\u3002 \u4fee\u6539\u5b83\u5bf9\u88ab\u6d4b\u7cfb\u7edf\u6ca1\u6709\u4efb\u4f55\u53ef\u89c2\u5bdf\u5230\u7684\u5f71\u54cd\uff0c\u56e0\u6b64\u5728\u6b64\u5904\u6295\u5165\u7684\u7cbe\u529b\u662f\u6d6a\u8d39\u7684\uff0c\u4e14\u9488\u5bf9\u5b83\u7f16\u5199\u7684\u4efb\u4f55\u6d4b\u8bd5\u90fd\u65e0\u6cd5\u9a8c\u8bc1\u6700\u7ec8\u53d1\u5e03\u7684\u4ee3\u7801\u3002\n- **\u8584\u5f31\u7684\u5b89\u5168\u7f51\u3002** \u4ec5\u6709\u4e24\u4e2a\u6d4b\u8bd5\uff0c\u6ca1\u6709\u6301\u7eed\u96c6\u6210\uff08CI\uff09\u3001\u6ca1\u6709\u4ee3\u7801\u68c0\u67e5\u5de5\u5177\uff08linter\uff09\u3001\u6ca1\u6709\u7c7b\u578b\u68c0\u67e5\u3002\u9664\u4e86\u4f60\u81ea\u5df1\u7f16\u5199\u7684\u4ee3\u7801\u5916\uff0c\u6ca1\u6709\u4efb\u4f55\u4e1c\u897f\u80fd\u6355\u83b7\u56de\u5f52\u95ee\u9898\u3002 \u5e94\u5c06\u73b0\u6709\u6d4b\u8bd5\u5957\u4ef6\u89c6\u4e3a\u8986\u76d6\u7387\u4e0d\u8db3\u7684\u57fa\u51c6\uff0c\u800c\u975e\u901a\u8fc7\u95e8\u69db\u3002\n\n### 6. \u5b9e\u65bd\u8ba1\u5212\uff08\u672a\u6267\u884c\uff09\n\n1. **\u9996\u5148\u4ee5\u4e66\u9762\u5f62\u5f0f\u660e\u786e\u8bed\u4e49\u3002** \u4f18\u5148\u7ea7\u7c7b\u578b\uff08`int` \u4e0e\u679a\u4e3e\uff09\uff0c\u6709\u6548\u8303\u56f4\uff0c\u73b0\u6709\/\u672a\u6307\u5b9a\u4efb\u52a1\u7684\u9ed8\u8ba4\u503c\uff0c\u4ee5\u53ca\u6392\u5e8f\u65b9\u5411\u3002\u5c06\u5176\u4f5c\u4e3a `scheduler\/models.py` \u4e2d `Job` \u7684\u6587\u6863\u5b57\u7b26\u4e32\u8bb0\u5f55\u4e0b\u6765\u2014\u2014\u8fd9\u662f\u6240\u6709\u5c42\u7ea7\u76ee\u524d\u552f\u4e00\u4f9d\u8d56\u7684\u4f4d\u7f6e\u3002\n2. **\u6269\u5c55\u6a21\u578b\u3002** \u5728 `scheduler\/models.py` \u4e2d\u5c06 `priority: int = 0` \u4f5c\u4e3a `Job` \u7684 *\u6700\u540e* \u4e00\u4e2a\u5b57\u6bb5\u6dfb\u52a0\uff0c\u540c\u65f6\u4fdd\u6301\u4e0e `service.py:13` \u7684\u4f4d\u7f6e\u517c\u5bb9\u6027\uff0c\u4e14\u4e0d\u4fee\u6539 `to_dict()`\u3002\n3. **\u5c06\u5176\u8d2f\u7a7f\u5230\u670d\u52a1\u4e2d\u3002** \u5728 `SchedulerService.create_job` \u4e2d\u6dfb\u52a0\u4e00\u4e2a\u9ed8\u8ba4\u503c\u4e3a `0` \u7684 `priority` \u53c2\u6570\uff0c\u5728\u73b0\u6709\u7684 `name.strip()` \u9a8c\u8bc1\u6761\u4ef6\u65c1\u5bf9\u5176\u8fdb\u884c\u9a8c\u8bc1\uff08\u629b\u51fa `ValueError`\uff0c\u4e0e\u5df2\u5efa\u7acb\u7684\u9519\u8bef\u7c7b\u578b\u5339\u914d\uff09\uff0c\u5e76\u5c06\u5176\u4f20\u9012\u7ed9 `Job` \u6784\u9020\u51fd\u6570\u3002\n4. **\u660e\u786e\u786e\u5b9a\u5217\u8868\u63a5\u53e3\u89c4\u8303\u3002** \u9996\u9009\u7684\u4f4e\u98ce\u9669\u65b9\u6848\uff1a\u4fdd\u7559 `JobRepository.all()` \u4f5c\u4e3a\u6309\u6807\u8bc6\u7b26\u6392\u5e8f\u7684\u539f\u59cb\u65b9\u6cd5\uff0c\u5e76\u6dfb\u52a0\u4e00\u4e2a\u5355\u72ec\u7684\u6309\u4f18\u5148\u7ea7\u6392\u5e8f\u7684\u8bbf\u95ee\u5668\u3002\u5982\u679c `list_jobs()` \u5fc5\u987b\u6539\u53d8\u542b\u4e49\uff0c\u5219\u4fee\u6539 `JobRepository.all()` \u7684\u5217\u8868\u63a8\u5bfc\u5f0f\uff0c\u4f7f\u5176\u6309\u5305\u542b `identifier`\uff08\u4f5c\u4e3a\u5e73\u5c40\u51b3\u80dc\u6761\u4ef6\uff09\u7684\u663e\u5f0f\u590d\u5408\u952e\u5bf9\u503c\u8fdb\u884c\u6392\u5e8f\uff0c\u5e76\u5728 `README.md` \u4e2d\u6ce8\u660e\u6b64\u53d8\u66f4\u3002\n5. **\u4ec5\u5f53\u5f15\u5165\u4e86\u516c\u5171\u679a\u4e3e\u6216\u5e38\u91cf\u65f6\uff0c\u624d\u9700\u4fdd\u6301 `scheduler\/__init__.py` \u4e0e\u4e4b\u540c\u6b65**\u3002\n6. **\u8bf7\u52ff\u4fee\u6539 `scheduler\/time_rules.py`**\uff0c\u9664\u975e\u5728\u540c\u4e00\u53d8\u66f4\u4e2d\u66f4\u65b0\u4e86 `fixture-manifest.json` \u4e2d\u7684 `expected_files`\uff0c\u5426\u5219\u8bf7\u52ff\u6dfb\u52a0\u6587\u4ef6\u3002\n\n### 7. \u9a8c\u8bc1\u8ba1\u5212\n\n- **\u5148\u9a8c\u8bc1\u57fa\u7ebf\u3002**\u5728\u8fdb\u884c\u4efb\u4f55\u7f16\u8f91\u4e4b\u524d\uff0c\u8fd0\u884c `python3 -m unittest discover -s tests -v` \u5e76\u786e\u8ba4\u6709 2 \u4e2a\u6d4b\u8bd5\u901a\u8fc7\u3002\u6211\u5df2\u7ecf\u6267\u884c\u8fc7\u6b64\u64cd\u4f5c\u2014\u2014\u6d4b\u8bd5\u5168\u90e8\u901a\u8fc7\u3002\n- **\u56de\u5f52\u68c0\u67e5\u3002** \u4e24\u4e2a\u73b0\u6709\u6d4b\u8bd5\u5728\u672a\u4fee\u6539\u7684\u60c5\u51b5\u4e0b\u5fc5\u987b\u4ecd\u80fd\u901a\u8fc7\u3002\u5982\u679c `test_create_and_list_jobs` \u9700\u8981\u7f16\u8f91\uff0c\u8fd9\u8868\u660e\u8be5\u66f4\u6539\u5bfc\u81f4\u4e86\u56de\u5f52\uff0c\u800c\u4e0d\u662f\u7f16\u8f91\u8be5\u6d4b\u8bd5\u7684\u7406\u7531\u3002\n- **`tests\/test_scheduler.py` \u4e2d\u7684\u65b0\u6d4b\u8bd5\u7528\u4f8b\uff1a**\n  - \u5f53\u4f7f\u7528\u65e7\u7248\u53cc\u53c2\u6570\u7b7e\u540d\u8c03\u7528 `create_job` \u65f6\u7684\u9ed8\u8ba4\u4f18\u5148\u7ea7\uff08\u7528\u4e8e\u9a8c\u8bc1\u5411\u540e\u517c\u5bb9\u6027\uff09\u3002\n  - \u901a\u8fc7 `create_job` \u2192 `list_jobs` \u663e\u5f0f\u9a8c\u8bc1\u4f18\u5148\u7ea7\u7684\u5f80\u8fd4\u884c\u4e3a\u3002\n  - \u5305\u542b **\u4e09\u4e2a\u6216\u66f4\u591a** \u4e0d\u540c\u4f18\u5148\u7ea7\u7684\u6392\u5e8f\uff0c\u9a8c\u8bc1\u5b8c\u6574\u5217\u8868\u2014\u2014\u8fd9\u6b63\u662f\u786e\u5b9a\u6392\u5e8f\u65b9\u5411\u7684\u5173\u952e\u3002\n  - \u5e73\u5c40\u5904\u7406\uff1a\u4f18\u5148\u7ea7\u76f8\u7b49\u7684\u4e24\u4e2a\u4efb\u52a1\u6309\u6807\u8bc6\u7b26\u5347\u5e8f\u8fd4\u56de\u3002\n  - \u65e0\u6548\u4f18\u5148\u7ea7\u4f1a\u5f15\u53d1 `ValueError`\uff0c\u4e0e\u540d\u79f0\u4e3a\u7a7a\u7684\u60c5\u51b5\u4e00\u81f4\u3002\n  - `to_dict()` \u5305\u542b `priority` \u5b57\u6bb5\u53ca\u5176\u9884\u671f\u503c\u3002\n  - \u6ce8\u5165\u7684\u4ed3\u5e93\u8def\u5f84\uff1a`SchedulerService(repository=fake)` \u4ecd\u80fd\u6b63\u786e\u5206\u914d\u4f18\u5148\u7ea7\uff0c\u9a8c\u8bc1\u4e86 `repository \u6216 JobRepository()` \u7f1d\u5408\u673a\u5236\u3002\n- **\u517c\u5bb9\u6027\u68c0\u67e5\u3002** \u786e\u8ba4\u6240\u6709\u5185\u5bb9\u5747\u5728 Python 3.9.6 \u73af\u5883\u4e0b\u8fd0\u884c\u2014\u2014\u4e0d\u4f7f\u7528 `slots=`\u3001\u4e0d\u4f7f\u7528 `kw_only=`\u3001\u4e0d\u4f7f\u7528\u88f8 PEP 604 \u8054\u5408\u7c7b\u578b\u3001\u4e0d\u4f7f\u7528 `StrEnum`\u3002\n- **\u6e05\u5355\u68c0\u67e5\u3002** \u91cd\u65b0\u8bfb\u53d6 `fixture-manifest.json`\uff0c\u5e76\u786e\u8ba4\u78c1\u76d8\u4e0a\u7684\u6587\u4ef6\u96c6\u4ecd\u4e0e `expected_files` \u5339\u914d\u3002\n- **\u786e\u5b9a\u6027\u3002** \u8fd0\u884c\u8be5\u6d4b\u8bd5\u5957\u4ef6\u4e24\u5230\u4e09\u6b21\uff1b\u6d89\u53ca\u5b57\u5178\u8fed\u4ee3\u987a\u5e8f\u7684\u6392\u5e8f\u9519\u8bef\u53ef\u80fd\u4f1a\u95f4\u6b47\u6027\u51fa\u73b0\u3002\n- **\u4ee3\u7801\u6574\u6d01\u5ea6\u3002** \u4f7f\u7528 `PYTHONDONTWRITEBYTECODE=1` \u8fd0\u884c\uff0c\u4ee5\u907f\u514d `__pycache__` \u76ee\u5f55\u4f5c\u4e3a\u672a\u88ab\u8ffd\u8e2a\u7684\u504f\u5dee\u51fa\u73b0\u5728\u6e05\u5355\u4e2d\u3002.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">\u73af\u5883\u9650\u5236\uff1a\u8fd9\u662f\u4e00\u4e2a\u5c0f\u578b\u79bb\u7ebf Python \u4ee3\u7801\u5e93\u3002Claude \u5728 CLI OAuth \u8fc7\u671f\u540e\u4f7f\u7528\u4e86\u5b50\u4ee3\u7406\u4f5c\u4e3a\u5907\u7528\u65b9\u6848\uff0c\u56e0\u6b64\u9694\u79bb\u6027\u548c\u4ee4\u724c\u53ef\u89c1\u6027\u5e76\u4e0d\u5b8c\u5168\u4e00\u81f4\u3002.<\/p><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\u8be5\u7ed3\u679c\u5e76\u4e0d\u80fd\u8bc1\u660e\u8be5\u5de5\u5177\u5728\u5927\u89c4\u6a21\u5355\u4ed3\u5e93\u6216\u4e3a\u671f\u4e00\u5468\u7684\u81ea\u4e3b\u8fd0\u884c\u4e2d\u7684\u8868\u73b0\u3002\u672c\u6b21\u6d4b\u8bd5\u73af\u5883\u662f\u523b\u610f\u8bbe\u8ba1\u5f97\u89c4\u6a21\u8f83\u5c0f\u4e14\u53d7\u63a7\u7684\u3002\u82e5\u8981\u8fdb\u884c\u5b9e\u9645\u8bc4\u4f30\uff0c\u8bf7\u4ece\u53ea\u8bfb\u63d0\u793a\u5f00\u59cb\uff1a\u5728\u5141\u8bb8\u7f16\u8f91\u4e4b\u524d\uff0c\u8981\u6c42\u6bcf\u6b3e\u5de5\u5177\u7ed8\u5236\u8c03\u7528\u8def\u5f84\u3001\u5217\u51fa\u5c06\u8981\u4fee\u6539\u7684\u6587\u4ef6\u3001\u8bc6\u522b\u6d4b\u8bd5\u7528\u4f8b\uff0c\u5e76\u5217\u51fa\u672a\u89e3\u51b3\u7684\u5047\u8bbe\u3002.<\/p>\n\n\n\n<h2 id=\"implementation\" class=\"wp-block-heading\">\u5b9e\u73b0\u65b9\u5f0f\u3001\u8865\u4e01\u8303\u56f4\u548c\u9519\u8bef\u4fee\u590d<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u591a\u6587\u4ef6\u529f\u80fd\u64cd\u4f5c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u76f8\u540c\u7684\u901a\u8fc7\u7ed3\u679c\u53ef\u80fd\u6e90\u4e8e\u4e0d\u540c\u7684\u5de5\u7a0b\u8bbe\u8ba1\u9009\u62e9\u3002\u5728 T2 \u6d4b\u8bd5\u4e2d\uff0c\u4e24\u6b3e\u4ea7\u54c1\u5747\u83b7\u5f97 30\/30 \u7684\u8bc4\u5206\uff0c\u5e76\u901a\u8fc7\u4e86\u201c\u51bb\u7ed3\u9690\u85cf\u9a8c\u8bc1\u5668\u201d\u6d4b\u8bd5\u3002Claude Code \u5728\u591a\u4e2a\u8fb9\u754c\u5904\u8bbe\u7f6e\u4e86\u9a8c\u8bc1\uff0c\u5e76\u589e\u52a0\u4e86\u66f4\u5168\u9762\u7684\u76f4\u63a5\u6a21\u578b\u548c\u9608\u503c\u6d4b\u8bd5\u3002Codex \u91c7\u7528\u4e86\u4e00\u79cd\u89c4\u6a21\u8f83\u5c0f\u3001\u4ee5\u670d\u52a1\u4e3a\u4e2d\u5fc3\u7684\u5b9e\u73b0\u65b9\u6848\uff0c\u540c\u6837\u6ee1\u8db3\u4e86\u5408\u7ea6\u8981\u6c42\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u4e8e\u72ec\u7acb\u5f00\u53d1\u8005\u800c\u8a00\uff0c\u8fd9\u786e\u5b9e\u662f\u4e00\u4e2a\u6743\u8861\u53d6\u820d\u7684\u95ee\u9898\u3002\u5f53\u5bf9\u8c61\u901a\u8fc7\u591a\u79cd\u8def\u5f84\u521b\u5efa\u65f6\uff0c\u66f4\u5e7f\u6cdb\u7684\u9a8c\u8bc1\u53ef\u4ee5\u4fdd\u62a4\u4e0d\u53d8\u91cf\uff1b\u800c\u5f53\u67d0\u4e2a\u670d\u52a1\u662f\u9884\u671f\u7684\u5165\u53e3\u70b9\u65f6\uff0c\u8f83\u5c0f\u7684\u8865\u4e01\u53ef\u4ee5\u51cf\u5c11\u56de\u5f52\u98ce\u9669\u5e76\u7f29\u77ed\u4ee3\u7801\u5ba1\u67e5\u65f6\u95f4\u3002\u6b63\u786e\u7684\u7b54\u6848\u53d6\u51b3\u4e8e\u4ee3\u7801\u5e93\u7684\u6240\u6709\u6743\u89c4\u5219\uff0c\u800c\u4e0d\u662f\u5b64\u7acb\u5730\u7edf\u8ba1\u4fee\u6539\u7684\u884c\u6570\u6216\u6d4b\u8bd5\u6570\u91cf\u3002.<\/p>\n\n\n\n<style>\n.evidence-t2-multifile-feature{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}\n.evidence-t2-multifile-feature *{box-sizing:border-box}.evidence-t2-multifile-feature .d-head{display:flex;align-items:flex-start;justify-content:space-between;gap:22px;padding:24px 26px 20px;border-bottom:1px solid var(--line)}\n.evidence-t2-multifile-feature .d-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.evidence-t2-multifile-feature .d-title{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.evidence-t2-multifile-feature .d-sub{margin:7px 0 0;color:var(--body);font-size:13px}.evidence-t2-multifile-feature .d-pill{flex:0 0 auto;padding:6px 10px;border:1px solid #ccd6ff;border-radius:999px;color:#2448ca;background:#f0f3ff;font-size:11px;font-weight:800}.evidence-t2-multifile-feature .d-grid{display:grid;grid-template-columns:1fr 1fr}.evidence-t2-multifile-feature .d-side{min-width:0;padding:24px 26px}.evidence-t2-multifile-feature .d-side+.d-side{border-left:1px solid var(--line)}.evidence-t2-multifile-feature .d-product{display:flex;align-items:baseline;justify-content:space-between;gap:14px;font-weight:800}.evidence-t2-multifile-feature .d-score{font-size:34px;line-height:1;letter-spacing:-.05em}.evidence-t2-multifile-feature .d-score small{color:var(--muted);font-size:12px;letter-spacing:0}.evidence-t2-multifile-feature .d-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:18px 0}.evidence-t2-multifile-feature .d-metric{padding:10px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.evidence-t2-multifile-feature .d-metric span{display:block;color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.evidence-t2-multifile-feature .d-metric strong{display:block;margin-top:3px;font-size:13px}.evidence-t2-multifile-feature .d-preview{position:relative;height:192px;overflow:hidden;border:1px solid #29313f;border-radius:6px;background:#11151d;color:#edf0f5}.evidence-t2-multifile-feature .d-preview-label{padding:11px 13px;border-bottom:1px solid rgba(255,255,255,.1);color:#aeb7c7;font:750 9px\/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.06em;text-transform:uppercase}.evidence-t2-multifile-feature .d-preview pre,.evidence-t2-multifile-feature .d-full pre{margin:0;white-space:pre-wrap;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.evidence-t2-multifile-feature .d-preview pre{padding:13px}.evidence-t2-multifile-feature .d-preview:after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:55px;background:linear-gradient(transparent,#11151d)}.evidence-t2-multifile-feature .d-take{margin:14px 0 0;color:var(--body);font-size:12px}.evidence-t2-multifile-feature .d-fulls{padding:0 26px 22px}.evidence-t2-multifile-feature .d-full{margin-top:10px;border:1px solid var(--line);border-radius:6px}.evidence-t2-multifile-feature .d-full summary{cursor:pointer;padding:13px 14px;font-size:12px;font-weight:800;list-style:none}.evidence-t2-multifile-feature .d-full summary::-webkit-details-marker{display:none}.evidence-t2-multifile-feature .d-full summary:after{content:\"+\";float:right;color:var(--blue);font-size:17px}.evidence-t2-multifile-feature .d-full[open] summary:after{content:\"\u2212\"}.evidence-t2-multifile-feature .d-full-pane{padding:0 14px 14px}.evidence-t2-multifile-feature .d-full-note{margin:0 0 9px;color:var(--muted);font-size:10px}.evidence-t2-multifile-feature .d-full pre{max-height:620px;overflow:auto;padding:15px;border-radius:5px;background:#f5f6f8;color:#222936;border:1px solid #e0e3e8}.evidence-t2-multifile-feature .d-limit{margin:0;padding:12px 26px;border-top:1px solid var(--line);color:#5a6270;background:#fafbfc;font-size:11px}\n@media(max-width:760px){.evidence-t2-multifile-feature .d-head{display:block}.evidence-t2-multifile-feature .d-pill{display:inline-block;margin-top:12px}.evidence-t2-multifile-feature .d-grid{grid-template-columns:1fr}.evidence-t2-multifile-feature .d-side+.d-side{border-left:0;border-top:1px solid var(--line)}}@media(max-width:480px){.evidence-t2-multifile-feature .d-head,.evidence-t2-multifile-feature .d-side{padding:20px}.evidence-t2-multifile-feature .d-fulls{padding:0 20px 20px}.evidence-t2-multifile-feature .d-metrics{grid-template-columns:1fr}}\n<\/style><article class=\"evidence-t2-multifile-feature\"><header class=\"d-head\"><div><p class=\"d-kicker\">T2 \u00b7 \u53d7\u63a7\u5b58\u50a8\u5e93\u6d4b\u8bd5<\/p><h3 class=\"d-title\">\u5728\u591a\u4e2a\u6587\u4ef6\u4e2d\u5b9e\u73b0\u4f18\u5148\u7ea7\u529f\u80fd<\/h3><p class=\"d-sub\">\u6dfb\u52a0\u51bb\u7ed3\u884c\u4e3a\uff0c\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u5e76\u901a\u8fc7\u516c\u5171\u548c\u9690\u85cf\u68c0\u67e5\u3002.<\/p><\/div><span class=\"d-pill\">\u529f\u80fd\u9886\u5e26<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"Codex \u7ed3\u679c\"><div class=\"d-product\"><span>\u300a\u6cd5\u5178\u300b<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7eed\u65f6\u95f4<\/span><strong>115 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>7 + \u9690\u85cf\u5185\u5bb9<\/strong><\/div><div class=\"d-metric\"><span>\u8303\u56f4<\/span><strong>\u8f83\u5c0f\u7684\u8865\u4e01<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u4e2a\u6709\u6548\u7684\u8f93\u51fa\u7247\u6bb5<\/div><pre>\u4e3a\u4e0d\u53ef\u53d8\u6a21\u578b\u6dfb\u52a0\u4e86\u4f18\u5148\u7ea7\uff0c\u5728\u670d\u52a1\u8fb9\u754c\u5904\u5bf9\u5176\u8fdb\u884c\u4e86\u9a8c\u8bc1\uff0c\u5e76\u5728\u5b58\u50a8\u5e93\u4e2d\u4fdd\u6301\u4e86\u987a\u5e8f\u3002\n\n\u5168\u90e8\u4e03\u4e2a\u516c\u5f00\u6d4b\u8bd5\u4ee5\u53ca\u51bb\u7ed3\u7684\u9690\u85cf\u9a8c\u8bc1\u5668\u5747\u901a\u8fc7\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8bc4\u8bba\u8005\u89c2\u70b9\uff1a<\/strong> \u4e00\u4e2a\u89c4\u6a21\u8f83\u5c0f\u3001\u4ee5\u670d\u52a1\u4e3a\u4e2d\u5fc3\u7684\u5b9e\u73b0\u65b9\u6848\uff0c\u6ee1\u8db3\u4e86\u6240\u6709\u51bb\u7ed3\u884c\u4e3a\u3002.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \u4ee3\u7801\u7ed3\u679c\"><div class=\"d-product\"><span>\u514b\u52b3\u5fb7\u4ee3\u7801<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7eed\u65f6\u95f4<\/span><strong>101 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>14 + \u9690\u85cf\u5185\u5bb9<\/strong><\/div><div class=\"d-metric\"><span>\u8303\u56f4<\/span><strong>\u66f4\u5168\u9762\u7684\u6d4b\u8bd5<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u4e2a\u6709\u6548\u7684\u8f93\u51fa\u7247\u6bb5<\/div><pre>\u5df2\u5728\u670d\u52a1\u8fb9\u754c\u548c\u4e0d\u53ef\u53d8\u6a21\u578b\u4e24\u5904\u9a8c\u8bc1\u4e86\u4f18\u5148\u7ea7\uff0c\u4fdd\u7559\u4e86\u4ed3\u5e93\u8fc7\u6ee4\u529f\u80fd\uff0c\u5e76\u6dfb\u52a0\u4e86\u9608\u503c\u8986\u76d6\u7387\u3002\n\n\u5341\u56db\u9879\u516c\u5f00\u6d4b\u8bd5\u548c\u9690\u85cf\u9a8c\u8bc1\u5668\u5747\u901a\u8fc7\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8bc4\u8bba\u8005\u89c2\u70b9\uff1a<\/strong> \u76f4\u63a5\u6a21\u578b\u548c\u9608\u503c\u6a21\u578b\u7684\u8986\u76d6\u8303\u56f4\u66f4\u5e7f\uff0c\u4f46\u5728\u529f\u80fd\u8bc4\u5206\u65b9\u9762\u5e76\u65e0\u4f18\u52bf\u3002.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>\u67e5\u770b\u5b8c\u6574\u7684Codex\u8f93\u51fa\u7ed3\u679c<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u3001\u7ecf\u8fc7\u5b89\u5168\u5904\u7406\u7684\u3001\u9996\u6b21\u6709\u6548\u7684\u8f93\u51fa<\/p><pre>\u5b9e\u73b0\u4e86\u5b9a\u65f6\u4efb\u52a1\u4f18\u5148\u7ea7\u529f\u80fd\u3002\n\n\u4fee\u6539\u7684\u6587\u4ef6\uff1a\n\n- [scheduler\/models.py](.\/scheduler\/models.py:5) \u2014 \u6dfb\u52a0\u4e86\u5e8f\u5217\u5316\u5b57\u6bb5 `priority`\uff0c\u9ed8\u8ba4\u503c\u4e3a `0`\u3002\n- [scheduler\/service.py](.\/scheduler\/service.py:11) \u2014 \u6dfb\u52a0\u4e86\u9a8c\u8bc1\u3001\u5b58\u50a8\u4ee5\u53ca `list_jobs(min_priority=0)` \u8fc7\u6ee4\u529f\u80fd\uff0c\u540c\u65f6\u4fdd\u6301\u6807\u8bc6\u7b26\u7684\u987a\u5e8f\u3002\n- [tests\/test_scheduler.py](.\/tests\/test_scheduler.py:16) \u2014 \u589e\u52a0\u4e86\u5bf9\u9ed8\u8ba4\u503c\u3001\u5e8f\u5217\u5316\u3001\u5b58\u50a8\u3001\u8fb9\u754c\u6761\u4ef6\u3001\u65e0\u6548\u503c\u4ee5\u53ca\u8fc7\u6ee4\u64cd\u4f5c\u7684\u4ee3\u7801\u8986\u76d6\u7387\u6d4b\u8bd5\u3002\n\n\u5df2\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1a\n\n```text\npython3 -m unittest discover -s tests -v\n\u5df2\u8fd0\u884c 7 \u4e2a\u6d4b\u8bd5 \u2014 OK\n```\n\n**\u7ed3\u8bba\uff1a** \u8be5\u51bb\u7ed3\u4efb\u52a1\u5df2\u5b8c\u6210\u5e76\u7ecf\u8fc7\u9a8c\u8bc1\u3002  \n**\u9700\u505a\u51fa\u7684\u51b3\u7b56\uff1a** \u65e0\u3002.<\/pre><\/div><\/details><details class=\"d-full\"><summary>\u67e5\u770b\u5b8c\u6574\u7684 Claude \u4ee3\u7801\u8f93\u51fa<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u4ea4\u63a5\u8bb0\u5f55\uff0c\u5305\u62ec\u9996\u6b21\u6709\u6548\u7684\u8f93\u51fa\u539f\u6587<\/p><pre># T2 \u8fd0\u884c\u8bb0\u5f55 \u2014 \u591a\u6587\u4ef6\u4f18\u5148\u7ea7\u529f\u80fd\n\n## \u6267\u884c\u53c2\u6570\n\n| \u5b57\u6bb5 | \u503c |\n| --- | --- |\n| \u4efb\u52a1 | `T2` |\n| \u51bb\u7ed3\u63d0\u793a\u8bcd | `01-prompts\/T2.md` |\n| \u51bb\u7ed3\u63d0\u793a\u8bcd SHA-256 | `8476a56034c4e719b97ee4081b32b4c73efd45feafe1bda9d477c83cb8fdb698` |\n| \u6267\u884c\u5355\u5143 | \u9694\u79bb\u7684 Claude \u5b50\u4ee3\u7406\uff0c`\u901a\u7528\u578b`\uff0c\u5168\u65b0\u4e0a\u4e0b\u6587 |\n| \u9694\u79bb\u65b9\u6cd5 | **\u5b50\u4ee3\u7406\u56de\u9000**\uff08\u5df2\u8bb0\u5f55\u7684\u964d\u7ea7\u64cd\u4f5c \u2014 \u53c2\u89c1 `results\/isolation-decision.md`\uff09 |\n| \u5206\u914d\u7684\u5e72\u51c0\u526f\u672c | `runtime\/workspaces\/T2` |\n| Claude \u4ee3\u7801\u7248\u672c | `2.1.220` |\n| \u6a21\u578b\u8bbe\u7f6e | `claude-opus-5` |\n| start_utc | `2026-07-28T10:27:52Z` |\n| end_utc | `2026-07-28T10:29:33Z` |\n| \u6301\u7eed\u65f6\u95f4 | 101 \u79d2\uff08\u4e0e T1\u3001T3\u3001T4 \u540c\u65f6\u8fdb\u884c\uff1b\u975e\u7eaf\u5ef6\u8fdf\u6d4b\u91cf\uff09 |\n| \u5c1d\u8bd5\u6b21\u6570 | 1 |\n| \u72b6\u6001 | `\u6709\u6548` |\n| \u4eba\u5de5\u5e72\u9884 | \u65e0 |\n\n## \u5b89\u5168\u5de5\u5177\u6458\u8981\n\n`date`\u3001\u4ec5\u5728\u6307\u5b9a\u5de5\u4f5c\u533a\u5185\u8fdb\u884c`\u8bfb\u53d6`\/`\u7f16\u8f91`\/`\u5199\u5165`\u3001`grep`\u3001\n`python3 -m unittest discover`\u3001`python3 -m compileall`\u3001\u5185\u8054 `python3 -c` \u70df\u96fe\u6d4b\u8bd5\u3002\n\u65e0\u7f51\u7edc\uff0c\u65e0\u5b89\u88c5\uff0c\u4ec5\u4f7f\u7528\u6807\u51c6\u5e93\u3002\n\n## \u5df2\u4fee\u6539\u7684\u6587\u4ef6\n\n`scheduler\/models.py`\u3001`scheduler\/repository.py`\u3001`scheduler\/service.py`\u3001\n`tests\/test_scheduler.py`\u3002 \u672a\u6dfb\u52a0\u6216\u5220\u9664\u4efb\u4f55\u6587\u4ef6\uff0c\u56e0\u6b64 `fixture-manifest.json` \u4fdd\u6301\n\u51c6\u786e\u3002\u5b8c\u6574\u8865\u4e01\uff1a`results\/T2\/patch.diff`\u3002\n\n## \u79bb\u7ebf\u68c0\u67e5\u7ed3\u679c\n\n\u4efb\u52a1\u8fd0\u884c\u5668\u62a5\u544a\uff1a\n\n| \u68c0\u67e5 | \u7ed3\u679c |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v`\uff08\u57fa\u7ebf\uff0c\u53d8\u66f4\u524d\uff09 | 2 \u901a\u8fc7\uff0c0 \u5931\u8d25 |\n| `python3 -m compileall -q scheduler tests` | \u65e0\u9519\u8bef |\n| \u5185\u8054\u70df\u96fe\u6d4b\u8bd5\uff08\u65e7\u7248 3 \u53c2\u6570\u6784\u9020\u3001\u5173\u952e\u5b57\/\u4f4d\u7f6e\u9608\u503c\u3001`to_dict`\uff09 | \u901a\u8fc7 |\n| `python3 -m unittest discover -s tests -v`\uff08\u6700\u7ec8\uff09 | **14 \u4e2a\u901a\u8fc7\uff0c0 \u4e2a\u5931\u8d25** |\n\n\u7531\u534f\u8c03\u5458\u5728\u5de5\u4f5c\u533a\u5916\u90e8\u72ec\u7acb\u91cd\u65b0\u9a8c\u8bc1\uff1a\n\n| \u68c0\u67e5\u9879 | \u9000\u51fa\u72b6\u6001 | \u7ed3\u679c |\n| --- | --- | --- |\n| \u516c\u5171\u6d4b\u8bd5\u5957\u4ef6\uff08`results\/checks\/T2-public.txt`\uff09 | 0 | 14 \u4e2a\u6d4b\u8bd5\uff0c\u901a\u8fc7 |\n| \u9690\u85cf\u9a8c\u8bc1\u5668 `03-checks\/test_t2_hidden.py` (`results\/checks\/T2-hidden.txt`) | 0 | 2 \u4e2a\u6d4b\u8bd5\uff0c\u901a\u8fc7 |\n\n\u9690\u85cf\u9a8c\u8bc1\u5668\u5728\u539f\u59cb\u6d4b\u8bd5\u6570\u636e\u526f\u672c\u4e0a\u5931\u8d25\uff08\u9000\u51fa\u4ee3\u7801 1\uff09\uff0c\u8fd9\u8bc1\u5b9e\u4e86\u901a\u8fc7\u7ed3\u679c\u5177\u6709\n\u5b9e\u9645\u610f\u4e49\u3002\u53c2\u89c1 `results\/checks\/validator-controls.md`\u3002\n\n## \u9ec4\u91d1\u6620\u5c04\u884c\u4e3a\u8986\u76d6\u7387\n\n`03-checks\/gold-map.json` \u4e2d\u6240\u6709\u4e94\u4e2a\u5fc5\u5907\u884c\u4e3a\u5747\u5df2\u6ee1\u8db3\uff1a\n\n| \u5fc5\u5907\u884c\u4e3a | \u8bc1\u636e |\n| --- | --- |\n| \u4f18\u5148\u7ea7\u9ed8\u8ba4\u503c\u4e3a 0 | `Job.priority: int = MIN_PRIORITY`\uff1b `create_job(..., priority=MIN_PRIORITY)`; `test_priority_defaults_to_zero` |\n| \u6574\u6570\u8303\u56f4 0 \u81f3 9 | `validate_priority` \u4f1a\u62d2\u7edd\u975e\u6574\u6570\u548c\u8d85\u51fa\u8303\u56f4\u7684\u503c\uff1b `test_out_of_range_priority_is_rejected`\u3001`test_non_integer_priority_is_rejected` |\n| \u5e8f\u5217\u5316\u4f18\u5148\u7ea7 | \u901a\u8fc7 `asdict` \u8c03\u7528 `to_dict()`\uff1b `test_priority_appears_in_serialized_output` \u65ad\u8a00\u5e8f\u5217\u5316\u8f93\u51fa\u4e2d\u5305\u542b\u786e\u5207\u7684\u5b57\u5178 |\n| \u6700\u4f4e\u4f18\u5148\u7ea7\u8fc7\u6ee4 | `list_jobs(min_priority=0)` \u2192 `JobRepository.all(min_priority)`; `test_filter_is_inclusive_of_the_threshold` |\n| \u6807\u8bc6\u7b26\u6392\u5e8f | \u5728\u73b0\u6709\u7684 `sorted(self._jobs)` \u7406\u89e3\u5f0f\u5185\u90e8\u5e94\u7528\u8fc7\u6ee4\u5668\uff1b`test_filter_preserves_ascending_identifier_order` |\n\n## \u5df2\u6e05\u7406\u7684\u9519\u8bef\n\n\u65e0\u3002\u6d4b\u8bd5\u8fd0\u884c\u4ea7\u751f\u7684 `__pycache__` \u6b8b\u7559\u6587\u4ef6\u5df2\u88ab\u4efb\u52a1\u8fd0\u884c\u5668\u79fb\u9664\uff1b\u534f\u8c03\u5668\n\u6e05\u7406\u64cd\u4f5c\u786e\u8ba4\u5de5\u4f5c\u533a\u5df2\u6e05\u7406\u5b8c\u6bd5\u3002\n\n## \u53ef\u89c1\u8f93\u51fa\uff08\u539f\u6837\uff09\n\n\u5728\u672c\u5730\u8c03\u5ea6\u5668\u6d4b\u8bd5 fixture \u7684\u6a21\u578b\u3001\u5b58\u50a8\u5e93\u548c\u670d\u52a1\u5c42\u4e2d\uff0c\u4e3a\u5df2\u6392\u7a0b\u4efb\u52a1\u6dfb\u52a0\u4e86\u6574\u578b `priority` \u5b57\u6bb5\uff0c\u5e76\u5728\u8fc7\u6ee4\u540e\u7684\u5217\u8868\u4e2d\u663e\u793a\u3002\n\n**`scheduler\/models.py`** \u2014 \u6dfb\u52a0\u4e86\u6a21\u5757\u5e38\u91cf `MIN_PRIORITY = 0` \/ `MAX_PRIORITY = 9`\uff0c\u4ee5\u53ca\u53ef\u91cd\u7528\u7684 `validate_priority(priority)` \u51fd\u6570\uff0c\u8be5\u51fd\u6570\u4f1a\u5bf9\u975e\u6574\u6570\u4ee5\u53ca\u8d85\u51fa 0\u20139\uff08\u542b 0 \u548c 9\uff09\u8303\u56f4\u7684\u503c\u629b\u51fa `ValueError`\u3002 \u5c3d\u7ba1 `bool` \u662f `int` \u7684\u5b50\u7c7b\uff0c\u4f46\u4f1a\u88ab\u660e\u786e\u62d2\u7edd\uff0c\u56e0\u6b64 `True` \u65e0\u6cd5\u4f5c\u4e3a\u4f18\u5148\u7ea7 1 \u6df7\u5165\u3002 \u51bb\u7ed3\u7684 `Job` \u6570\u636e\u7c7b\u65b0\u589e\u4e86\u5e26\u6709\u9ed8\u8ba4\u503c\u7684\u5c3e\u90e8\u5b57\u6bb5 `priority: int = MIN_PRIORITY`\uff0c\u8fd9\u786e\u4fdd\u4e86\u73b0\u6709\u7684\u4e09\u53c2\u6570\u6784\u9020\u51fd\u6570\u4ecd\u53ef\u6b63\u5e38\u5de5\u4f5c\uff1b\u540c\u65f6\u65b0\u589e\u4e86 `__post_init__` \u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u4f1a\u8c03\u7528\u9a8c\u8bc1\u5668\uff0c\u4ece\u800c\u786e\u4fdd\u65e0\u8bba\u901a\u8fc7\u4f55\u79cd\u8def\u5f84\u90fd\u65e0\u6cd5\u6784\u9020\u51fa\u65e0\u6548\u7684\u4f18\u5148\u7ea7\u3002 `to_dict()` \u4ecd\u4fdd\u7559\u4e3a `asdict(self)`\uff0c\u56e0\u6b64\u4f18\u5148\u7ea7\u4f1a\u81ea\u52a8\u6309\u5b57\u6bb5\u987a\u5e8f\u51fa\u73b0\u5728\u5e8f\u5217\u5316\u8f93\u51fa\u4e2d\u3002\n\n**`scheduler\/repository.py`** \u2014 `JobRepository.all()` \u63a5\u53d7\u53ef\u9009\u7684 `min_priority` \u53c2\u6570\uff0c\u5e76\u5728\u73b0\u6709\u7684 `sorted(self._jobs)` \u5217\u8868\u63a8\u5bfc\u5f0f\u4e2d\u8fdb\u884c\u8fc7\u6ee4\uff0c\u56e0\u6b64\u901a\u8fc7\u539f\u672c\u5c31\u5df2\u4fdd\u8bc1\u5347\u5e8f\u6807\u8bc6\u7b26\u6392\u5e8f\u7684\u540c\u4e00\u4ee3\u7801\u8def\u5f84\u6765\u7ef4\u6301\u8be5\u6392\u5e8f\uff0c\u800c\u975e\u5728\u8fc7\u6ee4\u540e\u91cd\u65b0\u5efa\u7acb\u6392\u5e8f\u3002 \u9ed8\u8ba4\u53c2\u6570\u4fdd\u7559\u4e86\u9488\u5bf9\u73b0\u6709\u8c03\u7528\u8005\u7684\u65e0\u53c2\u6570\u884c\u4e3a\u3002\u5b58\u50a8\u672c\u8eab\u65e0\u9700\u66f4\u6539\uff1a\u5b58\u50a8\u5e93\u5b58\u50a8\u5b8c\u6574\u7684 `Job` \u5b9e\u4f8b\uff0c\u56e0\u6b64\u4f18\u5148\u7ea7\u5f97\u4ee5\u4fdd\u7559\uff0c\u5e76\u5728 `save`\/`get`\/`all` \u64cd\u4f5c\u4e2d\u4fdd\u6301\u4e00\u81f4\u3002\n\n**`scheduler\/service.py`** \u2014 `create_job` \u63a5\u53d7\u4e00\u4e2a\u53ef\u9009\u7684\u5c3e\u968f `priority` \u53c2\u6570\uff08\u9ed8\u8ba4\u503c\u4e3a 0\uff09\uff0c\u5e76\u5728\u6784\u5efa `Job` \u4e4b\u524d\u5bf9\u5176\u8fdb\u884c\u9a8c\u8bc1\uff0c\u56e0\u6b64\u9519\u8bef\u4f1a\u5728\u670d\u52a1\u8fb9\u754c\u5904\u629b\u51fa\uff0c\u5176 `ValueError` \u5951\u7ea6\u4e0e\u73b0\u6709\u7684\u7a7a\u540d\u79f0\u68c0\u67e5\u4e00\u81f4\u3002 `list_jobs(min_priority=0)` \u5c06\u8c03\u7528\u59d4\u6258\u7ed9\u5b58\u50a8\u5e93\u3002\u6392\u5e8f\u548c\u8fc7\u6ee4\u529f\u80fd\u96c6\u4e2d\u5728\u4e00\u4e2a\u5730\u65b9\uff0c\u800c\u975e\u91cd\u590d\u5b9e\u73b0\u3002\n\n**\u5173\u4e8e `min_priority` \u9a8c\u8bc1\u7684\u8bbe\u8ba1\u8bf4\u660e\uff1a** \u867d\u7136\u5b83\u4f5c\u4e3a\u6574\u6570\u8fdb\u884c\u7c7b\u578b\u68c0\u67e5\uff0c\u4f46\u523b\u610f*\u672a*\u5c06\u5176\u8303\u56f4\u9650\u5236\u5728 0\u20139 \u4e4b\u95f4\u3002 0\u20139 \u89c4\u5219\u9650\u5236\u4e86\u4efb\u52a1\u53ef\u80fd\u5b58\u50a8\u7684\u503c\uff1b\u9608\u503c\u662f\u67e5\u8be2\u53c2\u6570\uff0c\u5982\u679c\u62d2\u7edd\u4f8b\u5982 `min_priority=10`\uff0c\u4f1a\u5c06\u4e00\u4e2a\u5408\u6cd5\u7684\"\u65e0\u5339\u914d\u9879\"\u67e5\u8be2\u8f6c\u5316\u4e3a\u9519\u8bef\u3002 \u5f53\u6ca1\u6709\u4efb\u52a1\u4f18\u5148\u7ea7\u4e3a 9 \u65f6\uff0c`list_jobs(min_priority=9)` \u8fd4\u56de `[]` \u7684\u60c5\u51b5\u5df2\u5728\u6d4b\u8bd5\u4e2d\u8986\u76d6\u3002\n\n\u5df2\u9605\u8bfb `scheduler\/time_rules.py` \u4f46\u672a\u4f5c\u4fee\u6539\u2014\u2014\u5176\u6587\u6863\u4e2d\u8bb0\u8f7d\u7684\u590f\u4ee4\u65f6\u8c03\u6574\u5c5e\u4e8e\u9884\u5148\u5b58\u5728\u7684\u9ed8\u8ba4\u884c\u4e3a\uff0c\u8d85\u51fa\u672c\u6b21\u4efb\u52a1\u8303\u56f4\uff0c\u4e14\u4fee\u6539\u8be5\u884c\u4e3a\u5c06\u5bfc\u81f4\u65e0\u5173\u7684\u884c\u4e3a\u53d8\u66f4\u3002 \u672a\u6dfb\u52a0\u6216\u5220\u9664\u4efb\u4f55\u6587\u4ef6\uff0c\u56e0\u6b64 `fixture-manifest.json` \u4ecd\u4fdd\u6301\u51c6\u786e\uff08\u5df2\u901a\u8fc7\u7a0b\u5e8f\u9a8c\u8bc1\uff09\u3002\n\n### \u589e\u52a0\u4e86\u6d4b\u8bd5\u8986\u76d6\u7387\n\n\u9ed8\u8ba4\u503c\u4e3a 0\uff1b\u901a\u8fc7 `JobRepository` \u8fdb\u884c\u5b58\u50a8\u5f80\u8fd4\u64cd\u4f5c\uff1b`to_dict()` \u8f93\u51fa\u4e2d\u7684\u4f18\u5148\u7ea7\uff1b\u63a5\u53d7\u8fb9\u754c\u503c 0 \u548c 9\uff1b\u62d2\u7edd\u8d85\u51fa\u8303\u56f4\u7684 \u22121\/10\/100\uff1b \u975e\u6574\u6570 `\"3\"`\/`3.5`\/`None`\/`True` \u88ab\u62d2\u7edd\uff1b\u76f4\u63a5\u5728\u6a21\u578b\u7ea7\u522b\u8fdb\u884c\u9a8c\u8bc1\uff1b\u672a\u8fc7\u6ee4\u7684\u5217\u8868\u987a\u5e8f\uff1b\u8fc7\u6ee4\u540e\u7684\u5217\u8868\u4fdd\u7559\u6807\u8bc6\u7b26\u5347\u5e8f\uff1b\u5305\u542b\u9608\u503c\uff1b\u7a7a\u7ed3\u679c\uff1b\u975e\u6574\u6570 `min_priority` \u88ab\u62d2\u7edd\u3002.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">\u73af\u5883\u9650\u5236\uff1a\u8fd9\u662f\u4e00\u4e2a\u5c0f\u578b\u79bb\u7ebf Python \u4ee3\u7801\u5e93\u3002Claude \u5728 CLI OAuth \u8fc7\u671f\u540e\u4f7f\u7528\u4e86\u5b50\u4ee3\u7406\u4f5c\u4e3a\u5907\u7528\u65b9\u6848\uff0c\u56e0\u6b64\u9694\u79bb\u6027\u548c\u4ee4\u724c\u53ef\u89c1\u6027\u5e76\u4e0d\u5b8c\u5168\u4e00\u81f4\u3002.<\/p><\/article>\n\n\n\n<h3 class=\"wp-block-heading\">\u8fb9\u7f18\u60c5\u51b5\u4e0b\u7684\u9519\u8bef\u4fee\u590d<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">T3 \u6d4b\u8bd5\u4e86\u590f\u4ee4\u65f6\u8c03\u5ea6\u7f3a\u9677\u3002\u4e24\u4e2a\u4ee3\u7406\u5747\u83b7\u5f97 30\/30 \u5206\uff0c\u5e76\u901a\u8fc7\u4e86\u76f8\u540c\u7684\u6625\u5b63\u548c\u79cb\u5b63\u9690\u85cf\u68c0\u67e5\u3002Claude \u4ee3\u7801\u9488\u5bf9\u6a21\u68f1\u4e24\u53ef\u548c\u88ab\u8df3\u8fc7\u7684\u672c\u5730\u65f6\u95f4\u3001\u7b80\u5355\u7c97\u66b4\u7684\u8f93\u5165\u4ee5\u53ca\u591a\u65e5\u6eda\u52a8\u60c5\u51b5\u589e\u52a0\u4e86\u663e\u5f0f\u8986\u76d6\u3002Codex \u5bf9\u65e5\u5386\u65e5\u8fdb\u884c\u4e86\u66f4\u7ec6\u5fae\u7684\u8c03\u6574\uff0c\u5e76\u901a\u8fc7\u4e86\u51bb\u7ed3\u5408\u540c\u6d4b\u8bd5\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u5e93\u88ab\u5e7f\u6cdb\u91cd\u7528\u6216\u8c03\u5ea6\u9519\u8bef\u7684\u4ee3\u4ef7\u5f88\u9ad8\u65f6\uff0c\u66f4\u5168\u9762\u7684\u8fb9\u754c\u60c5\u51b5\u6d4b\u8bd5\u80fd\u589e\u5f3a\u4fe1\u5fc3\u3002\u5f53\u7f3a\u9677\u5df2\u88ab\u5f88\u597d\u5730\u9694\u79bb\uff0c\u4e14\u56e2\u961f\u5e0c\u671b\u5c06\u884c\u4e3a\u53d8\u66f4\u964d\u81f3\u6700\u4f4e\u65f6\uff0c\u5c40\u90e8\u4fee\u6539\u5c31\u663e\u5f97\u5f88\u6709\u5438\u5f15\u529b\u3002 \u5b9e\u9645\u7684\u5ba1\u67e5\u95ee\u9898\u5e76\u975e\u201c\u8c01\u5199\u7684\u4ee3\u7801\u66f4\u591a\uff1f\u201d\uff0c\u800c\u662f\u8be5\u8865\u4e01\u662f\u5426\u4fee\u590d\u4e86\u6240\u8ff0\u7684\u6839\u672c\u539f\u56e0\u3001\u662f\u5426\u4fdd\u7559\u4e86\u5468\u8fb9\u7684\u5951\u7ea6\uff0c\u4ee5\u53ca\u662f\u5426\u9a8c\u8bc1\u4e86\u9ad8\u98ce\u9669\u8fb9\u754c\u3002.<\/p>\n\n\n\n<style>\n.evidence-t3-dst-bug-fix{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}\n.evidence-t3-dst-bug-fix *{box-sizing:border-box}.evidence-t3-dst-bug-fix .d-head{display:flex;align-items:flex-start;justify-content:space-between;gap:22px;padding:24px 26px 20px;border-bottom:1px solid var(--line)}\n.evidence-t3-dst-bug-fix .d-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.evidence-t3-dst-bug-fix .d-title{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.evidence-t3-dst-bug-fix .d-sub{margin:7px 0 0;color:var(--body);font-size:13px}.evidence-t3-dst-bug-fix .d-pill{flex:0 0 auto;padding:6px 10px;border:1px solid #ccd6ff;border-radius:999px;color:#2448ca;background:#f0f3ff;font-size:11px;font-weight:800}.evidence-t3-dst-bug-fix .d-grid{display:grid;grid-template-columns:1fr 1fr}.evidence-t3-dst-bug-fix .d-side{min-width:0;padding:24px 26px}.evidence-t3-dst-bug-fix .d-side+.d-side{border-left:1px solid var(--line)}.evidence-t3-dst-bug-fix .d-product{display:flex;align-items:baseline;justify-content:space-between;gap:14px;font-weight:800}.evidence-t3-dst-bug-fix .d-score{font-size:34px;line-height:1;letter-spacing:-.05em}.evidence-t3-dst-bug-fix .d-score small{color:var(--muted);font-size:12px;letter-spacing:0}.evidence-t3-dst-bug-fix .d-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:18px 0}.evidence-t3-dst-bug-fix .d-metric{padding:10px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.evidence-t3-dst-bug-fix .d-metric span{display:block;color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.evidence-t3-dst-bug-fix .d-metric strong{display:block;margin-top:3px;font-size:13px}.evidence-t3-dst-bug-fix .d-preview{position:relative;height:192px;overflow:hidden;border:1px solid #29313f;border-radius:6px;background:#11151d;color:#edf0f5}.evidence-t3-dst-bug-fix .d-preview-label{padding:11px 13px;border-bottom:1px solid rgba(255,255,255,.1);color:#aeb7c7;font:750 9px\/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.06em;text-transform:uppercase}.evidence-t3-dst-bug-fix .d-preview pre,.evidence-t3-dst-bug-fix .d-full pre{margin:0;white-space:pre-wrap;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.evidence-t3-dst-bug-fix .d-preview pre{padding:13px}.evidence-t3-dst-bug-fix .d-preview:after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:55px;background:linear-gradient(transparent,#11151d)}.evidence-t3-dst-bug-fix .d-take{margin:14px 0 0;color:var(--body);font-size:12px}.evidence-t3-dst-bug-fix .d-fulls{padding:0 26px 22px}.evidence-t3-dst-bug-fix .d-full{margin-top:10px;border:1px solid var(--line);border-radius:6px}.evidence-t3-dst-bug-fix .d-full summary{cursor:pointer;padding:13px 14px;font-size:12px;font-weight:800;list-style:none}.evidence-t3-dst-bug-fix .d-full summary::-webkit-details-marker{display:none}.evidence-t3-dst-bug-fix .d-full summary:after{content:\"+\";float:right;color:var(--blue);font-size:17px}.evidence-t3-dst-bug-fix .d-full[open] summary:after{content:\"\u2212\"}.evidence-t3-dst-bug-fix .d-full-pane{padding:0 14px 14px}.evidence-t3-dst-bug-fix .d-full-note{margin:0 0 9px;color:var(--muted);font-size:10px}.evidence-t3-dst-bug-fix .d-full pre{max-height:620px;overflow:auto;padding:15px;border-radius:5px;background:#f5f6f8;color:#222936;border:1px solid #e0e3e8}.evidence-t3-dst-bug-fix .d-limit{margin:0;padding:12px 26px;border-top:1px solid var(--line);color:#5a6270;background:#fafbfc;font-size:11px}\n@media(max-width:760px){.evidence-t3-dst-bug-fix .d-head{display:block}.evidence-t3-dst-bug-fix .d-pill{display:inline-block;margin-top:12px}.evidence-t3-dst-bug-fix .d-grid{grid-template-columns:1fr}.evidence-t3-dst-bug-fix .d-side+.d-side{border-left:0;border-top:1px solid var(--line)}}@media(max-width:480px){.evidence-t3-dst-bug-fix .d-head,.evidence-t3-dst-bug-fix .d-side{padding:20px}.evidence-t3-dst-bug-fix .d-fulls{padding:0 20px 20px}.evidence-t3-dst-bug-fix .d-metrics{grid-template-columns:1fr}}\n<\/style><article class=\"evidence-t3-dst-bug-fix\"><header class=\"d-head\"><div><p class=\"d-kicker\">T3 \u00b7 \u53d7\u63a7\u5b58\u50a8\u5e93\u6d4b\u8bd5<\/p><h3 class=\"d-title\">\u4fee\u590d\u590f\u4ee4\u65f6\u8f6c\u6362\u671f\u95f4\u7684\u6bcf\u65e5\u6392\u7a0b<\/h3><p class=\"d-sub\">\u5728\u6625\u5b63\u548c\u79cb\u5b63\u8fc7\u6e21\u671f\u95f4\uff0c\u4fdd\u6301\u6240\u8981\u6c42\u7684\u7ebd\u7ea6\u6302\u949f\u65f6\u95f4\u3002.<\/p><\/div><span class=\"d-pill\">\u9886\u5e26 \u00b7 \u4e0d\u540c\u7c97\u7ec6<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"Codex \u7ed3\u679c\"><div class=\"d-product\"><span>\u300a\u6cd5\u5178\u300b<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7eed\u65f6\u95f4<\/span><strong>99 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>4 + 2 \u4e2a\u9690\u85cf\u7684<\/strong><\/div><div class=\"d-metric\"><span>\u8303\u56f4<\/span><strong>\u7a84\u8303\u56f4\u4fee\u590d<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u4e2a\u6709\u6548\u7684\u8f93\u51fa\u7247\u6bb5<\/div><pre>\u6839\u672c\u539f\u56e0\uff1a\u8be5\u5b9e\u73b0\u589e\u52a0\u4e86 24 \u4e2a UTC \u5c0f\u65f6\u3002\n\n\u4fee\u590d\u65b9\u6848\uff1a\u5c06\u65f6\u95f4\u5411\u524d\u63a8\u8fdb\u4e00\u4e2a\u672c\u5730\u65e5\u5386\u65e5\u3002\u6625\u5b63\u548c\u79cb\u5b63\u7684\u51bb\u7ed3\u68c0\u67e5\u5747\u901a\u8fc7\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8bc4\u8bba\u8005\u89c2\u70b9\uff1a<\/strong> \u8303\u56f4\u8f83\u7a84\u7684\u4fee\u6b63\u6848\u901a\u8fc7\u4e86\u8be5\u4efd\u5df2\u5b8c\u5168\u6572\u5b9a\u7684\u5408\u540c\u3002.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \u4ee3\u7801\u7ed3\u679c\"><div class=\"d-product\"><span>\u514b\u52b3\u5fb7\u4ee3\u7801<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7eed\u65f6\u95f4<\/span><strong>118 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>10 + 2 \u4e2a\u9690\u85cf\u7684<\/strong><\/div><div class=\"d-metric\"><span>\u8303\u56f4<\/span><strong>\u8fb9\u7f18\u8986\u76d6<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u4e2a\u6709\u6548\u7684\u8f93\u51fa\u7247\u6bb5<\/div><pre>\u5df2\u6db5\u76d6\u6625\u5b63\u3001\u79cb\u5b63\u3001\u9057\u6f0f\u53ca\u4e0d\u660e\u786e\u7684\u672c\u5730\u65f6\u95f4\u3001\u7b80\u5355\u7c97\u653e\u7684\u8f93\u5165\uff0c\u4ee5\u53ca\u591a\u65e5\u6eda\u52a8\u5904\u7406\u3002\n\n\u5728\u6269\u5927\u56de\u5f52\u6d4b\u8bd5\u8986\u76d6\u8303\u56f4\u540e\uff0c\u4e24\u9879\u51bb\u7ed3\u7684\u9690\u85cf\u68c0\u67e5\u5747\u901a\u8fc7\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8bc4\u8bba\u8005\u89c2\u70b9\uff1a<\/strong> \u66f4\u5168\u9762\u7684\u8fb9\u754c\u60c5\u51b5\u8986\u76d6\uff1b\u5728\u201c\u51bb\u7ed3\u201d\u8bc4\u5206\u6807\u51c6\u4e0b\uff0c\u529f\u80fd\u8bc4\u5206\u4fdd\u6301\u4e0d\u53d8\u3002.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>\u67e5\u770b\u5b8c\u6574\u7684Codex\u8f93\u51fa\u7ed3\u679c<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u3001\u7ecf\u8fc7\u5b89\u5168\u5904\u7406\u7684\u3001\u9996\u6b21\u6709\u6548\u7684\u8f93\u51fa<\/p><pre>\u5df2\u5b9e\u73b0\u590f\u4ee4\u65f6\u4fee\u590d\u3002\n\n\u5df2\u4fee\u6539\u7684\u6587\u4ef6\uff1a\n\n- [scheduler\/time_rules.py](.\/scheduler\/time_rules.py)\n- [tests\/test_time_rules.py](.\/tests\/test_time_rules.py)\n\n\u53d8\u66f4\u5185\u5bb9\uff1a\n\n- \u65f6\u95f4\u5411\u524d\u8c03\u6574\u4e00\u4e2a\u672c\u5730\u65e5\u5386\u65e5\uff0c\u800c\u975e 24 \u4e2a UTC \u5c0f\u65f6\u3002\n- \u6dfb\u52a0\u4e86\u7ebd\u7ea6\u590f\u4ee4\u65f6\u5f00\u59cb\u548c\u7ed3\u675f\u7684\u56de\u5f52\u6d4b\u8bd5\u3002\n- \u9a8c\u8bc1\u4e86 UTC \u65f6\u95f4\u95f4\u9694\u5206\u522b\u4e3a 23 \u5c0f\u65f6\u548c 25 \u5c0f\u65f6\u3002\n\n\u68c0\u67e5\u7ed3\u679c\uff1a\n\n- \u5355\u5143\u6d4b\u8bd5\uff1a4 \u4e2a\u901a\u8fc7\u3002\n- \u5185\u5b58\u8bed\u6cd5\u68c0\u67e5\uff1a7 \u4e2a Python \u6587\u4ef6\u901a\u8fc7\u3002\n- \u5b57\u8282\u7801\u7f16\u8bd1\u88ab\u963b\u6b62\uff0c\u56e0\u4e3a Python \u5c06\u5176\u7f13\u5b58\u91cd\u5b9a\u5411\u5230\u4e86\u6307\u5b9a\u5de5\u4f5c\u533a\u4e4b\u5916\uff1b\u672a\u5199\u5165\u4efb\u4f55\u5916\u90e8\u6587\u4ef6\u3002\n\n**\u7ed3\u8bba\uff1a** `next_daily_run` \u73b0\u5df2\u5728\u590f\u4ee4\u65f6\u8f6c\u6362\u671f\u95f4\u4fdd\u7559\u4e86\u8bf7\u6c42\u7684\u5b9e\u9645\u65f6\u95f4\u5c0f\u65f6\u3002\u65e0\u9700\u505a\u51fa\u4efb\u4f55\u51b3\u7b56\u3002.<\/pre><\/div><\/details><details class=\"d-full\"><summary>\u67e5\u770b\u5b8c\u6574\u7684 Claude \u4ee3\u7801\u8f93\u51fa<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u4ea4\u63a5\u8bb0\u5f55\uff0c\u5305\u62ec\u9996\u6b21\u6709\u6548\u7684\u8f93\u51fa\u539f\u6587<\/p><pre># T3 \u8fd0\u884c\u8bb0\u5f55 \u2014 DST \u9519\u8bef\u4fee\u590d\n\n## \u6267\u884c\u53c2\u6570\n\n| \u5b57\u6bb5 | \u503c |\n| --- | --- |\n| \u4efb\u52a1 | `T3` |\n| \u51bb\u7ed3\u63d0\u793a | `01-prompts\/T3.md` |\n| \u51bb\u7ed3\u63d0\u793a\u8bcd SHA-256 | `3fee50d0230f27f8d6dd7f12e050fa3f0b7f5fb77d9559361fee96e5f1a47307` |\n| \u6267\u884c\u5355\u5143 | \u9694\u79bb\u7684 Claude \u5b50\u4ee3\u7406\uff0c`\u901a\u7528\u578b`\uff0c\u5168\u65b0\u4e0a\u4e0b\u6587 |\n| \u9694\u79bb\u65b9\u6cd5 | **\u5b50\u4ee3\u7406\u56de\u9000**\uff08\u5df2\u8bb0\u5f55\u7684\u964d\u7ea7\u64cd\u4f5c \u2014 \u53c2\u89c1 `results\/isolation-decision.md`\uff09 |\n| \u5206\u914d\u7684\u5e72\u51c0\u526f\u672c | `runtime\/workspaces\/T3` |\n| Claude \u4ee3\u7801\u7248\u672c | `2.1.220` |\n| \u6a21\u578b\u8bbe\u7f6e | `claude-opus-5` |\n| start_utc | `2026-07-28T10:28:05Z` |\n| end_utc | `2026-07-28T10:30:03Z` |\n| \u6301\u7eed\u65f6\u95f4 | 118 \u79d2\uff08\u4e0e T1\u3001T2\u3001T4 \u540c\u65f6\u8fdb\u884c\uff1b\u975e\u7eaf\u5ef6\u8fdf\u6d4b\u91cf\uff09 |\n| \u5c1d\u8bd5\u6b21\u6570 | 1 |\n| \u72b6\u6001 | `\u6709\u6548` |\n| \u4eba\u5de5\u5e72\u9884 | \u65e0 |\n\n## Safe \u5de5\u5177\u6458\u8981\n\n\u4ec5\u5728\u6307\u5b9a\u5de5\u4f5c\u533a\u5185\u90e8\u4f7f\u7528 `date`\u3001`Read`\/`Edit`\uff0c`python3 -m unittest discover`\uff0c\n`python3 -m compileall`\uff0c\u4e00\u6b21\u5185\u5b58\u4e2d\u7684\u9634\u6027\u5bf9\u7167\u8fd0\u884c\uff0c\u4e00\u6b21\u6e05\u5355\u5b8c\u6574\u6027\u68c0\u67e5\u3002\n\u4ec5\u4f7f\u7528\u6807\u51c6\u5e93\uff08`datetime`\u3001`zoneinfo`\u3001`unittest`\uff09\u3002\u65e0\u7f51\u7edc\u8fde\u63a5\uff0c\u65e0\u5b89\u88c5\u64cd\u4f5c\u3002\n\n## \u6587\u4ef6\u53d8\u66f4\n\n`scheduler\/time_rules.py`\uff08\u4fee\u590d\u5185\u5bb9\u2014\u2014\u4ec5\u4fee\u6539\u4e86 `next_daily_run` \u7684\u4e3b\u4f53\u548c\u6587\u6863\u5b57\u7b26\u4e32\uff09\uff0c\n`tests\/test_scheduler.py`\uff08\u6dfb\u52a0\u4e86 `NextDailyRunTests`\uff0c8 \u4e2a\u6d4b\u8bd5\uff0c\u4ee5\u53ca\u4e00\u4e2a `_elapsed` \u8f85\u52a9\u51fd\u6570\uff1b\n\u73b0\u6709\u6d4b\u8bd5\u672a\u4fee\u6539\uff09\u3002\u672a\u4fee\u6539\u5176\u4ed6\u6a21\u5757\uff0c\u672a\u6dfb\u52a0\u6587\u4ef6\u3002\u5b8c\u6574\u8865\u4e01\uff1a\n`results\/T3\/patch.diff`\u3002\n\n## \u79bb\u7ebf\u68c0\u67e5\u7ed3\u679c\n\n\u7531\u4efb\u52a1\u8fd0\u884c\u5668\u62a5\u544a\uff1a\n\n| \u68c0\u67e5\u9879 | \u7ed3\u679c |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v` | **10 \u901a\u8fc7\uff0c0 \u5931\u8d25**\uff082 \u4e2a\u539f\u6709\u6d4b\u8bd5 + 8 \u4e2a\u65b0\u6d4b\u8bd5\uff09 |\n| `python3 -m compileall -q scheduler tests` | \u901a\u8fc7 |\n| \u6e05\u5355\u5b8c\u6574\u6027\u4e0e `fixture-manifest.json` \u5bf9\u6bd4 | 0 \u4e2a\u7f3a\u5931\uff0c0 \u4e2a\u5f02\u5e38 |\n| \u9634\u6027\u5bf9\u7167\uff1a\u5185\u5b58\u4e2d\u4fee\u8865\u7684\u79cd\u5b50\u5b9e\u73b0\uff0c\u4ec5\u9650 `NextDailyRunTests` | \u8fd0\u884c\u4e86 8 \u4e2a\uff0c**5 \u4e2a\u6309\u9884\u671f\u5931\u8d25**\uff0c\u5305\u62ec\u4e24\u4e2a\u590f\u4ee4\u65f6\u6d4b\u8bd5 |\n\n\u7531\u534f\u8c03\u5458\u5728\u5de5\u4f5c\u533a\u5916\u90e8\u72ec\u7acb\u91cd\u65b0\u9a8c\u8bc1\uff1a\n\n| \u68c0\u67e5\u9879 | \u9000\u51fa\u72b6\u6001 | \u7ed3\u679c |\n| --- | --- | --- |\n| \u516c\u5171\u6d4b\u8bd5\u5957\u4ef6\uff08`results\/checks\/T3-public.txt`\uff09 | 0 | 10 \u4e2a\u6d4b\u8bd5\uff0c\u901a\u8fc7 |\n| \u9690\u85cf\u9a8c\u8bc1\u5668 `03-checks\/test_t3_hidden.py`\uff08`results\/checks\/T3-hidden.txt`\uff09 | 0 | 2 \u4e2a\u6d4b\u8bd5\uff0c\u901a\u8fc7 |\n\n\u9690\u85cf\u9a8c\u8bc1\u5668\u5728\u539f\u59cb\u6d4b\u8bd5\u6570\u636e\u526f\u672c\u4e0a\u5931\u8d25\uff08\u9000\u51fa\u4ee3\u7801 1\uff09\u3002\u53c2\u89c1\n`results\/checks\/validator-controls.md`\u3002\n\n## \u9ec4\u91d1\u6620\u5c04\u884c\u4e3a\u8986\u76d6\u7387\n\n`03-checks\/gold-map.json` \u4e2d\u6240\u6709\u56db\u4e2a\u5fc5\u5907\u884c\u4e3a\u5747\u5df2\u6ee1\u8db3\uff1a\n\n| \u5fc5\u5907\u884c\u4e3a | \u8bc1\u636e |\n| --- | --- |\n| \u5899\u949f\u5c0f\u65f6\u4fdd\u6301\u4e0d\u53d8 | \u5bf9\u539f\u59cb\u672c\u5730\u5899\u949f\u5e94\u7528\u589e\u91cf\uff0c\u65f6\u533a\u91cd\u65b0\u5173\u8054\uff1b\u5728\u6bcf\u4e2a\u590f\u4ee4\u65f6\u6d4b\u8bd5\u4e2d\u5747\u5df2\u9a8c\u8bc1 |\n| \u6625\u5b63\u8fc7\u6e21\u5df2\u8986\u76d6 | `test_spring_forward_keeps_requested_hour` \u2014 \u4fdd\u6301 09:30\uff0c\u65f6\u533a\u504f\u79fb `-04:00`\uff0c\u8017\u65f6 23 \u5c0f\u65f6 |\n| \u6db5\u76d6\u79cb\u5b63\u8f6c\u6362 | `test_fall_back_keeps_requested_hour` \u2014 \u4fdd\u6301 09:30 \u65f6\uff0c\u65f6\u533a\u504f\u79fb\u91cf `-05:00`\uff0c\u7ecf\u8fc7 25 \u5c0f\u65f6 |\n| \u4f7f\u7528 IANA \u65f6\u533a | \u6765\u81ea\u6807\u51c6\u5e93\u7684 `ZoneInfo(\"America\/New_York\")` |\n\n\u9664\u4e86\u5fc5\u6d4b\u7528\u4f8b\u5916\uff0c\u6d4b\u8bd5\u8fd0\u884c\u5668\u8fd8\u8986\u76d6\u4e86 PEP 495 \u7684\u4e24\u4e2a\u8fb9\u754c\u60c5\u51b5\u2014\u2014\u56e0\"\u6625\u4ee4\u65f6\"\u8c03\u6574\u800c\u88ab\u8df3\u8fc7\u7684\n\u5899\u949f\u65f6\u95f4\uff0c\u4ee5\u53ca\u201c\u79cb\u4ee4\u65f6\u201d\u56de\u8c03\u671f\u95f4\u7684\u6a21\u68f1\u4e24\u53ef\u7684\u5899\u949f\u65f6\u95f4\u2014\u2014\u6b64\u5916\u8fd8\u5305\u62ec\u8de8\u8d8a\u6bcf\u6b21\u65f6\u533a\u8f6c\u6362\u7684\u4e03\u5929\u6eda\u52a8\n\u6d4b\u8bd5\uff0c\u4ee5\u53ca\u201c\u6734\u7d20\u8f93\u5165\u201d\u884c\u4e3a\u3002\n\n## \u5df2\u4fee\u6b63\u7684\u9519\u8bef\n\n\u4e24\u4e2a\u81ea\u917f\u7684\u6d4b\u8bd5\u65ad\u8a00\u5931\u8d25\uff1a\u5bf9\u4e24\u4e2a\u5171\u4eab\u540c\u4e00\n`tzinfo` \u7684\u65e5\u671f\u65f6\u95f4\u8fdb\u884c `following - previous` \u8fd0\u7b97\u65f6\uff0c\u4f1a\u51cf\u53bb\u539f\u59cb\u5899\u949f\u65f6\u95f4\uff0c\u56e0\u6b64\u7ecf\u8fc7\u65f6\u95f4\u65ad\u8a00\u663e\u793a\u4e3a 1 \u5929\u5e76\u5931\u8d25\u3002\n\u5b9e\u73b0\u662f\u6b63\u786e\u7684\uff0c\u800c\u65ad\u8a00\u6709\u8bef\uff1b\u901a\u8fc7\u4e00\u4e2a\u540d\u4e3a `_elapsed`\n\u7684\u8f85\u52a9\u51fd\u6570\u8fdb\u884c\u4e86\u4fee\u6b63\uff0c\u8be5\u51fd\u6570\u4f1a\u5148\u5c06\u4e24\u4e2a\u64cd\u4f5c\u6570\u90fd\u8f6c\u6362\u4e3a UTC\u3002\u6ca1\u6709\u5de5\u5177\u3001\u5bfc\u5165\u6216\u73af\u5883\u9519\u8bef\u3002\n\u8fd0\u884c\u540e\u5df2\u79fb\u9664 `__pycache__` \u6b8b\u7559\u6587\u4ef6\u3002\n\n## \u53ef\u89c1\u8f93\u51fa \uff08\u539f\u6587\u7167\u5f55\uff09\n\n**\u91cd\u73b0\u6b65\u9aa4**\n\n\u5728 2024 \u5e74\u590f\u4ee4\u65f6\u8f6c\u6362\u7684\u4e24\u4e2a\u65f6\u95f4\u70b9\uff0c\u5206\u522b\u4f7f\u7528 `America\/New_York` \u65f6\u533a\u7684\u65f6\u95f4\u6233\u8c03\u7528 `scheduler\/time_rules.py::next_daily_run`\uff1a\n\n```\n2024-03-09T09:30:00-05:00 -&gt; 2024-03-10T10:30:00-04:00   # \u65f6\u5dee\u6f02\u79fb +1\n2024-11-02T09:30:00-04:00 -&gt; 2024-11-03T08:30:00-05:00   # \u5c0f\u65f6\u6f02\u79fb -1\n```\n\n\u4e00\u4e2a\u8981\u6c42\u5728\u5f53\u5730\u65f6\u95f409:30\u6267\u884c\u7684\u4efb\u52a1\uff0c\u5728\u590f\u4ee4\u65f6\u5f00\u59cb\u540e\u4e8e10:30\u89e6\u53d1\uff0c\u5728\u51ac\u4ee4\u65f6\u5f00\u59cb\u540e\u4e8e08:30\u89e6\u53d1\u3002\n\n**\u6839\u672c\u539f\u56e0**\n\n\u521d\u59cb\u5b9e\u73b0\u5c06\u201cdaily\u201d\u89c6\u4e3a\u4e00\u4e2a\u56fa\u5b9a\u7684\u7edd\u5bf9\u65f6\u957f\uff1a\n\n```python\nelapsed = previous_run.astimezone(timezone.utc) + timedelta(hours=24)\nreturn elapsed.astimezone(previous_run.tzinfo)\n```\n\n\u5148\u8f6c\u6362\u4e3a UTC \u4f1a\u5bfc\u81f4 `timedelta(hours=24)` \u7684\u5b9e\u9645\u8017\u65f6\u6070\u597d\u4e3a 24 \u5c0f\u65f6\u3002 \u4f46\u5728 IANA \u65f6\u533a\u4e2d\uff0c\u5f53\u5730\u65e5\u5386\u65e5\u4e8e\u590f\u4ee4\u65f6\u5f00\u59cb\u65e5\u4e3a 23 \u5c0f\u65f6\uff0c\u4e8e\u51ac\u4ee4\u65f6\u5f00\u59cb\u65e5\u4e3a 25 \u5c0f\u65f6\uff0c\u56e0\u6b64\u6052\u5b9a\u7684 24 \u5c0f\u65f6\u504f\u79fb\u91cf\u5fc5\u7136\u4f1a\u5bfc\u81f4\u7ed3\u679c\u4e0e\u8bf7\u6c42\u7684\u5b9e\u9645\u65f6\u95f4\u76f8\u5dee\u4e00\u5c0f\u65f6\u3002\n\n**\u4fee\u590d\u65b9\u6848**\uff08`scheduler\/time_rules.py`\uff09\n\n\u6bcf\u65e5\u91cd\u590d\u5c5e\u4e8e\u65e5\u5386\u89c4\u5219\uff0c\u56e0\u6b64\u73b0\u5728\u5c06\u589e\u91cf\u5e94\u7528\u4e8e\u539f\u59cb\u672c\u5730\u5899\u949f\u65f6\u95f4\uff0c\u968f\u540e\u518d\u91cd\u65b0\u9644\u52a0\u65f6\u533a\u4fe1\u606f\uff1a\n\n```python\ntzinfo = previous_run.tzinfo\nnaive_next = previous_run.replace(tzinfo=None) + timedelta(days=1)\nif tzinfo is None:\n    return naive_next\ncandidate = naive_next.replace(tzinfo=tzinfo, fold=0)\nreturn candidate.astimezone(timezone.utc).astimezone(tzinfo)\n```\n\n\u4e3a\u4ec0\u4e48\u8fd9\u6837\u505a\u662f\u6b63\u786e\u7684\uff1a\n- \u5bf9\u539f\u59cb\u503c\u8fdb\u884c\u7684\u5899\u949f\u8fd0\u7b97\u4e0e\u65f6\u533a\u504f\u79fb\u65e0\u5173\uff0c\u56e0\u6b64\u8bf7\u6c42\u7684\u5c0f\u65f6:\u5206\u949f\u503c\u5728\u6784\u9020\u8fc7\u7a0b\u4e2d\u5f97\u4ee5\u4fdd\u7559\uff1b \u968f\u540e `zoneinfo` \u4f1a\u63d0\u4f9b\u65b0\u65e5\u671f\u751f\u6548\u7684 UTC \u504f\u79fb\u91cf\uff08\u5df2\u9a8c\u8bc1\uff1a\u590f\u4ee4\u65f6\u5f00\u59cb\u540e\u4e3a `-04:00`\uff0c\u590f\u4ee4\u65f6\u7ed3\u675f\u540e\u4e3a `-05:00`\uff0c\u5b9e\u9645\u7ecf\u8fc7\u65f6\u95f4\u5206\u522b\u4e3a 23 \u5c0f\u65f6\u548c 25 \u5c0f\u65f6\uff09\u3002\n- `fold=0` \u7ed3\u5408 UTC \u5f80\u8fd4\u5904\u7406\u673a\u5236\uff0c\u53ef\u5904\u7406\u7eaf\u5899\u949f\u8fd0\u7b97\u4e2d\u672a\u660e\u786e\u5b9a\u4e49\u7684\u4e24\u4e2a\u8fb9\u754c\u60c5\u51b5\u3002\u6839\u636e PEP 495\uff0c\u4e00\u4e2a\u88ab*\u8df3\u8fc7*\u7684\u5899\u949f\u65f6\u95f4 \uff082024-03-10 02:30\uff09\u5728 `fold=0` \u65f6\u91c7\u7528\u8fc7\u6e21\u524d\u7684\u504f\u79fb\u91cf\uff0c\u56e0\u6b64\u5f80\u8fd4\u5904\u7406\u5c06\u5176\u89c4\u8303\u5316\u4e3a\u5b9e\u9645\u65f6\u523b 03:30 EDT\uff0c\u800c\u975e\u8fd4\u56de\u4e00\u4e2a\u672a\u6307\u5b9a\u5177\u4f53\u65f6\u523b\u7684 datetime \u5bf9\u8c61\u3002 \u4e00\u4e2a*\u6a21\u68f1\u4e24\u53ef*\u7684\u5899\u949f\u65f6\u95f4\uff082024-11-03 01:30\uff09\u4f1a\u786e\u5b9a\u6027\u5730\u89e3\u6790\u4e3a\u5176\u9996\u6b21\u51fa\u73b0\u7684\u65f6\u95f4\uff08EDT\uff09\uff0c\u800c\u975e\u4efb\u610f\u7ed3\u679c\u3002\n- \u7b80\u5355\u8f93\u5165\u4fdd\u7559\u5176\u539f\u6709\u542b\u4e49\uff08\u5355\u7eaf\u589e\u52a0 1 \u4e2a\u65e5\u5386\u65e5\uff09\u2014\u2014\u4e0d\u4f1a\u5bf9\u8c03\u7528\u65b9\u65bd\u52a0\u65b0\u7684 `tzinfo` \u8981\u6c42\u3002\n\n\u53d8\u66f4\u8303\u56f4\u4fdd\u6301\u8f83\u5c0f\uff1a\u4ec5\u4fee\u6539\u4e86 `next_daily_run` \u7684\u4e3b\u4f53\u4ee3\u7801\u548c\u6587\u6863\u5b57\u7b26\u4e32\u3002 `service.py`\u3001`models.py`\u3001`repository.py` \u548c `__init__.py` \u5747\u672a\u4fee\u6539\uff0c\u672a\u6dfb\u52a0\u65b0\u6587\u4ef6\uff0c\u4e14\u6d4b\u8bd5 fixture \u6e05\u5355\u4ecd\u5b8c\u5168\u5339\u914d\uff08\u65e0\u7f3a\u5931\u6216\u610f\u5916\u6587\u4ef6\uff09\u3002\u4ec5\u4f7f\u7528\u6807\u51c6\u5e93\uff08`datetime`\u3001`zoneinfo`\u3001`unittest`\uff09\u3002\n\n**\u56de\u5f52\u6d4b\u8bd5**\uff08`tests\/test_scheduler.py`\uff0c \u65b0\u7684 `NextDailyRunTests`\uff0c\u5171 8 \u4e2a\u6d4b\u8bd5\uff09\u6db5\u76d6\uff1a\u666e\u901a\u65e5\u7a33\u5b9a\u6027\u3001\u590f\u4ee4\u65f6\u5f00\u59cb\uff08\u65f6\u5dee + 23 \u5c0f\u65f6\u5df2\u8fc7\uff09\u3001\u51ac\u4ee4\u65f6\u5f00\u59cb\uff08\u65f6\u5dee + 25 \u5c0f\u65f6\u5df2\u8fc7\uff09\u3001\u8de8\u8d8a\u6bcf\u6b21\u65f6\u4ee4\u8f6c\u6362\u7684\u4e03\u5929\u6eda\u52a8\u5468\u671f\u3001\u8df3\u8fc7\u7684\u5b9e\u9645\u65f6\u95f4\u3001\u6a21\u7cca\u7684\u5b9e\u9645\u65f6\u95f4\u4ee5\u53ca\u7b80\u5355\u8f93\u5165\u3002\n\n\u6709\u4e24\u70b9\u503c\u5f97\u6ce8\u610f\u3002\u9996\u5148\uff0c\u6211\u6700\u521d\u7684\u7ecf\u8fc7\u65f6\u95f4\u65ad\u8a00\u4f7f\u7528\u4e86 `following - previous`\uff1bPython \u4f1a\u5ffd\u7565\u5171\u4eab\u7684 `tzinfo` \u5e76\u76f4\u63a5\u51cf\u53bb\u539f\u59cb\u5899\u949f\u65f6\u95f4\uff0c\u56e0\u6b64\u4e24\u8005\u90fd\u8fd4\u56de\u4e86 1 \u5929\u5e76\u5bfc\u81f4\u6d4b\u8bd5\u5931\u8d25\u3002 \u5b9e\u73b0\u662f\u6b63\u786e\u7684\uff0c\u800c\u65ad\u8a00\u6709\u8bef\u2014\u2014\u901a\u8fc7\u4e00\u4e2a\u5c06\u4e24\u4e2a\u64cd\u4f5c\u6570\u90fd\u8f6c\u6362\u4e3a UTC \u7684 `_elapsed` \u8f85\u52a9\u51fd\u6570\u8fdb\u884c\u4e86\u4fee\u590d\u3002 \u5176\u6b21\uff0c\u6211\u901a\u8fc7\u5728\u5185\u5b58\u4e2d\u5bf9\u5df2\u521d\u59cb\u5316\u7684\u5b9e\u73b0\u526f\u672c\u91cd\u65b0\u8fd0\u884c `NextDailyRunTests`\uff0c\u9a8c\u8bc1\u4e86\u8fd9\u4e9b\u6d4b\u8bd5\u786e\u5b9e\u80fd\u6355\u83b7\u539f\u59cb\u7f3a\u9677\uff1a8 \u4e2a\u6d4b\u8bd5\u4e2d\u6709 5 \u4e2a\u5931\u8d25\uff0c\u5305\u62ec\u4e24\u4e2a\u590f\u4ee4\u65f6\u6d4b\u8bd5\u3002 \u5728\u5b58\u5728\u7f3a\u9677\u7684\u7248\u672c\u4e2d\u901a\u8fc7\u6d4b\u8bd5\u7684\u4e09\u4e2a\u6848\u4f8b\uff08\u666e\u901a\u65e5\u3001\u8df3\u8fc7\u3001\u6a21\u7cca\u60c5\u51b5\uff09\u66f4\u591a\u662f\u8bb0\u5f55\u884c\u4e3a\u800c\u975e\u6355\u83b7\u56de\u5f52\u2014\u2014\u8df3\u8fc7\/\u6a21\u7cca\u60c5\u51b5\u4e4b\u6240\u4ee5\u7ed3\u679c\u4e00\u81f4\uff0c\u53ea\u662f\u56e0\u4e3a +24 \u5c0f\u65f6\u7684\u7edd\u5bf9\u504f\u79fb\u6070\u597d\u843d\u5728\u4e86\u540c\u4e00\u4e2a\u6807\u51c6\u5316\u65f6\u523b\u4e0a\u3002.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">\u73af\u5883\u9650\u5236\uff1a\u8fd9\u662f\u4e00\u4e2a\u5c0f\u578b\u79bb\u7ebf Python \u4ee3\u7801\u5e93\u3002Claude \u5728 CLI OAuth \u8fc7\u671f\u540e\u4f7f\u7528\u4e86\u5b50\u4ee3\u7406\u4f5c\u4e3a\u5907\u7528\u65b9\u6848\uff0c\u56e0\u6b64\u9694\u79bb\u6027\u548c\u4ee4\u724c\u53ef\u89c1\u6027\u5e76\u4e0d\u5b8c\u5168\u4e00\u81f4\u3002.<\/p><\/article>\n\n\n\n<h2 id=\"code-review\" class=\"wp-block-heading\">\u4ee3\u7801\u5ba1\u67e5\u8d28\u91cf\u4e0e\u4eba\u5de5\u6838\u9a8c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee3\u7801\u5ba1\u67e5\u4efb\u52a1\u6240\u4f53\u73b0\u7684\u6280\u80fd\u4e0e\u529f\u80fd\u5b9e\u73b0\u6709\u6240\u4e0d\u540c\u3002\u4e00\u540d\u4f18\u79c0\u7684\u4ee3\u7801\u5ba1\u67e5\u8005\u5fc5\u987b\u80fd\u591f\u53d1\u73b0\u53ef\u590d\u73b0\u7684\u95ee\u9898\uff0c\u8bc4\u4f30\u5176\u5f71\u54cd\u7a0b\u5ea6\uff0c\u51c6\u786e\u6307\u51fa\u4ee3\u7801\u8def\u5f84\uff0c\u5e76\u533a\u5206\u771f\u6b63\u7684\u7f3a\u9677\u4e0e\u63a8\u6d4b\u6027\u7684\u8b66\u544a\u3002\u4fee\u590d\u95ee\u9898\u8fd8\u9700\u901a\u8fc7\u53e6\u4e00\u9879\u6d4b\u8bd5\uff1a\u8865\u4e01\u4e0d\u5f97\u5f15\u5165\u65b0\u7684\u56de\u5f52\u95ee\u9898\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728T4\u6d4b\u8bd5\u4e2d\uff0cClaude Code\u8868\u73b0\u51fa\u4e86\u6700\u660e\u663e\u7684\u4f18\u52bf\u3002 \u8be5\u56e2\u961f\u62a5\u544a\u4e86\u4e94\u9879\u53ef\u72ec\u7acb\u590d\u73b0\u7684\u53d1\u73b0\uff0c\u5176\u4e2d\u5305\u62ec\u4e24\u4e2a\u9884\u8bbe\u7684\u5ba1\u67e5\u76ee\u6807\uff0c\u5f97\u520619\/20\u3002Codex\u56e2\u961f\u62a5\u544a\u5e76\u4fee\u590d\u4e86\u4e24\u4e2a\u6709\u6548\u7684\u8f83\u9ad8\u4e25\u91cd\u7ea7\u522b\u7684\u7f3a\u9677\uff0c\u4f46\u672a\u63d0\u53ca\u90a3\u5bf9\u9884\u8bbe\u7f3a\u9677\uff0c\u5f97\u520618\/20\u3002Codex\u56e2\u961f\u7684\u53d1\u73b0\u5e76\u975e\u8bef\u62a5\uff1b\u4e24\u8005\u4e4b\u95f4\u7684\u5dee\u5f02\u5728\u4e8e\u68c0\u6d4b\u8303\u56f4\u7684\u5e7f\u5ea6\uff0c\u800c\u975e\u57fa\u672c\u6b63\u786e\u6027\u3002.<\/p>\n\n\n\n<style>\n.evidence-t4-review-and-repair{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}\n.evidence-t4-review-and-repair *{box-sizing:border-box}.evidence-t4-review-and-repair .d-head{display:flex;align-items:flex-start;justify-content:space-between;gap:22px;padding:24px 26px 20px;border-bottom:1px solid var(--line)}\n.evidence-t4-review-and-repair .d-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.evidence-t4-review-and-repair .d-title{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.evidence-t4-review-and-repair .d-sub{margin:7px 0 0;color:var(--body);font-size:13px}.evidence-t4-review-and-repair .d-pill{flex:0 0 auto;padding:6px 10px;border:1px solid #ccd6ff;border-radius:999px;color:#2448ca;background:#f0f3ff;font-size:11px;font-weight:800}.evidence-t4-review-and-repair .d-grid{display:grid;grid-template-columns:1fr 1fr}.evidence-t4-review-and-repair .d-side{min-width:0;padding:24px 26px}.evidence-t4-review-and-repair .d-side+.d-side{border-left:1px solid var(--line)}.evidence-t4-review-and-repair .d-product{display:flex;align-items:baseline;justify-content:space-between;gap:14px;font-weight:800}.evidence-t4-review-and-repair .d-score{font-size:34px;line-height:1;letter-spacing:-.05em}.evidence-t4-review-and-repair .d-score small{color:var(--muted);font-size:12px;letter-spacing:0}.evidence-t4-review-and-repair .d-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin:18px 0}.evidence-t4-review-and-repair .d-metric{padding:10px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.evidence-t4-review-and-repair .d-metric span{display:block;color:var(--muted);font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}.evidence-t4-review-and-repair .d-metric strong{display:block;margin-top:3px;font-size:13px}.evidence-t4-review-and-repair .d-preview{position:relative;height:192px;overflow:hidden;border:1px solid #29313f;border-radius:6px;background:#11151d;color:#edf0f5}.evidence-t4-review-and-repair .d-preview-label{padding:11px 13px;border-bottom:1px solid rgba(255,255,255,.1);color:#aeb7c7;font:750 9px\/1 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.06em;text-transform:uppercase}.evidence-t4-review-and-repair .d-preview pre,.evidence-t4-review-and-repair .d-full pre{margin:0;white-space:pre-wrap;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.evidence-t4-review-and-repair .d-preview pre{padding:13px}.evidence-t4-review-and-repair .d-preview:after{content:\"\";position:absolute;left:0;right:0;bottom:0;height:55px;background:linear-gradient(transparent,#11151d)}.evidence-t4-review-and-repair .d-take{margin:14px 0 0;color:var(--body);font-size:12px}.evidence-t4-review-and-repair .d-fulls{padding:0 26px 22px}.evidence-t4-review-and-repair .d-full{margin-top:10px;border:1px solid var(--line);border-radius:6px}.evidence-t4-review-and-repair .d-full summary{cursor:pointer;padding:13px 14px;font-size:12px;font-weight:800;list-style:none}.evidence-t4-review-and-repair .d-full summary::-webkit-details-marker{display:none}.evidence-t4-review-and-repair .d-full summary:after{content:\"+\";float:right;color:var(--blue);font-size:17px}.evidence-t4-review-and-repair .d-full[open] summary:after{content:\"\u2212\"}.evidence-t4-review-and-repair .d-full-pane{padding:0 14px 14px}.evidence-t4-review-and-repair .d-full-note{margin:0 0 9px;color:var(--muted);font-size:10px}.evidence-t4-review-and-repair .d-full pre{max-height:620px;overflow:auto;padding:15px;border-radius:5px;background:#f5f6f8;color:#222936;border:1px solid #e0e3e8}.evidence-t4-review-and-repair .d-limit{margin:0;padding:12px 26px;border-top:1px solid var(--line);color:#5a6270;background:#fafbfc;font-size:11px}\n@media(max-width:760px){.evidence-t4-review-and-repair .d-head{display:block}.evidence-t4-review-and-repair .d-pill{display:inline-block;margin-top:12px}.evidence-t4-review-and-repair .d-grid{grid-template-columns:1fr}.evidence-t4-review-and-repair .d-side+.d-side{border-left:0;border-top:1px solid var(--line)}}@media(max-width:480px){.evidence-t4-review-and-repair .d-head,.evidence-t4-review-and-repair .d-side{padding:20px}.evidence-t4-review-and-repair .d-fulls{padding:0 20px 20px}.evidence-t4-review-and-repair .d-metrics{grid-template-columns:1fr}}\n<\/style><article class=\"evidence-t4-review-and-repair\"><header class=\"d-head\"><div><p class=\"d-kicker\">T4 \u00b7 \u53d7\u63a7\u5b58\u50a8\u5e93\u6d4b\u8bd5<\/p><h3 class=\"d-title\">\u67e5\u627e\u53ef\u91cd\u73b0\u7684\u7f3a\u9677\uff0c\u5e76\u4fee\u590d\u53ef\u4fe1\u5ea6\u6700\u9ad8\u7684\u95ee\u9898<\/h3><p class=\"d-sub\">\u5ba1\u67e5\u6d4b\u8bd5\u7528\u4f8b\uff0c\u91cd\u73b0\u5b9e\u9645\u7f3a\u9677\uff0c\u5e94\u7528\u5141\u8bb8\u7684\u4fee\u590d\u65b9\u6848\uff0c\u5e76\u8bc1\u660e\u56de\u5f52\u6d4b\u8bd5\u80fd\u6709\u6548\u7ea6\u675f\u8be5\u884c\u4e3a\u3002.<\/p><\/div><span class=\"d-pill\">Claude \u8986\u76d6\u8fb9\u754c<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"Codex \u7ed3\u679c\"><div class=\"d-product\"><span>\u300a\u6cd5\u5178\u300b<\/span><span class=\"d-score\">18<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7eed\u65f6\u95f4<\/span><strong>223 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>4 \u901a\u8fc7<\/strong><\/div><div class=\"d-metric\"><span>\u8303\u56f4<\/span><strong>2 \u5df2\u4fee\u590d<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u4e2a\u6709\u6548\u7684\u8f93\u51fa\u7247\u6bb5<\/div><pre>1. \u9ad8 \u2014 \u73b0\u6709\u4efb\u52a1\u53ef\u80fd\u4f1a\u88ab\u6084\u7136\u8986\u76d6\u3002\n\n2. \u4e2d \u2014 \u6bcf\u65e5\u4efb\u52a1\u7684\u8fd0\u884c\u65f6\u95f4\u5728\u590f\u4ee4\u65f6\u8f6c\u6362\u671f\u95f4\u51fa\u73b0\u504f\u5dee\u3002\n\n\u9a8c\u8bc1\u7ed3\u679c\uff1a4 \u4e2a\u6d4b\u8bd5\u901a\u8fc7\uff0c0 \u4e2a\u5931\u8d25\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8bc4\u8bba\u8005\u89c2\u70b9\uff1a<\/strong> \u867d\u7136\u53d1\u73b0\u4e86\u6709\u4ef7\u503c\u7684\u9ad8\u4e25\u91cd\u6027\u95ee\u9898\u5e76\u8fdb\u884c\u4e86\u9488\u5bf9\u6027\u4fee\u590d\uff0c\u4f46\u672a\u80fd\u8fbe\u5230\u4e24\u4e2a\u9884\u8bbe\u7684\u5ba1\u67e5\u76ee\u6807\u3002.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \u4ee3\u7801\u7ed3\u679c\"><div class=\"d-product\"><span>\u514b\u52b3\u5fb7\u4ee3\u7801<\/span><span class=\"d-score\">19<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7eed\u65f6\u95f4<\/span><strong>235 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>9 \u901a\u8fc7<\/strong><\/div><div class=\"d-metric\"><span>\u8303\u56f4<\/span><strong>\u62a5\u544a\u4e865\u8d77<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u4e2a\u6709\u6548\u7684\u8f93\u51fa\u7247\u6bb5<\/div><pre>D1 DST \u6f02\u79fb \u00b7 \u9ad8\nD2 \u7b80\u5355\u65f6\u533a\u83b7\u53d6 \u00b7 \u4e2d\nD3 \u6807\u8bc6\u7b26\u51b2\u7a81 \u00b7 \u9ad8\nD4 \u5220\u9664\u64cd\u4f5c\u7f3a\u5931\u4f1a\u5f15\u53d1 KeyError \u00b7 \u4e2d\nD5 \u6240\u6709\u8005\u672a\u7ecf\u9a8c\u8bc1 \u00b7 \u4f4e<\/pre><\/div><p class=\"d-take\"><strong>\u8bc4\u8bba\u8005\u89c2\u70b9\uff1a<\/strong> \u5ba1\u67e5\u8303\u56f4\u66f4\u5e7f\uff0c\u4e14\u672a\u51fa\u73b0\u4efb\u4f55\u91cd\u590d\u7684\u5047\u9633\u6027\u7ed3\u679c\uff1b\u5176\u4e2d\u4e24\u9879\u4e0e\u5408\u540c\u76f8\u5173\u7684\u53d1\u73b0\u672a\u4e88\u4fee\u6b63\u3002.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>\u67e5\u770b\u5b8c\u6574\u7684Codex\u8f93\u51fa\u7ed3\u679c<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u3001\u7ecf\u8fc7\u5b89\u5168\u5904\u7406\u7684\u3001\u9996\u6b21\u6709\u6548\u7684\u8f93\u51fa<\/p><pre>## \u9700\u91c7\u53d6\u884c\u52a8\u7684\u53d1\u73b0\n\n1. **\u9ad8 \u2014 \u73b0\u6709\u4efb\u52a1\u53ef\u80fd\u4f1a\u88ab\u65e0\u63d0\u793a\u5730\u8986\u76d6**\n\n   - \u8bc1\u636e\uff1a[service.py](.\/scheduler\/service.py:8) \u4e2d\u7684\u6807\u8bc6\u7b26\u521d\u59cb\u5316\uff0c\u7ed3\u5408 [repository.py](.\/scheduler\/repository.py:9) \u4e2d\u7684\u5b57\u5178\u66ff\u6362\u3002\n   - \u5f71\u54cd\uff1a\u4f7f\u7528\u73b0\u6709\u5b58\u50a8\u5e93\u521b\u5efa\u670d\u52a1\u65f6\uff0c\u53ef\u80fd\u4f1a\u590d\u7528\u6807\u8bc6\u7b26 `1`\uff0c\u4ece\u800c\u66ff\u6362\u5df2\u5b58\u50a8\u7684\u4efb\u52a1\u5e76\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u3002\n   - \u6700\u5c0f\u590d\u73b0\u6b65\u9aa4\uff1a\u4fdd\u5b58 `Job(1, ...)`\uff0c\u6784\u5efa `SchedulerService(repository)`\uff0c\u7136\u540e\u521b\u5efa\u53e6\u4e00\u4e2a\u4efb\u52a1\u3002\u5728\u4fee\u590d\u4e4b\u524d\uff0c\u4ec5\u4fdd\u7559\u65b0\u4efb\u52a1\u3002\n   - \u4fee\u590d\u65b9\u6848\uff1a\u4ece\u5b58\u50a8\u5e93\u4e2d\u73b0\u6709\u7684\u6700\u9ad8\u6807\u8bc6\u7b26\u5f00\u59cb\u521d\u59cb\u5316\u4e0b\u4e00\u4e2a\u6807\u8bc6\u7b26\u3002\n   - \u56de\u5f52\u6d4b\u8bd5\uff1a[test_scheduler.py](.\/tests\/test_scheduler.py:22)\u3002\n\n2. **\u4e2d\u7b49 \u2014 \u6bcf\u65e5\u4efb\u52a1\u5728\u590f\u4ee4\u65f6\u8f6c\u6362\u671f\u95f4\u51fa\u73b0\u65f6\u95f4\u504f\u5dee**\n\n   - \u8bc1\u636e\uff1a\u5728 [time_rules.py](.\/scheduler\/time_rules.py:4) \u4e2d\u4fee\u6b63\u4e86\u8ba1\u7b97\u903b\u8f91\u3002\n   - \u5f71\u54cd\uff1a\u4e00\u4e2a\u8ba1\u5212\u4e8e 09:00 \u8fd0\u884c\u7684\u6bcf\u65e5\u4efb\u52a1\uff0c\u5728\u6625\u5b63\u590f\u4ee4\u65f6\u8f6c\u6362\u540e\u4e8e 10:00 \u8fd0\u884c\u3002\n   - \u6700\u5c0f\u91cd\u73b0\u6b65\u9aa4\uff1a\u8ba1\u7b97 `2026-03-07 09:00 America\/New_York` \u4e4b\u540e\u7684\u4e0b\u6b21\u8fd0\u884c\u65f6\u95f4\u3002 \u4fee\u590d\u524d\uff0c\u7ed3\u679c\u4e3a `2026-03-08 10:00`\u3002\n   - \u4fee\u590d\u65b9\u6848\uff1a\u589e\u52a0\u4e00\u4e2a\u672c\u5730\u65e5\u5386\u65e5\uff0c\u800c\u975e 24 \u4e2a\u5df2\u8fc7\u53bb\u7684 UTC \u5c0f\u65f6\u3002\n   - \u56de\u5f52\u6d4b\u8bd5\uff1a[test_scheduler.py](.\/tests\/test_scheduler.py:33)\u3002\n\n## \u5df2\u4fee\u6539\u7684\u6587\u4ef6\n\n- [scheduler\/service.py](.\/scheduler\/service.py)\n- [scheduler\/time_rules.py](.\/scheduler\/time_rules.py)\n- [tests\/test_scheduler.py](.\/tests\/test_scheduler.py)\n\n## \u9a8c\u8bc1\n\n- \u5728\u4fee\u590d\u4e4b\u524d\uff0c\u89c2\u5bdf\u5230\u4e24\u9879\u56de\u5f52\u6d4b\u8bd5\u5747\u5931\u8d25\u3002\n- \u6bcf\u9879\u6d4b\u8bd5\u5728\u76f8\u5e94\u7684\u4fee\u590d\u540e\u5747\u901a\u8fc7\u3002\n- `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v`\n- \u7ed3\u679c\uff1a**4 \u4e2a\u6d4b\u8bd5\u901a\u8fc7\uff0c0 \u4e2a\u5931\u8d25**\u3002\n- \u6ca1\u6709\u6b8b\u7559\u7684\u751f\u6210\u7684 Python \u7f13\u5b58\u6587\u4ef6\u3002\n\n## \u7ed3\u8bba\u4e0e\u51b3\u7b56\n\n- **\u7ed3\u8bba\uff1a** \u4e24\u4e2a\u5df2\u786e\u8ba4\u7684\u7f3a\u9677\u5747\u5df2\u4fee\u590d\uff0c\u5e76\u7531\u9488\u5bf9\u6027\u7684\u56de\u5f52\u6d4b\u8bd5\u8986\u76d6\u3002\n- **\u9700\u505a\u51fa\u7684\u51b3\u7b56\uff1a** \u65e0\u3002.<\/pre><\/div><\/details><details class=\"d-full\"><summary>\u67e5\u770b\u5b8c\u6574\u7684 Claude \u4ee3\u7801\u8f93\u51fa<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u4ea4\u63a5\u8bb0\u5f55\uff0c\u5305\u62ec\u9996\u6b21\u6709\u6548\u7684\u8f93\u51fa\u539f\u6587<\/p><pre># T4 \u8fd0\u884c\u8bb0\u5f55 \u2014 \u6d4b\u8bd5\u4e0e\u4ee3\u7801\u5ba1\u67e5\n\n## \u6267\u884c\u53c2\u6570\n\n| \u5b57\u6bb5 | \u503c |\n| --- | --- |\n| \u4efb\u52a1 | `T4` |\n| \u51bb\u7ed3\u63d0\u793a\u8bcd | `01-prompts\/T4.md` |\n| \u51bb\u7ed3\u63d0\u793a\u8bcd SHA-256 | `5e69546007ea776f40b3d334ddb75671ff684c151c77551bad27de3b0fdce640` |\n| \u6267\u884c\u5355\u5143 | \u9694\u79bb\u7684 Claude \u5b50\u4ee3\u7406\uff0c`\u901a\u7528\u578b`\uff0c\u5168\u65b0\u4e0a\u4e0b\u6587 |\n| \u9694\u79bb\u65b9\u6cd5 | **\u5b50\u4ee3\u7406\u56de\u9000**\uff08\u5df2\u8bb0\u5f55\u7684\u964d\u7ea7\u64cd\u4f5c \u2014 \u53c2\u89c1 `results\/isolation-decision.md`\uff09 |\n| \u5206\u914d\u7684\u5e72\u51c0\u526f\u672c | `runtime\/workspaces\/T4` |\n| Claude \u4ee3\u7801\u7248\u672c | `2.1.220` |\n| \u6a21\u578b\u8bbe\u7f6e | `claude-opus-5` |\n| start_utc | `2026-07-28T10:28:22Z` |\n| end_utc | `2026-07-28T10:32:17Z` |\n| \u6301\u7eed\u65f6\u95f4 | 235 \u79d2\uff08\u4e0e T1\u2013T3 \u540c\u65f6\u8fdb\u884c\uff1b\u975e\u7eaf\u5ef6\u8fdf\u6d4b\u91cf\uff09 |\n| \u5c1d\u8bd5\u6b21\u6570 | 1 |\n| \u72b6\u6001 | `\u6709\u6548` |\n| \u4eba\u5de5\u5e72\u9884 | \u65e0 |\n\n\u51bb\u7ed3\u63d0\u793a\u4e2d\u7684\u6761\u4ef6\u2014\u2014\"\u5982\u679c\u51bb\u7ed3\u7684\u8fd0\u884c\u914d\u7f6e\u5141\u8bb8\n\u8fdb\u884c\u4fee\u590d\uff0c\u5219\u8fdb\u884c\u4fee\u590d\"\u2014\u2014\u7531\u534f\u8c03\u5668\u6839\u636e `00-control\/run-config.json` \u548c\n`00-control\/safety-policy.json` \u8fdb\u884c\u89e3\u6790\uff0c\u8fd9\u4e24\u4efd\u6587\u4ef6\u5141\u8bb8\u5199\u5165\u9694\u79bb\u7684\u6d4b\u8bd5\u7528\u4f8b\u526f\u672c\u3002 \u8fd0\u884c\u5668\u88ab\n\u544a\u77e5\u5141\u8bb8\u8fdb\u884c\u4fee\u590d\u3002\u672a\u5411\u5176\u5c55\u793a\u4efb\u4f55\u63a7\u5236\u6587\u4ef6\u3002\n\n## \u5b89\u5168\u5de5\u5177\u6458\u8981\n\n`date`\u3001\u4ec5\u5728\u5206\u914d\u7684\u5de5\u4f5c\u533a\u5185\u8fdb\u884c`Read`\/`Edit`\/`Write`\u64cd\u4f5c\u3001`grep`\u3001\n`python3 -m unittest discover`\u3001`python3 -m compileall`\u3001\u4e00\u6b21\u4e34\u65f6\u526f\u672c\u7684\u7a7a\u8fd0\u884c\u3001\u4e00\u6b21\n\u6e05\u5355\u5b58\u5728\u6027\u68c0\u67e5\u3002\u65e0\u7f51\u7edc\u8fde\u63a5\uff0c\u65e0\u5b89\u88c5\u64cd\u4f5c\uff0c\u4ec5\u4f7f\u7528\u6807\u51c6\u5e93\u3002\n\n## \u5df2\u4fee\u6539\u7684\u6587\u4ef6\n\n`scheduler\/time_rules.py`\uff08\u5df2\u4fee\u6539\uff09\u3001`scheduler\/service.py`\uff08\u5df2\u4fee\u6539\uff09\u3001\n`tests\/test_scheduler.py`\uff08\u5df2\u4fee\u6539\uff0c+2 \u4e2a\u6d4b\u8bd5\u7528\u4f8b\uff09\uff0c`tests\/test_time_rules.py`\uff08\u5df2\u6dfb\u52a0\uff0c5 \u4e2a\u6d4b\u8bd5\u7528\u4f8b\uff09\u3002\n\u5b8c\u6574\u8865\u4e01\uff1a`results\/T4\/patch.diff`\u3002\n\n## \u79bb\u7ebf\u68c0\u67e5\u7ed3\u679c\n\n\u7531\u4efb\u52a1\u8fd0\u884c\u5668\u62a5\u544a\uff1a\n\n| \u68c0\u67e5\u9879 | \u7ed3\u679c |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v` | **9 \u901a\u8fc7\uff0c0 \u5931\u8d25\uff0c0 \u8df3\u8fc7**\uff08\u57fa\u7ebf 2\uff09 |\n| `python3 -m compileall -q scheduler tests` | \u901a\u8fc7 |\n| \u6e05\u5355\u6587\u4ef6\u5b58\u5728\u6027\u68c0\u67e5\uff08\u4e0e `expected_files` \u5bf9\u6bd4\uff09 | 8 \u4e2a\u6587\u4ef6\u5747\u5b58\u5728 |\n| \u9488\u5bf9\u6062\u590d\u540e\u7684\u539f\u59cb\u5b9e\u73b0\u8fd0\u884c vacuity \u68c0\u67e5 | 5 \u4e2a\u5931\u8d25\uff0c4 \u4e2a\u901a\u8fc7\uff0c\u7b26\u5408\u9884\u671f |\n\n\u7531\u534f\u8c03\u5458\u5728\u5de5\u4f5c\u533a\u5916\u90e8\u72ec\u7acb\u91cd\u65b0\u9a8c\u8bc1\uff1a\n\n| \u68c0\u67e5\u9879 | \u9000\u51fa\u72b6\u6001 | \u7ed3\u679c |\n| --- | --- | --- |\n| \u516c\u5171\u6d4b\u8bd5\u5957\u4ef6\uff08`results\/checks\/T4-public.txt`\uff09 | 0 | 9 \u4e2a\u6d4b\u8bd5\uff0c\u901a\u8fc7 |\n\n\u4fe1\u606f\u6027\u4ea4\u53c9\u68c0\u67e5\uff0c\u4e0d\u8ba1\u5206\uff1aT3\u9690\u85cf\u9a8c\u8bc1\u5668\u5728\u6b64\n\u5de5\u4f5c\u533a\u4e2d\u4e5f\u901a\u8fc7\uff08\u9000\u51fa\u4ee3\u7801 0\uff09\uff0c\u56e0\u4e3a T4 \u5df2\u72ec\u7acb\u4fee\u590d\u4e86\u76f8\u540c\u7684 `next_daily_run` \u7f3a\u9677\u3002\u53c2\u89c1\n`results\/checks\/validator-controls.md`\u3002\n\n## Gold-map \u7f3a\u9677\u8986\u76d6\u7387\n\n`03-checks\/gold-map.json` \u4e3a T4 \u8bc4\u5206\u8bbe\u7f6e\u4e86\u4e24\u4e2a\u7f3a\u9677\u3002\u5747\u5df2\u68c0\u6d4b\u5230\uff1a\n\n| \u8bbe\u7f6e\u7684\u7f3a\u9677 | \u5df2\u68c0\u6d4b\u5230 | \u62a5\u544a\u72b6\u6001 |\n| --- | --- | --- |\n| \u7a7a\u767d\u6240\u6709\u8005\u5df2\u63a5\u53d7 | \u662f | **D5**\uff0c`scheduler\/service.py:11,13`\uff0c\u4e25\u91cd\u7a0b\u5ea6\u4f4e\uff0c\u5df2\u62a5\u544a\u4e14\u6545\u610f\u672a\u4fee\u590d |\n| \u5220\u9664\u7f3a\u5931\u7684\u6807\u8bc6\u7b26\u5f15\u53d1 `KeyError` | \u662f | **D4**\uff0c`scheduler\/repository.py:19` \u2192 `service.py:22`\uff0c\u4e25\u91cd\u7a0b\u5ea6\u4e3a\u4e2d\u7b49\uff0c\u5df2\u4e0a\u62a5\u4e14\u6545\u610f\u672a\u4fee\u590d |\n\n\u9664\u9884\u8bbe\u7f3a\u9677\u96c6\u5916\uff0c\u8fd8\u62a5\u544a\u4e86\u53e6\u5916\u4e09\u9879\u53d1\u73b0\u3002\u5747\u975e\u8bef\u62a5\uff1a\n\n- **D1** \u2014 `next_daily_run` \u4e2d\u5b58\u5728\u590f\u4ee4\u65f6\u6f02\u79fb\u3002\u8fd9\u662f\n  `03-checks\/seeded-defects.md` \u4e2d\u5217\u51fa\u7684\u7b2c\u4e09\u4e2a\u7f3a\u9677\uff08\u5176\u8bc4\u5206\u5f52\u7c7b\u4e8e T3 \u800c\u975e T4\uff0c\u4f46\u786e\u5b9e\u662f\u4e00\u4e2a\u771f\u5b9e\u7684\u9884\u8bbe\u7f3a\u9677\uff09\u3002\n- **D2** \u2014 `next_daily_run` \u4e2d\u7684\u7b80\u5355\u8f93\u5165\u4f1a\u65e0\u63d0\u793a\u5730\u83b7\u53d6\u4e3b\u673a\u65f6\u533a\uff0c\u5e76\u8fd4\u56de\u4e00\u4e2a\n  \u5df2\u8003\u8651\u65f6\u533a\u7684 datetime \u5bf9\u8c61\u3002\u8be5\u95ee\u9898\u771f\u5b9e\u5b58\u5728\u4e14\u4e0e\u4e3b\u673a\u76f8\u5173\uff1b\u534f\u8c03\u5458\u5df2\u901a\u8fc7\u6d4b\u8bd5\u7528\u4f8b\u6e90\u4ee3\u7801\u8fdb\u884c\u4e86\u9a8c\u8bc1\u3002\n- **D3** \u2014 \u670d\u52a1\u4e0e\u6ce8\u5165\u6216\u5171\u4eab\u7684\u5b58\u50a8\u5e93\u4e4b\u95f4\u53d1\u751f\u6807\u8bc6\u7b26\u51b2\u7a81\uff0c\u5bfc\u81f4\n  \u65e0\u63d0\u793a\u8986\u76d6\u3002\u771f\u5b9e\u7f3a\u9677\uff1a`SchedulerService._next_identifier` \u59cb\u7ec8\u4ece 1 \u5f00\u59cb\uff0c\u800c\n  `JobRepository.save` \u662f\u4e00\u4e2a\u672a\u53d7\u4fdd\u62a4\u7684\u5b57\u5178\u8d4b\u503c\u3002 T1 \u72ec\u7acb\u5730\u4ece\u539f\u59cb\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u8bc6\u522b\u51fa\u4e86\u76f8\u540c\u7684\n  \u6f0f\u6d1e\u70b9\u3002\n\n\u8bef\u62a5\u6570\u91cf\uff1a**0**\u3002\u6d4b\u8bd5\u8fd0\u884c\u5668\u8fd8\u6b63\u786e\u62a5\u544a\u672a\u53d1\u73b0\u5b89\u5168\u95ee\u9898\uff0c\u5e76\u6307\u51fa\n\u8be5\u6d4b\u8bd5\u7528\u4f8b\u4e0d\u5b58\u5728\u7f51\u7edc\u3001I\/O\u3001\u53cd\u5e8f\u5217\u5316\u3001\u5b50\u8fdb\u7a0b\u6216\u51ed\u636e\u66b4\u9732\u98ce\u9669\u3002\n\n## \u503c\u5f97\u8bb0\u5f55\u7684\u504f\u5dee\n\n\u56fa\u5b9a\u63d0\u793a\u8981\u6c42\u9488\u5bf9\"\u7f6e\u4fe1\u5ea6\u6700\u9ad8\u7684\u4e24\u4e2a\u7f3a\u9677\"\u8fdb\u884c\u6d4b\u8bd5\u548c\u4fee\u590d\u3002 \u8be5\n\u6d4b\u8bd5\u4eba\u5458\u9009\u62e9\u4e86 D1\/D2\uff08\u4e00\u4e2a\u4fee\u590d\uff0c\u540c\u4e00\u51fd\u6570\uff09\u548c D3\uff0c\u800c\u975e\u9ec4\u91d1\u5730\u56fe\u4e2d\u9884\u8bbe\u7684\n\u4e24\u4e2a\u7f3a\u9677 D4 \u548c D5\u3002\u5176\u7ed9\u51fa\u7684\u7406\u7531\u662f\u5408\u7406\u7684\uff1aD4 \u548c D5 \u90fd\u53d6\u51b3\u4e8e\u672a\u660e\u786e\u6307\u5b9a\u7684 API\n\u5951\u7ea6\uff0c\u56e0\u6b64\u4fee\u590d\u5b83\u4eec\u5c06\u7eaf\u5c5e\u731c\u6d4b\u3002 \u7f3a\u9677\u68c0\u6d4b\u6210\u7ee9\u4e0d\u53d7\u5f71\u54cd\u2014\u2014\u4e24\u4e2a\u9884\u8bbe\u7f3a\u9677\n\u5747\u5df2\u88ab\u53d1\u73b0\uff0c\u5e76\u8bb0\u5f55\u4e86\u6587\u4ef6\u3001\u884c\u53f7\u3001\u4e25\u91cd\u7a0b\u5ea6\u3001\u5f71\u54cd\u53ca\u91cd\u73b0\u6b65\u9aa4\u3002\u6240\u5e94\u7528\u7684\u4fee\u590d\u9488\u5bf9\u7684\u662f\u771f\u5b9e\n\u7f3a\u9677\uff0c\u5e76\u7ecf\u8fc7\u4e86\u7a7a\u503c\u68c0\u67e5\u7684\u9a8c\u8bc1\u3002\n\n## \u5df2\u6e05\u7406\u7684\u9519\u8bef\n\n\u56e0\u4f7f\u7528\u5171\u4eab `tzinfo` \u7684\u65e5\u671f\u65f6\u95f4\u65f6\uff0c\u5c06\"\u5899\u949f\u65f6\u95f4\"\u4e0e\"\u7edd\u5bf9\u65f6\u95f4\"\u76f8\u51cf\u5bfc\u81f4\u4e24\u6b21\u81ea\u53d1\u6d4b\u8bd5\u5931\u8d25\uff1b\n\u5df2\u66f4\u6b63\u5e76\u91cd\u65b0\u9a8c\u8bc1\u3002\u65e0\u5de5\u5177\u6216\u73af\u5883\u9519\u8bef\u3002\u8fd0\u884c\u540e\u5df2\u79fb\u9664 `__pycache__`\n\u6b8b\u7559\u6587\u4ef6\u3002\n\n## \u53ef\u89c1\u8f93\u51fa\uff08\u539f\u6837\uff09\n\n### \u7f3a\u9677\u62a5\u544a\n\n**D1 \u2014 `scheduler\/time_rules.py:10-11` \u2014 \u590f\u4ee4\u65f6\u671f\u95f4\u6bcf\u65e5\u8ba1\u5212\u51fa\u73b0\u4e00\u5c0f\u65f6\u504f\u5dee \u2014 \u4e25\u91cd\u7a0b\u5ea6\uff1a\u9ad8**\n\n`next_daily_run` \u901a\u8fc7 UTC \u5f80\u8fd4\u65b9\u5f0f\u589e\u52a0\u4e86 24 \u4e2a*\u5b9e\u9645*\u5c0f\u65f6\uff0c\u800c\u975e\u63a8\u8fdb\u65e5\u5386\u65e5\u671f\u3002 \u7531\u4e8e\u6bcf\u65e5\u4efb\u52a1\u7531\u5b9e\u9645\u65f6\u95f4\u5b9a\u4e49\uff0c\u56e0\u6b64\u4ece\u590f\u4ee4\u65f6\u8f6c\u6362\u65e5\u5f00\u59cb\uff0c\u590f\u4ee4\u65f6\u65f6\u533a\u5185\u7684\u6bcf\u4e2a\u4efb\u52a1\u90fd\u4f1a\u5728\u4e0d\u77e5\u4e0d\u89c9\u4e2d\u63d0\u524d\u6216\u63a8\u8fdf\u4e00\u5c0f\u65f6\u6267\u884c\uff0c\u4e14\u8be5\u9519\u8bef\u4f1a\u6301\u7eed\u5b58\u5728\uff08\u6bcf\u6b21\u8fd0\u884c\u90fd\u4f1a\u4ece\u504f\u79fb\u540e\u7684\u65f6\u95f4\u91cd\u65b0\u521d\u59cb\u5316\uff09\u3002\u6587\u6863\u5b57\u7b26\u4e32\u672c\u8eab\u4e5f\u627f\u8ba4\u4e86\u8fd9\u79cd\u884c\u4e3a\u3002\n\n```\nprev = datetime(2024, 3, 9, 9, 0, tzinfo=ZoneInfo('America\/New_York'))\nnext_daily_run(prev)   # -&gt; 2024-03-10 10:00:00-04:00\uff0c\u9884\u671f\u7ed3\u679c\u4e3a 09:00-04:00\nprev = datetime(2024, 11, 2, 9, 0, tzinfo=ZoneInfo(\"America\/New_York\"))\nnext_daily_run(prev)   # -&gt; 2024-11-03 08:00:00-05:00\uff0c\u9884\u671f 09:00-05:00\n```\n\n**D2 \u2014 `scheduler\/time_rules.py:10-11` \u2014 \u7b80\u5355\u8f93\u5165\u4f1a\u9ed8\u8ba4\u91c7\u7528\u673a\u5668\u7684\u672c\u5730\u65f6\u533a \u2014 \u4e25\u91cd\u6027\uff1a\u4e2d\u7b49**\n\n\u540c\u4e3a\u4e24\u884c\u4ee3\u7801\u3002\u5bf9\"\u65e0\u65f6\u533a\u610f\u8bc6\"\u7684 datetime \u5bf9\u8c61\u8c03\u7528 `.astimezone(timezone.utc)` \u65f6\uff0c\u4f1a\u9ed8\u8ba4\u91c7\u7528\u7cfb\u7edf\u672c\u5730\u65f6\u533a\uff1b\u800c `.astimezone(None)` \u5219\u4f1a\u8fd4\u56de\u4e00\u4e2a\"\u5177\u6709\u65f6\u533a\u610f\u8bc6\"\u7684 datetime \u5bf9\u8c61\u3002 \u4ee5\"\u672a\u611f\u77e5\"\u5f62\u5f0f\u4f20\u5165\u7684\u8c03\u7528\u4f1a\u8fd4\u56de'\u611f\u77e5'\u5f62\u5f0f\u7684\u8f93\u51fa\uff0c\u56e0\u6b64\u7ed3\u679c\u65e0\u6cd5\u4e0e\u8c03\u7528\u65b9\u5176\u4ed6'\u672a\u611f\u77e5'\u7684\u503c\u8fdb\u884c\u6bd4\u8f83\uff08\u6bd4\u8f83\u65f6\u4f1a\u5f15\u53d1 `TypeError`\uff09\uff0c\u4e14\u7ed3\u679c\u53d6\u51b3\u4e8e\u4e3b\u673a\u7684 `TZ`\u3002\n\n```\nnext_daily_run(datetime(2024, 1, 1, 9, 0))\n# -&gt; datetime(2024, 1, 2, 9, 0, tzinfo=timezone(timedelta(hours=8), \"CST\"))  # \u53d6\u51b3\u4e8e\u4e3b\u673a\n```\n\n**D3 \u2014 `scheduler\/service.py:8,13,15`\uff08\u524d\u7f00\uff09\u2014 \u6807\u8bc6\u7b26\u51b2\u7a81\u4f1a\u6084\u65e0\u58f0\u606f\u5730\u9500\u6bc1\u5df2\u5b58\u50a8\u7684\u4efb\u52a1 \u2014 \u4e25\u91cd\u6027\uff1a\u9ad8**\n\nID \u8ba1\u6570\u5668\u662f\u6309 `SchedulerService` \u5b9e\u4f8b\u5355\u72ec\u7ef4\u62a4\u7684\uff0c\u4e14\u59cb\u7ec8\u4ece 1 \u5f00\u59cb\uff0c\u5ffd\u7565\u6ce8\u5165\u7684\u5b58\u50a8\u5e93\u5185\u5bb9\u3002\u4efb\u4f55\u7b2c\u4e8c\u4e2a\u4f7f\u7528\u5171\u4eab\u5b58\u50a8\u5e93\u7684\u670d\u52a1\uff0c\u6216\u4efb\u4f55\u4f7f\u7528\u9884\u586b\u5145\u5b58\u50a8\u5e93\u7684\u670d\u52a1\uff0c\u90fd\u4f1a\u91cd\u65b0\u5206\u914d ID 1\uff1b \u7531\u4e8e `JobRepository.save` \u662f\u5b57\u5178\u8d4b\u503c\u64cd\u4f5c\uff0c\u56e0\u6b64\u4f1a\u8986\u76d6\u73b0\u6709\u4efb\u52a1\u4e14\u4e0d\u4f1a\u62a5\u9519\u3002\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u3002\n\n```\nrepo = JobRepository()\nSchedulerService(repo).create_job(\"Nightly backup\", 'Alex')    # \u518d\u6b21\u751f\u6210 ID 1\nSchedulerService(repo).create_job('\u5de5\u8d44\u5355\u5bfc\u51fa', 'Blake')   # \u518d\u6b21\u751f\u6210 id 1\nrepo.all()   # -&gt; [Job(1, '\u5de5\u8d44\u5355\u5bfc\u51fa', 'Blake')]  \u2014 Alex \u7684\u4efb\u52a1\u4e0d\u89c1\u4e86\n```\n\n**D4 \u2014 `scheduler\/repository.py:19` \u2192 `scheduler\/service.py:22` \u2014 `delete_job` \u56e0\u672a\u77e5 ID \u5f15\u53d1 `KeyError` \u2014 \u4e25\u91cd\u7a0b\u5ea6\uff1a\u4e2d\u7b49**\n\n`delete` \u65b9\u6cd5\u5728\u8c03\u7528 `dict.pop` \u65f6\u672a\u8bbe\u7f6e\u9ed8\u8ba4\u503c\uff0c\u800c\u5176\u540c\u7ea7\u65b9\u6cd5 `get` \uff08\u7b2c 13 \u884c\uff09\u5728\u672a\u627e\u5230\u65f6\u8fd4\u56de `None`\u3002\u8fd9\u79cd\u4e0d\u4e00\u81f4\u5bfc\u81f4\u539f\u59cb `KeyError` \u901a\u8fc7 `SchedulerService.delete_job` \u6cc4\u9732\u51fa\u6765\uff0c\u8c03\u7528\u65b9\u5f88\u96be\u6355\u83b7\u5230\u8be5\u5f02\u5e38\u3002\u91cd\u73b0\u6b65\u9aa4\uff1a`SchedulerService().delete_job(999)` \u2192 `KeyError: 999`\u3002 \u4fee\u590d\u65b9\u6848\u53ef\u91c7\u7528 `pop(identifier, None)` \u6216\u663e\u5f0f\u629b\u51fa\u9886\u57df\u5f02\u5e38\u2014\u2014\u6b64\u5904\u6545\u610f\u672a\u4fee\u590d\uff0c\u56e0\u4e3a\u6b63\u786e\u7684\u63a5\u53e3\u7ea6\u5b9a\uff08\u65e0\u58f0\u65e0\u64cd\u4f5c vs. \u7c7b\u578b\u5316\u9519\u8bef\uff09\u5e94\u7531\u6240\u6709\u8005\u901a\u8fc7 API \u51b3\u7b56\u51b3\u5b9a\u3002\n\n**D5 \u2014 `scheduler\/service.py:11,13` \u2014 \u201cowner\u201d\u5b57\u6bb5\u672a\u7ecf\u8fc7\u6709\u6548\u6027\u9a8c\u8bc1 \u2014 \u4e25\u91cd\u7a0b\u5ea6\uff1a\u4f4e**\n\n`name` \u4f1a\u68c0\u67e5\u662f\u5426\u4e3a\u7a7a\uff0c\u4f46 `owner` \u4e0d\u4f1a\uff1a`create_job(\"ok\", \"   \")` \u4f1a\u5c06 `owner=''` \u5b58\u50a8\u8fdb\u53bb\u3002 \u8fd9\u4e24\u4e2a\u53c2\u6570\u8fd8\u90fd\u5728\u672a\u52a0\u4fdd\u62a4\u7684\u60c5\u51b5\u4e0b\u8c03\u7528\u4e86 `.strip()`\uff0c\u56e0\u6b64 `None` \u4f1a\u5f15\u53d1 `AttributeError: 'NoneType' object has no attribute 'strip'`\uff0c\u800c\u975e API \u901a\u5e38\u7528\u4e8e\u5904\u7406\u9519\u8bef\u8f93\u5165\u7684 `ValueError`\u3002\u672a\u4fee\u590d\u2014\u2014\u8be5\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4efb\u4f55\u5730\u65b9\u5747\u672a\u660e\u786e\u8bf4\u660e\u9884\u671f\u6240\u6709\u8005\u5951\u7ea6\u3002\n\n**\u5b89\u5168\u6027\uff1a**\u672a\u53d1\u73b0\u95ee\u9898\u3002\u8be5\u6d4b\u8bd5 fixture \u4e0d\u6d89\u53ca\u7f51\u7edc\u3001I\/O\u3001\u53cd\u5e8f\u5217\u5316\u3001\u5b50\u8fdb\u7a0b\u6216\u51ed\u636e\u63a5\u53e3\uff1b\u5b58\u50a8\u91c7\u7528\u8fdb\u7a0b\u5185\u5b57\u5178\u3002\n\n**\u8986\u76d6\u7387\u7f3a\u53e3\uff1a**\u5728\u672c\u6b21\u8fd0\u884c\u4e4b\u524d\uff0c`scheduler\/time_rules.py` \u548c `scheduler\/repository.py` \u7684\u6d4b\u8bd5\u8986\u76d6\u7387\u4e3a\u96f6\uff1b\u4e24\u4e2a\u9884\u8bbe\u6d4b\u8bd5\u4ec5\u9a8c\u8bc1\u4e86\u670d\u52a1\u7684\u6b63\u5e38\u6d41\u7a0b\u3002\n\n### \u5df2\u5e94\u7528\u7684\u6d4b\u8bd5\u4e0e\u4fee\u590d\n\n\u4fe1\u5fc3\u5ea6\u6700\u9ad8\u7684\u4e24\u4e2a\u7f3a\u9677\u662f **D1\/D2**\uff08\u540c\u4e00\u51fd\u6570\uff0c\u4e00\u4e2a\u4fee\u590d\uff09\u548c **D3**\u3002\n\n**\u4fee\u590d 1 \u2014 `scheduler\/time_rules.py`\uff1a** \u5c06 UTC \u5f80\u8fd4\u8ba1\u7b97\u66ff\u6362\u4e3a `previous_run + timedelta(days=1)`\u3002 Python \u5bf9\u201caware datetimes\u201d\u6267\u884c\u5b9e\u9645\u65f6\u95f4\u8fd0\u7b97\uff0c\u800c `zoneinfo` \u4f1a\u6839\u636e\u65b0\u7684\u5b9e\u9645\u65f6\u95f4\u61d2\u52a0\u8f7d\u5730\u91cd\u65b0\u89e3\u6790 UTC \u504f\u79fb\u91cf\u2014\u2014\u56e0\u6b64 09:00 \u4ecd\u4fdd\u6301\u4e3a 09:00\uff0c\u800c\u504f\u79fb\u91cf\u4f1a\u6b63\u786e\u5730\u4ece `-05:00` \u53d8\u4e3a `-04:00`\u3002 \u8fd9\u540c\u65f6\u4fee\u590d\u4e86 D1 \u548c D2\uff1a\u539f\u59cb\u8f93\u5165\u73b0\u5728\u4fdd\u6301\u539f\u59cb\u72b6\u6001\uff0c\u4e14\u7edd\u4e0d\u4f1a\u63a8\u65ad\u672c\u5730\u65f6\u533a\u3002\u5173\u4e8e\u201c\u4e0d\u53ef\u8fbe\u201d\u4e0e\u201c\u6a21\u7cca\u201d\u7684\u8fc7\u6e21\u5c0f\u65f6\u60c5\u51b5\uff0c\u6587\u6863\u4e2d\u8bf4\u660e\u5c06\u9075\u5faa tzinfo \u7684\u6298\u53e0\u89c4\u5219\u3002\n\n**\u4fee\u590d 2 \u2014 `scheduler\/service.py`\uff1a** \u79fb\u9664\u4e86\u6bcf\u4e2a\u5b9e\u4f8b\u7684 `_next_identifier` \u8ba1\u6570\u5668\uff1b\u73b0\u5728\u5728\u521b\u5efa\u65f6\uff0c\u6807\u8bc6\u7b26\u4f1a\u4ece\u5b58\u50a8\u5e93\u72b6\u6001\u4e2d\u6309 `max(\u73b0\u6709 ID, \u9ed8\u8ba4\u503c=0) + 1` \u7684\u65b9\u5f0f\u5206\u914d\u3002\u8fd9\u5bf9\u4e8e\u5171\u4eab\u5b58\u50a8\u5e93\u548c\u9884\u586b\u5145\u5b58\u50a8\u5e93\u5747\u6b63\u786e\u3002 \u6743\u8861\uff1a\u6bcf\u6b21\u521b\u5efa\u64cd\u4f5c\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4ece O(1) \u53d8\u4e3a O(n)\uff0c\u5bf9\u4e8e\u57fa\u4e8e\u5b57\u5178\u7684\u5185\u5b58\u5b58\u50a8\u800c\u8a00\u5c1a\u53ef\u63a5\u53d7\uff0c\u4e14\u6bd4\u4f7f\u7528\u65e0\u6cd5\u201c\u770b\u5230\u201d\u5176\u5199\u5165\u76ee\u6807\u5b58\u50a8\u7684\u8ba1\u6570\u5668\u66f4\u4fdd\u8bc1\u6b63\u786e\u6027\u3002\n\n**\u6d4b\u8bd5 \u2014 `tests\/test_time_rules.py`\uff08\u65b0\u589e\uff0c5 \u4e2a\u6d4b\u8bd5\uff09\uff1a** \u6625\u8fdb\u548c\u79cb\u56de\u65f6\u949f\u65f6\u95f4\u4fdd\u6301\u3001\u8fd9\u4e9b\u8fc7\u6e21\u671f\u95f4\u7684\u7edd\u5bf9\u7ecf\u8fc7\u65f6\u95f4\u4e3a 23 \u5c0f\u65f6\/25 \u5c0f\u65f6\u3001UTC \u504f\u79fb\u91cf\u91cd\u65b0\u89e3\u6790\u3001\u7b80\u5355\u6a21\u5f0f\u4fdd\u6301\u7b80\u5355\u6a21\u5f0f\uff0c\u4ee5\u53ca\u7eaf UTC \u65e5\u671f\u63d0\u524d\u3002\u82e5\u4e0d\u5b58\u5728 IANA \u6570\u636e\u5e93\uff0c\u5219\u5e72\u51c0\u5730\u8df3\u8fc7\u3002\n\n**\u6d4b\u8bd5 \u2014 `tests\/test_scheduler.py`\uff08\u6269\u5c55\uff0c\u65b0\u589e 2 \u4e2a\u6d4b\u8bd5\uff09\uff1a** \u5171\u4eab\u540c\u4e00\u5b58\u50a8\u5e93\u7684\u4e24\u4e2a\u670d\u52a1\u5fc5\u987b\u751f\u6210\u4e0d\u540c\u7684 ID \u5e76\u4fdd\u7559\u4e24\u4e2a\u4efb\u52a1\uff1b\u5bf9\u4e8e\u9884\u5148\u586b\u5145\u4e86 ID 1 \u548c 7 \u7684\u5b58\u50a8\u5e93\uff0c\u670d\u52a1\u5fc5\u987b\u751f\u6210 ID 8 \u5e76\u4fdd\u6301\u73b0\u6709\u4efb\u52a1\u4e0d\u53d8\u3002\n\n**\u7a7a\u503c\u68c0\u67e5\uff1a**\u6211\u5728\u4e00\u4e2a\u4e34\u65f6\u526f\u672c\u4e2d\u6062\u590d\u4e86\u4e24\u4e2a\u539f\u59cb\u5b9e\u73b0\uff0c\u5e76\u91cd\u65b0\u8fd0\u884c\u4e86\u6d4b\u8bd5\u5957\u4ef6\u2014\u2014\u6240\u6709 5 \u4e2a\u65b0\u6d4b\u8bd5\u5747\u5931\u8d25\uff08`FAILED (failures=5)`\uff09\uff0c\u800c\u9488\u5bf9\u4fee\u590d\u540e\u7684\u4ee3\u7801\uff0c\u6240\u6709\u6d4b\u8bd5\u5747\u901a\u8fc7\u3002\u8fd9\u4e9b\u6d4b\u8bd5\u786e\u5b9e\u9501\u5b9a\u4e86\u7f3a\u9677\u3002\n\n\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u4e86\u4e00\u5904\u4fee\u6b63\uff1a\u6211\u7684\u521d\u7a3f\u5c06\u590f\u4ee4\u65f6\uff08DST\uff09\u7ecf\u8fc7\u65f6\u95f4\u65ad\u8a00\u4e3a `result - previous`\uff0c\u5f53\u4e24\u4e2a\u64cd\u4f5c\u6570\u5171\u4eab\u540c\u4e00 tzinfo \u65f6\uff0cPython \u4f1a\u5c06\u5176\u89c6\u4e3a\u5899\u949f\u65f6\u95f4\u8fd0\u7b97\uff0c\u56e0\u6b64\u7ed3\u679c\u88ab\u89e3\u8bfb\u4e3a `24h`\uff0c\u5bfc\u81f4\u6d4b\u8bd5\u5931\u8d25\u3002\u73b0\u5728\u7684\u65ad\u8a00\u5728\u51cf\u6cd5\u8fd0\u7b97\u524d\u4f1a\u5148\u8f6c\u6362\u4e3a UTC \u65f6\u95f4\u3002 \u5931\u8d25\u539f\u56e0\u51fa\u5728\u6211\u7684\u6d4b\u8bd5\u4e2d\uff0c\u800c\u975e\u4fee\u590d\u4ee3\u7801\u672c\u8eab\u3002\n\n### \u7ed9\u8d1f\u8d23\u4eba\u7684\u5907\u6ce8\n\n`fixture-manifest.json` \u672a\u88ab\u4fee\u6539\uff0c\u56e0\u6b64 `tests\/test_time_rules.py` \u662f `expected_files` \u4e2d\u672a\u5217\u51fa\u7684\u6709\u6548\u65b0\u6587\u4ef6\u2014\u2014\u5982\u679c\u68c0\u67e5\u8981\u6c42\u7cbe\u786e\u5339\u914d\u6587\u4ef6\u96c6\uff0c\u8bf7\u66f4\u65b0\u6e05\u5355\u3002 \u6b64\u5916\uff0cD4\/D5 \u867d\u5df2\u62a5\u544a\u4f46\u6545\u610f\u672a\u4fee\u590d\uff1a\u4e24\u8005\u5747\u53d6\u51b3\u4e8e API \u5951\u7ea6\u7684\u51b3\u7b56\uff08\u5220\u9664\u65f6\u7684\u7f3a\u5931\u8bed\u4e49\u3001\u6240\u6709\u8005\u9a8c\u8bc1\u89c4\u5219\uff09\uff0c\u800c\u8fd9\u4e9b\u5728\u6d4b\u8bd5 fixture \u4e2d\u4efb\u4f55\u5730\u65b9\u5747\u672a\u660e\u786e\u89c4\u5b9a\uff0c\u56e0\u6b64\u9009\u62e9\u5176\u4e2d\u4e00\u4e2a\u65b9\u6848\u5c06\u53ea\u662f\u731c\u6d4b\u800c\u975e\u771f\u6b63\u7684\u4fee\u590d\u3002.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">\u73af\u5883\u9650\u5236\uff1a\u8fd9\u662f\u4e00\u4e2a\u5c0f\u578b\u79bb\u7ebf Python \u4ee3\u7801\u5e93\u3002Claude \u5728 CLI OAuth \u8fc7\u671f\u540e\u4f7f\u7528\u4e86\u5b50\u4ee3\u7406\u4f5c\u4e3a\u5907\u7528\u65b9\u6848\uff0c\u56e0\u6b64\u9694\u79bb\u6027\u548c\u4ee4\u724c\u53ef\u89c1\u6027\u5e76\u4e0d\u5b8c\u5168\u4e00\u81f4\u3002.<\/p><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\u65e0\u8bba\u54ea\u79cd\u8bc4\u5206\u65b9\u5f0f\uff0c\u90fd\u65e0\u6cd5\u53d6\u4ee3\u4eba\u5de5\u5ba1\u67e5\u3002\u5728\u4efb\u4e00\u4ee3\u7406\u5b8c\u6210\u4fee\u590d\u540e\uff0c\u8bf7\u68c0\u67e5\u5df2\u66f4\u6539\u7684\u63a5\u53e3\u3001\u610f\u5916\u7684\u6587\u4ef6\u4f5c\u7528\u57df\u3001\u7f3a\u5931\u7684\u8d1f\u5411\u6d4b\u8bd5\u3001\u6743\u9650\u6216\u547d\u4ee4\u5386\u53f2\u8bb0\u5f55\uff0c\u4ee5\u53ca\u56de\u6eda\u8def\u5f84\u3002\u6709\u8bf4\u670d\u529b\u7684\u89e3\u91ca\u4e0d\u80fd\u66ff\u4ee3\u53ef\u91cd\u73b0\u7684\u6d4b\u8bd5\u3002.<\/p>\n\n\n\n<h2 id=\"safety\" class=\"wp-block-heading\">\u6743\u9650\u3001\u6c99\u7bb1\u548c\u8fd0\u884c\u5b89\u5168<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7f16\u7801\u4ee3\u7406\u53ef\u4ee5\u8bfb\u53d6\u79c1\u6709\u4ee3\u7801\u3001\u6267\u884cshell\u547d\u4ee4\u3001\u4fee\u6539\u5927\u91cf\u6587\u4ef6\uff0c\u5e76\u8c03\u7528\u5916\u90e8\u5de5\u5177\u3002\u56e0\u6b64\uff0c\u6743\u9650\u8bbe\u8ba1\u5df2\u6210\u4e3a\u4ea7\u54c1\u54c1\u8d28\u7684\u91cd\u8981\u7ec4\u6210\u90e8\u5206\u3002\u76f8\u5173\u7684\u95ee\u9898\u5305\u62ec\uff1a\u54ea\u4e9b\u64cd\u4f5c\u9700\u8981\u5ba1\u6279\u3001\u4ee3\u7406\u9ed8\u8ba4\u53ef\u4ee5\u8bbf\u95ee\u54ea\u4e9b\u5185\u5bb9\u3001\u5b83\u5bf9\u9ad8\u98ce\u9669\u64cd\u4f5c\u7684\u9884\u89c8\u662f\u5426\u8db3\u591f\u6e05\u6670\uff0c\u4ee5\u53ca\u5f00\u53d1\u4eba\u5458\u80fd\u5426\u68c0\u67e5\u7531\u6b64\u4ea7\u751f\u7684\u66f4\u6539\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0d\u8981\u8ba4\u4e3a\u5ba1\u6279\u63d0\u793a\u8d8a\u5c11\u5c31\u8d8a\u597d\u3002\u5728\u6ca1\u6709\u51ed\u636e\u6216\u751f\u4ea7\u73af\u5883\u8fde\u63a5\u7684\u5b64\u7acb\u73af\u5883\u4e2d\uff0c\u4f4e\u6469\u64e6\u786e\u5b9e\u5f88\u6709\u7528\u3002\u4f46\u5728\u8fde\u63a5\u4e86\u90e8\u7f72\u811a\u672c\u3001\u771f\u5b9e\u5ba2\u6237\u6570\u636e\u6216\u5e7f\u6cdb\u4e91\u6743\u9650\u7684\u4ee3\u7801\u5e93\u4e2d\uff0c\u540c\u6837\u7684\u884c\u4e3a\u53ef\u80fd\u4f1a\u5e26\u6765\u98ce\u9669\u3002\u53cd\u4e4b\uff0c\u8fc7\u591a\u7684\u5ba1\u6279\u53ef\u80fd\u4f1a\u4f7f\u5b89\u5168\u7684\u81ea\u52a8\u5316\u53d8\u5f97\u4e0d\u5207\u5b9e\u9645\uff0c\u5e76\u5bfc\u81f4\u7528\u6237\u5728\u672a\u4ed4\u7ec6\u9605\u8bfb\u8bf7\u6c42\u5185\u5bb9\u7684\u60c5\u51b5\u4e0b\u5c31\u4e88\u4ee5\u6279\u51c6\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u7684\u6d4b\u8bd5\u4f7f\u7528\u4e86\u5168\u65b0\u7684\u672c\u5730\u526f\u672c\uff0c\u672a\u6d89\u53ca\u751f\u4ea7\u7cfb\u7edf\u3001\u90e8\u7f72\u8fc7\u7a0b\uff0c\u4e5f\u672a\u8fdb\u884c\u6709\u6548\u8fd0\u884c\u7684\u4eba\u5de5\u5e72\u9884\u3002\u56e0\u6b64\uff0c\u8be5\u6d4b\u8bd5\u8bc4\u4f30\u7684\u662f\u5728\u5b89\u5168\u6761\u4ef6\u4e0b\u4efb\u52a1\u7684\u5b8c\u6210\u60c5\u51b5\uff0c\u800c\u975e\u4e24\u6b3e\u4ea7\u54c1\u7684\u76f8\u5bf9\u5b89\u5168\u6027\u3002 \u5728\u5c06\u4efb\u4f55\u4e00\u6b3e\u5de5\u5177\u7528\u4e8e\u91cd\u8981\u5de5\u4f5c\u4e4b\u524d\uff0c\u8bf7\u5148\u4ee5\u53ea\u8bfb\u6743\u9650\u5f00\u59cb\uff0c\u5b9a\u4e49\u5141\u8bb8\u8bbf\u95ee\u7684\u76ee\u5f55\u548c\u547d\u4ee4\uff0c\u5ba1\u67e5\u5dee\u5f02\u62a5\u544a\uff0c\u5e76\u5728\u53ef\u6062\u590d\u7684\u73af\u5883\u4e2d\u8fdb\u884c\u5ba2\u89c2\u6027\u68c0\u67e5\u3002.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4ece\u53ea\u8bfb\u67b6\u6784\u5f00\u59cb\uff0c\u5426\u5219\u5c06\u9762\u4e34\u98ce\u9669\u3002.<\/li>\n\n\n\n<li>\u8bf7\u4ec5\u6279\u51c6\u90a3\u4e9b\u60a8\u4e86\u89e3\u5176\u4f5c\u7528\u8303\u56f4\u548c\u540e\u679c\u7684\u547d\u4ee4\u3002.<\/li>\n\n\n\n<li>\u8bf7\u5c06\u51ed\u636e\u3001\u751f\u4ea7\u6570\u636e\u548c\u90e8\u7f72\u8bbf\u95ee\u6743\u9650\u4fdd\u7559\u5728\u8bd5\u7528\u8303\u56f4\u4e4b\u5916\u3002.<\/li>\n\n\n\n<li>\u5728\u63a5\u53d7\u7ed3\u679c\u4e4b\u524d\uff0c\u5fc5\u987b\u63d0\u4f9b\u5dee\u5f02\u62a5\u544a\u3001\u6d4b\u8bd5\u7ed3\u679c\u4ee5\u53ca\u660e\u786e\u7684\u56de\u6eda\u8def\u5f84\u3002.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"customization\" class=\"wp-block-heading\">MCP\u3001\u6280\u80fd\u3001\u9879\u76ee\u6307\u5357\u548c\u81ea\u5b9a\u4e49\u8bbe\u7f6e<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e24\u79cd\u751f\u6001\u7cfb\u7edf\u5747\u53ef\u8fdb\u884c\u6269\u5c55\uff0c\u4f46\u201c\u6269\u5c55\u201d\u8fd9\u4e00\u672f\u8bed\u4e0d\u5e94\u88ab\u89c6\u4e3a\u540c\u4e49\u8bcd\u3002\u9879\u76ee\u8bf4\u660e\u4f1a\u6307\u5bfc\u4ee3\u7406\u5728\u5b58\u50a8\u5e93\u4e2d\u5982\u4f55\u884c\u4e3a\u3002\u53ef\u91cd\u7528\u6280\u80fd\u5c06\u53ef\u91cd\u590d\u7684\u5de5\u4f5c\u6d41\u6216\u4e13\u4e1a\u77e5\u8bc6\u6253\u5305\u6210\u5305\u3002MCP \u5c06\u4e3b\u673a\u4e0e\u5916\u90e8\u5de5\u5177\u6216\u6570\u636e\u8fde\u63a5\u8d77\u6765\u3002\u94a9\u5b50\u548c\u547d\u4ee4\u53ef\u81ea\u52a8\u5316\u5f00\u53d1\u5faa\u73af\u4e2d\u7684\u7279\u5b9a\u73af\u8282\u3002 \u4e00\u6b3e\u4ea7\u54c1\u53ef\u4ee5\u5728\u67d0\u4e00\u5c42\u9762\u4e0a\u8868\u73b0\u51fa\u8272\uff0c\u800c\u65e0\u9700\u5728\u53e6\u4e00\u5c42\u9762\u4e0a\u9010\u4e00\u5339\u914d\u76f8\u5e94\u529f\u80fd\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u91c7\u8d2d\u65f6\u9700\u8981\u8003\u8651\u7684\u95ee\u9898\u5e76\u975e\u662f\u5426\u5b58\u5728\u96c6\u6210\u5fbd\u6807\uff0c\u800c\u662f\u8be5\u8fde\u63a5\u80fd\u5426\u5728\u60a8\u5b9e\u9645\u4f7f\u7528\u7684\u5bbf\u4e3b\u673a\u4e0a\u5b8c\u6210\u5b89\u88c5\u3001\u8eab\u4efd\u9a8c\u8bc1\u3001\u5ba1\u6279\u5e76\u6295\u5165\u4f7f\u7528\u3002\u6b64\u5916\uff0c\u5b83\u8fd8\u9700\u8981\u5177\u5907\u6613\u4e8e\u7406\u89e3\u7684\u6545\u969c\u6a21\u5f0f\u3002 \u4e00\u53f0\u5728\u4ea4\u4e92\u5f0f\u4f1a\u8bdd\u4e2d\u80fd\u6b63\u5e38\u8fd0\u884c\uff0c\u4f46\u5728\u65e0\u4eba\u503c\u5b88\u4f1a\u8bdd\u4e2d\u9700\u8981\u7b49\u5f85\u6279\u51c6\u7684 MCP \u670d\u52a1\u5668\u867d\u7136\u4ecd\u6709\u7528\u5904\uff0c\u4f46\u4e0d\u5e94\u88ab\u63cf\u8ff0\u4e3a\u201c\u65e0\u6469\u64e6\u81ea\u52a8\u5316\u201d\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u590d\u7528\u6307\u4ee4\u4e5f\u5b58\u5728\u7c7b\u4f3c\u7684\u6ce8\u610f\u4e8b\u9879\u3002\u5197\u957f\u7684\u6307\u4ee4\u6587\u4ef6\u5e76\u4e0d\u80fd\u4fdd\u8bc1\u5408\u89c4\u6027\uff0c\u800c\u8fc7\u4e8e\u590d\u6742\u7684\u89c4\u5219\u96c6\u53ef\u80fd\u4f1a\u5ffd\u7565\u4e0a\u4e0b\u6587\u6216\u5bfc\u81f4\u77db\u76fe\u3002\u8bf7\u786e\u4fdd\u4ee3\u7801\u5e93\u6307\u5357\u7b80\u660e\u627c\u8981\u3001\u53ef\u6d4b\u8bd5\uff0c\u5e76\u7d27\u8d34\u4ee3\u7801\u3002\u660e\u786e\u89c4\u5b9a\u5fc5\u8981\u7684\u9a8c\u8bc1\u547d\u4ee4\u3001\u53d7\u4fdd\u62a4\u533a\u57df\u3001\u98ce\u683c\u89c4\u5219\uff0c\u4ee5\u53ca\u4ee3\u7406\u4f55\u65f6\u5fc5\u987b\u6682\u505c\u5e76\u5bfb\u6c42\u786e\u8ba4\u3002.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u9879\u76ee\u8bf4\u660e\uff1a<\/strong> \u9488\u5bf9\u7279\u5b9a\u4ed3\u5e93\u7684\u89c4\u5219\u548c\u9a8c\u8bc1\u547d\u4ee4\u3002.<\/li>\n\n\n\n<li><strong>\u6280\u80fd\uff1a<\/strong> \u53ef\u91cd\u7528\u7a0b\u5e8f\u6216\u4e13\u4e1a\u77e5\u8bc6\u5305\u3002.<\/li>\n\n\n\n<li><strong>MCP\uff1a<\/strong> \u4e0e\u5916\u90e8\u5de5\u5177\u548c\u6570\u636e\u7684\u8fde\u63a5\u3002.<\/li>\n\n\n\n<li><strong>\u94a9\u5b50\u548c\u547d\u4ee4\uff1a<\/strong> \u56f4\u7ed5\u9884\u5b9a\u4e49\u7684\u5de5\u4f5c\u6d41\u4e8b\u4ef6\u8fdb\u884c\u7684\u81ea\u52a8\u5316\u3002.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"pricing\" class=\"wp-block-heading\">Codex \u4e0e Claude \u4ee3\u7801\u7684\u5b9a\u4ef7\u53ca\u4f7f\u7528\u9650\u5236<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u201cClean Consumer\u201d\u5957\u9910\u7684\u8d77\u4ef7\u4e3a\u6bcf\u6708 $20\u3002\u901a\u8fc7\u76f8\u5e94\u7684 $20 ChatGPT \u5957\u9910\u53ef\u4f7f\u7528 Codex \u670d\u52a1\uff0c\u800c Claude Pro \u5957\u9910\u5728\u7f8e\u56fd\u7684\u6708\u8d39\u4e3a $20\uff0c\u5e76\u5305\u542b Claude Code \u670d\u52a1\u3002 \u4e24\u8005\u5747\u63d0\u4f9b$100\u548c$200\u4e24\u4e2a\u9ad8\u7528\u91cf\u6d88\u8d39\u7ea7\u5957\u9910\u3002\u6807\u4ef7\u76f8\u8fd1\u5e76\u4e0d\u610f\u5473\u7740\u5bb9\u91cf\u5b8c\u5168\u76f8\u540c\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Claude Max 5x \u7684\u6708\u8d39\u4e3a $100\uff0cMax 20x \u7684\u6708\u8d39\u4e3a $200\u3002 \u201c5x\u201d\u548c\u201c20x\u201d\u7684\u547d\u540d\u63cf\u8ff0\u7684\u662f\u76f8\u5bf9\u4e8e Pro \u7248\u672c\u7684\u5355\u6b21\u4f1a\u8bdd\u4f7f\u7528\u91cf\uff0c\u800c\u975e\u4fdd\u8bc1\u7684\u7f16\u7801\u4efb\u52a1\u6570\u91cf\u3002Claude \u548c Claude Code \u5171\u4eab\u4f1a\u8bdd\u548c\u6bcf\u5468\u914d\u989d\u3002\u4e0a\u4e0b\u6587\u957f\u5ea6\u3001\u9644\u4ef6\u3001\u6a21\u578b\u9009\u62e9\u4ee5\u53ca\u529f\u80fd\u4f7f\u7528\u60c5\u51b5\u90fd\u4f1a\u5f71\u54cd\u914d\u989d\u7684\u6d88\u8017\u901f\u5ea6\u3002.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"800\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan.webp\" alt=\"Claude Max \u5957\u9910\u9875\u9762\u4e2d\u5173\u4e8e Max 5x \u548c Max 20x \u4f7f\u7528\u5bb9\u91cf\u7684\u8bf4\u660e\" class=\"wp-image-17388\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan.webp 1280w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan-300x188.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan-1024x640.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan-768x480.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-max-plan-18x12.webp 18w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\">Claude\u7684\u5b98\u65b9Max\u5957\u9910\u9875\u9762\u4ecb\u7ecd\u4e865\u500d\u548c20\u500d\u7684\u4f7f\u7528\u5bb9\u91cf\u9009\u9879\u3002\u8be5\u5b98\u65b9\u6587\u7ae0\u4e2d\u5217\u51fa\u4e86\u6708\u8d39\u4ef7\u683c\uff1b\u5957\u9910\u8be6\u60c5\u5df2\u4e8e2026\u5e747\u6708\u6838\u5b9e\u3002.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u542f\u7528 Claude \u7684\u53ef\u9009\u4f7f\u7528\u989d\u5ea6\u540e\uff0c\u5728\u5305\u542b\u7684\u4f7f\u7528\u91cf\u7528\u5c3d\u540e\uff0c\u7b26\u5408\u6761\u4ef6\u7684\u5de5\u4f5c\u4ecd\u53ef\u7ee7\u7eed\u8fdb\u884c\uff0c\u4e14\u8fd9\u4e9b\u989d\u5ea6\u5c06\u6309\u6807\u51c6 API \u8d39\u7387\u5355\u72ec\u8ba1\u8d39\u3002API \u5bc6\u94a5\u8ba4\u8bc1\u662f\u53e6\u4e00\u6761\u72ec\u7acb\u7684\u8ba1\u8d39\u9014\u5f84\u3002\u82e5\u5c06\u4efb\u4e00\u9014\u5f84\u79f0\u4e3a\u201c\u65e0\u9650\u201d\uff0c\u5219\u4f1a\u63a9\u76d6\u5176\u5b9e\u9645\u7684\u8fb9\u9645\u6210\u672c\u3002.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"800\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits.webp\" alt=\"Claude \u8d44\u8d39\u65b9\u6848\u8bf4\u660e\u6587\u6863\uff0c\u5176\u4e2d\u89e3\u91ca\u4e86\u5171\u4eab\u4f1a\u8bdd\u548c\u6bcf\u5468\u4f7f\u7528\u9650\u989d\" class=\"wp-image-17389\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits.webp 1280w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits-300x188.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits-1024x640.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits-768x480.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-code-plan-limits-18x12.webp 18w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><figcaption class=\"wp-element-caption\">Claude \u4ee3\u7801\u5c06\u4f7f\u7528\u5173\u8054\u7684 Pro \u6216 Max \u8ba2\u9605\u6240\u63d0\u4f9b\u7684\u914d\u989d\uff0c\u5305\u62ec\u5171\u4eab\u4f1a\u8bdd\u548c\u6bcf\u5468\u914d\u989d\u3002\u5177\u4f53\u5bb9\u91cf\u56e0\u5de5\u4f5c\u8d1f\u8f7d\u800c\u5f02\u3002.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Codex \u540c\u6837\u5c06\u5305\u542b\u5728\u7528\u6237\u5957\u9910\u5185\u7684\u4f7f\u7528\u91cf\u3001\u7b26\u5408\u6761\u4ef6\u7684\u5df2\u8d2d\u79ef\u5206\u4ee5\u53ca API \u8ba1\u8d39\u533a\u5206\u5f00\u6765\u3002\u672c\u5730\u6d88\u606f\u548c\u4e91\u7aef\u804a\u5929\u5171\u4eab\u4e00\u4e2a\u4e94\u5c0f\u65f6\u7684\u65f6\u6bb5\uff0c\u6b64\u5916\u53ef\u80fd\u8fd8\u53d7\u6bcf\u5468\u9650\u989d\u7684\u9650\u5236\u3002CLI \u65e5\u5fd7\u4e2d\u7684\u4ee4\u724c\u5b57\u6bb5\u65e0\u6cd5\u76f4\u63a5\u8f6c\u6362\u4e3a\u4e94\u5c0f\u65f6\u4f7f\u7528\u91cf\u7684\u767e\u5206\u6bd4\u3001\u8ba2\u9605\u79ef\u5206\u91d1\u989d\u6216 API \u8d26\u5355\u91d1\u989d\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u4e8e\u5076\u5c14\u8fdb\u884c\u7684\u5355\u4eba\u7f16\u7801\u5de5\u4f5c\uff0c\u65e0\u8bba\u9009\u62e9\u54ea\u4e00\u4fa7\u7684 $20 \u5c42\u7ea7\uff0c\u90fd\u662f\u5408\u7406\u7684\u8d77\u70b9\u3002 \u65e5\u5e38\u6d89\u53ca\u957f\u4e0a\u4e0b\u6587\u7684\u4ed3\u5e93\u5de5\u4f5c\u6216\u8bb8\u9700\u8981\u66f4\u9ad8\u4f7f\u7528\u5c42\u7ea7\uff0c\u4f46\u8fd9\u5fc5\u987b\u5728\u89c2\u5bdf\u5230\u5b9e\u9645\u91cd\u7f6e\u60c5\u51b5\u548c\u4efb\u52a1\u6d88\u8017\u4e4b\u540e\u624d\u80fd\u786e\u5b9a\u3002\u9ad8\u5f3a\u5ea6\u5e76\u884c\u5de5\u4f5c\u5219\u9700\u8981\u66f4\u52a0\u8c28\u614e\uff1a\u5373\u4f7f\u4ed8\u8d39\u5347\u7ea7\u5230\u66f4\u9ad8\u5c42\u7ea7\uff0c\u4e5f\u4f9d\u7136\u9700\u8981\u63a7\u5236\u4e0a\u4e0b\u6587\u3001\u62c6\u5206\u4efb\u52a1\uff0c\u5e76\u5c06\u9ad8\u6210\u672c\u7684\u63a8\u7406\u80fd\u529b\u4fdd\u7559\u7ed9\u9700\u8981\u9ad8\u5ea6\u5224\u65ad\u529b\u7684\u5de5\u4f5c\u3002.<\/p>\n\n\n\n<h2 id=\"controlled-test\" class=\"wp-block-heading\">\u6211\u4eec\u5bf9Codex\u4e0eClaude\u4ee3\u7801\u8fdb\u884c\u7684\u5bf9\u7167\u6d4b\u8bd5\u7ed3\u679c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u4e24\u4e2a\u667a\u80fd\u4f53\u5f00\u59cb\u8fd0\u884c\u4e4b\u524d\uff0c\u6211\u4eec\u9884\u5148\u9501\u5b9a\u4e86\u56db\u4e2a\u82f1\u8bed\u63d0\u793a\u3001\u4e00\u4e2a\u516c\u5f00\u7684 Python \u6d4b\u8bd5\u96c6\u3001\u5ba2\u89c2\u68c0\u67e5\u9879\u3001\u8bc4\u5206\u6807\u51c6\u4ee5\u53ca\u201c\u9996\u6b21\u6709\u6548\u7ed3\u679c\u201d\u89c4\u5219\u3002\u4efb\u52a1\u6db5\u76d6\u4e86\u964c\u751f\u4ee3\u7801\u5e93\u7684\u7406\u89e3\u3001\u591a\u6587\u4ef6\u529f\u80fd\u3001DST \u6f0f\u6d1e\u4fee\u590d\u4ee5\u53ca\u5e26\u4fee\u590d\u65b9\u6848\u7684\u4ee3\u7801\u5ba1\u67e5\u3002 \u6709\u6548\u7ed3\u679c\u65e0\u9700\u4eba\u5de5\u5e72\u9884\uff0c\u800c\u90a3\u4e9b\u867d\u7136\u8f83\u5f31\u4f46\u6709\u6548\u7684\u8f93\u51fa\u7ed3\u679c\u5219\u65e0\u6cd5\u91cd\u65b0\u8fd0\u884c\u4ee5\u83b7\u5f97\u66f4\u9ad8\u7684\u5206\u6570\u3002.<\/p>\n\n\n\n<style>.comparison-setup-card{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}.comparison-setup-card *{box-sizing:border-box}.comparison-setup-card .s-head{padding:24px 26px 20px;border-bottom:1px solid var(--line)}.comparison-setup-card .s-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.comparison-setup-card h3{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.comparison-setup-card .s-sub{margin:7px 0 0;color:var(--body);font-size:13px}.comparison-setup-card .s-body{padding:24px 26px}.comparison-setup-card .s-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.comparison-setup-card .s-stat{padding:15px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.comparison-setup-card .s-stat span{display:block;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.comparison-setup-card .s-stat strong{display:block;margin-top:5px;font-size:20px}.comparison-setup-card table{width:100%;border-collapse:collapse;font-size:12px}.comparison-setup-card th,.comparison-setup-card td{padding:11px 12px;border:1px solid var(--line);text-align:left;vertical-align:top}.comparison-setup-card th{background:var(--soft)}.comparison-setup-card .s-note{margin:16px 0 0;padding:12px 14px;border-left:3px solid var(--blue);background:#f3f5ff;color:#38466c;font-size:12px}.comparison-setup-card details{margin-top:12px;border:1px solid var(--line);border-radius:6px}.comparison-setup-card summary{cursor:pointer;padding:12px 14px;font-size:12px;font-weight:800}.comparison-setup-card pre{max-height:560px;overflow:auto;margin:0;padding:14px;white-space:pre-wrap;background:#f5f6f8;color:#222936;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}@media(max-width:680px){.comparison-setup-card .s-grid{grid-template-columns:1fr}.comparison-setup-card .s-head,.comparison-setup-card .s-body{padding:20px}}<\/style><aside class=\"comparison-setup-card\"><header class=\"s-head\"><p class=\"s-kicker\">\u6d4b\u8bd5\u7684\u8fdb\u884c\u65b9\u5f0f<\/p><h3>\u76f8\u540c\u7684\u4efb\u52a1\uff0c\u56fa\u5b9a\u7684\u89c4\u5219\uff0c\u7b2c\u4e00\u4e2a\u6709\u6548\u7684\u8f93\u51fa<\/h3><\/header><div class=\"s-body\"><div class=\"s-grid\"><div class=\"s-stat\"><span>\u300a\u6cd5\u5178\u300b<\/span><strong>gpt-5.6-sol<\/strong><small>\u4e2d\u5ea6 T1\u2013T3 \u00b7 \u9ad8\u5ea6 T4<\/small><\/div><div class=\"s-stat\"><span>\u514b\u52b3\u5fb7\u4ee3\u7801<\/span><strong>\u514b\u52b3\u5fb7-\u4f5c\u54c1\u7b2c5\u53f7<\/strong><small>\u62ab\u9732\u4e86\u5b50\u4ee3\u7406\u7684\u5907\u7528\u65b9\u6848<\/small><\/div><\/div><table><tbody><tr><th>\u8d5b\u7a0b\u8868<\/th><td>\u4e00\u4e2a\u89c4\u6a21\u8f83\u5c0f\u3001\u4ec5\u5305\u542b\u6807\u51c6\u5e93\u7684 Python \u4ee3\u7801\u5e93<\/td><\/tr><tr><th>\u8fd0\u884c\u89c4\u5219<\/th><td>\u4fdd\u7559\u7b2c\u4e00\u4e2a\u6709\u6548\u7ed3\u679c\uff1b\u7981\u6b62\u4e3a\u63d0\u9ad8\u8d28\u91cf\u800c\u91cd\u590d\u8fd0\u884c<\/td><\/tr><tr><th>\u5b89\u5168<\/th><td>\u6700\u65b0\u526f\u672c\u3001\u79bb\u7ebf\u4efb\u52a1\u3001\u65e0\u751f\u4ea7\u73af\u5883\u8bbf\u95ee\u6743\u9650\u3001\u65e0\u63a8\u9001\u6216\u90e8\u7f72<\/td><\/tr><tr><th>\u5f97\u5206<\/th><td>\u300a\u51b0\u96ea\u5947\u7f18\u300b100\u5206\u8bc4\u5206\u6807\u51c6\uff0c\u5916\u52a0\u72ec\u7acb\u7684\u516c\u5f00\/\u9690\u853d\u68c0\u67e5<\/td><\/tr><\/tbody><\/table><\/div><\/aside>\n\n\n\n<p class=\"wp-block-paragraph\">Codex \u8fd0\u884c\u4e86\u72ec\u7acb\u7684 CLI \u8fdb\u7a0b\uff0c\u5176\u4e2d\u4fdd\u7559\u4e86\u539f\u59cb JSONL \u4ee5\u53ca CLI \u751f\u6210\u7684\u4ee4\u724c\u5b57\u6bb5\u3002\u7531\u4e8e\u8be5\u540c\u4e8b\u7684 Claude CLI OAuth \u4f1a\u8bdd\u5df2\u8fc7\u671f\uff0c\u56e0\u6b64 Claude Code \u4f7f\u7528\u4e86\u4e00\u4e2a\u5e26\u6709\u5168\u65b0\u5b50\u4ee3\u7406\u4e0a\u4e0b\u6587\u7684\u534f\u8c03\u5668\u3002 \u6211\u4eec\u5728\u5e72\u51c0\u7684\u5ba1\u8ba1\u526f\u672c\u4e2d\u91cd\u6784\u4e86 Claude \u7684\u8865\u4e01\uff0c\u5e76\u91cd\u65b0\u8fd0\u884c\u4e86\u516c\u5f00\u548c\u9690\u85cf\u7684\u68c0\u67e5\u3002\u8fd9\u4ea7\u751f\u4e86\u53ef\u4fe1\u7684\u5b9e\u9645\u8bc1\u636e\uff0c\u4f46\u9694\u79bb\u73af\u5883\u548c\u6a21\u578b\u63a7\u5236\u9762\u5e76\u4e0d\u5b8c\u5168\u76f8\u540c\u3002.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u4efb\u52a1<\/th><th>\u300a\u6cd5\u5178\u300b<\/th><th>\u514b\u52b3\u5fb7\u4ee3\u7801<\/th><th>\u6709\u754c\u89e3\u91ca<\/th><\/tr><\/thead><tbody><tr><td>T1\uff1a\u5bf9\u4ee3\u7801\u5e93\u7684\u7406\u89e3<\/td><td>20\/20<\/td><td>20\/20<\/td><td>\u5e73\u5c40\uff1b\u7d27\u51d1\u578b\u4e0e\u7a77\u4e3e\u578b<\/td><\/tr><tr><td>T2\uff1a\u591a\u6587\u4ef6\u529f\u80fd<\/td><td>30\/30<\/td><td>30\/30<\/td><td>\u529f\u80fd\u6027\u5173\u8054\uff1b\u4e0d\u540c\u7684\u9a8c\u8bc1\u548c\u6d4b\u8bd5\u8303\u56f4<\/td><\/tr><tr><td>T3\uff1aDST\u4fee\u590d<\/td><td>30\/30<\/td><td>30\/30<\/td><td>\u4e24\u8005\u5747\u901a\u8fc7\uff1b\u8f83\u7a84\u7684\u4fee\u8865\u533a\u57df\u4e0e\u8f83\u5bbd\u7684\u8fb9\u7f18\u8986\u76d6\u8303\u56f4<\/td><\/tr><tr><td>T4\uff1a\u68c0\u67e5\u4e0e\u7ef4\u4fee<\/td><td>18\/20<\/td><td>19\/20<\/td><td>Claude \u4ee3\u7801\u663e\u793a\u51fa\u66f4\u5e7f\u6cdb\u7684\u5ba1\u67e5\u8303\u56f4<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<style>.aggregate-verdict-card{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}.aggregate-verdict-card *{box-sizing:border-box}.aggregate-verdict-card .s-head{padding:24px 26px 20px;border-bottom:1px solid var(--line)}.aggregate-verdict-card .s-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.aggregate-verdict-card h3{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.aggregate-verdict-card .s-sub{margin:7px 0 0;color:var(--body);font-size:13px}.aggregate-verdict-card .s-body{padding:24px 26px}.aggregate-verdict-card .s-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.aggregate-verdict-card .s-stat{padding:15px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.aggregate-verdict-card .s-stat span{display:block;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.aggregate-verdict-card .s-stat strong{display:block;margin-top:5px;font-size:20px}.aggregate-verdict-card table{width:100%;border-collapse:collapse;font-size:12px}.aggregate-verdict-card th,.aggregate-verdict-card td{padding:11px 12px;border:1px solid var(--line);text-align:left;vertical-align:top}.aggregate-verdict-card th{background:var(--soft)}.aggregate-verdict-card .s-note{margin:16px 0 0;padding:12px 14px;border-left:3px solid var(--blue);background:#f3f5ff;color:#38466c;font-size:12px}.aggregate-verdict-card details{margin-top:12px;border:1px solid var(--line);border-radius:6px}.aggregate-verdict-card summary{cursor:pointer;padding:12px 14px;font-size:12px;font-weight:800}.aggregate-verdict-card pre{max-height:560px;overflow:auto;margin:0;padding:14px;white-space:pre-wrap;background:#f5f6f8;color:#222936;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}@media(max-width:680px){.aggregate-verdict-card .s-grid{grid-template-columns:1fr}.aggregate-verdict-card .s-head,.aggregate-verdict-card .s-body{padding:20px}}<\/style><article class=\"aggregate-verdict-card\"><header class=\"s-head\"><p class=\"s-kicker\">\u53d7\u63a7\u6d4b\u8bd5 \u00b7 \u56fa\u5b9a\u8bc4\u5206\u6807\u51c6<\/p><h3>Codex 98\/100 \u4e0e Claude Code 99\/100<\/h3><p class=\"s-sub\">1\u5206\u7684\u5dee\u8ddd\u5e76\u975e\u653e\u4e4b\u56db\u6d77\u7686\u51c6\u7684\u83b7\u80dc\u4fe1\u53f7\u3002\u6709\u610f\u4e49\u7684\u5dee\u5f02\u53d6\u51b3\u4e8e\u5177\u4f53\u4efb\u52a1\u3002.<\/p><\/header><div class=\"s-body\"><div class=\"s-grid\"><div class=\"s-stat\"><span>\u300a\u6cd5\u5178\u300b<\/span><strong>98\/100<\/strong><\/div><div class=\"s-stat\"><span>\u514b\u52b3\u5fb7\u4ee3\u7801<\/span><strong>99\/100<\/strong><\/div><\/div><table><thead><tr><th>\u51b3\u7b56\u533a\u57df<\/th><th>\u89c2\u6d4b\u7ed3\u679c<\/th><th>\u5b9e\u7528\u9605\u8bfb<\/th><\/tr><\/thead><tbody><tr><td>\u5bf9\u4ee3\u7801\u5e93\u7684\u7406\u89e3<\/td><td>\u5e73\u5c40 \u00b7 \u540420\/20<\/td><td>Claude \u66f4\u5168\u9762\uff1bCodex \u5219\u66f4\u7b80\u6d01\u3002.<\/td><\/tr><tr><td>\u591a\u6587\u4ef6\u529f\u80fd<\/td><td>\u5e73\u5c40 \u00b7 \u540430\/30<\/td><td>\u4e24\u8005\u5747\u901a\u8fc7\u4e86\u9690\u5f0f\u68c0\u67e5\uff1bClaude \u589e\u52a0\u4e86\u66f4\u5168\u9762\u7684\u6d4b\u8bd5\u3002.<\/td><\/tr><tr><td>\u590f\u4ee4\u65f6\uff08DST\uff09\u9519\u8bef\u4fee\u590d<\/td><td>\u5e73\u5c40 \u00b7 \u540430\/30<\/td><td>Claude \u8986\u76d6\u7684\u8fb9\u7f18\u66f4\u591a\uff1bCodex \u5219\u91c7\u7528\u4e86\u8f83\u7a84\u7684\u8865\u4e01\u3002.<\/td><\/tr><tr><td>\u68c0\u67e5\u4e0e\u7ef4\u4fee<\/td><td>Claude 19\/20\uff1bCodex 18\/20<\/td><td>Claude \u53d1\u73b0\u4e86\u66f4\u591a\u53ef\u91cd\u73b0\u7684\u7f3a\u9677\u3002.<\/td><\/tr><tr><td>\u89c2\u6d4b\u901f\u5ea6<\/td><td>\u6df7\u5408\u578b<\/td><td>Claude \u9886\u8dd1 T1\/T2\uff1bCodex \u9886\u8dd1 T3\/T4\u3002.<\/td><\/tr><\/tbody><\/table><p class=\"s-note\"><strong>\u62ab\u9732\uff1a<\/strong> \u63d0\u793a\u548c\u6d4b\u8bd5\u73af\u5883\u76f8\u540c\uff0c\u4f46\u9694\u79bb\u8def\u5f84\u4e0d\u540c\u3002\u8bf7\u52ff\u5c06\u6b64\u5c0f\u578b\u6d4b\u8bd5\u7684\u7ed3\u679c\u63a8\u5e7f\u5230\u6bcf\u4e2a\u5b58\u50a8\u5e93\u3001\u6a21\u578b\u5c42\u6216\u72ec\u7acb\u4f1a\u8bdd\u3002.<\/p><\/div><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\u8be5\u6d4b\u8bd5\u6846\u67b6\u89c4\u6a21\u8fc7\u5c0f\uff0c\u65e0\u6cd5\u8bc4\u4f30\u5176\u5728\u5927\u578b\u4ee3\u7801\u5e93\u3001\u6240\u6709\u7f16\u7a0b\u8bed\u8a00\u3001\u6240\u6709\u6a21\u578b\u5c42\u7ea7\u6216\u957f\u65f6\u95f4\u81ea\u4e3b\u8fd0\u884c\u573a\u666f\u4e0b\u7684\u6027\u80fd\u3002\u8fd9\u4e00\u603b\u5206\u5dee\u8ddd\u6700\u597d\u7406\u89e3\u4e3a\u201c\u4e24\u8005\u5747\u6210\u529f\uff0c\u4f46\u5ba1\u67e5\u8303\u56f4\u5b58\u5728\u5dee\u5f02\u201d\uff0c\u800c\u975e\u4e00\u79cd\u666e\u9002\u6027\u7684\u6392\u540d\u3002.<\/p>\n\n\n\n<h2 id=\"user-experience\" class=\"wp-block-heading\">\u771f\u5b9e\u7528\u6237\u7684\u53cd\u9988\u2014\u2014\u4ee5\u53ca\u8be5\u76f8\u4fe1\u591a\u5c11<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u793e\u533a\u53cd\u9988\u5305\u542b\u9879\u76ee\u3001\u4efb\u52a1\u3001\u6a21\u578b\u3001\u5de5\u4f5c\u573a\u666f\u548c\u65f6\u95f4\u8303\u56f4\u65f6\uff0c\u8fd9\u7c7b\u53cd\u9988\u624d\u5177\u6709\u4ef7\u503c\u3002\u5982\u679c\u67d0\u6761\u5e16\u5b50\u4ec5\u8868\u793a\u67d0\u4e2a\u4ea7\u54c1\u201c\u611f\u89c9\u66f4\u667a\u80fd\u201d\u6216\u201c\u901f\u5ea6\u5feb\u5f97\u591a\u201d\uff0c\u90a3\u4e48\u8be5\u53cd\u9988\u7684\u53c2\u8003\u4ef7\u503c\u5c31\u8f83\u4f4e\u3002\u4e0d\u540c\u7528\u6237\u4f1a\u6bd4\u8f83\u4e0d\u540c\u7684\u4ee3\u7801\u5e93\u3001\u8ba2\u9605\u7b49\u7ea7\u3001\u63d0\u793a\u8bcd\u3001\u6269\u5c55\u7a0b\u5e8f\u4ee5\u53ca\u76d1\u7763\u7a0b\u5ea6\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0a\u6587\u63d0\u5230\u7684Reddit\u5b9e\u4f8b\u8868\u660e\uff0c\u4ea4\u4e92\u5b58\u5728\u4e00\u79cd\u6743\u8861\uff1a\u5feb\u901f\u4e14\u5bf9\u8bdd\u5f0f\u7684\u4ea4\u4e92\u53ef\u80fd\u9700\u8981\u66f4\u591a\u6ce8\u610f\u529b\uff0c\u800c\u7ecf\u8fc7\u6df1\u601d\u719f\u8651\u7684\u6267\u884c\u867d\u7136\u611f\u89c9\u8f83\u6162\uff0c\u4f46\u9700\u8981\u66f4\u5c11\u7684\u4fee\u6b63\u3002 \u6211\u4eec\u7684\u53d7\u63a7\u6d4b\u8bd5\u4e0e\u8be5\u8d26\u53f7\u7684\u60c5\u51b5\u4ec5\u90e8\u5206\u91cd\u5408\u3002\u6d4b\u8bd5\u7ed3\u679c\u663e\u793a\uff0c\u5728\u6709\u6548\u7684\u8fd0\u884c\u4e2d\uff0c\u901f\u5ea6\u8868\u73b0\u53c2\u5dee\u4e0d\u9f50\u4e14\u672a\u53d1\u73b0\u4eba\u5de5\u5e72\u9884\uff0c\u56e0\u6b64\u65e0\u6cd5\u9a8c\u8bc1\u201c\u4eba\u5de5\u770b\u62a4\u201d\u7684\u8bf4\u6cd5\u3002\u8fd9\u6b63\u662f\u4e3a\u4f55\u5e94\u5c06\u793e\u533a\u8bc1\u636e\u4e0e\u53d7\u63a7\u8bc1\u636e\u5e76\u5217\u5c55\u793a\uff0c\u800c\u4e0d\u80fd\u5c06\u4e24\u8005\u6df7\u4e3a\u4e00\u8c08\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5173\u4e8eX\u578b\u8bbe\u8ba1\u7684\u90a3\u6761\u8bc4\u8bba\u8fd8\u63d0\u51fa\u4e86\u4e00\u4e2a\u6709\u7528\u7684\u89c2\u70b9\uff1a\u7f16\u7801\u7ed3\u679c\u5c5e\u4e8e\u6574\u4e2a\u7cfb\u7edf\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u6a21\u578b\u6807\u7b7e\u3002\u8fd9\u4e24\u7bc7\u5e16\u5b50\u90fd\u4e0d\u5e94\u88ab\u89c6\u4e3a\u8c03\u67e5\u6570\u636e\u3002\u5e94\u5229\u7528\u5b83\u4eec\u6765\u786e\u5b9a\u81ea\u5df1\u8bd5\u9a8c\u4e2d\u9700\u8981\u5173\u6ce8\u7684\u95ee\u9898\u2014\u2014\u5e72\u9884\u6b21\u6570\u3001\u5dee\u5f02\u5927\u5c0f\u3001\u6d4b\u8bd5\u8d28\u91cf\u4ee5\u53ca\u4ece\u9519\u8bef\u5047\u8bbe\u4e2d\u6062\u590d\u7684\u60c5\u51b5\u3002.<\/p>\n\n\n\n<h2 id=\"globalgpt\" class=\"wp-block-heading\">\u901a\u8fc7 GlobalGPT \u6269\u5c55 Codex \u548c Claude \u4ee3\u7801<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT \u662f\u4e00\u79cd <a href=\"https:\/\/www.glbgpt.com\/hub\/best-all-in-one-ai-tools-and-platforms-11-options-compared\/\">\u591a\u6a21\u578b\u3001\u591a\u6a21\u6001\u5de5\u4f5c\u533a<\/a>, \uff0c\u5e76\u975e\u7528\u4e8e\u66ff\u4ee3\u539f\u751f\u4ee3\u7801\u5e93\u4ee3\u7406\u3002\u5176\u5b9e\u9645\u4f5c\u7528\u662f\u6269\u5c55\u73b0\u6709\u4e3b\u673a\u529f\u80fd\uff1a\u5229\u7528\u53e6\u4e00\u79cd\u53ef\u7528\u7684\u4ee3\u7406\u6a21\u578b\u8fdb\u884c\u4e8c\u6b21\u5ba1\u6838\u3001\u65b9\u6848\u5ba1\u67e5\u3001\u6587\u6863\u6838\u67e5\u6216\u751f\u6210\u4e13\u7528\u8f93\u51fa\uff0c\u800cCodex\u6216Claude Code\u4ecd\u8d1f\u8d23\u4ee3\u7801\u5e93\u8bbf\u95ee\u3001shell\u547d\u4ee4\u3001\u6d4b\u8bd5\u548c\u5ba1\u6279\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT \u53d1\u5e03\u4e86\u9488\u5bf9\u4ee5\u4e0b\u5185\u5bb9\u7684\u5b98\u65b9 CLI \u6307\u5357\uff1a <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-globalgpt-cli-in-codex\/\">\u300a\u6cd5\u5178\u300b<\/a> \u548c <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-globalgpt-cli-in-claude-code\/\">\u514b\u52b3\u5fb7\u4ee3\u7801<\/a>, \uff0c\u4ee5\u53ca Cursor\u3002\u5728\u6211\u4eec\u7684 T5 \u5b89\u5168\u96c6\u6210\u6d4b\u8bd5\u4e2d\uff0cCLI \u5728\u4e24\u79cd\u5bf9\u6bd4\u73af\u5883\u4e2d\u5747\u6210\u529f\u5b8c\u6210\u4e86\u540c\u4e00\u9879\u51bb\u7ed3\u4efb\u52a1\u3002\u5728 Codex \u4e2d\uff0c\u6211\u4eec\u8fd8\u9a8c\u8bc1\u4e86\u4e00\u4e2a\u53ea\u8bfb\u7684 MCP \u6a21\u578b\u5217\u8868\u8c03\u7528\uff0c\u5e76\u5b89\u88c5\u3001\u52a0\u8f7d\u5e76\u4f7f\u7528\u4e86 GlobalGPT \u6280\u80fd\u3002.<\/p>\n\n\n\n<style>.globalgpt-integration-card{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}.globalgpt-integration-card *{box-sizing:border-box}.globalgpt-integration-card .s-head{padding:24px 26px 20px;border-bottom:1px solid var(--line)}.globalgpt-integration-card .s-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.globalgpt-integration-card h3{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.globalgpt-integration-card .s-sub{margin:7px 0 0;color:var(--body);font-size:13px}.globalgpt-integration-card .s-body{padding:24px 26px}.globalgpt-integration-card .s-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.globalgpt-integration-card .s-stat{padding:15px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.globalgpt-integration-card .s-stat span{display:block;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.globalgpt-integration-card .s-stat strong{display:block;margin-top:5px;font-size:20px}.globalgpt-integration-card table{width:100%;border-collapse:collapse;font-size:12px}.globalgpt-integration-card th,.globalgpt-integration-card td{padding:11px 12px;border:1px solid var(--line);text-align:left;vertical-align:top}.globalgpt-integration-card th{background:var(--soft)}.globalgpt-integration-card .s-note{margin:16px 0 0;padding:12px 14px;border-left:3px solid var(--blue);background:#f3f5ff;color:#38466c;font-size:12px}.globalgpt-integration-card details{margin-top:12px;border:1px solid var(--line);border-radius:6px}.globalgpt-integration-card summary{cursor:pointer;padding:12px 14px;font-size:12px;font-weight:800}.globalgpt-integration-card pre{max-height:560px;overflow:auto;margin:0;padding:14px;white-space:pre-wrap;background:#f5f6f8;color:#222936;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}@media(max-width:680px){.globalgpt-integration-card .s-grid{grid-template-columns:1fr}.globalgpt-integration-card .s-head,.globalgpt-integration-card .s-body{padding:20px}}<\/style><article class=\"globalgpt-integration-card\"><header class=\"s-head\"><p class=\"s-kicker\">GlobalGPT \u6574\u5408 \u00b7 \u4e0d\u8ba1\u5165\u7f16\u7801\u5206\u6570<\/p><h3>CLI \u5df2\u5728\u4e24\u4e2a\u5de5\u4f5c\u6d41\u4e2d\u5747\u901a\u8fc7\u9a8c\u8bc1\uff1bMCP \u548c Skill \u5df2\u5728 Codex \u4e2d\u901a\u8fc7\u9a8c\u8bc1<\/h3><p class=\"s-sub\">\u8fd9\u8861\u91cf\u7684\u662f\u6574\u5408\u8def\u5f84\uff0c\u800c\u975eGlobalGPT\u662f\u5426\u53d6\u4ee3\u4e86\u4efb\u4e00\u539f\u751f\u7f16\u7801\u56e0\u5b50\u3002.<\/p><\/header><div class=\"s-body\"><table><thead><tr><th>\u8def\u5f84<\/th><th>Codex \u73af\u5883<\/th><th>Claude \u540c\u4e8b\u8dd1\u56e2<\/th><\/tr><\/thead><tbody><tr><td>GlobalGPT CLI<\/td><td>\u5df2\u901a\u8fc7 gpt-5.6-sol \u548c gpt-5.6-luna \u9a8c\u8bc1<\/td><td>\u5df2\u4f7f\u7528\u76f8\u540c\u7684\u51bb\u7ed3\u4efb\u52a1\u8fdb\u884c\u9a8c\u8bc1<\/td><\/tr><tr><td>MCP<\/td><td>\u5df2\u9a8c\u8bc1\u4ea4\u4e92\u5f0f\u53ea\u8bfb\u6a21\u578b\u5217\u8868<\/td><td>\u8fd0\u884c\u671f\u95f4\u672a\u8fde\u63a5<\/td><\/tr><tr><td>\u6280\u80fd<\/td><td>\u5df2\u5b89\u88c5\u3001\u5df2\u52a0\u8f7d\u5e76\u5df2\u6d4b\u8bd5<\/td><td>\u5df2\u5b89\u88c5\u4f46\u672a\u7528\u4e8e\u5904\u7406\u51bb\u7ed3\u547c\u53eb<\/td><\/tr><tr><td>\u65e0\u4eba\u503c\u5b88\u7684 MCP<\/td><td>\u89c2\u5bdf\u5230\u6279\u51c6\u9650\u5236<\/td><td>\u672a\u7ecf\u8fc7\u6d4b\u8bd5<\/td><\/tr><\/tbody><\/table><details><summary>\u67e5\u770b\u5b8c\u6574\u7684\u6574\u5408\u8bc1\u636e<\/summary><pre># GlobalGPT \u96c6\u6210\u6d4b\u8bd5\u6458\u8981\n\n# # \u8303\u56f4\n\nT5 \u7528\u4e8e\u8bc4\u4f30 GlobalGPT \u7684\u96c6\u6210\u60c5\u51b5\uff0c\u4e0d\u8ba1\u5165\u539f\u751f Codex \u7f16\u7801\u5206\u6570\u3002\u672a\u4f7f\u7528 Yukie\u3002\n\n## \u6a21\u578b\u9501\u5b9a\u4e0e\u5c31\u7eea\u72b6\u6001\n\n- \u6a21\u578b A\uff1a`gpt-5.6-sol`\n- \u6a21\u578b B\uff1a`gpt-5.6-luna`\n- \u4e24\u4e2a\u6a21\u578b\u5747\u51fa\u73b0\u5728\u5728\u7ebf\u6a21\u578b\u5217\u8868\u4e2d\u3002\n- \u4e24\u4e2a\u8f7b\u91cf\u7ea7\u5c31\u7eea\u6027\u63a2\u9488\u5747\u8fd4\u56de\u4e86\u6709\u6548\u4e14\u53ef\u89e3\u6790\u7684\u6587\u672c\u3002\n- \u5728\u6b63\u5f0f\u8c03\u7528 T5A \u548c T5B \u8f93\u51fa\u4e4b\u524d\uff0c\u6a21\u578b\u5df2\u5904\u4e8e\u9501\u5b9a\u72b6\u6001\u3002\n\n## \u6b63\u5f0f CLI \u7ed3\u679c\n\n| \u4efb\u52a1 | \u6a21\u578b | \u72b6\u6001 | \u8017\u65f6 | \u63d0\u793a\u8bcd\u4ee4\u724c\u6570 | \u5b8c\u6210\u8bcd\u4ee4\u724c\u6570 | \u6240\u9700\u6807\u9898\u6570 |\n|---|---|---|---:|---:|---:|---:|\n| T5A | gpt-5.6-sol | \u6709\u6548 | 27 \u79d2 | 2,116 | 1,207 | 6\/6 |\n| T5B | gpt-5.6-luna | \u6709\u6548 | 14 \u79d2 | 2,116 | 1,441 | 6\/6 |\n\n\u8fd9\u4e24\u6b21\u6b63\u5f0f\u8c03\u7528\u5747\u901a\u8fc7 `glbgpt exec` \u4f7f\u7528\u4e86\u76f8\u540c\u7684\u51bb\u7ed3\u7248\u82f1\u8bed\u4ea7\u54c1\u89c4\u5212\u4efb\u52a1\uff0c\u8fd4\u56de\u4e86\u4ec5\u663e\u793a\u82f1\u8bed\u7684\u53ef\u89c1\u8f93\u51fa\uff0c\u4e14\u672a\u66b4\u9732\u4efb\u4f55\u51ed\u636e\u3002\u672a\u8fdb\u884c\u8d28\u91cf\u91cd\u8dd1\u3002\n\n## MCP \u7ed3\u679c\n\n- `codex mcp list` \u663e\u793a `globalgpt` \u5df2\u542f\u7528\u3002\n- \u4e00\u4e2a\u975e\u4ea4\u4e92\u5f0f Codex \u4f1a\u8bdd\u68c0\u6d4b\u5230\u5e76\u5c1d\u8bd5\u8c03\u7528 `mcp__globalgpt__glbgpt_list_models`\uff0c\u4f46\u7531\u4e8e\u65e0\u6cd5\u83b7\u5f97\u65e0\u4eba\u503c\u5b88\u7684 MCP \u6279\u51c6\uff0c\u8be5\u8c03\u7528\u88ab\u53d6\u6d88\u3002\u672a\u653e\u5bbd\u4efb\u4f55\u5b89\u5168\u8bbe\u7f6e\u3002\n- \u5f53\u524d\u6d3b\u52a8\u7684\u4ea4\u4e92\u5f0f Codex \u4f1a\u8bdd\u6210\u529f\u8c03\u7528\u4e86\u76f8\u540c\u7684\u53ea\u8bfb GlobalGPT MCP \u5de5\u5177\uff0c\u5e76\u83b7\u53d6\u4e86\u4e5d\u4e2a\u804a\u5929\u6a21\u578b\u3002\n- \u7ed3\u679c\uff1a\u5df2\u9a8c\u8bc1\u4ea4\u4e92\u5f0f MCP \u8bbf\u95ee\uff1b\u65e0\u4eba\u503c\u5b88\u7684\u975e\u4ea4\u4e92\u5f0f MCP \u6267\u884c\u4ecd\u53d7\u5ba1\u6279\u9650\u5236\u3002\n\n## \u6280\u80fd\u7ed3\u679c\n\n- \u901a\u8fc7\u94fe\u63a5\u5230\u6346\u7ed1\u7684 CLI \u6280\u80fd\u5305\uff0c\u5df2\u5728 Codex \u6280\u80fd\u76ee\u5f55\u4e2d\u5b89\u88c5\u4e86 GlobalGPT \u548c GlobalGPT \u7f16\u7801\u6280\u80fd\u3002\n- \u52a0\u8f7d\u4e86 GlobalGPT \u6280\u80fd\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u4e86\u914d\u7f6e\u4f1a\u8bdd\u68c0\u67e5\u3001\u5b9e\u65f6\u6a21\u578b\u9009\u62e9\u3001\u5c31\u7eea\u6027\u9a8c\u8bc1\u3001\u4fe1\u7528\u5b89\u5168\u9009\u9879\u914d\u7f6e\u4ee5\u53ca\u6545\u969c\u5904\u7406\u7684\u6d4b\u8bd5\u3002\n- \u7ed3\u679c\uff1a\u5df2\u5728\u6d3b\u8dc3\u7684 Codex \u5de5\u4f5c\u6d41\u4e2d\u5b89\u88c5\u5e76\u8fd0\u884c\u3002\n\n## \u6709\u9650\u7ed3\u8bba\n\n\u672c\u6b21\u8fd0\u884c\u9a8c\u8bc1\u4e86 GlobalGPT CLI \u8c03\u7528\u7684\u6709\u6548\u6027\u3001\u4ece Codex \u53d1\u8d77\u7684\u4ea4\u4e92\u5f0f GlobalGPT MCP \u53ea\u8bfb\u8c03\u7528\uff0c\u4ee5\u53ca\u5df2\u5b89\u88c5\u5e76\u4f7f\u7528\u7684 GlobalGPT \u6280\u80fd\u8def\u5f84\u3002 \u5b83\u5e76\u672a\u8bc1\u660e\u6bcf\u4e2a\u6a21\u578b\u3001\u5a92\u4f53\u5de5\u5177\u3001\u4e3b\u673a\u3001\u8d26\u6237\u6216\u65e0\u4eba\u503c\u5b88\u7684 MCP \u914d\u7f6e\u5747\u80fd\u6b63\u5e38\u5de5\u4f5c\u3002\u5b83\u672a\u5bf9 Yukie \u8fdb\u884c\u6d4b\u8bd5\uff0c\u4e5f\u4e0d\u652f\u6301\u201cGlobalGPT \u53d6\u4ee3 Codex \u6216 Claude Code\u201d\u7684\u8bf4\u6cd5\u3002.\n<\/pre><\/details><p class=\"s-note\">\u5df2\u9a8c\u8bc1\u8303\u56f4\uff1a\u7279\u5b9a\u7684 CLI \u8c03\u7528\u3001\u4e00\u6b21\u4ea4\u4e92\u5f0f MCP \u8bfb\u53d6\u64cd\u4f5c\uff0c\u4ee5\u53ca\u4e00\u6761\u5df2\u5b89\u88c5\/\u6b63\u5728\u4f7f\u7528\u7684\u6280\u80fd\u8def\u5f84\u3002\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u5df2\u9a8c\u8bc1\u6240\u6709\u6a21\u578b\u3001\u5a92\u4f53\u5de5\u5177\u3001\u4e3b\u673a\u6216\u65e0\u4eba\u503c\u5b88\u914d\u7f6e\u3002.<\/p><\/div><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fb9\u754c\u5f88\u91cd\u8981\u3002\u8be5\u540c\u4e8b\u7684 Claude \u8fd0\u884c\u9a8c\u8bc1\u7684\u662f CLI \u8def\u5f84\uff0c\u800c\u975e Claude \u4fa7\u7684 MCP\u3002\u8be5\u6280\u80fd\u867d\u5df2\u5b89\u88c5\u5728\u8be5\u5904\uff0c\u4f46\u5e76\u672a\u7528\u4e8e\u5904\u7406\u51bb\u7ed3\u7684\u547c\u53eb\u3002 \u5373\u4f7f\u5c1d\u8bd5\u4f7f\u7528\u65e0\u4eba\u503c\u5b88\u7684 Codex MCP\uff0c\u4ecd\u9700\u4eba\u5de5\u6279\u51c6\u3002\u6a21\u578b\u7684\u53ef\u7528\u6027\u548c\u79ef\u5206\u4e5f\u53d6\u51b3\u4e8e\u5f53\u524d\u7684 GlobalGPT \u5957\u9910\uff0c\u56e0\u6b64\u5f00\u53d1\u4eba\u5458\u5e94\u67e5\u770b\u5b9e\u65f6\u5217\u8868\uff0c\u800c\u975e\u5047\u8bbe\u6240\u6709\u6a21\u578b\u5747\u5305\u542b\u5728\u5185\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT \u8fd8\u6db5\u76d6\u4e86\u56fe\u50cf\u3001\u89c6\u9891\u3001\u97f3\u9891\u4ee5\u53ca\u5e26\u5f15\u5bfc\u7684 Agent \u5de5\u4f5c\u6d41\u3002 Yukie \u7684\u5e7b\u706f\u7247\u3001\u6587\u6863\u548c\u56fe\u7247\u6761\u76ee\u5219\u5c5e\u4e8e\u53e6\u4e00\u7c7b\uff1a\u5b83\u4eec\u4e3a\u975e\u7f16\u7801\u4efb\u52a1\u63d0\u4f9b\u4e86\u660e\u786e\u7684\u6a21\u677f\u548c\u5206\u6b65\u6d4f\u89c8\u5668\u6307\u5bfc\u3002\u4e0e\u6253\u5f00\u7f16\u7801\u547d\u4ee4\u884c\u754c\u9762\uff08CLI\uff09\u6765\u5236\u4f5c\u6f14\u793a\u6587\u7a3f\u6216\u7ed3\u6784\u5316\u6587\u6863\u76f8\u6bd4\uff0c\u8fd9\u79cd\u65b9\u5f0f\u53ef\u80fd\u66f4\u7b80\u5355\uff0c\u4f46\u5e76\u4e0d\u80fd\u66ff\u4ee3\u4ee3\u7801\u5e93\u67e5\u9605\u3001\u6d4b\u8bd5\u6267\u884c\u6216\u4ee3\u7801\u5ba1\u67e5\u3002.<\/p>\n\n\n\n<style>.yukie-workflow-summary-card{--ink:#111318;--body:#414753;--muted:#707784;--line:#e4e7ec;--soft:#f6f7f9;--blue:#315efb;--violet:#7257e8;--green:#087a55;--greenSoft:#eaf8f2;--red:#a23131;--redSoft:#fff0f0;color:var(--ink);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;line-height:1.5;border:1px solid var(--line);border-radius:8px;background:#fff;overflow:hidden;box-shadow:0 16px 42px rgba(24,32,56,.08)}.yukie-workflow-summary-card *{box-sizing:border-box}.yukie-workflow-summary-card .s-head{padding:24px 26px 20px;border-bottom:1px solid var(--line)}.yukie-workflow-summary-card .s-kicker{margin:0 0 6px;color:var(--muted);font:750 11px\/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.08em;text-transform:uppercase}.yukie-workflow-summary-card h3{margin:0;font-size:22px;line-height:1.2;letter-spacing:-.025em}.yukie-workflow-summary-card .s-sub{margin:7px 0 0;color:var(--body);font-size:13px}.yukie-workflow-summary-card .s-body{padding:24px 26px}.yukie-workflow-summary-card .s-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.yukie-workflow-summary-card .s-stat{padding:15px;border:1px solid var(--line);border-radius:6px;background:var(--soft)}.yukie-workflow-summary-card .s-stat span{display:block;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}.yukie-workflow-summary-card .s-stat strong{display:block;margin-top:5px;font-size:20px}.yukie-workflow-summary-card table{width:100%;border-collapse:collapse;font-size:12px}.yukie-workflow-summary-card th,.yukie-workflow-summary-card td{padding:11px 12px;border:1px solid var(--line);text-align:left;vertical-align:top}.yukie-workflow-summary-card th{background:var(--soft)}.yukie-workflow-summary-card .s-note{margin:16px 0 0;padding:12px 14px;border-left:3px solid var(--blue);background:#f3f5ff;color:#38466c;font-size:12px}.yukie-workflow-summary-card details{margin-top:12px;border:1px solid var(--line);border-radius:6px}.yukie-workflow-summary-card summary{cursor:pointer;padding:12px 14px;font-size:12px;font-weight:800}.yukie-workflow-summary-card pre{max-height:560px;overflow:auto;margin:0;padding:14px;white-space:pre-wrap;background:#f5f6f8;color:#222936;font:11px\/1.6 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}@media(max-width:680px){.yukie-workflow-summary-card .s-grid{grid-template-columns:1fr}.yukie-workflow-summary-card .s-head,.yukie-workflow-summary-card .s-body{padding:20px}}<\/style><article class=\"yukie-workflow-summary-card\"><header class=\"s-head\"><p class=\"s-kicker\">\u4e0d\u540c\u7684\u5de5\u4f5c\u6d41\u7c7b\u522b<\/p><h3>Yukie \u6307\u5bfc\u7684\u6d4f\u89c8\u5668\u4ee3\u7406\u6d4b\u8bd5<\/h3><p class=\"s-sub\">\u9002\u7528\u4e8e\u7279\u5b9a\u4efb\u52a1\u7684 Web \u5de5\u4f5c\u6d41\uff1b\u5c1a\u672a\u7ecf\u8fc7\u6d4b\u8bd5\uff0c\u65e0\u6cd5\u66ff\u4ee3\u4ee3\u7801\u4ed3\u5e93\u4e2d\u7684\u7f16\u7801\u4ee3\u7406\u3002.<\/p><\/header><div class=\"s-body\"><table><thead><tr><th>\u5de5\u4f5c\u6d41\u7a0b<\/th><th>\u5df2\u6ee1\u8db3\u6807\u51c6<\/th><th>\u9996\u4e2a\u6709\u6548\u7ed3\u679c<\/th><\/tr><\/thead><tbody><tr><td>\u5e7b\u706f\u7247<\/td><td>5\/6<\/td><td>\u5df2\u751f\u6210\u5305\u542b\u4e94\u5f20\u5e7b\u706f\u7247\u7684\u6f14\u793a\u6587\u7a3f\uff1b\u65e0\u6cd5\u9a8c\u8bc1\u8bb2\u8005\u5907\u6ce8\u3002.<\/td><\/tr><tr><td>\u6587\u6863<\/td><td>6\/6<\/td><td>\u7ed3\u6784\u5316\u7684\u7814\u7a76\u7b80\u62a5\uff0c\u9644\u5e26\u5bfc\u51fa\u529f\u80fd\u548c\u7248\u672c\u5386\u53f2\u8bb0\u5f55\u3002.<\/td><\/tr><tr><td>\u56fe\u7247 + \u56fe\u6ce8<\/td><td>5\/6<\/td><td>\u9192\u76ee\u7684\u65b9\u5f62\u89c6\u89c9\u5143\u7d20\uff1b\u5e94\u6709\u7684\u56fe\u6ce8\u7f3a\u5931\u3002.<\/td><\/tr><\/tbody><\/table><p class=\"s-note\">\u5408\u7406\u7684\u7ed3\u8bba\uff1a\u660e\u786e\u7684\u5207\u5165\u70b9\u548c\u5f15\u5bfc\u5f0f\u591a\u6a21\u5f0f\u5de5\u4f5c\u6d41\u3002\u7f3a\u4e4f\u4f9d\u636e\u7684\u7ed3\u8bba\uff1a\u65e0\u9650\u5236\u4f7f\u7528\u3001\u786e\u5207\u4ef7\u683c\uff0c\u6216\u5b8c\u5168\u66ff\u4ee3 Codex\/Claude Code\u3002.<\/p><\/div><\/article>\n\n\n\n<h2 id=\"which-one\" class=\"wp-block-heading\">\u72ec\u7acb\u5f00\u53d1\u8005\u5e94\u8be5\u9009\u62e9\u54ea\u79cd\u7f16\u7801\u5de5\u5177\uff1f<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u9009\u62e9 Codex<\/strong> \u5f53\u7d27\u51d1\u6709\u754c\u6267\u884c\u3001\u5176\u53ef\u7528\u8868\u9762\u7684\u7ec4\u5408\uff0c\u6216\u60a8\u5f53\u524d\u914d\u7f6e\u4e2d\u53ef\u7528\u7684\u8fd0\u884c\u8bc1\u636e\u7b26\u5408\u60a8\u7684\u5de5\u4f5c\u65b9\u5f0f\u65f6\u3002.<\/li>\n\n\n\n<li><strong>\u9009\u62e9 Claude \u4ee3\u7801<\/strong> \u5f53\u51fa\u73b0\u5bf9\u8bdd\u7ec8\u7aef\u5faa\u73af\u65f6\uff0c\u60a8\u5df2\u9a8c\u8bc1\u7684\u81ea\u5b9a\u4e49\u529f\u80fd\uff0c\u6216\u662f\u50cf\u6211\u4eec\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u89c2\u5bdf\u5230\u7684\u90a3\u79cd\u66f4\u5e7f\u6cdb\u7684\u5ba1\u67e5\u884c\u4e3a\uff0c\u4f1a\u663e\u5f97\u66f4\u4e3a\u91cd\u8981\u3002.<\/li>\n\n\n\n<li><strong>\u5bf9\u4e8e\u4e0d\u719f\u6089\u7684\u4ed3\u5e93\uff0c\u8bf7\u4f7f\u7528\u5176\u4e2d\u4efb\u610f\u4e00\u79cd<\/strong> \u53ea\u6709\u5728\u901a\u8fc7\u53ea\u8bfb\u67b6\u6784\u548c\u98ce\u9669\u8bc4\u4f30\u540e\uff0c\u8fd9\u4e24\u6b3e\u5de5\u5177\u90fd\u5f88\u597d\u5730\u5b8c\u6210\u4e86\u8fd9\u9879\u4efb\u52a1\u3002.<\/li>\n\n\n\n<li><strong>\u6709\u9009\u62e9\u5730\u540c\u65f6\u4f7f\u7528\u8fd9\u4e24\u8005<\/strong> \u5728\u4f55\u79cd\u60c5\u51b5\u4e0b\uff0c\u7531\u7b2c\u4e8c\u65b9\u4ee3\u7406\u8fdb\u884c\u5ba1\u6838\u6240\u4ea7\u751f\u7684\u989d\u5916\u8ba2\u9605\u548c\u534f\u8c03\u6210\u672c\u662f\u503c\u5f97\u7684\u3002\u5e94\u8981\u6c42\u7b2c\u4e8c\u6b3e\u5de5\u5177\u5bf9\u5dee\u5f02\u6216\u8ba1\u5212\u63d0\u51fa\u8d28\u7591\uff0c\u800c\u4e0d\u662f\u76f2\u76ee\u5730\u91cd\u590d\u8be5\u4efb\u52a1\u3002.<\/li>\n\n\n\n<li><strong>\u6dfb\u52a0 GlobalGPT<\/strong> \u5f53\u591a\u6a21\u578b\u8def\u7531\u6216\u591a\u6a21\u5f0f\u5904\u7406\u662f\u7f3a\u5931\u7684\u4e00\u73af\u65f6\uff0c\u8bf7\u5c06\u539f\u751f\u5b58\u50a8\u5e93\u64cd\u4f5c\u4fdd\u7559\u5728\u7f16\u7801\u4e3b\u673a\u4e2d\u3002.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e3a\u671f\u4e03\u5929\u7684\u8bd5\u7528\u6bd4\u6392\u884c\u699c\u66f4\u80fd\u63d0\u4f9b\u6709\u4ef7\u503c\u7684\u4fe1\u606f\u3002 \u9009\u62e9\u4e00\u4e2a\u771f\u5b9e\u4f46\u975e\u751f\u4ea7\u73af\u5883\u4e2d\u7684\u529f\u80fd\u3001\u7f3a\u9677\u548c\u4ee3\u7801\u5ba1\u67e5\u3002\u56fa\u5b9a\u63d0\u793a\u8bed\u548c\u6210\u529f\u6307\u4ee4\u3002\u8bb0\u5f55\u7b2c\u4e00\u4e2a\u6709\u6548\u7684\u5dee\u5f02\u3001\u901a\u8fc7\u7684\u6d4b\u8bd5\u3001\u8017\u65f6\u3001\u4eba\u5de5\u5e72\u9884\u3001\u610f\u5916\u8303\u56f4\uff0c\u4ee5\u53ca\u8be5\u5de5\u4f5c\u5bf9\u53ef\u7528\u914d\u989d\u7684\u5f71\u54cd\u3002\u66f4\u597d\u7684\u4ea7\u54c1\uff0c\u662f\u90a3\u79cd\u4f60\u80fd\u53d1\u73b0\u5176\u9519\u8bef\u4e14\u80fd\u7ef4\u6301\u5176\u5de5\u4f5c\u6d41\u7684\u4ea7\u54c1\u3002.<\/p>\n\n\n\n<h2 id=\"faq\" class=\"wp-block-heading\">Codex \u4e0e Claude \u4ee3\u7801\u5e38\u89c1\u95ee\u9898\u89e3\u7b54<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Codex \u6bd4 Claude Code \u66f4\u597d\u5417\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5e76\u975e\u5b8c\u5168\u5982\u6b64\u3002\u4e24\u8005\u90fd\u5b8c\u6210\u4e86\u6211\u4eec\u6d4b\u8bd5\u5957\u4ef6\u4e2d\u7684\u56db\u9879\u4efb\u52a1\u3002\u5728\u4ee3\u7801\u5ba1\u67e5\u8303\u56f4\u65b9\u9762\uff0cClaude Code \u66f4\u80dc\u4e00\u7b79\uff0c\u800c\u5728\u90e8\u5206\u5b9e\u73b0\u548c\u9519\u8bef\u4fee\u590d\u65b9\u9762\uff0cCodex \u5219\u66f4\u4e3a\u7cbe\u7b80\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5bf9\u4e8e\u5927\u578b\u4ee3\u7801\u5e93\u6765\u8bf4\uff0c\u54ea\u79cd\u66f4\u597d\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u8fd9\u4e2a\u5c0f\u5de5\u5177\u65e0\u6cd5\u56de\u7b54\u8fd9\u4e2a\u95ee\u9898\u3002\u5728\u5141\u8bb8\u8fdb\u884c\u66f4\u6539\u4e4b\u524d\uff0c\u8bf7\u5148\u5728\u60a8\u81ea\u5df1\u7684\u4ee3\u7801\u5e93\u4e2d\uff0c\u9488\u5bf9\u53ea\u8bfb\u67b6\u6784\u4efb\u52a1\u5bf9\u4e24\u8005\u8fdb\u884c\u8bc4\u4f30\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u54ea\u79cd\u7f16\u7801\u5242\u5bf9\u76d1\u62a4\u7684\u8981\u6c42\u8f83\u4f4e\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u53d6\u51b3\u4e8e\u4efb\u52a1\u7684\u6e05\u6670\u5ea6\u3001\u6a21\u578b\u8bbe\u7f6e\u3001\u4ed3\u5e93\u8bf4\u660e\u4ee5\u53ca\u671f\u671b\u7684\u4ea4\u4e92\u65b9\u5f0f\u3002\u4e00\u4f4dReddit\u7528\u6237\u62a5\u544a\u4e86\u4e0d\u540c\u7684\u76d1\u7763\u6a21\u5f0f\uff0c\u4f46\u8fd9\u79cd\u4e2a\u4eba\u4f53\u9a8c\u5e76\u4e0d\u4ee3\u8868\u6574\u4e2a\u4ea7\u54c1\u7684\u901a\u7528\u89c4\u5219\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u54ea\u4e00\u4e2a\u66f4\u4fbf\u5b9c\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e3b\u8981\u6d88\u8d39\u5c42\u7ea7\u5206\u522b\u4e3a\u6bcf\u6708 $20\u3001$100 \u548c $200\uff0c\u4f46\u6240\u5305\u542b\u7684\u5bb9\u91cf\u548c\u9650\u989d\u673a\u5236\u5404\u4e0d\u76f8\u540c\u3002\u53ef\u9009\u79ef\u5206\u548c API \u8ba1\u8d39\u662f\u5206\u5f00\u7684\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Claude \u548c Claude \u7684\u4ee3\u7801\u5171\u4eab\u4f7f\u7528\u9650\u5236\u662f\u5426\u76f8\u540c\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u662f\u7684\u3002\u5728\u5df2\u8fde\u63a5\u7684 Pro \u6216 Max \u5957\u9910\u4e2d\uff0cClaude \u548c Claude Code \u91c7\u7528\u5171\u4eab\u4f1a\u8bdd\u548c\u6bcf\u5468\u9650\u989d\u673a\u5236\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Codex \u7684\u672c\u5730\u4efb\u52a1\u548c\u4e91\u7aef\u4efb\u52a1\u662f\u5426\u5171\u4eab\u914d\u989d\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u5730\u6d88\u606f\u548c\u4e91\u7aef\u804a\u5929\u5747\u53d7\u4e94\u5c0f\u65f6\u65f6\u9650\u7684\u9650\u5236\uff0c\u6b64\u5916\u53ef\u80fd\u8fd8\u5b58\u5728\u6bcf\u5468\u9650\u989d\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">GlobalGPT \u80fd\u5426\u66ff\u4ee3 Codex \u6216 Claude Code\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0d\u3002\u5b83\u53ef\u4ee5\u901a\u8fc7\u6dfb\u52a0\u989d\u5916\u7684\u6a21\u578b\u3001\u547d\u4ee4\u884c\u754c\u9762\uff08CLI\uff09\u3001MCP\u3001\u6280\u80fd\u548c\u591a\u6a21\u6001\u5de5\u5177\u6765\u6269\u5c55\u4efb\u4e00\u5de5\u4f5c\u6d41\uff0c\u4f46\u4ee3\u7801\u5e93\u8bbf\u95ee\u6743\u9650\u548c\u7f16\u7801\u4ee3\u7406\u7684\u884c\u4e3a\u4ecd\u7531\u4e3b\u673a\u63a7\u5236\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6211\u80fd\u5426\u540c\u65f6\u4f7f\u7528\u8fd9\u4e24\u6b3e\u4ea7\u54c1\u4e2d\u7684GlobalGPT\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT \u4e3a\u8fd9\u4e24\u79cd\u65b9\u5f0f\u5747\u63d0\u4f9b\u4e86\u5b98\u65b9\u7684\u547d\u4ee4\u884c\u754c\u9762\uff08CLI\uff09\u6559\u7a0b\u3002\u6211\u4eec\u5df2\u5728\u4e24\u79cd\u73af\u5883\u4e2d\u9a8c\u8bc1\u4e86 CLI \u7684\u4f7f\u7528\uff0c\u5e76\u5728 Codex \u4e2d\u9a8c\u8bc1\u4e86 MCP \u4e0e Skill \u7684\u7ec4\u5408\u4f7f\u7528\uff0c\u4f46\u65e0\u4eba\u503c\u5b88\u7684 MCP \u5b58\u5728\u5ba1\u6279\u9650\u5236\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u5b9a\u4ef7\u3001\u5957\u9910\u89c4\u5219\u3001\u96c6\u6210\u529f\u80fd\u53ca\u6765\u6e90\u4f9d\u636e\u5747\u4e8e2026\u5e747\u6708\u8fdb\u884c\u4e86\u6838\u67e5\u3002\u4ea7\u54c1\u8be6\u60c5\u53ef\u80fd\u4f1a\u6709\u53d8\u52a8\u3002.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.glbgpt.com\/home?inviter=hub_content_home&amp;login=1\">\u5f00\u76d8\u4ef7 GlobalGPT<\/a> \u5982\u679c\u60a8\u5e0c\u671b\u5728\u73b0\u6709\u7684\u7f16\u7801\u5de5\u4f5c\u6d41\u4e2d\u6dfb\u52a0\u591a\u6a21\u578b\u548c\u591a\u6a21\u6001\u5c42\u3002.<\/p>\n\n\n<\/article>","protected":false},"excerpt":{"rendered":"<p>Codex vs Claude Code is less about finding one universal winner and more about choosing the working style you can trust every day. Both products can inspect a repository, edit multiple files, run commands, execute tests, and explain a patch. The meaningful differences appear in how you delegate work, how often you steer the agent, [&hellip;]<\/p>","protected":false},"author":7,"featured_media":17361,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":" Codex vs Claude Code: Features, Pricing & Hands-On Tests","_seopress_titles_desc":"A neutral Codex vs Claude Code comparison covering features, pricing, limits, real repository tests, user experience, and GlobalGPT integrations.","_seopress_robots_index":"","footnotes":""},"categories":[7],"tags":[],"class_list":["post-17342","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-chat"],"_links":{"self":[{"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/posts\/17342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/comments?post=17342"}],"version-history":[{"count":2,"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/posts\/17342\/revisions"}],"predecessor-version":[{"id":17393,"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/posts\/17342\/revisions\/17393"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/media\/17361"}],"wp:attachment":[{"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/media?parent=17342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/categories?post=17342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/zh\/wp-json\/wp\/v2\/tags?post=17342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}