{"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\/zh-hk\/hub\/codex-vs-claude-code","title":{"rendered":"Codex \u5c0d\u6bd4 Claude Code\uff1a\u54ea\u7a2e\u7de8\u78bc\u5291\u6700\u9069\u5408\u60a8\u7684\u5de5\u4f5c\u6d41\u7a0b\uff1f"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>Codex \u8207 Claude Code \u7684\u6bd4\u8f03\uff0c\u91cd\u9ede\u4e0d\u5728\u65bc\u627e\u51fa\u4e00\u500b\u653e\u8af8\u56db\u6d77\u7686\u6e96\u7684\u8d0f\u5bb6\uff0c\u800c\u5728\u65bc\u9078\u64c7\u4e00\u7a2e\u4f60\u80fd\u6bcf\u5929\u4fe1\u8cf4\u7684\u5de5\u4f5c\u6a21\u5f0f\u3002.<\/strong> \u9019\u5169\u6b3e\u7522\u54c1\u90fd\u80fd\u6aa2\u8996\u5132\u5b58\u5eab\u3001\u7de8\u8f2f\u591a\u500b\u6a94\u6848\u3001\u57f7\u884c\u6307\u4ee4\u3001\u57f7\u884c\u6e2c\u8a66\uff0c\u4ee5\u53ca\u89e3\u91cb\u4fee\u88dc\u7a0b\u5f0f\u3002\u5169\u8005\u9593\u7684\u5be6\u8cea\u5dee\u7570\u5728\u65bc\uff1a\u60a8\u5982\u4f55\u59d4\u6d3e\u5de5\u4f5c\u3001\u591a\u983b\u7e41\u5730\u5f15\u5c0e\u4ee3\u7406\u7a0b\u5f0f\u3001\u80fd\u6aa2\u8996\u591a\u5c11\u76f8\u95dc\u8b49\u64da\uff0c\u4ee5\u53ca\u6bcf\u9805\u5de5\u5177\u5982\u4f55\u878d\u5165\u60a8\u73fe\u6709\u7684\u958b\u767c\u74b0\u5883\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u6211\u5011\u9032\u884c\u7684\u56db\u9805\u4efb\u52d9\u53d7\u63a7\u5132\u5b58\u5eab\u6e2c\u8a66\u4e2d\uff0cCodex \u7372\u5f97 98\/100 \u5206\uff0c\u800c Claude Code \u5247\u7372\u5f97 99\/100 \u5206\u3002 \u5169\u8005\u5747\u5b8c\u6210\u4e86\u6838\u5fc3\u5de5\u4f5c\u3002Claude Code \u5c55\u73fe\u51fa\u66f4\u5ee3\u6cdb\u7684\u5be9\u67e5\u7bc4\u570d\u8207\u908a\u754c\u6848\u4f8b\u8986\u84cb\u7387\uff0c\u800c Codex \u5247\u5e38\u4ee5\u8f03\u5c0f\u7684\u7bc4\u570d\u9054\u5230\u6240\u9700\u7d50\u679c\uff0c\u4e26\u5728\u6211\u5011\u7684\u6e2c\u8a66\u74b0\u5883\u4e2d\u7522\u751f\u4e86\u66f4\u5f37\u6709\u529b\u7684\u57f7\u884c\u5c64\u7d1a\u8b49\u64da\u3002\u5728\u4e00\u500b\u5c0f\u578b Python \u6e2c\u8a66\u6848\u4f8b\u4e2d\u50c5\u6709\u4e00\u5206\u7684\u5dee\u8ddd\uff0c\u4e26\u4e0d\u8db3\u4ee5\u4f5c\u70ba\u5ba3\u5e03\u6574\u9ad4\u52dd\u8005\u7684\u4f9d\u64da\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u958b\u767c\u8005\u82e5\u4e0d\u5e0c\u671b\u5176\u5de5\u4f5c\u6d41\u7a0b\u7684\u5176\u4ed6\u90e8\u5206\u53d7\u9650\u65bc\u55ae\u4e00\u7de8\u78bc\u4ee3\u7406\uff0c\u53ef\u5c07 GlobalGPT \u4f5c\u70ba\u7368\u7acb\u7684\u591a\u6a21\u578b\u8207\u591a\u6a21\u614b\u5c64\u52a0\u5165\u3002 GlobalGPT \u5c07 100 \u591a\u500b\u9802\u5c16\u6a21\u578b\uff08\u4f8b\u5982 GPT 5.6\u3001Claude Opus 5 \u53ca GPT Image 2\uff09\u6574\u5408\u65bc\u55ae\u4e00\u5100\u8868\u677f\u4e2d\u3002\u6b64\u5916\uff0c\u8a72 <a href=\"https:\/\/www.glbgpt.com\/home\/cli?inviter=hub_content_cli&amp;login=1\">GlobalGPT \u547d\u4ee4\u5217\u4ecb\u9762<\/a>, MCP \u53ca Skill \u8def\u7dda\u53ef\u900f\u904e Codex \u6216 Claude Code \u9032\u884c\u7b2c\u4e8c\u610f\u898b\u5fb5\u8a62\u3001\u898f\u5283\u3001\u6587\u4ef6\u7de8\u5beb\u6216\u5176\u4ed6\u53d7\u652f\u63f4\u7684\u6a21\u578b\uff0c\u800c\u539f\u751f\u7de8\u78bc\u4e3b\u6a5f\u5247\u6301\u7e8c\u638c\u63a7\u5132\u5b58\u5eab\u7684\u7de8\u8f2f\u8207\u6e2c\u8a66\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 \u5100\u8868\u677f\" 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\u8a66\u7528 100 \u591a\u7a2e\u9802\u7d1a\u6a21\u578b<\/strong><\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b64\u9805\u6bd4\u8f03\u7d9c\u5408\u4e86\u5b98\u65b9\u8a08\u756b\u8cc7\u8a0a\u3001\u5be6\u4f5c\u5132\u5b58\u5eab\u3001\u5b8c\u6574\u4e14\u53ef\u64f4\u5145\u7684\u8f38\u51fa\u7d50\u679c\uff0c\u4ee5\u53ca\u6a19\u793a\u6e05\u6670\u7684\u793e\u7fa4\u4f7f\u7528\u7d93\u9a57\u3002\u5176\u76ee\u6a19\u662f\u5354\u52a9\u7368\u7acb\u958b\u767c\u8005\u9078\u64c7\u4e3b\u8981\u7a0b\u5f0f\u8a2d\u8a08\u5de5\u5177\uff0c\u540c\u6642\u907f\u514d\u56e0\u8a02\u95b1\u6b0a\u9650\u3001\u984d\u5916\u7a4d\u5206\u53ca API \u8a08\u8cbb\u7b49\u554f\u984c\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\u9304\">\n  <div class=\"head\"><h2>\u5728\u9019\u9805\u6bd4\u8f03\u4e2d<\/h2><span class=\"hint\">\u8df3\u81f3\u67d0\u500b\u7ae0\u7bc0<\/span><\/div>\n  <ol>\n    <li><a href=\"#quick-comparison\">\u5feb\u901f\u6bd4\u8f03<\/a><\/li><li><a href=\"#what-they-are\">\u9019\u4e9b\u5de5\u5177\u662f\u4ec0\u9ebc<\/a><\/li><li><a href=\"#workflow-control\">\u5de5\u4f5c\u6d41\u7a0b\u8207\u63a7\u5236<\/a><\/li><li><a href=\"#repository-understanding\">\u5c0d\u5132\u5b58\u5eab\u7684\u7406\u89e3<\/a><\/li><li><a href=\"#implementation\">\u5be6\u4f5c\u8207\u932f\u8aa4\u4fee\u6b63<\/a><\/li><li><a href=\"#code-review\">\u7a0b\u5f0f\u78bc\u5be9\u67e5\u54c1\u8cea<\/a><\/li><li><a href=\"#safety\">\u6b0a\u9650\u8207\u5b89\u5168<\/a><\/li><li><a href=\"#customization\">MCP\u3001\u6280\u80fd\u8207\u81ea\u8a02\u529f\u80fd<\/a><\/li><li><a href=\"#pricing\">\u5b9a\u50f9\u8207\u9650\u5236<\/a><\/li><li><a href=\"#controlled-test\">\u53d7\u63a7\u6e2c\u8a66<\/a><\/li><li><a href=\"#user-experience\">\u4f7f\u7528\u8005\u56de\u5831<\/a><\/li><li><a href=\"#globalgpt\">GlobalGPT \u64f4\u5c55\u5c64<\/a><\/li><li><a href=\"#which-one\">\u8a72\u9078\u54ea\u4e00\u500b<\/a><\/li><li><a href=\"#faq\">\u5e38\u898b\u554f\u984c<\/a><\/li>\n  <\/ol>\n<\/nav>\n\n\n\n<h2 id=\"quick-comparison\" class=\"wp-block-heading\">Codex \u8207 Claude \u7de8\u78bc\u4e00\u89bd<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u6c7a\u7b56\u56e0\u7d20<\/th><th>\u300a\u53e4\u7c4d\u300b<\/th><th>\u514b\u52de\u5fb7\u00b7\u79d1\u5fb7<\/th><\/tr><\/thead><tbody><tr><td>\u6838\u5fc3\u5132\u5b58\u5eab\u76f8\u95dc\u5de5\u4f5c<\/td><td>\u53ef\u5728\u53d7\u652f\u63f4\u7684 Codex \u4ecb\u9762\u4e0a\u8b80\u53d6\u3001\u7de8\u8f2f\u3001\u57f7\u884c\u6307\u4ee4\uff0c\u4e26\u9a57\u8b49\u8b8a\u66f4<\/td><td>\u7528\u65bc\u95b1\u8b80\u3001\u7de8\u8f2f\u3001\u57f7\u884c\u547d\u4ee4\u53ca\u9a57\u8b49\u8b8a\u66f4\u7684\u5c0d\u8a71\u5f0f\u7d42\u7aef\u4ee3\u7406\u7a0b\u5f0f<\/td><\/tr><tr><td>\u5728\u6211\u5011\u7684\u6e2c\u8a66\u4e2d\u89c0\u5bdf\u5230\u7684\u98a8\u683c<\/td><td>\u5728\u90e8\u5206\u5be6\u4f5c\u8207\u932f\u8aa4\u4fee\u5fa9\u65b9\u9762\u66f4\u70ba\u7cbe\u7c21<\/td><td>\u5728\u5132\u5b58\u5eab\u5206\u6790\u3001\u6e2c\u8a66\u53ca\u5be9\u67e5\u7bc4\u570d\u65b9\u9762\u66f4\u70ba\u5168\u9762<\/td><\/tr><tr><td>\u5c0d\u5132\u5b58\u5eab\u7684\u7406\u89e3<\/td><td colspan=\"2\">\u95dc\u65bc\u300c\u51cd\u7d50\u4efb\u52d9\u300d\u7684\u529f\u80fd\u6027\u95dc\u806f<\/td><\/tr><tr><td>\u7a0b\u5f0f\u78bc\u6aa2\u95b1<\/td><td>\u767c\u73fe\u4e26\u4fee\u5fa9\u4e86\u5169\u500b\u6709\u6548\u7684\u8f03\u9ad8\u56b4\u91cd\u6027\u7f3a\u9677<\/td><td>\u56de\u5831\u4e86\u66f4\u591a\u53ef\u91cd\u73fe\u7684\u554f\u984c\uff0c\u4e26\u5c07 19\/20 \u4fee\u6b63\u70ba 18\/20<\/td><\/tr><tr><td>\u89c0\u6e2c\u901f\u5ea6<\/td><td colspan=\"2\">\u7d50\u679c\u53c3\u5dee\u4e0d\u9f4a\uff1b\u5404\u8cfd\u5834\u7684\u689d\u4ef6\u4e0d\u5920\u76f8\u7576\uff0c\u56e0\u6b64\u7121\u6cd5\u9078\u51fa\u4e00\u4f4d\u7d55\u5c0d\u7684\u51a0\u8ecd<\/td><\/tr><tr><td>\u6d88\u8cbb\u7d1a\u5165\u9580\u6b3e<\/td><td>\u6bcf\u6708 $20\uff0c\u900f\u904e\u76f8\u95dc\u7684 ChatGPT \u8a08\u756b<\/td><td>Claude Pro\uff1a\u7f8e\u570b\u5730\u5340\u6bcf\u6708 $20<\/td><\/tr><tr><td>\u4f7f\u7528\u91cf\u8f03\u9ad8\u7684\u968e\u5c64<\/td><td>$100 \u548c $200 \u7b49\u7d1a<\/td><td>\u5728 $100 \u8a2d\u5b9a\u4e0b\u6700\u9ad8 5 \u500d\uff0c\u5728 $200 \u8a2d\u5b9a\u4e0b\u6700\u9ad8 20 \u500d<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b64\u8868\u683c\u63cf\u8ff0\u7684\u662f\u8cfc\u8cb7\u6c7a\u7b56\uff0c\u800c\u975e\u6a21\u578b\u6392\u884c\u699c\u3002\u4e0d\u540c\u7684\u6a21\u578b\u8a2d\u5b9a\u3001\u5132\u5b58\u5eab\u3001\u6b0a\u9650\u914d\u7f6e\u6216\u4efb\u52d9\u898f\u683c\u90fd\u53ef\u80fd\u5f71\u97ff\u7d50\u679c\u3002\u82e5\u60a8\u5df2\u4f7f\u7528\u67d0\u9805\u7522\u54c1\uff0c\u6700\u4f73\u7684\u6bd4\u8f03\u65b9\u5f0f\u662f\u9078\u7528\u60a8\u81ea\u8eab\u7a0b\u5f0f\u78bc\u5eab\u4e2d\u4e00\u500b\u7bc4\u570d\u660e\u78ba\u7684\u4efb\u52d9\uff0c\u4e14\u8a72\u4efb\u52d9\u9700\u4f7f\u7528\u76f8\u540c\u7684\u6210\u529f\u6307\u4ee4\uff0c\u4e26\u907f\u514d\u9032\u884c\u54c1\u8cea\u91cd\u64f2\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\u6e2c\u9a57\u5206\u6578\u5206\u5e03\">\n  <h3>\u53d7\u63a7\u6e2c\u8a66\u8a2d\u5b9a\u6a94<\/h3>\n  <p class=\"sub\">\u7b2c\u4e00\u500b\u6709\u6548\u7d50\u679c\uff0c\u63a1\u7528\u76f8\u540c\u7684\u56fa\u5b9a\u8a55\u5206\u6a19\u6e96\u3002\u5404\u689d\u5f62\u5716\u7684\u6578\u503c\u5747\u5df2\u6839\u64da\u5404\u4efb\u52d9\u7684\u6700\u9ad8\u5206\u9032\u884c\u6b78\u4e00\u5316\u8655\u7406\u3002.<\/p>\n  <div class=\"legend\"><span><i class=\"dot\" style=\"background:#2563eb\"><\/i>\u300a\u53e4\u7c4d\u300b<\/span><span><i class=\"dot\" style=\"background:#d97706\"><\/i>\u514b\u52de\u5fb7\u00b7\u79d1\u5fb7<\/span><\/div>\n  <div class=\"task\"><strong>T1 \u00b7 \u5c0d\u5132\u5b58\u5eab\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\u6a94\u6848\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\u6642\u932f\u8aa4\u4fee\u5fa9<\/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 \u6aa2\u4fee\u8207\u4fee\u5fa9<\/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\">\u9019\u5f35\u5716\u8868\u986f\u793a\u4e86\u90191\u5206\u5dee\u8ddd\u7684\u4f86\u6e90\uff1b\u5b83\u4e26\u672a\u5c07\u4e00\u5834\u5c0f\u6bd4\u8cfd\u8f49\u5316\u70ba\u666e\u904d\u6027\u7684\u6392\u540d\u3002.<\/p>\n<\/section>\n\n\n\n<h2 id=\"what-they-are\" class=\"wp-block-heading\">\u300cCodex\u300d\u8207\u300cClaude Code\u300d\u7a76\u7adf\u662f\u4ec0\u9ebc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Codex \u548c Claude Code \u662f\u4ee3\u7406\u7522\u54c1\uff0c\u4e26\u975e\u55ae\u7d14\u7684\u578b\u865f\u540d\u7a31\u3002\u5176\u5e95\u5c64\u7684 <a href=\"https:\/\/www.glbgpt.com\/hub\/best-ai-model-for-coding\/\">\u7528\u65bc\u7de8\u78bc\u7684\u4eba\u5de5\u667a\u6167\u6a21\u578b<\/a> \u9019\u56fa\u7136\u91cd\u8981\uff0c\u4f46\u5468\u908a\u7684\u6846\u67b6\u4e5f\u6c7a\u5b9a\u4e86\u4ee3\u7406\u7a0b\u5f0f\u80fd\u770b\u5230\u54ea\u4e9b\u6a94\u6848\u3001\u53ef\u57f7\u884c\u54ea\u4e9b\u6307\u4ee4\u3001\u5be9\u6279\u6a5f\u5236\u5982\u4f55\u904b\u4f5c\u3001\u4e0a\u4e0b\u6587\u5982\u4f55\u4fdd\u7559\uff0c\u4ee5\u53ca\u4efb\u52d9\u5b8c\u6210\u5f8c\u54ea\u4e9b\u8b49\u64da\u6703\u88ab\u4fdd\u7559\u4e0b\u4f86\u3002\u82e5\u50c5\u6bd4\u8f03\u6a21\u578b\u7684\u8072\u8b7d\uff0c\u4fbf\u5ffd\u7565\u4e86\u958b\u767c\u8005\u6240\u8cfc\u8cb7\u7684\u9ad4\u9a57\u4e2d\u5f88\u5927\u4e00\u90e8\u5206\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Codex \u6db5\u84cb\u4e86\u547d\u4ee4\u5217\u3001\u6574\u5408\u958b\u767c\u74b0\u5883\uff08IDE\uff09\u3001\u684c\u9762\u53ca\u96f2\u7aef\u5c0e\u5411\u7684\u5de5\u4f5c\u6d41\u7a0b\u3002\u9019\u7a2e\u5ee3\u6cdb\u7684\u9069\u7528\u7bc4\u570d\u4f7f\u5176\u65e2\u9069\u5408\u76f4\u63a5\u7684\u672c\u5730\u5354\u4f5c\uff0c\u4e5f\u9069\u5408\u7bc4\u570d\u66f4\u6709\u9650\u7684\u4efb\u52d9\u59d4\u6d3e\u3002Claude Code \u4ee5\u5c0d\u8a71\u5f0f\u7d42\u7aef\u5de5\u4f5c\u6d41\u7a0b\u70ba\u6838\u5fc3\uff0c\u5177\u5099\u652f\u63f4\u7684\u6574\u5408\u529f\u80fd\u8207\u8c50\u5bcc\u7684\u81ea\u8a02\u9078\u9805\uff1b\u9019 <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-claude-ai-for-coding\/\">Claude \u7de8\u78bc\u4f7f\u7528\u6307\u5357<\/a> \u5c0d\u8a72\u5de5\u4f5c\u6d41\u7a0b\u63d0\u4f9b\u4e86\u66f4\u5ee3\u6cdb\u7684\u4ecb\u7d39\u3002\u5c0d\u67d0\u4e9b\u958b\u767c\u4eba\u54e1\u800c\u8a00\uff0c\u770b\u8457\u4ee3\u7406\u7a0b\u5f0f\u5728\u7d42\u7aef\u6a5f\u4e2d\u904b\u4f5c\u6703\u8b93\u4eba\u611f\u5230\u5b89\u5fc3\uff1b\u5c0d\u5176\u4ed6\u4eba\u4f86\u8aaa\uff0c\u91cd\u8981\u7684\u7522\u51fa\u5247\u662f\u6700\u7d42\u7684\u5dee\u7570\u5831\u544a\u3001\u6e2c\u8a66\u7d50\u679c\u548c\u7a3d\u6838\u8ecc\u8de1\uff0c\u800c\u975e\u6301\u7e8c\u7684\u5c0d\u8a71\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u7a2e\u5340\u5225\u4e5f\u89e3\u91cb\u4e86\u70ba\u4f55\u5169\u9805\u4f7f\u7528\u540d\u7fa9\u4e0a\u5f37\u5927\u6a21\u578b\u7684\u6e2c\u8a66\uff0c\u5176\u8868\u73fe\u6703\u6709\u6240\u4e0d\u540c\u3002\u4e3b\u6a5f\u6c7a\u5b9a\u6307\u4ee4\u7684\u5448\u73fe\u65b9\u5f0f\u3001\u5de5\u5177\u7684\u547c\u53eb\u65b9\u5f0f\uff0c\u4ee5\u53ca\u4f55\u6642\u9700\u8981\u4eba\u985e\u6279\u51c6\u67d0\u9805\u52d5\u4f5c\u3002\u82e5\u5728\u793e\u7fa4\u6bd4\u8f03\u4e2d\u5ffd\u7565\u4e86\u6e2c\u8a66\u6846\u67b6\uff0c\u4fbf\u53ef\u80fd\u5c07\u7522\u54c1\u5c64\u7d1a\u7684\u884c\u70ba\u8aa4\u8a8d\u70ba\u6a21\u578b\u5c64\u7d1a\u7684\u771f\u76f8\u3002.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u8a72\u6a21\u578b<\/strong> \u63d0\u4f9b\u63a8\u7406\u8207\u751f\u6210\u80fd\u529b\u3002.<\/li>\n\n\n\n<li><strong>\u4ee3\u7406\u7a0b\u5f0f\u9023\u63a5\u7dda\u7d44<\/strong> \u7ba1\u7406\u6a94\u6848\u3001\u6307\u4ee4\u3001\u60c5\u5883\u3001\u6838\u51c6\u53ca\u5fa9\u539f\u3002.<\/li>\n\n\n\n<li><strong>\u4f7f\u7528\u8005\u7684\u4efb\u52d9\u5408\u7d04<\/strong> \u6c7a\u5b9a\u7bc4\u570d\u3001\u6210\u529f\u6aa2\u5b9a\uff0c\u4ee5\u53ca\u4ee3\u7406\u4eba\u61c9\u5728\u4f55\u6642\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\u9644\u8a3b\u7684 X \u8cbc\u6587\u6307\u51fa\uff0c\u4ee3\u7406\u6a21\u578b\u6846\u67b6\u53ef\u80fd\u6703\u5f71\u97ff\u7de8\u78bc\u6a21\u578b\u8207\u4ee3\u7406\u6a21\u578b\u4e4b\u9593\u7684\u6bd4\u8f03\" 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\u7db2\u53cb X \u7684\u8a55\u8ad6\u6307\u51fa\u4e86\u6bd4\u8f03\u6642\u7684\u4e00\u9805\u91cd\u8981\u6ce8\u610f\u4e8b\u9805\uff1a\u6e2c\u8a66\u74b0\u5883\u53ef\u80fd\u5f71\u97ff\u7d50\u679c\u3002\u9019\u96d6\u662f\u6709\u7528\u7684\u80cc\u666f\u8cc7\u8a0a\uff0c\u4f46\u4e26\u975e\u80fd\u8b49\u660e\u4efb\u4e00\u7522\u54c1\u66f4\u512a\u7684\u56b4\u8b39\u8b49\u64da\u3002.<\/figcaption><\/figure>\n\n\n\n<h2 id=\"workflow-control\" class=\"wp-block-heading\">\u5de5\u4f5c\u6d41\u7a0b\u8207\u7ba1\u63a7\uff1a\u6388\u6b0a\u9084\u662f\u6301\u7e8c\u5f15\u5c0e\uff1f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u95dc\u65bc Codex \u8207 Claude Code \u7684\u6700\u5be6\u7528\u554f\u984c\uff0c\u901a\u5e38\u4e26\u975e\u300c\u54ea\u500b\u80fd\u5beb\u51fa\u66f4\u597d\u7684\u7a0b\u5f0f\u78bc\uff1f\u300d\uff0c\u800c\u662f\u300c\u6211\u5e0c\u671b\u5982\u4f55\u904b\u7528\u5b83\uff1f\u300d \u5c0d\u65bc\u660e\u78ba\u4e14\u7bc4\u570d\u754c\u5b9a\u7684\u4efb\u52d9\uff0c\u53ef\u4ee5\u900f\u904e\u8a2d\u5b9a\u7cbe\u78ba\u7684\u76ee\u6a19\u3001\u5141\u8a31\u7684\u7bc4\u570d\u4ee5\u53ca\u9a57\u8b49\u6307\u4ee4\u4f86\u59d4\u6d3e\u3002\u81f3\u65bc\u6a21\u7cca\u4e0d\u6e05\u7684\u91cd\u69cb\u4efb\u52d9\uff0c\u5247\u9700\u8981\u900f\u904e\u8a0e\u8ad6\u3001\u968e\u6bb5\u6027\u6aa2\u8996\uff0c\u4e26\u5728\u4ee3\u7406\u7a0b\u5f0f\u9032\u884c\u904e\u591a\u8b8a\u66f4\u4e4b\u524d\uff0c\u53ca\u6642\u5f15\u5c0e\u5176\u8abf\u6574\u65b9\u5411\uff0c\u624d\u80fd\u7372\u5f97\u6700\u4f73\u6210\u6548\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7576\u9700\u6c42\u4e0d\u65b7\u6f14\u8b8a\uff0c\u6216\u67b6\u69cb\u5224\u65b7\u4ecd\u5728\u5354\u5546\u4e4b\u4e2d\u6642\uff0c\u6301\u7e8c\u5f0f\u5f15\u5c0e\u5177\u6709\u5176\u50f9\u503c\u3002\u4f46\u7576\u4ee3\u7406\u7a0b\u5f0f\u53cd\u8986\u8981\u6c42\u505a\u51fa\u672c\u53ef\u900f\u904e\u5132\u5b58\u5eab\u6307\u793a\u89e3\u6c7a\u7684\u6c7a\u7b56\u6642\uff0c\u9019\u4fbf\u6703\u6210\u70ba\u4e00\u7a2e\u6210\u672c\u3002\u7576\u4efb\u52d9\u5408\u7d04\u7a69\u5b9a\u6642\uff0c\u81ea\u4e3b\u57f7\u884c\u5177\u6709\u5176\u50f9\u503c\u3002\u4f46\u7576\u4ee3\u7406\u7a0b\u5f0f\u505a\u51fa\u672a\u7d93\u6838\u5be6\u7684\u5047\u8a2d\uff0c\u6216\u5728\u7f3a\u4e4f\u660e\u78ba\u56de\u6efe\u8def\u5f91\u7684\u60c5\u6cc1\u4e0b\u64f4\u5c55\u7bc4\u570d\u6642\uff0c\u9019\u4fbf\u6703\u5e36\u4f86\u98a8\u96aa\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u4efd\u65e5\u671f\u70ba 2026 \u5e74 4 \u6708 13 \u65e5\u7684 Reddit \u8a73\u7d30\u5831\u544a\u63cf\u8ff0\u4e86\u5728\u4e00\u500b\u7d04\u6709 80,000 \u884c Python \u548c TypeScript \u7a0b\u5f0f\u78bc\u3001\u5305\u542b\u7d04 2,800 \u500b\u6e2c\u8a66\u7528\u4f8b\u7684\u5c08\u6848\u4e2d\uff0c\u4f7f\u7528 Claude Code \u7d04 100 \u5c0f\u6642\uff0c\u4ee5\u53ca\u4f7f\u7528 Codex \u7d04 20 \u5c0f\u6642\u7684\u7d93\u9a57\u3002 \u4f5c\u8005\u5c07 Claude \u63cf\u8ff0\u70ba\u901f\u5ea6\u8f03\u5feb\u4e14\u4e92\u52d5\u6027\u66f4\u9ad8\uff0c\u4f46\u9700\u8981\u66f4\u591a\u4eba\u5de5\u5e72\u9810\uff1b\u800c Codex \u5247\u901f\u5ea6\u8f03\u6162\u4e14\u904b\u4f5c\u66f4\u70ba\u7a69\u5065\u3002\u9019\u4efd\u5831\u544a\u4e4b\u6240\u4ee5\u683c\u5916\u5be6\u7528\uff0c\u5728\u65bc\u5b83\u5305\u542b\u4e86\u5c08\u6848\u80cc\u666f\u8207\u4f7f\u7528\u7d93\u9a57\u7684\u8108\u7d61\uff0c\u4f46\u5b83\u7d42\u7a76\u50c5\u4ee3\u8868\u4e00\u4f4d\u958b\u767c\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\u8a3b\u8a73\u76e1\u7684 Reddit \u7d93\u9a57\u5206\u4eab\uff0c\u6bd4\u8f03\u5728\u4e00\u500b 80,000 \u884c\u4ee3\u78bc\u7684\u5c08\u6848\u4e2d\u4f7f\u7528 Claude Code \u8207 Codex \u7684\u60c5\u6cc1\" 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\">\u67d0\u4f4d\u958b\u767c\u8005\u91dd\u5c0d Claude Code \u548c Codex \u7684\u5c08\u6848\u5be6\u52d9\u7d93\u9a57\u3002\u6587\u4e2d\u6a19\u793a\u7684\u89c0\u5bdf\u7d50\u679c\u61c9\u8996\u70ba\u5f85\u9a57\u8b49\u7684\u5047\u8a2d\uff0c\u800c\u975e\u9069\u7528\u65bc\u5168\u7cfb\u5217\u7522\u54c1\u7684\u6548\u80fd\u6578\u64da\u3002.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u6839\u64da\u6211\u5011\u81ea\u8eab\u7684\u6e2c\u8a66\u7d50\u679c\uff0c\u4e26\u672a\u5f97\u51fa\u660e\u78ba\u7684\u52dd\u8005\u3002Claude \u5728\u524d\u5169\u9805\u4efb\u52d9\u4e2d\u5b8c\u6210\u5f97\u8f03\u5feb\uff0c\u800c Codex \u5247\u5728\u5f8c\u5169\u9805\u4efb\u52d9\u4e2d\u5b8c\u6210\u5f97\u8f03\u5feb\u3002\u6b64\u5916\uff0c\u7576 Claude \u7684 CLI \u9a57\u8b49\u8def\u5f91\u4e0d\u53ef\u7528\u6642\uff0c\u5b83\u555f\u7528\u4e86\u5b50\u4ee3\u7406\u5099\u7528\u6a5f\u5236\uff0c\u56e0\u6b64\u5169\u8005\u7684\u57f7\u884c\u8def\u5f91\u4e26\u4e0d\u5b8c\u5168\u7b49\u540c\u65bc\u5be6\u9a57\u5ba4\u74b0\u5883\u3002 \u5408\u7406\u7684\u7d50\u8ad6\u662f\uff1a\u57f7\u884c\u901f\u5ea6\u53d6\u6c7a\u65bc\u4efb\u52d9\u3001\u9078\u7528\u7684\u6a21\u578b\u3001\u5de5\u4f5c\u91cf\u8a2d\u5b9a\u3001\u60c5\u5883\u4ee5\u53ca\u4e3b\u6a5f\u2014\u2014\u800c\u975e\u67d0\u6b3e\u7522\u54c1\u7e3d\u662f\u66f4\u5feb\u3002.<\/p>\n\n\n\n<h2 id=\"repository-understanding\" class=\"wp-block-heading\">\u5c0d\u5132\u5b58\u5eab\u7684\u7406\u89e3\u8207\u60c5\u5883\u7ba1\u7406<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c0d\u5132\u5b58\u5eab\u7684\u7406\u89e3\u4e0d\u50c5\u50c5\u662f\u70ba\u8cc7\u6599\u593e\u547d\u540d\u3002\u4e00\u500b\u5be6\u7528\u7684\u5206\u6790\u5de5\u5177\u5fc5\u9808\u80fd\u8ffd\u8e64\u8cc7\u6599\u5728\u6a94\u6848\u9593\u7684\u6d41\u52d5\u65b9\u5f0f\u3001\u8b58\u5225\u9650\u5236\u8b8a\u66f4\u7684\u5408\u7d04\u3001\u5b9a\u4f4d\u6e2c\u8a66\u3001\u5340\u5206\u75c7\u72c0\u8207\u5176\u53ef\u80fd\u7684\u4f86\u6e90\uff0c\u4e26\u8aaa\u660e\u7de8\u8f2f\u932f\u8aa4\u5c64\u7d1a\u6240\u5e36\u4f86\u7684\u98a8\u96aa\u3002\u8a73\u76e1\u7684\u6620\u5c04\u5716\u80fd\u63ed\u9732\u96b1\u85cf\u7684\u4e0d\u4e00\u81f4\u6027\uff1b\u7c21\u660e\u7684\u6620\u5c04\u5716\u5247\u80fd\u8b93\u958b\u767c\u4eba\u54e1\u66f4\u5feb\u505a\u51fa\u5b89\u5168\u7684\u5be6\u4f5c\u6c7a\u7b56\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u6211\u5011\u7684\u552f\u8b80 T1 \u4efb\u52d9\u4e2d\uff0c\u5169\u6b3e\u5de5\u5177\u5747\u7372\u5f97 20\/20 \u5206\uff0c\u4e14\u5176\u7b54\u6848\u7686\u4ee5\u5132\u5b58\u5eab\u70ba\u4f9d\u64da\u3002Claude Code \u7684\u5206\u6790\u66f4\u70ba\u8a73\u76e1\uff0c\u4e26\u63ed\u793a\u4e86\u66f4\u591a\u5408\u7d04\u4e0d\u4e00\u81f4\u4e4b\u8655\uff1bCodex \u5247\u66f4\u70ba\u7c21\u6f54\uff0c\u4f46\u4ecd\u80fd\u8b58\u5225\u51fa\u76f8\u95dc\u6a94\u6848\u3001\u98a8\u96aa\u53ca\u5be6\u65bd\u8a08\u756b\u3002\u9019\u5169\u7a2e\u98a8\u683c\u4e26\u7121\u7d55\u5c0d\u512a\u52a3\u4e4b\u5206\u3002 \u5728\u8655\u7406\u4e0d\u719f\u6089\u7684\u9077\u79fb\u8207\u7a3d\u6838\u6642\uff0c\u8a73\u76e1\u6027\u6709\u52a9\u76ca\uff1b\u7576\u958b\u767c\u4eba\u54e1\u5df2\u719f\u6089\u67b6\u69cb\u4e26\u5e0c\u671b\u7372\u5f97\u91cd\u9ede\u660e\u78ba\u7684\u8b8a\u66f4\u8a08\u756b\u6642\uff0c\u7c21\u6f54\u6027\u5247\u66f4\u70ba\u5be6\u7528\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\u5132\u5b58\u5eab\u6e2c\u8a66<\/p><h3 class=\"d-title\">\u5728\u4fee\u6539\u4e0d\u719f\u6089\u7684\u5132\u5b58\u5eab\u4e4b\u524d\uff0c\u8acb\u5148\u4e86\u89e3\u5176\u5167\u5bb9<\/h3><p class=\"d-sub\">\u7e6a\u88fd\u67b6\u69cb\u5716\u3001\u8ffd\u8e64\u8cc7\u6599\u6d41\u3001\u8b58\u5225\u512a\u5148\u529f\u80fd\u6240\u9762\u81e8\u7684\u98a8\u96aa\uff0c\u4e14\u4e0d\u5c0d\u6a94\u6848\u9032\u884c\u4efb\u4f55\u8b8a\u66f4\u3002.<\/p><\/div><span class=\"d-pill\">\u5e73\u624b<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"\u300aCodex\u300b\u7d50\u679c\"><div class=\"d-product\"><span>\u300a\u53e4\u7c4d\u300b<\/span><span class=\"d-score\">20<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7e8c\u6642\u9593<\/span><strong>108 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>2 \u57fa\u6e96\u7dda<\/strong><\/div><div class=\"d-metric\"><span>\u7bc4\u570d<\/span><strong>\u552f\u8b80<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u500b\u6709\u6548\u7684\u8f38\u51fa\u7247\u6bb5<\/div><pre>\u67b6\u69cb\uff1a\u6a21\u578b\u3001\u5132\u5b58\u5eab\u3001\u670d\u52d9\uff0c\u4ee5\u53ca\u4e00\u500b\u672a\u9023\u7dda\u7684\u6642\u9593\u8f14\u52a9\u7a0b\u5f0f\u3002\n\n\u4e3b\u8981\u98a8\u96aa\uff1a\u672a\u660e\u78ba\u5b9a\u7fa9\u7684\u512a\u5148\u9806\u5e8f\u8a9e\u7fa9\u3001\u76f8\u5bb9\u6027\u3001\u9806\u5e8f\u3001\u9a57\u8b49\uff0c\u4ee5\u53ca\u7bc4\u570d\u4e0d\u7b26\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8a55\u8ad6\u8005\u89c0\u9ede\uff1a<\/strong> \u7c21\u6f54\u3001\u4ee5\u6a94\u6848\u70ba\u4f9d\u64da\uff0c\u4e14\u8db3\u4ee5\u4f5c\u70ba\u51cd\u7d50\u6c7a\u7b56\u7684\u4f9d\u64da\u3002.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \u4ee3\u78bc\u7d50\u679c\"><div class=\"d-product\"><span>\u514b\u52de\u5fb7\u00b7\u79d1\u5fb7<\/span><span class=\"d-score\">20<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7e8c\u6642\u9593<\/span><strong>61 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>2 \u57fa\u6e96\u7dda<\/strong><\/div><div class=\"d-metric\"><span>\u7bc4\u570d<\/span><strong>\u552f\u8b80<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u500b\u6709\u6548\u7684\u8f38\u51fa\u7247\u6bb5<\/div><pre>\u4e09\u5c64\u67b6\u69cb\u52a0\u4e0a\u4e00\u500b\u5b64\u7acb\u6a21\u7d44\u3002\u7121\u5faa\u74b0\uff1b\u4f9d\u8cf4\u6ce8\u5165\u91cf\u6975\u5c11\u3002\n\n\u6b64\u5916\uff0c\u9084\u63ed\u9732\u4e86\u8b58\u5225\u78bc\u5206\u914d\u3001\u975e\u5c0d\u7a31\u932f\u8aa4\u5408\u7d04\uff0c\u4ee5\u53ca\u6e2c\u8a66\u8986\u84cb\u7387\u4e0d\u8db3\u7684\u554f\u984c\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8a55\u8ad6\u8005\u89c0\u9ede\uff1a<\/strong> \u66f4\u70ba\u8a73\u76e1\uff0c\u540c\u6642\u4ecd\u7b26\u5408\u76f8\u540c\u7684\u552f\u8b80\u5408\u7d04\u3002.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>\u6aa2\u8996\u5b8c\u6574\u7684 Codex \u8f38\u51fa\u5167\u5bb9<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u3001\u7d93\u904e\u6e05\u7406\u7684\u3001\u9996\u6b21\u6709\u6548\u7684\u8f38\u51fa<\/p><pre>## \u67b6\u69cb\n\n\u9019\u662f\u4e00\u500b\u50c5\u4f7f\u7528\u6a19\u6e96\u51fd\u5f0f\u5eab\u7684\u5c0f\u578b Python \u5957\u4ef6\uff0c\u5305\u542b\u56db\u500b\u529f\u80fd\u5c64\uff1a\n\n- **\u8cc7\u6599\u6a21\u578b\uff1a** [`Job`]() \u662f\u4e00\u500b\u4e0d\u53ef\u8b8a\u7684\u8cc7\u6599\u985e\u5225\uff0c\u5305\u542b `identifier`\u3001`name` \u548c `owner`\u3002`Job.to_dict()` \u6703\u900f\u904e `dataclasses.asdict()` \u5c07\u5176\u5e8f\u5217\u5316\u3002\n- **\u5132\u5b58\u5eab\uff1a** [`JobRepository`]() \u5c07\u5de5\u4f5c\u5132\u5b58\u5728\u4ee5\u8b58\u5225\u78bc\u70ba\u9375\u7684\u8a18\u61b6\u9ad4\u5167\u5b57\u5178\u4e2d\u3002\u6b64\u8655\u4e0d\u4f7f\u7528\u8cc7\u6599\u5eab\uff0c\u4ea6\u7121\u6301\u4e45\u5316\u5132\u5b58\u6a5f\u5236\u3002\n- **\u670d\u52d9\uff1a** [`SchedulerService`]() \u8ca0\u8cac\u8b58\u5225\u78bc\u7684\u5206\u914d\u3001\u8f38\u5165\u6b63\u898f\u5316\u3001\u5efa\u7acb\u3001\u5217\u51fa\u53ca\u522a\u9664\u3002\n- **\u6642\u9593\u8f14\u52a9\u51fd\u5f0f\uff1a** [`next_daily_run()`]() \u7528\u65bc\u8a08\u7b97\u4e0b\u4e00\u6b21\u57f7\u884c\u6642\u9593\uff0c\u4f46\u6c92\u6709\u4efb\u4f55\u5167\u5bb9\u5c07\u5176\u5c0e\u5165\u6216\u8207 `Job`\u3001`SchedulerService` \u6216 `JobRepository` \u5efa\u7acb\u9023\u7d50\u3002\n- **\u516c\u958b API\uff1a** [`scheduler.__init__`]() \u50c5\u5c0e\u51fa `SchedulerService`\u3002\n\n\u5118\u7ba1\u5132\u5b58\u5eab\u540d\u7a31\u5982\u6b64\uff0c\u76ee\u524d\u5de5\u4f5c\u4e26\u672a\u5305\u542b\u6392\u7a0b\u8cc7\u8a0a\uff0c\u4e14\u4e0d\u5b58\u5728\u57f7\u884c\u4f47\u5217\u3002 \u56e0\u6b64\uff0c\u512a\u5148\u7d1a\u96d6\u53ef\u5f71\u97ff\u5132\u5b58\u7684\u5143\u8cc7\u6599\u53ca\u6e05\u55ae\u6392\u5e8f\uff0c\u4f46\u5728\u672a\u5927\u5e45\u64f4\u5c55\u7cfb\u7d71\u7684\u60c5\u6cc1\u4e0b\uff0c\u7121\u6cd5\u5f71\u97ff\u5be6\u969b\u7684\u4efb\u52d9\u57f7\u884c\u3002\n\n## \u5efa\u7acb\u8207\u6e05\u55ae\u986f\u793a\u7684\u8cc7\u6599\u6d41\n\n\u900f\u904e `SchedulerService.create_job(name, owner)` \u5efa\u7acb\uff1a\n\n1. [`create_job()`]() \u6703\u62d2\u7d55\u50c5\u7531\u7a7a\u767d\u5b57\u5143\u7d44\u6210\u7684\u540d\u7a31\u3002\n2. \u5b83\u6703\u4fee\u526a `name` \u548c `owner`\uff0c\u7136\u5f8c\u4f7f\u7528\u670d\u52d9\u7684 `_next_identifier` \u5efa\u7acb\u4e00\u500b\u4e0d\u53ef\u8b8a\u7684 `Job` \u7269\u4ef6\u3002\n3. [`JobRepository.save()`]() \u5c07\u8a72\u7269\u4ef6\u5beb\u5165 `_jobs[job.identifier]`\u3002\n4. \u8a72\u670d\u52d9\u5c07 `_next_identifier` \u905e\u589e\uff0c\u4e26\u8fd4\u56de\u76f8\u540c\u7684 `Job` \u7269\u4ef6\u3002\n\n\u900f\u904e `SchedulerService.list_jobs()` \u5217\u51fa\u6e05\u55ae\uff1a\n\n1. [`list_jobs()`]() \u76f4\u63a5\u59d4\u6d3e\u7d66 `repository.all()`\u3002\n2. [`JobRepository.all()`]() \u6703\u6309\u5b57\u5178\u9375\u7684\u6578\u503c\u9032\u884c\u6392\u5e8f\u3002\n3. \u56e0\u6b64\uff0c\u5de5\u4f5c\u6703\u4f9d\u7167\u8b58\u5225\u78bc\/\u5efa\u7acb\u6642\u9593\u7684\u5347\u5e8f\u8fd4\u56de\uff0c\u800c\u975e\u4f9d\u7167\u6392\u7a0b\u6216\u512a\u5148\u7d1a\u9806\u5e8f\u3002\n\n## \u53ef\u80fd\u53d7\u5de5\u4f5c\u512a\u5148\u7d1a\u5f71\u97ff\u7684\u6a94\u6848\n\n\u5fc5\u4fee\uff1a\n\n- [`scheduler\/models.py`]()\uff1a\u65b0\u589e priority \u6b04\u4f4d\u53ca\u5176\u9810\u8a2d\u503c\u3002 \u7531\u65bc `to_dict()` \u4f7f\u7528 `asdict()`\uff0c\u56e0\u6b64\u6703\u81ea\u52d5\u5305\u542b\u8a72\u6b04\u4f4d\u3002\n- [`scheduler\/service.py`]()\uff1a\u63a5\u53d7\u3001\u9a57\u8b49\u4e26\u5c07\u512a\u5148\u7d1a\u50b3\u905e\u7d66 `Job`\u3002\n- [`tests\/test_scheduler.py`]()\uff1a\u6e2c\u8a66\u9810\u8a2d\u503c\u3001\u660e\u793a\u503c\u3001\u7121\u6548\u503c\u3001\u5e8f\u5217\u5316\u53ca\u6392\u5e8f\u884c\u70ba\u3002\n\n\u689d\u4ef6\u6027\uff1a\n\n- [`scheduler\/repository.py`]()\uff1a\u50c5\u7576\u512a\u5148\u7d1a\u65e8\u5728\u63a7\u5236\u6e05\u55ae\u6392\u5e8f\u6642\uff0c\u624d\u4fee\u6539 `all()`\u3002\u61c9\u4f7f\u7528 `identifier` \u7b49\u78ba\u5b9a\u6027\u6b21\u8981\u9375\u4f86\u8655\u7406\u4e26\u5217\u60c5\u6cc1\u3002\n- [`scheduler\/__init__.py`]()\uff1a\u50c5\u7576\u512a\u5148\u7d1a\u6210\u70ba\u516c\u958b\u679a\u8209\u6216\u503c\u7269\u4ef6\u6642\u624d\u9032\u884c\u66f4\u65b0\u3002\n- [`README.md`]()\uff1a\u61c9\u8a18\u9304\u53ef\u63a5\u53d7\u7684\u503c\u3001\u9810\u8a2d\u503c\u4ee5\u53ca\u6392\u5e8f\u8a9e\u7fa9\u3002\n\n\u53ef\u80fd\u4e0d\u53d7\u5f71\u97ff\uff1a\n\n- `scheduler\/time_rules.py`\uff0c\u56e0\u70ba\u5176\u552f\u4e00\u7684\u7b26\u865f\u50c5\u4f5c\u7528\u65bc\u50b3\u5165\u7684\u65e5\u671f\u6642\u9593\u53c3\u6578\uff0c\u4e14\u8207\u5de5\u4f5c\u6216\u6e05\u55ae\u6392\u5e8f\u7121\u95dc\u3002\n\n## \u4e3b\u8981\u98a8\u96aa\n\n- **\u672a\u5b9a\u7fa9\u7684\u8a9e\u7fa9\uff1a** \u7a0b\u5f0f\u78bc\u672a\u63d0\u4f9b\u4efb\u4f55\u5148\u4f8b\u8aaa\u660e\u8f03\u5927\u6216\u8f03\u5c0f\u7684\u6578\u503c\u662f\u5426\u4ee3\u8868\u8f03\u9ad8\u512a\u5148\u7d1a\u3001\u54ea\u4e9b\u6578\u503c\u662f\u6709\u6548\u7684\uff0c\u6216\u662f\u512a\u5148\u7d1a\u662f\u5426\u6703\u5f71\u97ff\u6e05\u55ae\u6392\u5e8f\u3002\n- **\u76f8\u5bb9\u6027\uff1a** \u82e5\u5728 `Job` \u6216 `create_job()` \u4e2d\u65b0\u589e\u5fc5\u586b\u53c3\u6578\uff0c\u5c07\u5c0e\u81f4\u73fe\u6709\u547c\u53eb\u65b9\u7121\u6cd5\u904b\u4f5c\uff0c\u4f8b\u5982\u7576\u524d\u6e2c\u8a66\u4e2d\u7684 `create_job(\"Daily report\", \"Alex\")`\u3002\u8a2d\u5b9a\u9810\u8a2d\u503c\u53ef\u7dad\u6301\u8a72\u547c\u53eb\u7684\u6b63\u5e38\u904b\u4f5c\u3002\n- **\u4f4d\u7f6e\u53c3\u6578\u5efa\u69cb\u5668\u7684\u76f8\u5bb9\u6027\u554f\u984c\uff1a** \u76ee\u524d `Job` \u5728 `SchedulerService.create_job()` \u4e2d\u662f\u4ee5\u4f4d\u7f6e\u53c3\u6578\u65b9\u5f0f\u5efa\u69cb\u7684\u3002\u6b04\u4f4d\u4f4d\u7f6e\u53ca\u672a\u4f86\u7684\u4f4d\u7f6e\u53c3\u6578\u547c\u53eb\u53ef\u80fd\u6703\u5728\u7121\u8b66\u793a\u7684\u60c5\u6cc1\u4e0b\u8ce6\u4e88\u932f\u8aa4\u7684\u503c\uff1b\u63a1\u7528\u95dc\u9375\u5b57\u5efa\u69cb\u6703\u66f4\u5b89\u5168\u3002\n- **\u9806\u5e8f\u8b8a\u66f4\uff1a** \u66ff\u63db `JobRepository.all()` \u4e2d\u7684\u8b58\u5225\u78bc\u9806\u5e8f\u6703\u6539\u8b8a\u65e2\u5b9a\u884c\u70ba\u3002\u512a\u5148\u7d1a\u76f8\u540c\u6642\u9700\u8981\u4e00\u500b\u7a69\u5b9a\u7684\u6c7a\u7b56\u6a5f\u5236\u3002\n- **\u9a57\u8b49\u6a21\u7cca\u6027\uff1a** \u82e5\u672a\u9650\u5236 Python \u503c\u7684\u985e\u578b\uff0c\u53ef\u80fd\u6703\u5141\u8a31\u5b57\u4e32\u3001\u5e03\u6797\u503c\u6216\u4efb\u610f\u6574\u6578\uff0c\u9019\u6703\u5c0e\u81f4\u96e3\u4ee5\u9032\u884c\u4e00\u81f4\u7684\u6bd4\u8f03\u3002\n- **\u57f7\u884c\u7bc4\u570d\u4e0d\u7b26\uff1a** \u76ee\u524d\u4e0d\u5b58\u5728\u8abf\u5ea6\u5668\u6216\u57f7\u884c\u4f47\u5217\u3002\u8072\u7a31\u512a\u5148\u7d1a\u6703\u5f71\u97ff\u54ea\u500b\u5de5\u4f5c\u5148\u57f7\u884c\uff0c\u6b64\u884c\u70ba\u76ee\u524d\u6c92\u6709\u4efb\u4f55\u7b26\u865f\u80fd\u652f\u6301\u3002\n- **\u8a18\u61b6\u9ad4\u5167\u9650\u5236\uff1a** \u512a\u5148\u7d1a\u8207\u5176\u4ed6\u6240\u6709\u5de5\u4f5c\u9805\u76ee\u6b04\u4f4d\u4e00\u6a23\uff0c\u6703\u5728\u7a0b\u5e8f\u7d50\u675f\u6642\u6d88\u5931\uff0c\u56e0\u70ba `_jobs` \u50c5\u662f\u4e00\u500b\u5be6\u4f8b\u5b57\u5178\u3002\n\n## \u5be6\u4f5c\u8207\u9a57\u8b49\u8a08\u756b\n\n1. \u9996\u5148\u5b9a\u7fa9\u5408\u7d04\uff1a\u8868\u793a\u5f62\u5f0f\u3001\u5141\u8a31\u7684\u503c\u3001\u9810\u8a2d\u503c\u3001\u512a\u5148\u7d1a\u65b9\u5411\u3001\u5e73\u5c40\u6c7a\u7b56\uff0c\u4ee5\u53ca\u662f\u5426\u6703\u6539\u8b8a\u6e05\u55ae\u6392\u5e8f\u9806\u5e8f\u3002\n2. \u5c07 `priority` \u65b0\u589e\u81f3 `Job`\uff0c\u6700\u597d\u8a2d\u5b9a\u70ba\u5411\u5f8c\u76f8\u5bb9\u7684\u9810\u8a2d\u503c\u3002\n3. \u64f4\u5145 `SchedulerService.create_job()`\uff0c\u52a0\u5165\u9810\u8a2d\u7684\u512a\u5148\u7d1a\u53c3\u6578\uff0c\u9032\u884c\u9a57\u8b49\uff0c\u4e26\u4f7f\u7528\u95dc\u9375\u5b57\u53c3\u6578\u5efa\u69cb `Job`\u3002\n4. \u82e5\u6e05\u55ae\u6392\u5e8f\u6703\u8003\u91cf\u512a\u5148\u7d1a\uff0c\u5247\u5c07 `JobRepository.all()` \u4fee\u6539\u70ba\u5148\u6309\u512a\u5148\u7d1a\u6392\u5e8f\uff0c\u518d\u6309\u8b58\u5225\u78bc\u6392\u5e8f\uff1b\u5426\u5247\u7dad\u6301\u5132\u5b58\u5eab\u7684\u539f\u59cb\u6392\u5e8f\u4e0d\u8b8a\u3002\n5. \u65b0\u589e\u4ee5\u4e0b\u6e2c\u8a66\uff1a\n   - \u73fe\u6709\u7684\u96d9\u53c3\u6578\u5efa\u7acb\u65b9\u5f0f\u3002\n   - \u660e\u793a\u512a\u5148\u7d1a\u7684\u4fdd\u7559\u3002\n   - \u9810\u8a2d\u512a\u5148\u7d1a\u3002\n   - \u985e\u578b\u4e0d\u6b63\u78ba\u53ca\u6578\u503c\u8d85\u51fa\u7bc4\u570d\u7684\u60c5\u6cc1\u3002\n   - `Job.to_dict()` \u7684\u8f38\u51fa\u7d50\u679c\u3002\n   - \u591a\u512a\u5148\u7d1a\u6e05\u55ae\u7684\u6392\u5e8f\u9806\u5e8f\u3002\n   - \u512a\u5148\u7d1a\u76f8\u540c\u6642\u7684\u7a69\u5b9a\u6392\u5e8f\u3002\n   - \u73fe\u6709\u7a7a\u767d\u540d\u7a31\u7684\u884c\u70ba\u3002\n6. \u66f4\u65b0 README\uff0c\u660e\u78ba\u5217\u51fa\u516c\u958b\u4ecb\u9762\u898f\u7bc4\u3002\n7. \u57f7\u884c\u5b8c\u6574\u7684\u96e2\u7dda\u6e2c\u8a66\u5957\u4ef6\uff1a`python3 -m unittest discover -s tests -v`\u3002\n\n## \u9a57\u8b49\u5df2\u5b8c\u6210\n\n- \u57fa\u6e96\u6e2c\u8a66\u5957\u4ef6\uff1a**2 \u9805\u6e2c\u8a66\u901a\u904e**\u3002\n- \u78ba\u8a8d\u5168\u5132\u5b58\u5eab\u7b26\u865f\u641c\u5c0b\u7d50\u679c\u986f\u793a `next_daily_run()` \u5df2\u65b7\u958b\u9023\u7d50\uff0c\u4e14\u4e0d\u5b58\u5728\u4efb\u4f55\u73fe\u6709\u512a\u5148\u7d1a\u7b26\u865f\u3002\n- \u8b8a\u66f4\u6a94\u6848\uff1a**\u7121**\u3002\n- \u529f\u80fd\u5be6\u4f5c\uff1a**\u672a\u57f7\u884c**\uff0c\u7b26\u5408\u8981\u6c42\u3002\n\n&gt; **\u7d50\u8ad6 + \u6c7a\u7b56**\n&gt;\n&gt; \u82e5\u512a\u5148\u7d1a\u50c5\u70ba\u5143\u8cc7\u6599\u6216\u6e05\u55ae\u6392\u5e8f\uff0c\u5247\u8b8a\u66f4\u7bc4\u570d\u8f03\u5c0f\uff1a\u4e3b\u8981\u6d89\u53ca `models.py`\u3001`service.py`\u3001`repository.py` \u53ca\u6e2c\u8a66\u7a0b\u5f0f\u3002\u5728\u5be6\u4f5c\u524d\uff0c\u9700\u6c7a\u5b9a\u512a\u5148\u7d1a\u662f\u50c5\u7528\u65bc\u63cf\u8ff0\u5de5\u4f5c\uff0c\u9084\u662f\u6703\u6539\u8b8a `list_jobs()` \u7684\u6392\u5e8f\uff0c\u4e26\u9700\u78ba\u5b9a\u6578\u503c\u7bc4\u570d\u3001\u9810\u8a2d\u503c\u3001\u65b9\u5411\u53ca\u5e73\u624b\u6c7a\u7b56\u898f\u5247\u3002.<\/pre><\/div><\/details><details class=\"d-full\"><summary>\u6aa2\u8996\u5b8c\u6574\u7684 Claude \u7a0b\u5f0f\u78bc\u8f38\u51fa<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u4ea4\u63a5\u8a18\u9304\uff0c\u5305\u542b\u7b2c\u4e00\u9805\u6709\u6548\u7684\u8f38\u51fa\u5167\u5bb9\u7684\u9010\u5b57\u8a18\u9304<\/p><pre># T1 \u57f7\u884c\u7d00\u9304 \u2014 \u5c0d\u964c\u751f\u5132\u5b58\u5eab\u7684\u7406\u89e3\n\n## \u57f7\u884c\u53c3\u6578\n\n| \u6b04\u4f4d | \u503c |\n| --- | --- |\n| \u4efb\u52d9 | `T1` |\n| \u51cd\u7d50\u63d0\u793a\u8a5e | `01-prompts\/T1.md` |\n| \u51cd\u7d50\u63d0\u793a\u8a5e SHA-256 | `a571ff15c2502ec29b172ae2e77dd9ab0caca2869b91f9468d47571434d16c17` |\n| \u57f7\u884c\u55ae\u5143 | \u9694\u96e2\u7684 Claude \u5b50\u4ee3\u7406\uff0c`\u901a\u7528\u578b`\uff0c\u5168\u65b0\u4e0a\u4e0b\u6587 |\n| \u9694\u96e2\u65b9\u6cd5 | **\u5b50\u4ee3\u7406\u5099\u7528\u65b9\u6848**\uff08\u5df2\u8a18\u9304\u7684\u964d\u7d1a \u2014 \u53c3\u898b `results\/isolation-decision.md`\uff09 |\n| \u6307\u6d3e\u7684\u4e7e\u6de8\u526f\u672c | `runtime\/workspaces\/T1` |\n| Claude \u7a0b\u5f0f\u78bc\u7248\u672c | `2.1.220` |\n| \u6a21\u578b\u8a2d\u5b9a | `claude-opus-5` |\n| start_utc | `2026-07-28T10:27:31Z` |\n| end_utc | `2026-07-28T10:28:32Z` |\n| \u57f7\u884c\u6642\u9593 | 61 \u79d2\uff08\u8207 T2\u2013T4 \u540c\u6642\u9032\u884c\uff1b\u975e\u7d14\u7cb9\u7684\u5ef6\u9072\u6e2c\u91cf\uff09 |\n| \u5617\u8a66\u6b21\u6578 | 1 |\n| \u72c0\u614b | `\u6709\u6548` |\n| \u4eba\u70ba\u5e72\u9810 | \u7121 |\n\n## Safe \u5de5\u5177\u6458\u8981\n\n`date`\u3001`find`\u3001`ls`\u3001`wc`\u3001`stat`\u3001`grep`\u3001\u5c0d 7 \u500b\u5de5\u4f5c\u5340\u6a94\u6848\u7684 `Read` \u64cd\u4f5c\u3001`python3 -V`\u3001\n`python3 -m unittest discover -s tests -v`\u3002\u6240\u6709\u8b80\u53d6\u64cd\u4f5c\u5747\u9650\u65bc\u6307\u5b9a\u5de5\u4f5c\u5340\u5167\u3002\n\u7121\u7db2\u8def\u9023\u7dda\u3001\u7121\u5b89\u88dd\u3001\u7121\u5beb\u5165\u64cd\u4f5c\u3002\n\n## \u96e2\u7dda\u6aa2\u67e5\u7d50\u679c\n\n`python3 -m unittest discover -s tests -v` \u2192 2 \u9805\u6e2c\u8a66\uff0c\u901a\u904e (\u9000\u51fa\u4ee3\u78bc 0)\u3002 \u7531\n\u5354\u8abf\u54e1\u5728\u5de5\u4f5c\u5340\u5916\u90e8\u91cd\u65b0\u9a57\u8b49\uff1a\u8acb\u53c3\u95b1 `results\/checks\/T1-public.txt`\u3002\n\n## \u4fee\u88dc\u7a0b\u5f0f\n\n\u7121\u3002`results\/T1\/patch.diff` \u70ba\u7a7a\uff0c\u4e14 `diff -ru 02-fixture runtime\/workspaces\/T1`\n\u672a\u56de\u50b3\u4efb\u4f55\u5dee\u7570\u3002\u6b64\u4efb\u52d9\u50c5\u9700\u6aa2\u67e5\u800c\u4e0d\u9700\u4fee\u6539\u6a94\u6848\uff1b\u6b64\u70ba\n\u7d93\u78ba\u8a8d\u800c\u975e\u9810\u8a2d\u7d50\u679c\u3002\n\n## \u5df2\u4fee\u6b63\u7684\u932f\u8aa4\n\n\u4e00\u500b\u53ef\u6062\u5fa9\u7684 shell \u932f\u8aa4\uff1a\u521d\u59cb\u7684 `grep` \u6307\u4ee4\u4f7f\u7528\u4e86\u672a\u52a0\u5f15\u865f\u7684 `--include=*.py` \u6a21\u5f0f\uff0c\n\u5c0e\u81f4 shell \u5617\u8a66\u9032\u884c\u901a\u914d\u7b26\u64f4\u5c55\uff1b\u91cd\u65b0\u57f7\u884c\u6642\u5c07\u6a21\u5f0f\u52a0\u5f15\u865f\u5f8c\u5373\u6210\u529f\u3002\u6b64\u932f\u8aa4\u5c0d\u6aa2\u67e5\u7d50\u679c\u7121\u5f71\u97ff\u3002\n\n## \u53ef\u898b\u8f38\u51fa\uff08\u9010\u5b57\uff09\n\n### 1. \u6b64\u5132\u5b58\u5eab\u7684\u5167\u5bb9\n\n\u4e00\u500b\u540d\u70ba `local-scheduler-1.0.0`\uff08`fixture-manifest.json`\uff09\u7684\u81ea\u5305\u542b Python \u6a19\u6e96\u51fd\u5f0f\u5eab\u56fa\u5b9a\u5957\u4ef6\uff0c\u63a1\u7528 MIT \u6388\u6b0a\uff0c\u7121\u7db2\u8def\u6216\u751f\u7522\u74b0\u5883\u4f9d\u8cf4\u9805\uff08`README.md`\uff0c`\"network_required\": false`\uff09\u3002 \u5176\u9ad4\u7a4d\u975e\u5e38\u5c0f\uff1a\u5305\u542b 8 \u500b\u539f\u59cb\u78bc\uff0f\u6587\u4ef6\u6a94\u6848\u52a0\u4e0a\u6e05\u55ae\u6a94\u6848\uff0c\u7e3d\u8a08 103 \u884c\u3002\u5167\u5efa\u7684\u89e3\u91cb\u5668\u70ba **Python 3.9.6**\u3002 \u6b64\u5132\u5b58\u5eab\u4e2d\u6c92\u6709 `pyproject.toml`\u3001`setup.py`\u3001CI \u8a2d\u5b9a\u3001\u8a9e\u6cd5\u6aa2\u67e5\u5668\u6216\u985e\u578b\u6aa2\u67e5\u5668\u8a2d\u5b9a\u2014\u2014\u552f\u4e00\u5ba3\u544a\u7684\u5de5\u4f5c\u6d41\u7a0b\u662f `python3 -m unittest discover -s tests -v`\uff08`README.md`\uff09\u3002\n\n### 2. \u67b6\u69cb\n\n\u4e09\u5c64\u67b6\u69cb\u5916\u52a0\u4e00\u500b\u7368\u7acb\u6a21\u7d44\uff0c\u5168\u90fd\u4f4d\u65bc `scheduler\/` \u76ee\u9304\u4e0b\uff1a\n\n| \u5c64\u7d1a | \u6a94\u6848 | \u7b26\u865f | \u8077\u8cac |\n|---|---|---|---|\n| \u5957\u4ef6\u9580\u9762 | `scheduler\/__init__.py` | `__all__ = [\"SchedulerService\"]` | \u50c5\u91cd\u65b0\u5c0e\u51fa `SchedulerService`\uff1b`Job`\u3001`JobRepository` \u53ca `time_rules` \u4e0d\u5c6c\u65bc\u516c\u958b\u4ecb\u9762 |\n| \u9818\u57df\u6a21\u578b | `scheduler\/models.py` | `Job` (`@dataclass(frozen=True)`) | \u4e0d\u53ef\u8b8a\u503c\u7269\u4ef6\uff0c\u5305\u542b\u6b04\u4f4d `identifier: int`\u3001`name: str`\u3001`owner: str`\uff0c\u4e26\u5be6\u4f5c `to_dict()` \u70ba `asdict(self)` |\n| \u6301\u4e45\u5316 | `scheduler\/repository.py` | `JobRepository` | \u4ee5 `identifier` \u70ba\u9375\u7684\u5167\u5b58 `dict`\uff1b\u63d0\u4f9b `save`\u3001`get`\u3001`all`\u3001`delete` \u65b9\u6cd5 |\n| \u61c9\u7528\u7a0b\u5f0f\u670d\u52d9 | `scheduler\/service.py` | `SchedulerService` | \u9a57\u8b49\u3001\u8b58\u5225\u78bc\u5206\u914d\u3001\u5354\u8abf\uff1a`create_job`\u3001`list_jobs`\u3001`delete_job` |\n| \u5b64\u7acb\u6a21\u7d44 | `scheduler\/time_rules.py` | `next_daily_run` | \u9031\u671f\u904b\u7b97 \u2014 **\u672a\u88ab\u4efb\u4f55\u6a21\u7d44\u5c0e\u5165** |\n\n\u4f9d\u8cf4\u95dc\u4fc2\u65b9\u5411\u6e05\u6670\u4e14\u70ba\u55ae\u5411\uff1a`service.py` \u5f9e `.models` \u548c `.repository` \u5c0e\u5165\uff1b`repository.py` \u5f9e `.models` \u5c0e\u5165\uff1b`models.py` \u50c5\u5c0e\u5165 `dataclasses`\u3002\u7121\u5faa\u74b0\u3002 \u96d6\u7136\u5b58\u5728\u4f9d\u8cf4\u6ce8\u5165\uff0c\u4f46\u7a0b\u5ea6\u6975\u8f15\u5fae \u2014 `SchedulerService.__init__(self, repository=None)` \u6703\u57f7\u884c `self.repository = repository or JobRepository()`\uff0c\u56e0\u6b64\u53ef\u5728\u6e2c\u8a66\u4e2d\u66ff\u63db\u70ba\u6a21\u64ec\u7684\u5132\u5b58\u5eab\u3002\n\n\u8acb\u6ce8\u610f\uff0c`scheduler\/time_rules.py` \u76ee\u524d\u5df2\u662f\u6b7b\u78bc\u3002 \u6211\u5df2\u5c0d\u6574\u500b\u7a0b\u5f0f\u78bc\u6a39\u9032\u884c `time_rules` \u548c `next_daily_run` \u7684 grep \u641c\u5c0b\uff1b\u552f\u4e00\u7684\u641c\u5c0b\u7d50\u679c\u50c5\u6709\u5176\u81ea\u8eab\u7684\u5b9a\u7fa9\uff0c\u4ee5\u53ca\u5728 `fixture-manifest.json` \u7684 `expected_files` \u4e2d\u7684\u5217\u8209\u3002\u8a72\u6a94\u6848\u96d6\u5df2\u5305\u542b\u5728\u767c\u884c\u7248\u672c\u4e2d\uff0c\u4f46\u672a\u88ab\u5be6\u4f5c\u3002\n\n### 3. \u8cc7\u6599\u6d41\n\n**\u5efa\u7acb\u5de5\u4f5c** \u2014 `SchedulerService.create_job(name, owner)`\uff1a\n1. \u6aa2\u67e5\u689d\u4ef6\uff1a`if not name.strip(): raise ValueError('name is required\")`\u3002 \u9019\u662f\u7cfb\u7d71\u4e2d*\u552f\u4e00\u7684*\u9a57\u8b49 \u2014 `owner` \u5f9e\u672a\u88ab\u6aa2\u67e5\uff0c\u56e0\u6b64\u63a5\u53d7\u7559\u7a7a\u7684\u64c1\u6709\u8005\u3002\n2. \u5efa\u69cb\uff1a`Job(self._next_identifier, name.strip(), owner.strip())` \u2014 \u4f4d\u7f6e\u53c3\u6578\u5efa\u69cb\uff0c\u4e14\u5169\u500b\u5b57\u4e32\u7686\u900f\u904e\u53bb\u9664\u7a7a\u683c\u9032\u884c\u6a19\u6e96\u5316\u3002\n3. \u6301\u4e45\u5316\uff1a`self.repository.save(job)`\uff0c\u6b64\u64cd\u4f5c\u6703\u57f7\u884c `self._jobs[job.identifier] = job` \u4e26\u8fd4\u56de\u8a72\u5de5\u4f5c\u3002\n4. \u905e\u589e\u8a08\u6578\u5668\uff1a`self._next_identifier += 1` \u2014\u2014 \u6b64\u64cd\u4f5c\u767c\u751f\u5728 `save` \u4e4b\u5f8c\uff0c\u56e0\u6b64\u82e5\u767c\u751f\u4f8b\u5916\u72c0\u6cc1\uff0c\u8a08\u6578\u5668\u5c07\u4fdd\u6301\u672a\u6d88\u8017\u72c0\u614b\u3002\n5. \u8fd4\u56de `Job` \u5be6\u4f8b\uff08\u8a72\u670d\u52d9\u8fd4\u56de\u5176\u81ea\u8eab\u7684\u672c\u5730 `job`\uff0c\u800c\u975e\u5132\u5b58\u5eab\u7684\u8fd4\u56de\u503c\uff09\u3002\n\n\u8b58\u5225\u78bc\u7684\u5206\u914d\u7531 **\u670d\u52d9** \u8ca0\u8cac\uff0c\u800c\u975e\u5132\u5b58\u5eab\uff08\u5728 `SchedulerService.__init__` \u4e2d\u57f7\u884c `self._next_identifier = 1`\uff09\u3002\u9019\u662f\u500b\u91cd\u8981\u7684\u63a5\u5408\u9ede\uff1a\u82e5\u6ce8\u5165\u4e00\u500b\u5df2\u5305\u542b\u5de5\u4f5c\u7684\u5132\u5b58\u5eab\uff0c\u5c07\u6703\u5728\u7121\u8b66\u793a\u7684\u60c5\u6cc1\u4e0b\u8986\u5beb\u9019\u4e9b\u5de5\u4f5c\uff0c\u56e0\u70ba\u65b0\u5efa\u7acb\u7684\u670d\u52d9\u6703\u5c07\u7de8\u865f\u91cd\u65b0\u5f9e 1 \u958b\u59cb\u3002\n\n**\u5217\u51fa\u5de5\u4f5c\u9805\u76ee** \u2014 `SchedulerService.list_jobs()` \u76f4\u63a5\u8f49\u767c\u81f3 `JobRepository.all()`\uff0c\u8a72\u65b9\u6cd5\u6703\u50b3\u56de `[self._jobs[key] for key in sorted(self._jobs)]`\u3002 \u56e0\u6b64\u6392\u5e8f\u65b9\u5f0f\u70ba **\u4f9d\u6574\u6578\u8b58\u5225\u78bc\u5347\u5e8f**\uff0c\u76ee\u524d\u9019\u8207\u63d2\u5165\u9806\u5e8f\u4e00\u81f4\u3002\u6bcf\u6b21\u547c\u53eb\u90fd\u6703\u5efa\u7acb\u65b0\u7684\u6e05\u55ae\uff0c\u4f46 `Job` \u7269\u4ef6\u662f\u5171\u7528\u53c3\u7167 \u2014 \u4e4b\u6240\u4ee5\u5b89\u5168\uff0c\u50c5\u56e0 `Job` \u5df2\u88ab\u51cd\u7d50\u3002\n\n**\u522a\u9664** \u2014 `SchedulerService.delete_job(identifier)` \u6703\u59d4\u6d3e\u7d66 `JobRepository.delete`\uff0c\u8a72\u65b9\u6cd5\u5be6\u8cea\u4e0a\u662f `self._jobs.pop(identifier)` \u4e14\u7121\u9810\u8a2d\u503c\uff0c\u56e0\u6b64\u82e5\u8b58\u5225\u78bc\u4e0d\u5b58\u5728\uff0c\u6703\u62cb\u51fa `KeyError`\u3002 \u9019\u8207 `JobRepository.get` \u4e0d\u4e00\u81f4\uff0c\u5f8c\u8005\u5728\u76f8\u540c\u689d\u4ef6\u4e0b\u6703\u50b3\u56de `None`\u3002\n\n**\u9019\u4e9b\u8def\u5f91\u7684\u6e2c\u8a66\u8986\u84cb\u7387** \u2014 `tests\/test_scheduler.py` \u50c5\u5305\u542b\u5169\u500b\u6e2c\u8a66\u6848\u4f8b\uff1a`test_create_and_list_jobs`\uff08\u9a57\u8b49 `job.identifier == 1` \u4ee5\u53ca `[job] == service.list_jobs()`\uff09\u8207 `test_blank_name_is_rejected`\u3002 \u9019\u5169\u9805\u6e2c\u8a66\u5728\u7576\u524d\u6a39\u72c0\u7d50\u69cb\u4e2d\u5747\u901a\u904e\u3002\n\n### 4. \u53ef\u80fd\u53d7\u65b0\u589e\u5de5\u4f5c\u512a\u5148\u7d1a\u5f71\u97ff\u7684\u6a94\u6848\n\n\u6309\u78ba\u5b9a\u6027\u7531\u9ad8\u81f3\u4f4e\u6392\u5e8f\uff1a\n\n1. **`scheduler\/models.py`** \u2014 \u78ba\u5b9a\u3002 `Job` \u9700\u8981\u65b0\u589e `priority` \u6b04\u4f4d\u3002\u7531\u65bc\u8a72\u8cc7\u6599\u985e\u5225\u8a2d\u5b9a\u4e86 `frozen=True`\uff0c\u4e14\u6b04\u4f4d\u70ba\u4f4d\u7f6e\u578b\uff0c\u56e0\u6b64\u65b0\u6b04\u4f4d\u5fc5\u9808\u8a2d\u5b9a\u9810\u8a2d\u503c\uff08\u4f8b\u5982 `priority: int = 0`\uff09\uff0c\u6216\u8005\u5fc5\u9808\u7f6e\u65bc\u73fe\u6709\u4e09\u500b\u6b04\u4f4d\u4e4b\u5f8c\uff1b\u5426\u5247\u6240\u6709\u73fe\u6709\u7684\u4f4d\u7f6e\u578b\u5efa\u69cb\u90fd\u6703\u5931\u6548\u3002 `to_dict()` \u7121\u9700\u4fee\u6539 \u2014 `asdict(self)` \u6703\u81ea\u52d5\u64f7\u53d6\u8a72\u6b04\u4f4d\uff0c\u9019\u5c6c\u65bc\u7121\u8072\u7684\u5e8f\u5217\u5316\u5408\u7d04\u8b8a\u66f4\uff0c\u800c\u975e\u7a0b\u5f0f\u78bc\u8b8a\u66f4\u3002\n2. **`scheduler\/service.py`** \u2014 \u78ba\u5b9a\u3002 `create_job` \u9700\u8981\u4e00\u500b `priority` \u53c3\u6578\uff0c\u4e26\u5fc5\u9808\u5728\u7b2c 13 \u884c\u5c07\u5176\u50b3\u5165 `Job(...)` \u7684\u4f4d\u7f6e\u53c3\u6578\u5efa\u69cb\u51fd\u5f0f\u4e2d\u3002\u82e5\u9700\u9a57\u8b49\u512a\u5148\u7d1a\uff08\u7bc4\u570d\u3001\u679a\u8209\u6210\u54e1\u8cc7\u683c\uff09\uff0c\u5247\u8a72\u9a57\u8b49\u689d\u4ef6\u61c9\u7f6e\u65bc\u73fe\u6709\u7684 `name.strip()` \u6aa2\u67e5\u65c1\u3002 \u82e5\u6e05\u55ae\u5fc5\u9808\u6309\u512a\u5148\u7d1a\u6392\u5e8f\uff0c\u4e14\u5e0c\u671b\u5132\u5b58\u5eab\u4fdd\u6301\u70ba\u300c\u88ab\u52d5\u5132\u5b58\u300d\u7684\u89d2\u8272\uff0c\u5247\u61c9\u5728 `list_jobs` \u4e2d\u5b9a\u7fa9\u6392\u5e8f\u7b56\u7565\u3002\n3. **`scheduler\/repository.py`** \u2014 \u53ef\u80fd\u6027\u8f03\u9ad8\u3002`JobRepository.all()` \u4e2d\u7684 `sorted(self._jobs)` \u662f\u6839\u64da\u5b57\u5178 *\u9375*\uff08\u5373\u8b58\u5225\u78bc\uff09\u9032\u884c\u6392\u5e8f\u3002 \u82e5\u8981\u5be6\u73fe\u4f9d\u512a\u5148\u7d1a\u6392\u5e8f\u7684\u6e05\u55ae\uff0c\u9700\u5c07\u6b64\u8655\u4fee\u6539\u70ba\u6839\u64da `(-job.priority, job.identifier)` \u7b49\u9375\u503c\u5c0d\u9032\u884c\u6392\u5e8f\uff0c\u6216\u65b0\u589e\u7368\u7acb\u7684\u6709\u5e8f\u5b58\u53d6\u5668\u3002\u5207\u52ff\u5c07\u5e73\u624b\u8655\u7406\u7559\u4f5c\u96b1\u542b\u884c\u70ba\uff1a\u5b57\u5178\u7684\u63d2\u5165\u9806\u5e8f\u4e26\u975e\u53ef\u4f9d\u8cf4\u7684\u7a69\u5b9a\u5408\u7d04\u3002\n4. **`tests\/test_scheduler.py`** \u2014 \u78ba\u5b9a\u3002 \u65b0\u589e\u4e86\u9810\u8a2d\u512a\u5148\u7d1a\u3001\u986f\u5f0f\u512a\u5148\u7d1a\u3001\u6392\u5e8f\u4ee5\u53ca\u7121\u6548\u512a\u5148\u7d1a\u62d2\u7d55\u7b49\u6e2c\u8a66\u6848\u4f8b\u3002\u8acb\u6ce8\u610f\uff0c\u73fe\u6709\u7684 `assertEqual([job], service.list_jobs())` \u6bd4\u8f03\u7684\u662f *\u540c\u4e00\u500b* \u7269\u4ef6\uff0c\u56e0\u6b64\u5373\u4f7f\u65b0\u589e\u6b04\u4f4d\u4ecd\u80fd\u901a\u904e\u6e2c\u8a66\uff1b\u82e5\u5176\u6bd4\u8f03\u7684\u662f\u65b0\u5efa\u7acb\u7684 `Job` \u5b57\u9762\u91cf\uff0c\u5247\u7121\u6cd5\u901a\u904e\u6e2c\u8a66\u3002\n5. **`README.md`** \u2014 \u53ef\u80fd\u9700\u8981\uff0c\u82e5\u9700\u5728\u4efb\u4f55\u5730\u65b9\u8aaa\u660e\u512a\u5148\u7d1a\u8a9e\u7fa9\uff08\u7bc4\u570d\u5169\u7aef\u54ea\u4e00\u65b9\u512a\u5148\u3001\u9810\u8a2d\u503c\u7b49\uff09\u3002\n6. **`scheduler\/__init__.py`** \u2014 \u50c5\u7576\u9700\u8981\u8207 `SchedulerService` \u4e00\u540c\u5c0e\u51fa\u512a\u5148\u7d1a\u679a\u8209\u6216\u5e38\u6578\u6642\u624d\u9700\u4fee\u6539\u3002\n7. **`fixture-manifest.json`** \u2014\u2014 \u50c5\u7576\u60a8\u65b0\u589e\u6a21\u7d44\u6a94\u6848\u6642\u624d\u9700\u4fee\u6539\uff1b\u5176 `expected_files` \u9663\u5217\u662f\u660e\u78ba\u7684\u6e05\u55ae\uff0c\u82e5\u672a\u66f4\u65b0\u6703\u5c0e\u81f4\u4e0d\u4e00\u81f4\u3002\n8. **`scheduler\/time_rules.py`** \u2014 *\u5207\u52ff*\u4fee\u6539\u3002\u512a\u5148\u7d1a\u8207\u91cd\u8907\u6027\u4e92\u4e0d\u76f8\u95dc\uff0c\u4e14\u6b64\u6a21\u7d44\u672a\u8207\u5176\u4ed6\u6a21\u7d44\u9023\u7d50\u3002\n\n### 5. \u4e3b\u8981\u98a8\u96aa\n\n- **\u6392\u5e8f\u8a9e\u7fa9\u5c6c\u65bc\u96b1\u6027\u884c\u70ba\u8b8a\u66f4\u3002** `JobRepository.all()` \u76ee\u524d\u4fdd\u8b49\u6309\u8b58\u5225\u78bc\u5347\u5e8f\u6392\u5217\uff0c\u800c `list_jobs` \u7e7c\u627f\u6b64\u884c\u70ba\u3002\u4efb\u4f55\u4f9d\u8cf4\u6b64\u4fdd\u8b49\u7684\u4f7f\u7528\u8005\uff0c\u5176\u7a0b\u5f0f\u908f\u8f2f\u90fd\u5c07\u56e0\u91cd\u65b0\u6392\u5e8f\u800c\u5931\u6548\u3002 \u8acb\u660e\u78ba\u6c7a\u5b9a\uff1a\u662f\u8b93 `list_jobs()` \u7684\u542b\u7fa9\u767c\u751f\u6539\u8b8a\uff0c\u9084\u662f\u540c\u6642\u65b0\u589e\u4e00\u500b `list_jobs_by_priority()` \u65b9\u6cd5\uff1f\u524d\u8005\u662f\u98a8\u96aa\u8f03\u9ad8\u7684\u9078\u9805\uff0c\u800c\u73fe\u6709\u7684\u6e2c\u8a66 `test_create_and_list_jobs` \u904e\u65bc\u8584\u5f31\uff0c\u7121\u6cd5\u5075\u6e2c\u5230\u56de\u6b78\u554f\u984c\uff08\u55ae\u5143\u7d20\u6e05\u55ae\uff09\u3002\n- **\u6392\u5e8f\u65b9\u5411\u78ba\u5be6\u5b58\u5728\u6b67\u7fa9\u3002** \u5728\u67d0\u4e9b\u7cfb\u7d71\u4e2d\uff0c\u300c\u512a\u5148\u7d1a 1\u300d\u6163\u4f8b\u4e0a\u8868\u793a *\u6700\u9ad8*\uff0c\u800c\u5728\u5176\u4ed6\u7cfb\u7d71\u4e2d\u5247\u8868\u793a *\u6700\u4f4e*\u3002\u6b64\u5132\u5b58\u5eab\u4e2d\u6c92\u6709\u4efb\u4f55\u5167\u5bb9\u2014\u2014\u7121\u8ad6\u662f\u8a3b\u89e3\u3001\u6587\u6a94\u5b57\u4e32\u9084\u662f README \u8aaa\u660e\u2014\u2014\u80fd\u660e\u78ba\u91d0\u6e05\u9019\u4e00\u9ede\u3002 \u8acb\u9078\u5b9a\u4e00\u7a2e\u6163\u4f8b\uff0c\u5728 `models.py` \u4e2d\u9032\u884c\u6587\u4ef6\u5316\uff0c\u4e26\u900f\u904e\u5305\u542b\u81f3\u5c11\u4e09\u7a2e\u4e0d\u540c\u512a\u5148\u7d1a\u7684\u6e2c\u8a66\u4f86\u9328\u5b9a\u6392\u5e8f\u65b9\u5411\u3002\n- **\u6392\u5e8f\u5e73\u5c40\u8655\u7406\u4e0d\u7a69\u5b9a\u3002** \u82e5\u5169\u500b\u5de5\u4f5c\u5177\u6709\u76f8\u540c\u512a\u5148\u7d1a\uff0c\u7d50\u679c\u4ecd\u9808\u5177\u6709\u78ba\u5b9a\u6027\u3002Python \u7684 `sorted` \u51fd\u5f0f\u662f\u7a69\u5b9a\u7684\uff0c\u4f46\u7a69\u5b9a\u6027\u50c5\u5728\u8f38\u5165\u9806\u5e8f\u672c\u8eab\u5df2\u5b9a\u7fa9\u6642\u624d\u6709\u610f\u7fa9\u3002\u8acb\u52d9\u5fc5\u5c07 `identifier` \u4f5c\u70ba\u660e\u78ba\u7684\u6b21\u8981\u9375\u7d0d\u5165\u3002\n- **Frozen-dataclass \u6b04\u4f4d\u6392\u5e8f\u3002** `Job` \u63a1\u7528 `@dataclass(frozen=True)` \u4e26\u5305\u542b\u4e09\u500b\u4f4d\u7f6e\u578b\u5225\u6b04\u4f4d\uff0c\u800c `service.py:13` \u6703\u4f9d\u4f4d\u7f6e\u5efa\u69cb\u8a72\u7269\u4ef6\u3002\u82e5\u5c07 `priority` \u63d2\u5165\u6700\u5f8c\u4e00\u500b\u4f4d\u7f6e\u4ee5\u5916\u7684\u4efb\u4f55\u4f4d\u7f6e\uff0c\u6216\u672a\u8a2d\u5b9a\u9810\u8a2d\u503c\uff0c\u5c07\u69cb\u6210\u7834\u58de\u6027\u8b8a\u66f4\uff0c\u800c\u73fe\u6709\u7684\u5169\u9805\u6e2c\u8a66\u53ef\u80fd\u7121\u6cd5\u660e\u78ba\u63ed\u9732\u6b64\u554f\u984c\u3002\n- **`to_dict()` \u5408\u7d04\u64f4\u5c55\u3002** `asdict(self)` \u6703\u53cd\u6620\u6240\u6709\u6b04\u4f4d\u3002\u65b0\u589e `priority` \u6703\u6539\u8b8a\u6bcf\u500b\u5e8f\u5217\u5316\u8f09\u8377\uff0c\u800c `models.py` \u4e2d\u7684\u65b9\u6cd5\u672c\u9ad4\u4e26\u672a\u9032\u884c\u4efb\u4f55\u53ef\u898b\u7684\u4fee\u6539\u3002\u4efb\u4f55\u57fa\u65bc\u7cbe\u78ba\u5b57\u5178\u7d50\u69cb\u9032\u884c\u65b7\u8a00\u7684\u7a0b\u5f0f\u78bc\u90fd\u6703\u5931\u6548\u3002\n- **Python 3.9.6 \u9650\u5236\u3002** \u4e0d\u652f\u63f4 `@dataclass(slots=True)`\uff083.10+\uff09\uff0c\u4e0d\u652f\u63f4 `kw_only=True`\uff083.10+\uff09\uff0c\u4e14\u82e5\u672a\u4f7f\u7528 `from __future__ import annotations`\uff0cPEP 604 \u7684 `int | None` \u8a3b\u89e3\u5c07\u5728\u57f7\u884c\u6642\u5931\u6557\u3002 \u82e5\u5c07\u512a\u5148\u7d1a\u5efa\u6a21\u70ba\u679a\u8209\u985e\u578b\uff0c`enum.StrEnum` \u9700 Python 3.11 \u4ee5\u4e0a\u7248\u672c\uff0c\u76ee\u524d\u4e0d\u53ef\u7528\u3002\u4e0a\u8ff0\u4efb\u4e00\u60c5\u6cc1\u90fd\u5c07\u5c0e\u81f4\u6b64\u89e3\u91cb\u5668\u4e0a\u7684\u56fa\u5b9a\u88dd\u7f6e\u7121\u6cd5\u904b\u4f5c\u3002\n- **\u8b58\u5225\u78bc\u5206\u914d\u4f4d\u65bc\u932f\u8aa4\u7684\u5c64\u7d1a\u3002** `SchedulerService._next_identifier` \u8868\u793a\u670d\u52d9\u8ca0\u8cac\u8b58\u5225\u78bc\u751f\u6210\uff0c\u800c\u5132\u5b58\u5eab\u8ca0\u8cac\u5132\u5b58\u3002\u82e5\u512a\u5148\u7d1a\u76f8\u95dc\u529f\u80fd\u4fc3\u4f7f\u5be6\u4f5c\u7b2c\u4e8c\u500b\u5132\u5b58\u5eab\u6216\u9810\u8f09\u56fa\u5b9a\u88dd\u7f6e\uff0c\u6b64\u5206\u96e2\u5c07\u5c0e\u81f4\u8b58\u5225\u78bc\u885d\u7a81\u53ca\u5de5\u4f5c\u88ab\u8986\u5beb\u3002\n- **\u932f\u8aa4\u5408\u7d04\u4e0d\u5c0d\u7a31\u3002** `JobRepository.get` \u5728\u672a\u627e\u5230\u6642\u8fd4\u56de `None`\uff0c\u800c `JobRepository.delete` \u5247\u62cb\u51fa `KeyError`\u3002\u4efb\u4f55\u8207\u512a\u5148\u7d1a\u76f8\u95dc\u7684\u65b0\u67e5\u8a62\u90fd\u61c9\u523b\u610f\u63a1\u7528\u5176\u4e2d\u4e00\u7a2e\u898f\u7bc4\uff0c\u800c\u975e\u7121\u610f\u9593\u7e7c\u627f\u9019\u7a2e\u4e0d\u4e00\u81f4\u6027\u3002\n- **\u9a57\u8b49\u7f3a\u53e3\u5148\u4f8b\u3002** `create_job` \u6703\u9a57\u8b49 `name` \u4f46\u4e0d\u6703\u9a57\u8b49 `owner`\u3002\u8acb\u52ff\u5c07\u6b64\u9b06\u6563\u505a\u6cd5\u5957\u7528\u81f3 `priority` \u2014\u2014 \u672a\u7d93\u9a57\u8b49\u7684\u512a\u5148\u7d1a\u6703\u50b3\u64ad\u81f3\u6392\u5e8f\u9375\u4e2d\uff0c\u4e26\u53ef\u80fd\u5728 `sorted` \u51fd\u5f0f\u6df1\u8655\uff08\u4f8b\u5982\u5c07 `int` \u8207 `None` \u9032\u884c\u6bd4\u8f03\uff09\u62cb\u51fa `TypeError`\uff0c\u800c\u975e\u5728\u547c\u53eb\u8655\u62cb\u51fa\u3002\n- **\u6b7b\u78bc\u9677\u9631\u3002** `scheduler\/time_rules.py` \u770b\u4f3c\u6392\u7a0b\u908f\u8f2f\uff0c\u56e0\u6b64\u5bb9\u6613\u5438\u5f15\u7de8\u8f2f\u3002\u4f46\u8a72\u6a94\u6848\u672a\u88ab\u4efb\u4f55\u7a0b\u5f0f\u6240\u5c0e\u5165\uff0c\u4e14\u5176\u81ea\u8eab\u7684 docstring \u4e5f\u627f\u8a8d\u4e86\u9019\u500b\u932f\u8aa4\uff1a\u5b83\u6703\u589e\u52a0 24 \u5c0f\u6642\u7684 UTC \u7d93\u904e\u6642\u9593\uff0c\u4e26\u300c\u5728\u590f\u4ee4\u6642\u8f49\u63db\u671f\u9593\u8abf\u6574\u672c\u5730\u5be6\u6642\u9418\u6642\u9593\u300d\u3002 \u4fee\u6539\u6b64\u8655\u5c0d\u53d7\u6e2c\u7cfb\u7d71\u6beb\u7121\u53ef\u89c0\u5bdf\u7684\u5f71\u97ff\uff0c\u56e0\u6b64\u6295\u5165\u7684\u7cbe\u529b\u7d14\u5c6c\u6d6a\u8cbb\uff0c\u4e14\u91dd\u5c0d\u6b64\u8655\u7de8\u5beb\u7684\u4efb\u4f55\u6e2c\u8a66\u90fd\u7121\u6cd5\u9a57\u8b49\u5be6\u969b\u767c\u5e03\u7248\u672c\u4e2d\u7684\u4efb\u4f55\u5167\u5bb9\u3002\n- **\u8584\u5f31\u7684\u5b89\u5168\u7db2\u3002** \u50c5\u6709\u5169\u9805\u6e2c\u8a66\uff0c\u7121\u6301\u7e8c\u6574\u5408\uff08CI\uff09\u3001\u7121\u7a0b\u5f0f\u78bc\u6aa2\u67e5\u5de5\u5177\uff08linter\uff09\u3001\u7121\u985e\u578b\u6aa2\u67e5\u3002\u9664\u4e86\u60a8\u81ea\u5df1\u7de8\u5beb\u7684\u4ee3\u78bc\u5916\uff0c\u6c92\u6709\u4efb\u4f55\u6a5f\u5236\u80fd\u5075\u6e2c\u5230\u56de\u6b78\u554f\u984c\u3002 \u8acb\u5c07\u73fe\u6709\u7684\u6e2c\u8a66\u5957\u4ef6\u8996\u70ba\u8986\u84cb\u7387\u4e0d\u8db3\u7684\u57fa\u6e96\uff0c\u800c\u975e\u901a\u904e\u9580\u6abb\u3002\n\n### 6. \u5be6\u4f5c\u8a08\u756b\uff08\u672a\u57f7\u884c\uff09\n\n1. **\u9996\u5148\u4ee5\u66f8\u9762\u5f62\u5f0f\u91d0\u6e05\u8a9e\u7fa9\u3002** \u512a\u5148\u7d1a\u985e\u578b\uff08`int` \u5c0d\u6bd4\u679a\u8209\uff09\u3001\u6709\u6548\u7bc4\u570d\u3001\u73fe\u6709\uff0f\u672a\u6307\u5b9a\u5de5\u4f5c\u7684\u9810\u8a2d\u503c\uff0c\u4ee5\u53ca\u6392\u5e8f\u65b9\u5411\u3002\u5c07\u5176\u8a18\u9304\u70ba `scheduler\/models.py` \u4e2d `Job` \u7684 docstring \u2014\u2014 \u9019\u662f\u6240\u6709\u5c64\u7d1a\u76ee\u524d\u552f\u4e00\u4f9d\u8cf4\u7684\u4f4d\u7f6e\u3002\n2. **\u64f4\u5145\u6a21\u578b\u3002** \u5728 `scheduler\/models.py` \u4e2d\uff0c\u5c07 `priority: int = 0` \u4f5c\u70ba `Job` \u7684 *\u6700\u5f8c* \u4e00\u500b\u6b04\u4f4d\u52a0\u5165\uff0c\u540c\u6642\u7dad\u6301\u8207 `service.py:13` \u7684\u4f4d\u7f6e\u76f8\u5bb9\u6027\uff0c\u4e26\u4fdd\u7559 `to_dict()` \u4e0d\u4f5c\u8b8a\u66f4\u3002\n3. **\u5c07\u5176\u6574\u5408\u81f3\u670d\u52d9\u4e2d\u3002** \u5728 `SchedulerService.create_job` \u4e2d\u65b0\u589e\u9810\u8a2d\u503c\u7684 `priority` \u53c3\u6578\uff0c\u5728\u73fe\u6709\u7684 `name.strip()` \u9a57\u8b49\u689d\u4ef6\u65c1\u9032\u884c\u9a57\u8b49\uff08\u62cb\u51fa `ValueError`\uff0c\u8207\u65e2\u5b9a\u7684\u932f\u8aa4\u985e\u578b\u76f8\u7b26\uff09\uff0c\u4e26\u5c07\u5176\u50b3\u905e\u7d66 `Job` \u5efa\u69cb\u51fd\u5f0f\u3002\n4. **\u660e\u78ba\u6c7a\u5b9a\u6e05\u55ae\u7684\u5951\u7d04\u3002** \u9996\u9078\u7684\u4f4e\u98a8\u96aa\u65b9\u6848\uff1a\u4fdd\u7559 `JobRepository.all()` \u4f5c\u70ba\u6309\u8b58\u5225\u78bc\u6392\u5e8f\u7684\u539f\u59cb\u65b9\u6cd5\uff0c\u4e26\u65b0\u589e\u4e00\u500b\u7368\u7acb\u7684\u6309\u512a\u5148\u7d1a\u6392\u5e8f\u7684\u5b58\u53d6\u5668\u3002 \u82e5 `list_jobs()` \u5fc5\u9808\u8b8a\u66f4\u5176\u542b\u7fa9\uff0c\u5247\u5c07 `JobRepository.all()` \u7684\u5217\u8868\u63a8\u5c0e\u5f0f\u4fee\u6539\u70ba\u6839\u64da\u5305\u542b `identifier` \u4f5c\u70ba\u5e73\u5c40\u6c7a\u7b56\u57fa\u6e96\u7684\u986f\u5f0f\u8907\u5408\u9375\u9032\u884c\u6392\u5e8f\uff0c\u4e26\u5728 `README.md` \u4e2d\u8a3b\u660e\u6b64\u8b8a\u66f4\u3002\n5. **\u50c5\u7576\u5f15\u5165\u4e86\u516c\u958b\u7684\u679a\u8209\u6216\u5e38\u6578\u6642\uff0c\u624d\u9700\u4fdd\u6301 `scheduler\/__init__.py` \u8207\u4e4b\u540c\u6b65**\u3002\n6. **\u8acb\u52ff\u4fee\u6539 `scheduler\/time_rules.py`**\uff0c\u4e14\u9664\u975e\u5728\u540c\u4e00\u9805\u8b8a\u66f4\u4e2d\u66f4\u65b0\u4e86 `fixture-manifest.json` \u4e2d\u7684 `expected_files`\uff0c\u5426\u5247\u8acb\u52ff\u65b0\u589e\u6a94\u6848\u3002\n\n### 7. \u9a57\u8b49\u8a08\u756b\n\n- **\u5148\u78ba\u8a8d\u57fa\u6e96\u72c0\u614b\u3002** \u5728\u9032\u884c\u4efb\u4f55\u7de8\u8f2f\u524d\uff0c\u8acb\u57f7\u884c `python3 -m unittest discover -s tests -v`\uff0c\u4e26\u78ba\u8a8d\u6709 2 \u9805\u6e2c\u8a66\u901a\u904e\u3002\u6211\u5df2\u7d93\u57f7\u884c\u904e\u6b64\u6b65\u9a5f\u2014\u2014\u6e2c\u8a66\u7d50\u679c\u5b8c\u5168\u901a\u904e\u3002\n- **\u56de\u6b78\u6e2c\u8a66\u9580\u6abb\u3002** \u5169\u9805\u73fe\u6709\u6e2c\u8a66\u5728\u672a\u4fee\u6539\u7684\u60c5\u6cc1\u4e0b\u5fc5\u9808\u4ecd\u80fd\u901a\u904e\u3002\u82e5 `test_create_and_list_jobs` \u9700\u8981\u7de8\u8f2f\uff0c\u9019\u8868\u793a\u8a72\u8b8a\u66f4\u6703\u5c0e\u81f4\u56de\u6b78\uff0c\u800c\u975e\u7de8\u8f2f\u6e2c\u8a66\u7684\u7406\u7531\u3002\n- **`tests\/test_scheduler.py` \u4e2d\u7684\u65b0\u6e2c\u8a66\u6848\u4f8b\uff1a**\n  - \u7576\u4ee5\u820a\u7248\u96d9\u53c3\u6578\u7c3d\u540d\u547c\u53eb `create_job` \u6642\u7684\u9810\u8a2d\u512a\u5148\u7d1a\uff08\u7528\u4ee5\u9a57\u8b49\u5411\u5f8c\u76f8\u5bb9\u6027\uff09\u3002\n  - \u900f\u904e `create_job` \u2192 `list_jobs` \u9032\u884c\u7684\u986f\u5f0f\u512a\u5148\u7d1a\u5f80\u8fd4\u6e2c\u8a66\u3002\n  - \u5305\u542b **\u4e09\u500b\u6216\u66f4\u591a** \u4e0d\u540c\u512a\u5148\u7d1a\u7684\u6392\u5e8f\uff0c\u4e26\u9a57\u8b49\u5b8c\u6574\u6e05\u55ae \u2014 \u9019\u662f\u6c7a\u5b9a\u6392\u5e8f\u65b9\u5411\u7684\u95dc\u9375\u3002\n  - \u5e73\u5c40\u8655\u7406\uff1a\u5169\u500b\u512a\u5148\u7d1a\u76f8\u7b49\u7684\u4efb\u52d9\u5c07\u6309\u8b58\u5225\u78bc\u5347\u5e8f\u8fd4\u56de\u3002\n  - \u7121\u6548\u7684\u512a\u5148\u7d1a\u6703\u5f15\u767c `ValueError`\uff0c\u8207\u540d\u7a31\u7559\u7a7a\u7684\u60c5\u6cc1\u4e00\u81f4\u3002\n  - `to_dict()` \u6703\u5c07 `priority` \u5305\u542b\u5728\u5167\uff0c\u4e26\u63a1\u7528\u9810\u671f\u503c\u3002\n  - \u6ce8\u5165\u5f0f\u5132\u5b58\u5eab\u8def\u5f91\uff1a`SchedulerService(repository=fake)` \u4ecd\u80fd\u6b63\u78ba\u6307\u6d3e\u512a\u5148\u7d1a\uff0c\u4e26\u9a57\u8b49 `repository \u6216 JobRepository()` \u7684\u7e2b\u5408\u6a5f\u5236\u3002\n- **\u76f8\u5bb9\u6027\u6aa2\u67e5\u3002** \u78ba\u8a8d\u6240\u6709\u529f\u80fd\u7686\u53ef\u5728 Python 3.9.6 \u74b0\u5883\u4e0b\u904b\u884c \u2014 \u7121 `slots=`\u3001\u7121 `kw_only=`\u3001\u7121\u88f8 PEP 604 \u806f\u5408\u985e\u578b\u3001\u7121 `StrEnum`\u3002\n- **\u6e05\u55ae\u6aa2\u67e5\u3002** \u91cd\u65b0\u8b80\u53d6 `fixture-manifest.json`\uff0c\u4e26\u78ba\u8a8d\u78c1\u789f\u4e0a\u7684\u6a94\u6848\u96c6\u4ecd\u8207 `expected_files` \u76f8\u7b26\u3002\n- **\u78ba\u5b9a\u6027\u3002** \u57f7\u884c\u6e2c\u8a66\u5957\u4ef6\u5169\u81f3\u4e09\u6b21\uff1b\u6d89\u53ca\u5b57\u5178\u8fed\u4ee3\u9806\u5e8f\u7684\u932f\u8aa4\u53ef\u80fd\u9593\u6b47\u6027\u51fa\u73fe\u3002\n- **\u7a0b\u5f0f\u78bc\u6574\u6f54\u5ea6\u3002** \u8a2d\u5b9a `PYTHONDONTWRITEBYTECODE=1` \u57f7\u884c\u6e2c\u8a66\uff0c\u4ee5\u907f\u514d `__pycache__` \u76ee\u9304\u5728\u6e05\u55ae\u4e2d\u986f\u793a\u70ba\u672a\u8ffd\u8e64\u7684\u504f\u79fb\u9805\u76ee\u3002.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">\u6e2c\u8a66\u74b0\u5883\u9650\u5236\uff1a\u9019\u662f\u4e00\u500b\u5c0f\u578b\u96e2\u7dda Python \u5132\u5b58\u5eab\u3002Claude \u5728 CLI OAuth \u904e\u671f\u5f8c\u6703\u4f7f\u7528\u5b50\u4ee3\u7406\u4f5c\u70ba\u5099\u7528\u65b9\u6848\uff0c\u56e0\u6b64\u9694\u96e2\u72c0\u614b\u8207\u6191\u8b49\u53ef\u898b\u6027\u4e26\u4e0d\u5b8c\u5168\u4e00\u81f4\u3002.<\/p><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\u6b64\u7d50\u679c\u4e26\u4e0d\u80fd\u8b49\u660e\u8a72\u5de5\u5177\u5728\u5927\u578b\u55ae\u4e00\u5132\u5b58\u5eab\uff08monorepo\uff09\u6216\u70ba\u671f\u4e00\u9031\u7684\u81ea\u4e3b\u57f7\u884c\u74b0\u5883\u4e2d\u7684\u8868\u73fe\u3002\u672c\u6b21\u6e2c\u8a66\u74b0\u5883\u662f\u523b\u610f\u8a2d\u8a08\u5f97\u898f\u6a21\u5c0f\u4e14\u53d7\u63a7\u7684\u3002\u82e5\u8981\u9032\u884c\u5be6\u969b\u8a55\u4f30\uff0c\u61c9\u5f9e\u552f\u8b80\u63d0\u793a\u958b\u59cb\uff1a\u5728\u5141\u8a31\u7de8\u8f2f\u4e4b\u524d\uff0c\u8acb\u8981\u6c42\u6bcf\u500b\u5de5\u5177\u7e6a\u88fd\u547c\u53eb\u8def\u5f91\u3001\u5217\u51fa\u6703\u88ab\u4fee\u6539\u7684\u6a94\u6848\u540d\u7a31\u3001\u8b58\u5225\u6e2c\u8a66\u7528\u4f8b\uff0c\u4e26\u5217\u51fa\u5c1a\u672a\u91d0\u6e05\u7684\u5047\u8a2d\u3002.<\/p>\n\n\n\n<h2 id=\"implementation\" class=\"wp-block-heading\">\u5be6\u4f5c\u98a8\u683c\u3001\u4fee\u88dc\u7bc4\u570d\u8207\u932f\u8aa4\u4fee\u6b63<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u591a\u6a94\u6848\u529f\u80fd\u64cd\u4f5c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u76f8\u540c\u7684\u901a\u904e\u884c\u70ba\u53ef\u80fd\u6e90\u81ea\u4e0d\u540c\u7684\u5de5\u7a0b\u8a2d\u8a08\u9078\u64c7\u3002\u5728 T2 \u6e2c\u8a66\u4e2d\uff0c\u9019\u5169\u6b3e\u7522\u54c1\u5747\u7372\u5f97 30\/30 \u5206\uff0c\u4e26\u901a\u904e\u4e86\u300c\u51cd\u7d50\u96b1\u85cf\u9a57\u8b49\u5668\u300d\u6e2c\u8a66\u3002Claude Code \u5728\u591a\u500b\u908a\u754c\u8655\u8a2d\u7f6e\u4e86\u9a57\u8b49\u6a5f\u5236\uff0c\u4e26\u589e\u52a0\u4e86\u66f4\u5ee3\u6cdb\u7684\u76f4\u63a5\u6a21\u578b\u6e2c\u8a66\u8207\u95be\u503c\u6e2c\u8a66\uff1bCodex \u5247\u63a1\u7528\u4e86\u898f\u6a21\u8f03\u5c0f\u3001\u4ee5\u670d\u52d9\u70ba\u4e2d\u5fc3\u7684\u5be6\u4f5c\u65b9\u5f0f\uff0c\u540c\u6a23\u7b26\u5408\u5408\u7d04\u8981\u6c42\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5c0d\u7368\u7acb\u958b\u767c\u8005\u800c\u8a00\uff0c\u9019\u78ba\u5be6\u662f\u4e00\u9805\u6b0a\u8861\u53d6\u6368\u3002\u7576\u7269\u4ef6\u662f\u900f\u904e\u591a\u7a2e\u8def\u5f91\u5efa\u7acb\u6642\uff0c\u66f4\u5ee3\u6cdb\u7684\u9a57\u8b49\u80fd\u4fdd\u8b77\u4e0d\u8b8a\u689d\u4ef6\uff1b\u82e5\u50c5\u6709\u4e00\u500b\u670d\u52d9\u4f5c\u70ba\u9810\u671f\u7684\u5165\u53e3\u9ede\uff0c\u8f03\u5c0f\u7684\u4fee\u88dc\u7a0b\u5f0f\u5247\u80fd\u6e1b\u5c11\u56de\u6b78\u98a8\u96aa\u7bc4\u570d\u4e26\u7e2e\u77ed\u5be9\u67e5\u6642\u9593\u3002\u6b63\u78ba\u7684\u7b54\u6848\u53d6\u6c7a\u65bc\u5132\u5b58\u5eab\u7684\u6240\u6709\u6b0a\u898f\u5247\uff0c\u800c\u975e\u55ae\u7d14\u8a08\u7b97\u8b8a\u66f4\u7684\u7a0b\u5f0f\u78bc\u884c\u6578\u6216\u6e2c\u8a66\u6578\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\u5132\u5b58\u5eab\u6e2c\u8a66<\/p><h3 class=\"d-title\">\u5728\u591a\u500b\u6a94\u6848\u4e2d\u5be6\u4f5c\u4e00\u9805\u512a\u5148\u7d1a\u529f\u80fd<\/h3><p class=\"d-sub\">\u65b0\u589e\u300c\u51cd\u7d50\u300d\u884c\u70ba\u3001\u7dad\u6301\u76f8\u5bb9\u6027\uff0c\u4e26\u901a\u904e\u516c\u958b\u8207\u96b1\u85cf\u7684\u6aa2\u67e5\u3002.<\/p><\/div><span class=\"d-pill\">\u529f\u80fd\u6027\u9818\u5e36<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"\u300aCodex\u300b\u7d50\u679c\"><div class=\"d-product\"><span>\u300a\u53e4\u7c4d\u300b<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7e8c\u6642\u9593<\/span><strong>115 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>7 + \u96b1\u85cf\u7684<\/strong><\/div><div class=\"d-metric\"><span>\u7bc4\u570d<\/span><strong>\u8f03\u5c0f\u7684\u4fee\u88dc\u7a0b\u5f0f<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u500b\u6709\u6548\u7684\u8f38\u51fa\u7247\u6bb5<\/div><pre>\u5c07\u512a\u5148\u9806\u5e8f\u65b0\u589e\u81f3\u4e0d\u53ef\u8b8a\u6a21\u578b\u4e2d\uff0c\u65bc\u670d\u52d9\u908a\u754c\u9032\u884c\u9a57\u8b49\uff0c\u4e26\u5728\u5132\u5b58\u5eab\u4e2d\u7dad\u6301\u9806\u5e8f\u3002\n\n\u6240\u6709\u4e03\u9805\u516c\u958b\u6e2c\u8a66\u4ee5\u53ca\u5df2\u51cd\u7d50\u7684\u96b1\u85cf\u9a57\u8b49\u5668\u5747\u901a\u904e\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8a55\u8ad6\u8005\u89c0\u9ede\uff1a<\/strong> \u4e00\u500b\u898f\u6a21\u8f03\u5c0f\u3001\u4ee5\u670d\u52d9\u70ba\u4e2d\u5fc3\u7684\u5be6\u4f5c\uff0c\u5b8c\u6574\u6db5\u84cb\u4e86\u6240\u6709\u51cd\u7d50\u884c\u70ba\u3002.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \u4ee3\u78bc\u7d50\u679c\"><div class=\"d-product\"><span>\u514b\u52de\u5fb7\u00b7\u79d1\u5fb7<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7e8c\u6642\u9593<\/span><strong>101 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>14 + \u96b1\u85cf\u5167\u5bb9<\/strong><\/div><div class=\"d-metric\"><span>\u7bc4\u570d<\/span><strong>\u66f4\u5ee3\u6cdb\u7684\u6e2c\u8a66<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u500b\u6709\u6548\u7684\u8f38\u51fa\u7247\u6bb5<\/div><pre>\u5df2\u5728\u670d\u52d9\u908a\u754c\u548c\u4e0d\u53ef\u8b8a\u6a21\u578b\u5169\u8655\u9a57\u8b49\u512a\u5148\u7d1a\uff0c\u4fdd\u7559\u4e86\u5132\u5b58\u5eab\u7be9\u9078\u529f\u80fd\uff0c\u4e26\u65b0\u589e\u4e86\u95be\u503c\u8986\u84cb\u7387\u3002\n\n\u5341\u56db\u9805\u516c\u958b\u6e2c\u8a66\u53ca\u96b1\u85cf\u9a57\u8b49\u5668\u5747\u901a\u904e\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8a55\u8ad6\u8005\u89c0\u9ede\uff1a<\/strong> \u76f4\u63a5\u6a21\u578b\u8207\u95be\u503c\u6a21\u578b\u7684\u6db5\u84cb\u7bc4\u570d\u66f4\u5ee3\uff0c\u4f46\u672a\u5c55\u73fe\u51fa\u529f\u80fd\u5206\u6578\u4e0a\u7684\u512a\u52e2\u3002.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>\u6aa2\u8996\u5b8c\u6574\u7684 Codex \u8f38\u51fa\u5167\u5bb9<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u3001\u7d93\u904e\u6e05\u7406\u7684\u3001\u9996\u6b21\u6709\u6548\u7684\u8f38\u51fa<\/p><pre>\u5df2\u5be6\u4f5c\u6392\u7a0b\u5de5\u4f5c\u512a\u5148\u7d1a\u529f\u80fd\u3002\n\n\u8b8a\u66f4\u7684\u6a94\u6848\uff1a\n\n- [scheduler\/models.py](.\/scheduler\/models.py:5) \u2014 \u65b0\u589e\u5e8f\u5217\u5316 `priority` \u5c6c\u6027\uff0c\u9810\u8a2d\u503c\u70ba `0`\u3002\n- [scheduler\/service.py](.\/scheduler\/service.py:11) \u2014 \u65b0\u589e\u9a57\u8b49\u3001\u5132\u5b58\u529f\u80fd\uff0c\u4ee5\u53ca\u5728\u7dad\u6301\u8b58\u5225\u78bc\u9806\u5e8f\u7684\u540c\u6642\uff0c\u65b0\u589e `list_jobs(min_priority=0)` \u7be9\u9078\u6a5f\u5236\u3002\n- [tests\/test_scheduler.py](.\/tests\/test_scheduler.py:16) \u2014 \u91dd\u5c0d\u9810\u8a2d\u503c\u3001\u5e8f\u5217\u5316\u3001\u5132\u5b58\u3001\u908a\u754c\u3001\u7121\u6548\u503c\u53ca\u7be9\u9078\u529f\u80fd\u65b0\u589e\u4e86\u7a0b\u5f0f\u78bc\u8986\u84cb\u7387\u6e2c\u8a66\u3002\n\n\u6e2c\u8a66\u57f7\u884c\u7d50\u679c\uff1a\n\n```text\npython3 -m unittest discover -s tests -v\n\u57f7\u884c\u4e86 7 \u9805\u6e2c\u8a66 \u2014 \u6210\u529f\n```\n\n**\u7d50\u8ad6\uff1a** \u51cd\u7d50\u4efb\u52d9\u5df2\u5b8c\u6210\u4e26\u901a\u904e\u9a57\u8b49\u3002  \n**\u9700\u6c7a\u7b56\u4e8b\u9805\uff1a** \u7121\u3002.<\/pre><\/div><\/details><details class=\"d-full\"><summary>\u6aa2\u8996\u5b8c\u6574\u7684 Claude \u7a0b\u5f0f\u78bc\u8f38\u51fa<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u4ea4\u63a5\u8a18\u9304\uff0c\u5305\u542b\u7b2c\u4e00\u9805\u6709\u6548\u7684\u8f38\u51fa\u5167\u5bb9\u7684\u9010\u5b57\u8a18\u9304<\/p><pre># T2 \u57f7\u884c\u8a18\u9304 \u2014 \u591a\u6a94\u6848\u512a\u5148\u7d1a\u529f\u80fd\n\n## \u57f7\u884c\u53c3\u6578\n\n| \u6b04\u4f4d | \u503c |\n| --- | --- |\n| \u4efb\u52d9 | `T2` |\n| \u51cd\u7d50\u63d0\u793a | `01-prompts\/T2.md` |\n| \u51cd\u7d50\u63d0\u793a\u8a5e SHA-256 | `8476a56034c4e719b97ee4081b32b4c73efd45feafe1bda9d477c83cb8fdb698` |\n| \u57f7\u884c\u55ae\u5143 | \u9694\u96e2\u7684 Claude \u5b50\u4ee3\u7406\uff0c`\u901a\u7528\u578b`\uff0c\u5168\u65b0\u4e0a\u4e0b\u6587 |\n| \u9694\u96e2\u65b9\u6cd5 | **\u5b50\u4ee3\u7406\u5099\u7528\u65b9\u6848**\uff08\u5df2\u8a18\u9304\u7684\u964d\u7d1a \u2014 \u53c3\u898b `results\/isolation-decision.md`\uff09 |\n| \u6307\u6d3e\u7684\u4e7e\u6de8\u526f\u672c | `runtime\/workspaces\/T2` |\n| Claude \u7a0b\u5f0f\u78bc\u7248\u672c | `2.1.220` |\n| \u6a21\u578b\u8a2d\u5b9a | `claude-opus-5` |\n| start_utc | `2026-07-28T10:27:52Z` |\n| end_utc | `2026-07-28T10:29:33Z` |\n| \u6301\u7e8c\u6642\u9593 | 101 \u79d2\uff08\u8207 T1\u3001T3\u3001T4 \u540c\u6642\u9032\u884c\uff1b\u975e\u7d14\u7cb9\u7684\u5ef6\u9072\u6e2c\u91cf\uff09 |\n| \u5617\u8a66\u6b21\u6578 | 1 |\n| \u72c0\u614b | `\u6709\u6548` |\n| \u4eba\u70ba\u5e72\u9810 | \u7121 |\n\n## \u5b89\u5168\u5de5\u5177\u6458\u8981\n\n`date`\u3001\u50c5\u9650\u65bc\u6307\u5b9a\u5de5\u4f5c\u5340\u5167\u7684 `\u8b80\u53d6`\/`\u7de8\u8f2f`\/`\u5beb\u5165`\u3001`grep`\u3001\n`python3 -m unittest discover`\u3001`python3 -m compileall`\u3001\u5167\u5d4c `python3 -c` \u7159\u9727\u6e2c\u8a66\u3002\n\u7121\u7db2\u8def\u9023\u7dda\u3001\u7121\u5b89\u88dd\u7a0b\u5f0f\uff0c\u50c5\u4f7f\u7528\u6a19\u6e96\u51fd\u5f0f\u5eab\u3002\n\n## \u8b8a\u66f4\u7684\u6a94\u6848\n\n`scheduler\/models.py`\u3001`scheduler\/repository.py`\u3001`scheduler\/service.py`\u3001\n`tests\/test_scheduler.py`\u3002 \u6c92\u6709\u65b0\u589e\u6216\u79fb\u9664\u6a94\u6848\uff0c\u56e0\u6b64 `fixture-manifest.json` \u4ecd\u4fdd\u6301\n\u6e96\u78ba\u3002\u5b8c\u6574\u4fee\u88dc\u6a94\uff1a`results\/T2\/patch.diff`\u3002\n\n## \u96e2\u7dda\u6aa2\u67e5\u7d50\u679c\n\n\u7531\u4efb\u52d9\u57f7\u884c\u5668\u56de\u5831\uff1a\n\n| \u6aa2\u67e5\u9805\u76ee | \u7d50\u679c |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v`\uff08\u57fa\u6e96\uff0c\u8b8a\u66f4\u524d\uff09 | 2 \u901a\u904e\uff0c0 \u5931\u6557 |\n| `python3 -m compileall -q scheduler tests` | \u7121\u932f\u8aa4 |\n| \u5167\u5d4c\u7159\u9727\u6e2c\u8a66\uff08\u820a\u5f0f 3 \u53c3\u6578\u7d50\u69cb\u3001\u95dc\u9375\u5b57\/\u4f4d\u7f6e\u53c3\u6578\u95be\u503c\u3001`to_dict`\uff09 | \u901a\u904e |\n| `python3 -m unittest discover -s tests -v`\uff08\u6700\u7d42\uff09 | **14 \u901a\u904e\uff0c0 \u5931\u6557** |\n\n\u7531\u5354\u8abf\u54e1\u5728\u5de5\u4f5c\u5340\u5916\u90e8\u7368\u7acb\u91cd\u65b0\u9a57\u8b49\uff1a\n\n| \u6aa2\u67e5\u9805\u76ee | \u9000\u51fa\u72c0\u614b | \u7d50\u679c |\n| --- | --- | --- |\n| \u516c\u958b\u6e2c\u8a66\u5957\u4ef6\uff08`results\/checks\/T2-public.txt`\uff09 | 0 | 14 \u9805\u6e2c\u8a66\uff0c\u6b63\u5e38 |\n| \u96b1\u85cf\u9a57\u8b49\u5668 `03-checks\/test_t2_hidden.py` (`results\/checks\/T2-hidden.txt`) | 0 | 2 \u9805\u6e2c\u8a66\uff0c\u901a\u904e |\n\n\u96b1\u85cf\u9a57\u8b49\u5668\u5728\u4f7f\u7528\u539f\u59cb\u56fa\u5b9a\u88dd\u7f6e\u526f\u672c\u6642\u5931\u6557\uff08\u9000\u51fa\u4ee3\u78bc 1\uff09\uff0c\u9019\u8b49\u5be6\u4e86\u901a\u904e\u7d50\u679c\u5177\u6709\n\u5be6\u8cea\u610f\u7fa9\u3002\u8acb\u53c3\u95b1 `results\/checks\/validator-controls.md`\u3002\n\n## \u91d1\u6a19\u6e96\u5730\u5716\u884c\u70ba\u8986\u84cb\u7387\n\n`03-checks\/gold-map.json` \u4e2d\u6240\u6709\u4e94\u9805\u5fc5\u5099\u884c\u70ba\u5747\u5df2\u6eff\u8db3\uff1a\n\n| \u5fc5\u5099\u884c\u70ba | \u8b49\u64da |\n| --- | --- |\n| \u512a\u5148\u7d1a\u9810\u8a2d\u503c\u70ba 0 | `Job.priority: int = MIN_PRIORITY`\uff1b `create_job(..., priority=MIN_PRIORITY)`\uff1b`test_priority_defaults_to_zero` |\n| \u6574\u6578\u7bc4\u570d 0 \u81f3 9 | `validate_priority` \u6703\u62d2\u7d55\u975e\u6574\u6578\u53ca\u8d85\u51fa\u7bc4\u570d\u7684\u503c\uff1b `test_out_of_range_priority_is_rejected`\u3001`test_non_integer_priority_is_rejected` |\n| \u5e8f\u5217\u5316\u5f8c\u7684\u512a\u5148\u7d1a | \u900f\u904e `asdict` \u547c\u53eb `to_dict()`\uff1b `test_priority_appears_in_serialized_output` \u9a57\u8b49\u5e8f\u5217\u5316\u8f38\u51fa\u4e2d\u662f\u5426\u5305\u542b\u7cbe\u78ba\u7684\u5b57\u5178 |\n| \u6700\u4f4e\u512a\u5148\u7d1a\u7be9\u9078 | `list_jobs(min_priority=0)` \u2192 `JobRepository.all(min_priority)`\uff1b `test_filter_is_inclusive_of_the_threshold` |\n| \u8b58\u5225\u78bc\u6392\u5e8f | \u7be9\u9078\u5668\u61c9\u7528\u65bc\u73fe\u6709\u7684 `sorted(self._jobs)` \u7406\u89e3\u5f0f\u4e2d\uff1b `test_filter_preserves_ascending_identifier_order` |\n\n## \u5df2\u6e05\u7406\u7684\u932f\u8aa4\n\n\u7121\u3002\u6e2c\u8a66\u57f7\u884c\u7522\u751f\u7684 `__pycache__` \u6b98\u7559\u6a94\u6848\u5df2\u7531\u4efb\u52d9\u57f7\u884c\u5668\u79fb\u9664\uff1b\u5354\u8abf\u5668\n\u6383\u63cf\u78ba\u8a8d\u5de5\u4f5c\u5340\u5df2\u6e05\u7406\u4e7e\u6de8\u3002\n\n## \u53ef\u898b\u8f38\u51fa\uff08\u9010\u5b57\uff09\n\n\u5728\u672c\u5730\u6392\u7a0b\u5668\u56fa\u5b9a\u88dd\u7f6e\u7684\u6a21\u578b\u3001\u5132\u5b58\u5eab\u53ca\u670d\u52d9\u5c64\u7d1a\u4e2d\uff0c\u70ba\u5df2\u6392\u7a0b\u7684\u5de5\u4f5c\u65b0\u589e\u4e86\u6574\u6578 `priority` \u6b04\u4f4d\uff0c\u4e26\u5305\u542b\u904e\u6ffe\u5f8c\u7684\u6e05\u55ae\u3002\n\n**`scheduler\/models.py`** \u2014 \u65b0\u589e\u6a21\u7d44\u5e38\u6578 `MIN_PRIORITY = 0` \/ `MAX_PRIORITY = 9`\uff0c\u4ee5\u53ca\u53ef\u91cd\u8907\u4f7f\u7528\u7684 `validate_priority(priority)` \u51fd\u5f0f\uff0c\u8a72\u51fd\u5f0f\u6703\u91dd\u5c0d\u975e\u6574\u6578\u503c\uff0c\u4ee5\u53ca\u8d85\u51fa 0 \u81f3 9\uff08\u542b\uff09\u7bc4\u570d\u7684\u503c\u62cb\u51fa `ValueError`\u3002 \u5118\u7ba1 `bool` \u662f `int` \u7684\u5b50\u985e\u5225\uff0c\u4f46\u4ecd\u6703\u88ab\u660e\u78ba\u62d2\u7d55\uff0c\u56e0\u6b64 `True` \u7121\u6cd5\u4ee5\u512a\u5148\u7d1a 1 \u7684\u5f62\u5f0f\u6df7\u5165\u3002 \u51cd\u7d50\u7684 `Job` \u8cc7\u6599\u985e\u5225\u65b0\u589e\u4e86\u5e36\u6709\u9810\u8a2d\u503c\u7684\u5c3e\u96a8\u6b04\u4f4d `priority: int = MIN_PRIORITY`\uff0c\u4ee5\u7dad\u6301\u73fe\u6709 3 \u53c3\u6578\u5efa\u69cb\u65b9\u5f0f\u7684\u904b\u4f5c\uff1b\u540c\u6642\u65b0\u589e\u4e86\u6703\u547c\u53eb\u9a57\u8b49\u5668\u7684 `__post_init__` \u65b9\u6cd5\uff0c\u78ba\u4fdd\u7121\u8ad6\u900f\u904e\u4f55\u7a2e\u8def\u5f91\u90fd\u7121\u6cd5\u5efa\u7acb\u7121\u6548\u7684\u512a\u5148\u7d1a\u3002 `to_dict()` \u7dad\u6301\u70ba `asdict(self)`\uff0c\u56e0\u6b64\u512a\u5148\u7d1a\u6703\u81ea\u52d5\u4ee5\u6b04\u4f4d\u9806\u5e8f\u51fa\u73fe\u5728\u5e8f\u5217\u5316\u8f38\u51fa\u4e2d\u3002\n\n**`scheduler\/repository.py`** \u2014 `JobRepository.all()` \u63a5\u53d7\u4e00\u500b\u53ef\u9078\u7684 `min_priority` \u53c3\u6578\uff0c\u4e26\u5728\u73fe\u6709\u7684 `sorted(self._jobs)` \u7406\u89e3\u5f0f\u4e2d\u9032\u884c\u7be9\u9078\uff0c\u56e0\u6b64\u53ef\u900f\u904e\u539f\u672c\u5c31\u5df2\u63d0\u4f9b\u6b64\u529f\u80fd\u7684\u55ae\u4e00\u7a0b\u5f0f\u8def\u5f91\u4f86\u4fdd\u8b49\u8b58\u5225\u78bc\u7684\u5347\u5e8f\u6392\u5217\uff0c\u800c\u975e\u5728\u7be9\u9078\u5f8c\u91cd\u65b0\u5efa\u7acb\u3002 \u9810\u8a2d\u53c3\u6578\u4fdd\u7559\u4e86\u5c0d\u73fe\u6709\u547c\u53eb\u8005\u7684\u539f\u6709\u7121\u53c3\u6578\u884c\u70ba\u3002\u5132\u5b58\u6a5f\u5236\u672c\u8eab\u7121\u9700\u8b8a\u66f4\uff1a\u5132\u5b58\u5eab\u5132\u5b58\u5b8c\u6574\u7684 `Job` \u5be6\u4f8b\uff0c\u56e0\u6b64\u512a\u5148\u7d1a\u5f97\u4ee5\u4fdd\u7559\uff0c\u4e26\u5728 `save`\/`get`\/`all` \u4e4b\u9593\u4f86\u56de\u50b3\u905e\u3002\n\n**`scheduler\/service.py`** \u2014 `create_job` \u63a5\u53d7\u4e00\u500b\u53ef\u9078\u7684\u5c3e\u96a8 `priority` \u53c3\u6578\uff08\u9810\u8a2d\u503c\u70ba 0\uff09\uff0c\u4e26\u5728\u5efa\u7acb `Job` \u4e4b\u524d\u9032\u884c\u9a57\u8b49\uff0c\u56e0\u6b64\u932f\u8aa4\u6703\u5728\u670d\u52d9\u908a\u754c\u89f8\u767c\uff0c\u5176 `ValueError` \u5408\u7d04\u8207\u73fe\u6709\u7684\u7a7a\u540d\u7a31\u6aa2\u67e5\u76f8\u540c\u3002 `list_jobs(min_priority=0)` \u6703\u5c07\u8655\u7406\u6b0a\u59d4\u6d3e\u7d66\u5132\u5b58\u5eab\u3002\u6392\u5e8f\u8207\u7be9\u9078\u529f\u80fd\u96c6\u4e2d\u65bc\u55ae\u4e00\u4f4d\u7f6e\uff0c\u800c\u975e\u91cd\u8907\u5be6\u73fe\u3002\n\n**\u95dc\u65bc `min_priority` \u9a57\u8b49\u7684\u8a2d\u8a08\u8aaa\u660e\uff1a** \u96d6\u7136\u5176\u985e\u578b\u6aa2\u67e5\u70ba\u6574\u6578\uff0c\u4f46\u523b\u610f*\u672a*\u5c07\u7bc4\u570d\u9650\u5236\u5728 0\u20139 \u4e4b\u9593\u3002 0\u20139 \u898f\u5247\u6703\u9650\u5236\u5de5\u4f5c\u9805\u76ee\u53ef\u5132\u5b58\u7684\u503c\uff1b\u95be\u503c\u5c6c\u65bc\u67e5\u8a62\u53c3\u6578\uff0c\u82e5\u62d2\u7d55\u4f8b\u5982 `min_priority=10`\uff0c\u5c07\u6703\u5c07\u4e00\u500b\u5408\u6cd5\u7684\u300c\u7121\u5339\u914d\u7d50\u679c\u300d\u67e5\u8a62\u8f49\u70ba\u932f\u8aa4\u3002 \u7576\u6c92\u6709\u4efb\u4f55\u5de5\u4f5c\u5177\u6709\u512a\u5148\u7d1a 9 \u6642\uff0c`list_jobs(min_priority=9)` \u6703\u8fd4\u56de `[]`\uff0c\u6b64\u60c5\u6cc1\u5df2\u7531\u6e2c\u8a66\u6db5\u84cb\u3002\n\n\u5df2\u95b1\u8b80 `scheduler\/time_rules.py` \u4f46\u672a\u9032\u884c\u4efb\u4f55\u4fee\u6539\u2014\u2014\u5176\u6587\u4ef6\u4e2d\u8a18\u8f09\u7684\u590f\u4ee4\u6642\u8f49\u63db\u6a5f\u5236\u5c6c\u65bc\u65e2\u6709\u7684\u9810\u8a2d\u884c\u70ba\uff0c\u8d85\u51fa\u672c\u6b21\u4efb\u52d9\u7bc4\u570d\uff0c\u4e14\u8b8a\u66f4\u6b64\u6a5f\u5236\u5c07\u69cb\u6210\u7121\u95dc\u7684\u884c\u70ba\u8b8a\u66f4\u3002 \u7531\u65bc\u672a\u65b0\u589e\u6216\u79fb\u9664\u4efb\u4f55\u6a94\u6848\uff0c\u56e0\u6b64 `fixture-manifest.json` \u4ecd\u4fdd\u6301\u6e96\u78ba\uff08\u5df2\u900f\u904e\u7a0b\u5f0f\u9a57\u8b49\uff09\u3002\n\n### \u65b0\u589e\u6e2c\u8a66\u8986\u84cb\u7387\n\n\u9810\u8a2d\u503c\u70ba 0\uff1b\u900f\u904e `JobRepository` \u9032\u884c\u5132\u5b58\u5f80\u8fd4\uff1b`to_dict()` \u8f38\u51fa\u4e2d\u7684\u512a\u5148\u7d1a\uff1b\u63a5\u53d7\u908a\u754c\u503c 0 \u548c 9\uff1b\u62d2\u6536\u8d85\u51fa\u7bc4\u570d\u7684 \u22121\/10\/100\uff1b \u975e\u6574\u6578 `\"3\"`\/`3.5`\/`None`\/`True` \u88ab\u62d2\u7d55\uff1b\u76f4\u63a5\u5728\u6a21\u578b\u5c64\u7d1a\u9032\u884c\u9a57\u8b49\uff1b\u672a\u904e\u6ffe\u7684\u6e05\u55ae\u9806\u5e8f\uff1b\u904e\u6ffe\u5f8c\u6e05\u55ae\u4ecd\u4fdd\u7559\u8b58\u5225\u78bc\u5347\u5e8f\uff1b\u5305\u542b\u908a\u754c\u7684\u95be\u503c\uff1b\u7a7a\u7d50\u679c\uff1b\u975e\u6574\u6578 `min_priority` \u88ab\u62d2\u7d55\u3002.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">\u6e2c\u8a66\u74b0\u5883\u9650\u5236\uff1a\u9019\u662f\u4e00\u500b\u5c0f\u578b\u96e2\u7dda Python \u5132\u5b58\u5eab\u3002Claude \u5728 CLI OAuth \u904e\u671f\u5f8c\u6703\u4f7f\u7528\u5b50\u4ee3\u7406\u4f5c\u70ba\u5099\u7528\u65b9\u6848\uff0c\u56e0\u6b64\u9694\u96e2\u72c0\u614b\u8207\u6191\u8b49\u53ef\u898b\u6027\u4e26\u4e0d\u5b8c\u5168\u4e00\u81f4\u3002.<\/p><\/article>\n\n\n\n<h3 class=\"wp-block-heading\">\u908a\u7de3\u60c5\u6cc1\u4e0b\u7684\u932f\u8aa4\u4fee\u6b63<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">T3 \u6e2c\u8a66\u4e86\u590f\u4ee4\u6642\u6392\u7a0b\u7684\u7f3a\u9677\u3002\u5169\u4f4d\u4ee3\u7406\u5747\u7372\u5f97 30\/30 \u5206\uff0c\u4e26\u901a\u904e\u4e86\u76f8\u540c\u7684\u6625\u5b63\u8207\u79cb\u5b63\u96b1\u85cf\u6aa2\u67e5\u3002Claude Code \u91dd\u5c0d\u6a21\u7a1c\u5169\u53ef\u53ca\u88ab\u8df3\u904e\u7684\u5730\u65b9\u6642\u9593\u3001\u7c21\u55ae\u7c97\u7cd9\u7684\u8f38\u5165\uff0c\u4ee5\u53ca\u591a\u65e5\u6efe\u52d5\uff0c\u65b0\u589e\u4e86\u660e\u78ba\u7684\u8986\u84cb\u7bc4\u570d\u3002Codex \u5c0d\u65e5\u66c6\u65e5\u9032\u884c\u4e86\u66f4\u7d30\u5fae\u7684\u8abf\u6574\uff0c\u4e26\u901a\u904e\u4e86\u51cd\u7d50\u5408\u7d04\u7684\u6e2c\u8a66\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7576\u51fd\u5f0f\u5eab\u88ab\u5ee3\u6cdb\u91cd\u8907\u4f7f\u7528\uff0c\u6216\u6392\u7a0b\u932f\u8aa4\u7684\u4ee3\u50f9\u5f88\u9ad8\u6642\uff0c\u66f4\u5ee3\u6cdb\u7684\u908a\u754c\u6848\u4f8b\u6e2c\u8a66\u80fd\u5e36\u4f86\u4fe1\u5fc3\u3002\u7576\u7f3a\u9677\u5df2\u660e\u78ba\u9694\u96e2\uff0c\u4e14\u5718\u968a\u5e0c\u671b\u5c07\u884c\u70ba\u8b8a\u66f4\u964d\u81f3\u6700\u4f4e\u6642\uff0c\u5c40\u90e8\u8b8a\u66f4\u4fbf\u5177\u6709\u5438\u5f15\u529b\u3002 \u5be6\u969b\u7684\u5be9\u67e5\u554f\u984c\u4e26\u975e\u300c\u54ea\u4e00\u65b9\u5beb\u7684\u7a0b\u5f0f\u78bc\u66f4\u591a\uff1f\u300d\u800c\u662f\u8a72\u4fee\u88dc\u7a0b\u5f0f\u662f\u5426\u4fee\u6b63\u4e86\u6240\u8ff0\u7684\u6839\u672c\u539f\u56e0\u3001\u662f\u5426\u7dad\u6301\u4e86\u5468\u908a\u7684\u5408\u7d04\uff0c\u4ee5\u53ca\u662f\u5426\u9a57\u8b49\u4e86\u9ad8\u98a8\u96aa\u7684\u908a\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\u5132\u5b58\u5eab\u6e2c\u8a66<\/p><h3 class=\"d-title\">\u4fee\u5fa9\u590f\u4ee4\u6642\u8f49\u63db\u671f\u9593\u7684\u6bcf\u65e5\u6392\u7a0b<\/h3><p class=\"d-sub\">\u5728\u6625\u5b63\u8207\u79cb\u5b63\u7684\u904e\u6e21\u671f\u9593\uff0c\u7dad\u6301\u6240\u8981\u6c42\u7684\u7d10\u7d04\u58c1\u9418\u6642\u9593\u3002.<\/p><\/div><span class=\"d-pill\">\u9818\u5e36 \u00b7 \u4e0d\u540c\u7c97\u7d30<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"\u300aCodex\u300b\u7d50\u679c\"><div class=\"d-product\"><span>\u300a\u53e4\u7c4d\u300b<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7e8c\u6642\u9593<\/span><strong>99 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>4 + 2 \u96b1\u85cf<\/strong><\/div><div class=\"d-metric\"><span>\u7bc4\u570d<\/span><strong>\u72f9\u7a84\u8655\u7684\u4fee\u5fa9<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u500b\u6709\u6548\u7684\u8f38\u51fa\u7247\u6bb5<\/div><pre>\u6839\u672c\u539f\u56e0\uff1a\u8a72\u5be6\u4f5c\u589e\u52a0\u4e86 24 \u500b UTC \u7d93\u904e\u5c0f\u6642\u3002\n\n\u4fee\u6b63\u65b9\u5f0f\uff1a\u5c07\u6642\u9593\u5411\u524d\u63a8\u9032\u4e00\u500b\u7576\u5730\u65e5\u66c6\u65e5\u3002\u6625\u5b63\u8207\u79cb\u5b63\u7684\u51cd\u7d50\u6aa2\u67e5\u5747\u901a\u904e\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8a55\u8ad6\u8005\u89c0\u9ede\uff1a<\/strong> \u8a72\u8f03\u7a84\u7684\u4fee\u6b63\u6848\u901a\u904e\u4e86\u9019\u4efd\u5b8c\u5168\u51cd\u7d50\u7684\u5408\u7d04\u3002.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \u4ee3\u78bc\u7d50\u679c\"><div class=\"d-product\"><span>\u514b\u52de\u5fb7\u00b7\u79d1\u5fb7<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7e8c\u6642\u9593<\/span><strong>118 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>10 + 2 \u96b1\u85cf<\/strong><\/div><div class=\"d-metric\"><span>\u7bc4\u570d<\/span><strong>\u908a\u7de3\u8986\u84cb\u7bc4\u570d<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u500b\u6709\u6548\u7684\u8f38\u51fa\u7247\u6bb5<\/div><pre>\u5df2\u6db5\u84cb\u6625\u5b63\u3001\u79cb\u5b63\u3001\u907a\u6f0f\u53ca\u4e0d\u660e\u78ba\u7684\u7576\u5730\u6642\u9593\u3001\u7c21\u55ae\u7c97\u7565\u7684\u8f38\u5165\uff0c\u4ee5\u53ca\u591a\u65e5\u6efe\u52d5\u8655\u7406\u3002\n\n\u5728\u64f4\u5927\u56de\u6b78\u6e2c\u8a66\u7bc4\u570d\u5f8c\uff0c\u5169\u9805\u51cd\u7d50\u7684\u96b1\u85cf\u6aa2\u67e5\u5747\u901a\u904e\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8a55\u8ad6\u8005\u89c0\u9ede\uff1a<\/strong> \u5c0d\u908a\u7de3\u6848\u4f8b\u7684\u6db5\u84cb\u7bc4\u570d\u66f4\u5ee3\uff1b\u5728\u300c\u51cd\u7d50\u300d\u8a55\u5206\u6a19\u6e96\u4e0b\uff0c\u529f\u80fd\u5206\u6578\u4fdd\u6301\u4e0d\u8b8a\u3002.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>\u6aa2\u8996\u5b8c\u6574\u7684 Codex \u8f38\u51fa\u5167\u5bb9<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u3001\u7d93\u904e\u6e05\u7406\u7684\u3001\u9996\u6b21\u6709\u6548\u7684\u8f38\u51fa<\/p><pre>\u5df2\u5be6\u4f5c\u590f\u4ee4\u6642\u4fee\u6b63\u3002\n\n\u8b8a\u66f4\u7684\u6a94\u6848\uff1a\n\n- [scheduler\/time_rules.py](.\/scheduler\/time_rules.py)\n- [tests\/test_time_rules.py](.\/tests\/test_time_rules.py)\n\n\u8b8a\u66f4\u5167\u5bb9\uff1a\n\n- \u5c07\u6642\u9593\u5411\u524d\u8abf\u6574\u4e00\u500b\u7576\u5730\u65e5\u66c6\u65e5\uff0c\u800c\u975e 24 \u500b UTC \u5c0f\u6642\u3002\n- \u65b0\u589e\u7d10\u7d04\u6625\u590f\u6642\u9593\u8207\u79cb\u5b63\u6642\u9593\u7684\u56de\u6b78\u6e2c\u8a66\u3002\n- \u9a57\u8b49\u6240\u7d93\u904e\u7684 UTC \u6642\u9593\u9593\u9694\u5206\u5225\u70ba 23 \u5c0f\u6642\u8207 25 \u5c0f\u6642\u3002\n\n\u6aa2\u67e5\u7d50\u679c\uff1a\n\n- \u55ae\u5143\u6e2c\u8a66\uff1a4 \u9805\u901a\u904e\u3002\n- \u5167\u5b58\u8a9e\u6cd5\u6aa2\u67e5\uff1a7 \u500b Python \u6a94\u6848\u901a\u904e\u3002\n- \u7531\u65bc Python \u5c07\u5176\u5feb\u53d6\u91cd\u5b9a\u5411\u81f3\u6307\u5b9a\u5de5\u4f5c\u5340\u4e4b\u5916\uff0c\u5c0e\u81f4\u4f4d\u5143\u7d44\u78bc\u7de8\u8b6f\u53d7\u963b\uff1b\u672a\u5beb\u5165\u4efb\u4f55\u5916\u90e8\u6a94\u6848\u3002\n\n**\u7d50\u8ad6\uff1a** `next_daily_run` \u73fe\u5df2\u80fd\u5728\u590f\u4ee4\u6642\u8f49\u63db\u671f\u9593\u4fdd\u7559\u6240\u8981\u6c42\u7684\u5be6\u6642\u5c0f\u6642\u3002\u7121\u9700\u505a\u51fa\u4efb\u4f55\u6c7a\u7b56\u3002.<\/pre><\/div><\/details><details class=\"d-full\"><summary>\u6aa2\u8996\u5b8c\u6574\u7684 Claude \u7a0b\u5f0f\u78bc\u8f38\u51fa<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u4ea4\u63a5\u8a18\u9304\uff0c\u5305\u542b\u7b2c\u4e00\u9805\u6709\u6548\u7684\u8f38\u51fa\u5167\u5bb9\u7684\u9010\u5b57\u8a18\u9304<\/p><pre># T3 \u57f7\u884c\u8a18\u9304 \u2014 DST \u932f\u8aa4\u4fee\u6b63\n\n## \u57f7\u884c\u53c3\u6578\n\n| \u6b04\u4f4d | \u503c |\n| --- | --- |\n| \u4efb\u52d9 | `T3` |\n| \u51cd\u7d50\u63d0\u793a | `01-prompts\/T3.md` |\n| \u51cd\u7d50\u63d0\u793a\u8a5e SHA-256 | `3fee50d0230f27f8d6dd7f12e050fa3f0b7f5fb77d9559361fee96e5f1a47307` |\n| \u57f7\u884c\u55ae\u5143 | \u9694\u96e2\u7684 Claude \u5b50\u4ee3\u7406\uff0c`\u901a\u7528\u578b`\uff0c\u5168\u65b0\u4e0a\u4e0b\u6587 |\n| \u9694\u96e2\u65b9\u6cd5 | **\u5b50\u4ee3\u7406\u5099\u7528\u65b9\u6848**\uff08\u5df2\u8a18\u9304\u7684\u964d\u7d1a \u2014 \u53c3\u898b `results\/isolation-decision.md`\uff09 |\n| \u6307\u6d3e\u7684\u4e7e\u6de8\u526f\u672c | `runtime\/workspaces\/T3` |\n| Claude \u7a0b\u5f0f\u78bc\u7248\u672c | `2.1.220` |\n| \u6a21\u578b\u8a2d\u5b9a | `claude-opus-5` |\n| start_utc | `2026-07-28T10:28:05Z` |\n| end_utc | `2026-07-28T10:30:03Z` |\n| \u6301\u7e8c\u6642\u9593 | 118 \u79d2\uff08\u8207 T1\u3001T2\u3001T4 \u540c\u6642\u9032\u884c\uff1b\u975e\u7d14\u7cb9\u7684\u5ef6\u9072\u6e2c\u91cf\uff09 |\n| \u5617\u8a66\u6b21\u6578 | 1 |\n| \u72c0\u614b | `\u6709\u6548` |\n| \u4eba\u70ba\u5e72\u9810 | \u7121 |\n\n## Safe \u5de5\u5177\u6458\u8981\n\n\u50c5\u9650\u65bc\u6307\u5b9a\u5de5\u4f5c\u5340\u5167\u7684 `date`\u3001`Read`\/`Edit`\uff0c`python3 -m unittest discover`\u3001\n`python3 -m compileall`\u3001\u4e00\u6b21\u8a18\u61b6\u9ad4\u5167\u7684\u9670\u6027\u5c0d\u7167\u57f7\u884c\uff0c\u4ee5\u53ca\u4e00\u4efd\u6e05\u55ae\u5b8c\u6574\u6027\u6aa2\u67e5\u3002\n\u50c5\u4f7f\u7528\u6a19\u6e96\u51fd\u5f0f\u5eab\uff08`datetime`\u3001`zoneinfo`\u3001`unittest`\uff09\u3002\u7121\u7db2\u8def\u9023\u7dda\uff0c\u7121\u5b89\u88dd\u7a0b\u5e8f\u3002\n\n## \u8b8a\u66f4\u7684\u6a94\u6848\n\n`scheduler\/time_rules.py`\uff08\u4fee\u6b63\u5167\u5bb9 \u2014 \u50c5\u4fee\u6539 `next_daily_run` \u7684\u4e3b\u9ad4\u8207 docstring\uff09\uff0c\n`tests\/test_scheduler.py`\uff08\u65b0\u589e `NextDailyRunTests`\uff0c8 \u500b\u6e2c\u8a66\uff0c\u4ee5\u53ca\u4e00\u500b `_elapsed` \u8f14\u52a9\u51fd\u5f0f\uff1b\n\u73fe\u6709\u6e2c\u8a66\u672a\u4fee\u6539\uff09\u3002\u672a\u89f8\u53ca\u5176\u4ed6\u6a21\u7d44\uff0c\u4ea6\u672a\u65b0\u589e\u6a94\u6848\u3002\u5b8c\u6574\u4fee\u88dc\u6a94\uff1a\n`results\/T3\/patch.diff`\u3002\n\n## \u96e2\u7dda\u6aa2\u67e5\u7d50\u679c\n\n\u7531\u4efb\u52d9\u57f7\u884c\u5668\u56de\u5831\uff1a\n\n| \u6aa2\u67e5\u9805\u76ee | \u7d50\u679c |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v` | **10 \u901a\u904e\uff0c0 \u5931\u6557**\uff082 \u500b\u65e2\u6709\u6e2c\u8a66 + 8 \u500b\u65b0\u6e2c\u8a66\uff09 |\n| `python3 -m compileall -q scheduler tests` | \u7121\u932f\u8aa4 |\n| \u6e05\u55ae\u5b8c\u6574\u6027\u8207 `fixture-manifest.json` \u6bd4\u5c0d | 0 \u9805\u7f3a\u5931\uff0c0 \u9805\u7570\u5e38 |\n| \u8ca0\u9762\u5c0d\u7167\u7d44\uff1a\u5728\u8a18\u61b6\u9ad4\u4e2d\u4fee\u88dc\u7a2e\u5b50\u5be6\u4f5c\uff0c\u50c5\u9650 `NextDailyRunTests` | \u57f7\u884c 8 \u9805\uff0c**5 \u9805\u5982\u9810\u671f\u5931\u6557**\uff0c\u5305\u542b\u5169\u9805\u590f\u4ee4\u6642\u9593\u6e2c\u8a66 |\n\n\u7531\u5354\u8abf\u54e1\u5728\u5de5\u4f5c\u5340\u5916\u90e8\u7368\u7acb\u91cd\u65b0\u9a57\u8b49\uff1a\n\n| \u6aa2\u67e5\u9805\u76ee | \u9000\u51fa\u72c0\u614b | \u7d50\u679c |\n| --- | --- | --- |\n| \u516c\u958b\u6e2c\u8a66\u5957\u4ef6\uff08`results\/checks\/T3-public.txt`\uff09 | 0 | 10 \u9805\u6e2c\u8a66\uff0c\u901a\u904e |\n| \u96b1\u85cf\u9a57\u8b49\u5668 `03-checks\/test_t3_hidden.py` (`results\/checks\/T3-hidden.txt`) | 0 | 2 \u9805\u6e2c\u8a66\uff0c\u901a\u904e |\n\n\u96b1\u85cf\u9a57\u8b49\u5668\u5728\u4f7f\u7528\u539f\u59cb\u56fa\u5b9a\u88dd\u7f6e\u526f\u672c\u6642\u5931\u6557\uff08\u9000\u51fa\u4ee3\u78bc 1\uff09\u3002\u8acb\u53c3\u95b1\n`results\/checks\/validator-controls.md`\u3002\n\n## \u9ec3\u91d1\u5730\u5716\u884c\u70ba\u8986\u84cb\u7387\n\n`03-checks\/gold-map.json` \u4e2d\u6240\u6709\u56db\u9805\u5fc5\u5099\u884c\u70ba\u5747\u5df2\u6eff\u8db3\uff1a\n\n| \u5fc5\u5099\u884c\u70ba | \u8b49\u64da |\n| --- | --- |\n| \u5be6\u6642\u9418\u5c0f\u6642\u6578\u7dad\u6301\u4e0d\u8b8a | \u5c0d\u539f\u59cb\u672c\u5730\u5be6\u6642\u9418\u9032\u884c\u589e\u91cf\u8abf\u6574\uff0c\u6642\u5340\u91cd\u65b0\u7d81\u5b9a\uff1b\u65bc\u6bcf\u9805\u590f\u4ee4\u6642\u6e2c\u8a66\u4e2d\u5747\u901a\u904e\u9a57\u8b49 |\n| \u6625\u5b63\u8f49\u63db\u5df2\u6db5\u84cb | `test_spring_forward_keeps_requested_hour` \u2014 \u7dad\u6301 09:30 \u6642\uff0c\u504f\u79fb\u91cf `-04:00`\uff0c\u6b77\u6642 23 \u5c0f\u6642 |\n| \u6db5\u84cb\u79cb\u5b63\u8f49\u63db | `test_fall_back_keeps_requested_hour` \u2014 \u7dad\u6301 09:30 \u6642\uff0c\u6642\u5340\u504f\u79fb\u91cf `-05:00`\uff0c\u6b77\u6642 25 \u5c0f\u6642 |\n| \u4f7f\u7528 IANA \u6642\u5340 | \u4f86\u81ea\u6a19\u6e96\u51fd\u5f0f\u5eab\u7684 `ZoneInfo(\"America\/New_York\")` |\n\n\u9664\u4e86\u5fc5\u6e2c\u96c6\u4e4b\u5916\uff0c\u57f7\u884c\u5668\u9084\u6db5\u84cb\u4e86 PEP 495 \u7684\u5169\u500b\u908a\u754c\u6848\u4f8b \u2014\u2014 \u56e0\u300c\u6625\u4ee4\u6642\u300d\u800c\n\u88ab\u8df3\u904e\u7684\u7246\u9418\u6642\u9593\uff0c\u4ee5\u53ca\u300c\u79cb\u4ee4\u6642\u300d\u671f\u9593\u7684\u6a21\u7cca\u7246\u9418\u6642\u9593 \u2014\u2014 \u52a0\u4e0a\u6a6b\u8de8\u6bcf\u6b21\u8f49\u63db\u7684\u4e03\u5929\n\u6efe\u52d5\uff0c\u4ee5\u53ca\u300c\u5929\u771f\u8f38\u5165\u300d\u884c\u70ba\u3002\n\n## \u5df2\u4fee\u6b63\u7684\u932f\u8aa4\n\n\u5169\u9805\u56e0\u81ea\u8eab\u539f\u56e0\u5c0e\u81f4\u7684\u6e2c\u8a66\u65b7\u8a00\u5931\u6557\uff1a\u91dd\u5c0d\u5171\u4eab\u540c\u4e00\n`tzinfo` \u7684\u5169\u500b\u65e5\u671f\u6642\u9593\u9032\u884c `following - previous` \u904b\u7b97\u6642\uff0c\u6703\u6e1b\u53bb\u539f\u59cb\u7246\u9418\u6642\u9593\uff0c\u56e0\u6b64\u7d93\u904e\u6642\u9593\u7684\u65b7\u8a00\u986f\u793a\u70ba 1 \u5929\u800c\u5931\u6557\u3002\n\u5be6\u4f5c\u662f\u6b63\u78ba\u7684\uff0c\u4f46\u65b7\u8a00\u6709\u8aa4\uff1b\u5df2\u900f\u904e `_elapsed`\n\u8f14\u52a9\u51fd\u5f0f\u4fee\u6b63\uff0c\u8a72\u51fd\u5f0f\u6703\u5148\u5c07\u5169\u500b\u64cd\u4f5c\u6578\u8f49\u63db\u70ba UTC\u3002\u7121\u5de5\u5177\u3001\u532f\u5165\u6216\u74b0\u5883\u932f\u8aa4\u3002\n\u57f7\u884c\u5f8c\u5df2\u79fb\u9664 `__pycache__` \u6b98\u7559\u6a94\u6848\u3002\n\n## \u53ef\u898b\u8f38\u51fa \uff08\u539f\u6587\u7167\u9304\uff09\n\n**\u91cd\u73fe\u6b65\u9a5f**\n\n\u5728 2024 \u5e74\u590f\u4ee4\u6642\u8f49\u63db\u524d\u5f8c\uff0c\u5206\u5225\u4ee5 `America\/New_York` \u65e5\u671f\u6642\u9593\u4f5c\u70ba\u53c3\u6578\u547c\u53eb `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   # \u6642\u5340\u504f\u79fb +1\n2024-11-02T09:30:00-04:00 -&gt; 2024-11-03T08:30:00-05:00   # \u5c0f\u6642\u504f\u79fb -1\n```\n\n\u4e00\u9805\u9810\u5b9a\u65bc\u7576\u5730\u6642\u9593 09:30 \u57f7\u884c\u7684\u4efb\u52d9\uff0c\u5728\u590f\u4ee4\u6642\u958b\u59cb\u5f8c\u65bc 10:30 \u89f8\u767c\uff0c\u800c\u5728\u51ac\u4ee4\u6642\u958b\u59cb\u5f8c\u5247\u65bc 08:30 \u89f8\u767c\u3002\n\n**\u6839\u672c\u539f\u56e0**\n\n\u9810\u8a2d\u5be6\u4f5c\u5c07\u300c\u6bcf\u65e5\u300d\u8996\u70ba\u56fa\u5b9a\u7684\u7d55\u5c0d\u6642\u9593\u9577\u5ea6\uff1a\n\n```python\nelapsed = previous_run.astimezone(timezone.utc) + timedelta(hours=24)\nreturn elapsed.astimezone(previous_run.tzinfo)\n```\n\n\u5148\u8f49\u63db\u70ba UTC \u6703\u4f7f `timedelta(hours=24)` \u7684\u7d93\u904e\u6642\u9593\u7cbe\u78ba\u70ba 24 \u5c0f\u6642\u3002 \u4f46\u5728 IANA \u6642\u5340\u4e2d\uff0c\u7576\u5730\u65e5\u66c6\u65e5\u65bc\u300c\u6625\u4ee4\u6642\u300d\u8abf\u6574\u65e5\u70ba 23 \u5c0f\u6642\uff0c\u800c\u300c\u79cb\u4ee4\u6642\u300d\u8abf\u6574\u65e5\u5247\u70ba 25 \u5c0f\u6642\uff0c\u56e0\u6b64\u56fa\u5b9a 24 \u5c0f\u6642\u7684\u504f\u79fb\u91cf\u5fc5\u7136\u6703\u5c0e\u81f4\u7d50\u679c\u8207\u8acb\u6c42\u7684\u5be6\u6642\u6642\u9593\u76f8\u5dee\u4e00\u5c0f\u6642\u3002\n\n**\u4fee\u6b63\u65b9\u6848**\uff08`scheduler\/time_rules.py`\uff09\n\n\u6bcf\u65e5\u91cd\u8907\u662f\u4e00\u9805\u65e5\u66c6\u898f\u5247\uff0c\u56e0\u6b64\u73fe\u5728\u6703\u5148\u5c07\u589e\u91cf\u5957\u7528\u81f3\u539f\u59cb\u7684\u672c\u5730\u5be6\u6642\u9418\uff0c\u4e4b\u5f8c\u518d\u91cd\u65b0\u9644\u52a0\u6642\u5340\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\u70ba\u4f55\u6b64\u65b9\u6cd5\u6b63\u78ba\uff1a\n- \u91dd\u5c0d\u539f\u59cb\u503c\u9032\u884c\u7684\u5be6\u6642\u9418\u904b\u7b97\u8207\u6642\u5340\u504f\u79fb\u91cf\u7121\u95dc\uff0c\u56e0\u6b64\u6240\u8981\u6c42\u7684\u6642\uff1a\u5206\u5728\u8a2d\u8a08\u4e0a\u6703\u88ab\u4fdd\u7559\uff1b \u63a5\u8457 `zoneinfo` \u6703\u63d0\u4f9b\u65b0\u65e5\u671f\u7576\u6642\u751f\u6548\u7684 UTC \u504f\u79fb\u91cf\uff08\u5df2\u9a57\u8b49\uff1a\u6625\u65e5\u8abf\u5feb\u5f8c\u70ba `-04:00`\uff0c\u79cb\u65e5\u8abf\u56de\u5f8c\u70ba `-05:00`\uff0c\u5be6\u969b\u7d93\u904e\u6642\u9593\u5206\u5225\u70ba 23 \u5c0f\u6642\u8207 25 \u5c0f\u6642\uff09\u3002\n- `fold=0` \u52a0\u4e0a UTC \u5f80\u8fd4\u8655\u7406\uff0c\u53ef\u8655\u7406\u7d14\u7246\u9418\u904b\u7b97\u6240\u7559\u4e0b\u7684\u5169\u500b\u672a\u5b9a\u7fa9\u908a\u754c\u60c5\u6cc1\u3002\u6839\u64da PEP 495\uff0c\u4e00\u500b *\u88ab\u8df3\u904e* \u7684\u7246\u9418\u6642\u9593 \uff082024-03-10 02:30\uff09\u5728 `fold=0` \u6642\u5177\u6709\u8f49\u63db\u524d\u7684\u504f\u79fb\u91cf\uff0c\u56e0\u6b64\u5f80\u8fd4\u8655\u7406\u6703\u5c07\u5176\u6b63\u898f\u5316\u70ba\u5be6\u969b\u6642\u523b 03:30 EDT\uff0c\u800c\u975e\u8fd4\u56de\u4e00\u500b\u672a\u6307\u5b9a\u5177\u9ad4\u6642\u523b\u7684 datetime \u7269\u4ef6\u3002 \u4e00\u500b *\u6a21\u7a1c\u5169\u53ef* \u7684\u7246\u9418\u6642\u9593\uff082024-11-03 01:30\uff09\u6703\u78ba\u5b9a\u6027\u5730\u89e3\u6790\u70ba\u5176\u9996\u6b21\u51fa\u73fe\u7684\u6642\u9593\u9ede\uff08EDT\uff09\uff0c\u800c\u975e\u96a8\u6a5f\u7d50\u679c\u3002\n- \u539f\u59cb\u8f38\u5165\u4fdd\u7559\u5176\u539f\u6709\u542b\u7fa9\uff08\u7d14\u7cb9\u589e\u52a0 1 \u500b\u65e5\u66c6\u65e5\uff09\u2014\u2014\u4e0d\u6703\u5c0d\u547c\u53eb\u65b9\u65bd\u52a0\u65b0\u7684 `tzinfo` \u8981\u6c42\u3002\n\n\u8b8a\u66f4\u7bc4\u570d\u4fdd\u6301\u72f9\u7a84\uff1a\u50c5 `next_daily_run` \u7684\u4e3b\u9ad4\/\u6587\u6a94\u5b57\u4e32\u6709\u6240\u8b8a\u66f4\u3002 `service.py`\u3001`models.py`\u3001`repository.py` \u53ca `__init__.py` \u5747\u672a\u66f4\u52d5\uff0c\u672a\u65b0\u589e\u4efb\u4f55\u6a94\u6848\uff0c\u4e14\u6e2c\u8a66\u5957\u4ef6\u6e05\u55ae\u4ecd\u5b8c\u5168\u543b\u5408\uff08\u7121\u907a\u6f0f\u6216\u610f\u5916\u6a94\u6848\uff09\u3002\u50c5\u4f7f\u7528\u6a19\u6e96\u51fd\u5f0f\u5eab\uff08`datetime`\u3001`zoneinfo`\u3001`unittest`\uff09\u3002\n\n**\u56de\u6b78\u6e2c\u8a66**\uff08`tests\/test_scheduler.py`\u3001 \u65b0\u7684 `NextDailyRunTests`\uff0c\u5171 8 \u500b\u6e2c\u8a66\uff09\u6db5\u84cb\uff1a\u666e\u901a\u65e5\u7a69\u5b9a\u6027\u3001\u590f\u4ee4\u6642\u958b\u59cb\uff08\u6642\u5340\u504f\u79fb\u91cf + 23 \u5c0f\u6642\u5df2\u904e\uff09\u3001\u51ac\u4ee4\u6642\u958b\u59cb\uff08\u6642\u5340\u504f\u79fb\u91cf + 25 \u5c0f\u6642\u5df2\u904e\uff09\u3001\u6a6b\u8de8\u5404\u8f49\u63db\u6642\u9ede\u7684\u4e03\u65e5\u5faa\u74b0\u3001\u8df3\u904e\u5be6\u969b\u6642\u9593\u3001\u6a21\u7cca\u5be6\u969b\u6642\u9593\uff0c\u4ee5\u53ca\u7c21\u55ae\u8f38\u5165\u3002\n\n\u6709\u5169\u9ede\u503c\u5f97\u6ce8\u610f\u3002\u9996\u5148\uff0c\u6211\u6700\u521d\u7684\u7d93\u904e\u6642\u9593\u65b7\u8a00\u4f7f\u7528\u4e86 `following - previous`\uff1b\u7531\u65bc Python \u6703\u5ffd\u7565\u5171\u7528\u7684 `tzinfo` \u4e26\u76f4\u63a5\u6e1b\u53bb\u539f\u59cb\u7246\u9418\u6642\u9593\uff0c\u56e0\u6b64\u5169\u8005\u7686\u8fd4\u56de 1 \u5929\u800c\u6e2c\u8a66\u5931\u6557\u3002 \u5176\u5be6\u5be6\u73fe\u662f\u6b63\u78ba\u7684\uff0c\u4f46\u65b7\u8a00\u6709\u8aa4\u2014\u2014\u900f\u904e\u4e00\u500b\u5c07\u5169\u500b\u64cd\u4f5c\u6578\u8f49\u63db\u70ba UTC \u7684 `_elapsed` \u8f14\u52a9\u51fd\u5f0f\u4f86\u4fee\u6b63\u3002 \u5176\u6b21\uff0c\u6211\u900f\u904e\u5c0d\u5167\u5b58\u4e2d\u5df2\u521d\u59cb\u5316\u7684\u5be6\u4f5c\u526f\u672c\u91cd\u65b0\u57f7\u884c `NextDailyRunTests`\uff0c\u9a57\u8b49\u4e86\u9019\u4e9b\u6e2c\u8a66\u78ba\u5be6\u80fd\u5075\u6e2c\u5230\u539f\u59cb\u7f3a\u9677\uff1a8 \u500b\u6e2c\u8a66\u4e2d\u6709 5 \u500b\u5931\u6557\uff0c\u5305\u62ec\u5169\u500b\u590f\u4ee4\u6642\u6e2c\u8a66\u3002 \u5728\u5b58\u5728\u932f\u8aa4\u7684\u7248\u672c\u4e2d\u901a\u904e\u6e2c\u8a66\u7684\u9019\u4e09\u500b\u6848\u4f8b\uff08\u666e\u901a\u65e5\u3001\u8df3\u904e\u3001\u6a21\u7cca\u60c5\u6cc1\uff09\u50c5\u662f\u8a18\u9304\u884c\u70ba\uff0c\u800c\u975e\u5075\u6e2c\u56de\u6b78\u932f\u8aa4\u2014\u2014\u8df3\u904e\u8207\u6a21\u7cca\u60c5\u6cc1\u4e4b\u6240\u4ee5\u7d50\u679c\u4e00\u81f4\uff0c\u7d14\u5c6c\u5de7\u5408\uff0c\u56e0\u70ba +24 \u5c0f\u6642\u7684\u7d55\u5c0d\u504f\u79fb\u525b\u597d\u843d\u5728\u540c\u4e00\u500b\u6b63\u898f\u5316\u6642\u523b\u4e0a\u3002.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">\u6e2c\u8a66\u74b0\u5883\u9650\u5236\uff1a\u9019\u662f\u4e00\u500b\u5c0f\u578b\u96e2\u7dda Python \u5132\u5b58\u5eab\u3002Claude \u5728 CLI OAuth \u904e\u671f\u5f8c\u6703\u4f7f\u7528\u5b50\u4ee3\u7406\u4f5c\u70ba\u5099\u7528\u65b9\u6848\uff0c\u56e0\u6b64\u9694\u96e2\u72c0\u614b\u8207\u6191\u8b49\u53ef\u898b\u6027\u4e26\u4e0d\u5b8c\u5168\u4e00\u81f4\u3002.<\/p><\/article>\n\n\n\n<h2 id=\"code-review\" class=\"wp-block-heading\">\u7a0b\u5f0f\u78bc\u5be9\u67e5\u54c1\u8cea\u8207\u4eba\u5de5\u9a57\u8b49<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7a0b\u5f0f\u78bc\u5be9\u67e5\u4efb\u52d9\u6240\u5c55\u73fe\u7684\u6280\u80fd\uff0c\u8207\u529f\u80fd\u5be6\u4f5c\u6709\u6240\u4e0d\u540c\u3002\u4e00\u4f4d\u7a31\u8077\u7684\u5be9\u67e5\u8005\u5fc5\u9808\u627e\u51fa\u53ef\u91cd\u73fe\u7684\u554f\u984c\u3001\u8a55\u4f30\u5176\u5f71\u97ff\u7a0b\u5ea6\u3001\u7cbe\u78ba\u6307\u51fa\u7a0b\u5f0f\u78bc\u8def\u5f91\uff0c\u4e26\u80fd\u5340\u5206\u771f\u6b63\u7684\u7f3a\u9677\u8207\u7d14\u5c6c\u63a8\u6e2c\u7684\u8b66\u544a\u3002\u4fee\u5fa9\u554f\u984c\u6642\u9084\u9700\u901a\u904e\u53e6\u4e00\u9805\u6e2c\u8a66\uff1a\u4fee\u88dc\u7a0b\u5f0f\u7d55\u4e0d\u80fd\u5f15\u5165\u65b0\u7684\u56de\u6b78\u554f\u984c\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Claude Code \u5728 T4 \u74b0\u7bc0\u4e2d\u5c55\u73fe\u51fa\u6700\u660e\u986f\u7684\u512a\u52e2\u3002 \u8a72\u5718\u968a\u5831\u544a\u4e86\u4e94\u9805\u53ef\u7368\u7acb\u91cd\u73fe\u7684\u767c\u73fe\uff0c\u5176\u4e2d\u5305\u542b\u5169\u9805\u9810\u8a2d\u5be9\u67e5\u76ee\u6a19\uff0c\u56e0\u6b64\u7372\u5f97 19\/20 \u5206\u3002Codex \u5831\u544a\u4e26\u4fee\u5fa9\u4e86\u5169\u9805\u6709\u6548\u7684\u8f03\u9ad8\u56b4\u91cd\u6027\u7f3a\u9677\uff0c\u4f46\u672a\u63d0\u53ca\u90a3\u5c0d\u9810\u8a2d\u7f3a\u9677\uff0c\u56e0\u6b64\u7372\u5f97 18\/20 \u5206\u3002Codex \u7684\u767c\u73fe\u4e26\u975e\u8aa4\u5831\uff1b\u5169\u8005\u4e4b\u9593\u7684\u5dee\u7570\u5728\u65bc\u6aa2\u6e2c\u7bc4\u570d\u7684\u5ee3\u5ea6\uff0c\u800c\u975e\u57fa\u672c\u6b63\u78ba\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\u5132\u5b58\u5eab\u6e2c\u8a66<\/p><h3 class=\"d-title\">\u627e\u51fa\u53ef\u91cd\u73fe\u7684\u7f3a\u9677\uff0c\u4e26\u4fee\u5fa9\u53ef\u4fe1\u5ea6\u6700\u9ad8\u7684\u554f\u984c<\/h3><p class=\"d-sub\">\u6aa2\u8996\u6e2c\u8a66\u6848\u4f8b\u3001\u91cd\u73fe\u5be6\u969b\u7f3a\u9677\u3001\u5be6\u65bd\u5141\u8a31\u7684\u4fee\u6b63\uff0c\u4e26\u8b49\u660e\u56de\u6b78\u6e2c\u8a66\u80fd\u6709\u6548\u9a57\u8b49\u8a72\u884c\u70ba\u3002.<\/p><\/div><span class=\"d-pill\">Claude \u8986\u84cb\u908a\u7de3<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"\u300aCodex\u300b\u7d50\u679c\"><div class=\"d-product\"><span>\u300a\u53e4\u7c4d\u300b<\/span><span class=\"d-score\">18<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7e8c\u6642\u9593<\/span><strong>223 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>4 \u901a\u904e<\/strong><\/div><div class=\"d-metric\"><span>\u7bc4\u570d<\/span><strong>2 \u5df2\u4fee\u6b63<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u500b\u6709\u6548\u7684\u8f38\u51fa\u7247\u6bb5<\/div><pre>1. \u9ad8 \u2014 \u73fe\u6709\u5de5\u4f5c\u53ef\u80fd\u88ab\u6084\u7136\u8986\u5beb\u3002\n\n2. \u4e2d \u2014 \u6bcf\u65e5\u57f7\u884c\u7684\u4efb\u52d9\u5728\u590f\u4ee4\u6642\u8f49\u63db\u671f\u9593\u51fa\u73fe\u504f\u79fb\u3002\n\n\u9a57\u8b49\u7d50\u679c\uff1a\u56db\u9805\u6e2c\u8a66\u901a\u904e\uff0c\u96f6\u9805\u5931\u6557\u3002.<\/pre><\/div><p class=\"d-take\"><strong>\u8a55\u8ad6\u8005\u89c0\u9ede\uff1a<\/strong> \u96d6\u7136\u767c\u73fe\u4e86\u6709\u7528\u7684\u9ad8\u56b4\u91cd\u6027\u554f\u984c\u4e26\u9032\u884c\u4e86\u91dd\u5c0d\u6027\u4fee\u6b63\uff0c\u4f46\u672a\u80fd\u9054\u6210\u5169\u9805\u9810\u5148\u8a2d\u5b9a\u7684\u5be9\u67e5\u76ee\u6a19\u3002.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \u4ee3\u78bc\u7d50\u679c\"><div class=\"d-product\"><span>\u514b\u52de\u5fb7\u00b7\u79d1\u5fb7<\/span><span class=\"d-score\">19<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\u6301\u7e8c\u6642\u9593<\/span><strong>235 \u79d2<\/strong><\/div><div class=\"d-metric\"><span>\u652f\u7968<\/span><strong>9 \u901a\u904e<\/strong><\/div><div class=\"d-metric\"><span>\u7bc4\u570d<\/span><strong>5 \u5247\u5831\u5c0e<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\u7b2c\u4e00\u500b\u6709\u6548\u7684\u8f38\u51fa\u7247\u6bb5<\/div><pre>D1 DST \u504f\u79fb \u00b7 \u9ad8\nD2 \u7c21\u55ae\u6642\u5340\u53d6\u5f97 \u00b7 \u4e2d\nD3 \u8b58\u5225\u78bc\u885d\u7a81 \u00b7 \u9ad8\nD4 \u7f3a\u5c11\u522a\u9664\u64cd\u4f5c\u6703\u5f15\u767c KeyError \u00b7 \u4e2d\nD5 \u6240\u6709\u8005\u672a\u7d93\u9a57\u8b49 \u00b7 \u4f4e<\/pre><\/div><p class=\"d-take\"><strong>\u8a55\u8ad6\u8005\u89c0\u9ede\uff1a<\/strong> \u5be9\u67e5\u7bc4\u570d\u66f4\u5ee3\u6cdb\uff0c\u4e14\u672a\u51fa\u73fe\u4efb\u4f55\u91cd\u8907\u7684\u5047\u967d\u6027\u7d50\u679c\uff1b\u5176\u4e2d\u5169\u9805\u8207\u5408\u7d04\u76f8\u95dc\u7684\u767c\u73fe\u5247\u672a\u4e88\u4fee\u6b63\u3002.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>\u6aa2\u8996\u5b8c\u6574\u7684 Codex \u8f38\u51fa\u5167\u5bb9<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u3001\u7d93\u904e\u6e05\u7406\u7684\u3001\u9996\u6b21\u6709\u6548\u7684\u8f38\u51fa<\/p><pre>## \u9700\u63a1\u53d6\u884c\u52d5\u7684\u767c\u73fe\u4e8b\u9805\n\n1. **\u9ad8\u98a8\u96aa \u2014 \u73fe\u6709\u5de5\u4f5c\u53ef\u80fd\u88ab\u7121\u9810\u8b66\u5730\u8986\u5beb**\n\n   - \u8b49\u64da\uff1a[service.py](.\/scheduler\/service.py:8) \u4e2d\u7684\u8b58\u5225\u78bc\u521d\u59cb\u5316\uff0c\u7d50\u5408 [repository.py](.\/scheduler\/repository.py:9) \u4e2d\u7684\u5b57\u5178\u66ff\u63db\u3002\n   - \u5f71\u97ff\uff1a\u82e5\u4f7f\u7528\u73fe\u6709\u5132\u5b58\u5eab\u5efa\u7acb\u670d\u52d9\uff0c\u53ef\u80fd\u6703\u91cd\u8907\u4f7f\u7528\u8b58\u5225\u78bc `1`\uff0c\u5f9e\u800c\u53d6\u4ee3\u5df2\u5132\u5b58\u7684\u5de5\u4f5c\u4e26\u5c0e\u81f4\u8cc7\u6599\u907a\u5931\u3002\n   - \u6700\u7c21\u91cd\u73fe\u6b65\u9a5f\uff1a\u5132\u5b58 `Job(1, ...)`\uff0c\u5efa\u7acb `SchedulerService(repository)`\uff0c\u7136\u5f8c\u5efa\u7acb\u53e6\u4e00\u500b\u5de5\u4f5c\u3002\u5728\u4fee\u6b63\u524d\uff0c\u50c5\u5269\u65b0\u5efa\u7acb\u7684\u5de5\u4f5c\u3002\n   - \u4fee\u6b63\uff1a\u5f9e\u5132\u5b58\u5eab\u4e2d\u73fe\u6709\u7684\u6700\u9ad8\u8b58\u5225\u78bc\u958b\u59cb\u521d\u59cb\u5316\u4e0b\u4e00\u500b\u8b58\u5225\u78bc\u3002\n   - \u56de\u6b78\u6e2c\u8a66\uff1a[test_scheduler.py](.\/tests\/test_scheduler.py:22)\u3002\n\n2. **\u4e2d\u7b49 \u2014 \u6bcf\u65e5\u57f7\u884c\u6642\u9593\u5728\u590f\u4ee4\u6642\u8f49\u63db\u671f\u9593\u7522\u751f\u504f\u5dee**\n\n   - \u8b49\u64da\uff1a\u5df2\u4fee\u6b63 [time_rules.py](.\/scheduler\/time_rules.py:4) \u4e2d\u7684\u8a08\u7b97\u908f\u8f2f\u3002\n   - \u5f71\u97ff\uff1a\u4e00\u9805\u6392\u5b9a\u65bc 09:00 \u57f7\u884c\u7684\u6bcf\u65e5\u5de5\u4f5c\uff0c\u5728\u6625\u5b63\u590f\u4ee4\u6642\u8f49\u63db\u5f8c\u65bc 10:00 \u57f7\u884c\u3002\n   - \u6700\u7c21\u91cd\u73fe\u6b65\u9a5f\uff1a\u8a08\u7b97 `2026-03-07 09:00 America\/New_York` \u4e4b\u5f8c\u7684\u4e0b\u4e00\u6b21\u57f7\u884c\u6642\u9593\u3002 \u4fee\u6b63\u524d\uff0c\u7d50\u679c\u70ba `2026-03-08 10:00`\u3002\n   - \u4fee\u6b63\u65b9\u5f0f\uff1a\u589e\u52a0\u4e00\u500b\u7576\u5730\u65e5\u66c6\u65e5\uff0c\u800c\u975e 24 \u5c0f\u6642\u7684 UTC \u7d93\u904e\u6642\u9593\u3002\n   - \u56de\u6b78\u6e2c\u8a66\uff1a[test_scheduler.py](.\/tests\/test_scheduler.py:33)\u3002\n\n## \u5df2\u8b8a\u66f4\u7684\u6a94\u6848\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## \u9a57\u8b49\n\n- \u89c0\u5bdf\u5230\u5169\u9805\u56de\u6b78\u6e2c\u8a66\u5728\u4fee\u6b63\u524d\u5747\u5931\u6557\u3002\n- \u6bcf\u9805\u6e2c\u8a66\u5728\u5c0d\u61c9\u7684\u4fee\u6b63\u5f8c\u5747\u901a\u904e\u3002\n- `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v`\n- \u7d50\u679c\uff1a**4 \u9805\u6e2c\u8a66\u901a\u904e\uff0c0 \u9805\u5931\u6557**\u3002\n- \u6c92\u6709\u4efb\u4f55\u751f\u6210\u7684 Python \u5feb\u53d6\u7522\u7269\u6b98\u7559\u3002\n\n## \u7d50\u8ad6\u8207\u6c7a\u7b56\n\n- **\u7d50\u8ad6\uff1a** \u5169\u9805\u5df2\u78ba\u8a8d\u7684\u7f3a\u9677\u5747\u5df2\u4fee\u5fa9\uff0c\u4e26\u7531\u91dd\u5c0d\u6027\u7684\u56de\u6b78\u6e2c\u8a66\u6db5\u84cb\u3002\n- **\u9700\u6c7a\u7b56\u4e8b\u9805\uff1a** \u7121\u3002.<\/pre><\/div><\/details><details class=\"d-full\"><summary>\u6aa2\u8996\u5b8c\u6574\u7684 Claude \u7a0b\u5f0f\u78bc\u8f38\u51fa<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\u5b8c\u6574\u7684\u4ea4\u63a5\u8a18\u9304\uff0c\u5305\u542b\u7b2c\u4e00\u9805\u6709\u6548\u7684\u8f38\u51fa\u5167\u5bb9\u7684\u9010\u5b57\u8a18\u9304<\/p><pre># T4 \u57f7\u884c\u7d00\u9304 \u2014 \u6e2c\u8a66\u8207\u7a0b\u5f0f\u78bc\u5be9\u67e5\n\n## \u57f7\u884c\u53c3\u6578\n\n| \u6b04\u4f4d | \u503c |\n| --- | --- |\n| \u4efb\u52d9 | `T4` |\n| \u51cd\u7d50\u63d0\u793a | `01-prompts\/T4.md` |\n| \u51cd\u7d50\u63d0\u793a\u8a5e SHA-256 | `5e69546007ea776f40b3d334ddb75671ff684c151c77551bad27de3b0fdce640` |\n| \u57f7\u884c\u55ae\u5143 | \u9694\u96e2\u7684 Claude \u5b50\u4ee3\u7406\uff0c`\u901a\u7528\u578b`\uff0c\u5168\u65b0\u4e0a\u4e0b\u6587 |\n| \u9694\u96e2\u65b9\u6cd5 | **\u5b50\u4ee3\u7406\u5099\u7528\u65b9\u6848**\uff08\u5df2\u8a18\u9304\u7684\u964d\u7d1a \u2014 \u53c3\u898b `results\/isolation-decision.md`\uff09 |\n| \u6307\u6d3e\u7684\u4e7e\u6de8\u526f\u672c | `runtime\/workspaces\/T4` |\n| Claude \u7a0b\u5f0f\u78bc\u7248\u672c | `2.1.220` |\n| \u6a21\u578b\u8a2d\u5b9a | `claude-opus-5` |\n| start_utc | `2026-07-28T10:28:22Z` |\n| end_utc | `2026-07-28T10:32:17Z` |\n| \u57f7\u884c\u6642\u9593 | 235 \u79d2\uff08\u8207 T1\u2013T3 \u4e26\u884c\u57f7\u884c\uff1b\u975e\u7d14\u7cb9\u7684\u5ef6\u9072\u6e2c\u91cf\uff09 |\n| \u5617\u8a66\u6b21\u6578 | 1 |\n| \u72c0\u614b | `\u6709\u6548` |\n| \u4eba\u70ba\u5e72\u9810 | \u7121 |\n\n\u51cd\u7d50\u63d0\u793a\u4e2d\u7684\u689d\u4ef6 \u2014\u2014\u300c\u82e5\u51cd\u7d50\u7684\u57f7\u884c\u914d\u7f6e\u5141\u8a31\n\u4fee\u6b63\uff0c\u5247\u9032\u884c\u4fee\u6b63\u300d \u2014\u2014 \u7531\u5354\u8abf\u5668\u5f9e `00-control\/run-config.json` \u53ca\n`00-control\/safety-policy.json` \u4e2d\u89e3\u6790\uff0c\u8a72\u8a2d\u5b9a\u5141\u8a31\u5beb\u5165\u9694\u96e2\u7684\u6e2c\u8a66\u5957\u4ef6\u526f\u672c\u3002\u57f7\u884c\u5668\n\u5df2\u7372\u544a\u77e5\u5141\u8a31\u9032\u884c\u4fee\u6b63\u3002\u7cfb\u7d71\u672a\u5411\u5176\u986f\u793a\u4efb\u4f55\u63a7\u5236\u6a94\u3002\n\n## \u5b89\u5168\u5de5\u5177\u6458\u8981\n\n`date`\u3001\u50c5\u9650\u65bc\u6307\u6d3e\u5de5\u4f5c\u5340\u5167\u7684 `Read`\/`Edit`\/`Write`\u3001`grep`\u3001\n`python3 -m unittest discover`\u3001`python3 -m compileall`\u3001\u4e00\u6b21\u81e8\u6642\u526f\u672c\u7684\u7a7a\u904b\u884c\u3001\u4e00\u6b21\n\u6e05\u55ae\u5b58\u5728\u6027\u6aa2\u67e5\u3002\u7121\u7db2\u8def\u3001\u7121\u5b89\u88dd\u3001\u50c5\u4f7f\u7528\u6a19\u6e96\u51fd\u5f0f\u5eab\u3002\n\n## \u8b8a\u66f4\u7684\u6a94\u6848\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\u65b0\u589e 2 \u9805\u6e2c\u8a66\uff09\u3001`tests\/test_time_rules.py`\uff08\u65b0\u589e\uff0c5 \u9805\u6e2c\u8a66\uff09\u3002\n\u5b8c\u6574\u4fee\u88dc\u6a94\uff1a`results\/T4\/patch.diff`\u3002\n\n## \u96e2\u7dda\u6aa2\u67e5\u7d50\u679c\n\n\u7531\u4efb\u52d9\u57f7\u884c\u5668\u56de\u5831\uff1a\n\n| \u6aa2\u67e5\u9805\u76ee | \u7d50\u679c |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v` | **9 \u901a\u904e\uff0c0 \u5931\u6557\uff0c0 \u8df3\u904e**\uff08\u57fa\u6e96 2\uff09 |\n| `python3 -m compileall -q scheduler tests` | \u901a\u904e |\n| \u5c0d\u7167 `expected_files` \u6aa2\u67e5\u6e05\u55ae\u662f\u5426\u5b58\u5728 | \u5168\u90e8 8 \u500b\u7686\u5b58\u5728 |\n| \u91dd\u5c0d\u9084\u539f\u5f8c\u7684\u539f\u59cb\u5be6\u4f5c\u57f7\u884c vacuity \u6aa2\u67e5 | 5 \u6b21\u5931\u6557\uff0c4 \u6b21\u901a\u904e\uff0c\u7b26\u5408\u9810\u671f |\n\n\u7531\u5354\u8abf\u54e1\u5728\u5de5\u4f5c\u5340\u5916\u90e8\u7368\u7acb\u91cd\u65b0\u9a57\u8b49\uff1a\n\n| \u6aa2\u67e5\u9805\u76ee | \u9000\u51fa\u72c0\u614b | \u7d50\u679c |\n| --- | --- | --- |\n| \u516c\u958b\u6e2c\u8a66\u5957\u4ef6 (`results\/checks\/T4-public.txt`) | 0 | 9 \u9805\u6e2c\u8a66\uff0c\u6b63\u5e38 |\n\n\u8cc7\u8a0a\u6027\u4ea4\u53c9\u6aa2\u67e5\uff0c\u4e0d\u8a08\u5206\uff1aT3 \u96b1\u85cf\u9a57\u8b49\u5668\u5c0d\u6b64\n\u5de5\u4f5c\u5340\u4ea6\u901a\u904e\uff08\u9000\u51fa\u4ee3\u78bc 0\uff09\uff0c\u56e0\u70ba T4 \u5df2\u7368\u7acb\u4fee\u5fa9\u4e86\u76f8\u540c\u7684 `next_daily_run` \u7f3a\u9677\u3002\u8acb\u53c3\u95b1\n`results\/checks\/validator-controls.md`\u3002\n\n## Gold-map \u7f3a\u9677\u8986\u84cb\u7387\n\n`03-checks\/gold-map.json` \u70ba T4 \u8a55\u5206\u9810\u8a2d\u4e86\u5169\u500b\u7f3a\u9677\u3002\u5169\u8005\u5747\u5df2\u88ab\u767c\u73fe\uff1a\n\n| \u9810\u8a2d\u7f3a\u9677 | \u5df2\u767c\u73fe | \u56de\u5831\u72c0\u614b |\n| --- | --- | --- |\n| \u7a7a\u767d\u6240\u6709\u8005\u5df2\u63a5\u53d7 | \u662f | **D5**\uff0c`scheduler\/service.py:11,13`\uff0c\u56b4\u91cd\u6027\uff1a\u4f4e\uff0c\u5df2\u56de\u5831\u4e14\u523b\u610f\u672a\u4fee\u6b63 |\n| \u522a\u9664\u4e0d\u5b58\u5728\u7684\u8b58\u5225\u78bc\u6703\u5f15\u767c `KeyError` | \u662f | **D4**\uff0c`scheduler\/repository.py:19` \u2192 `service.py:22`\uff0c\u56b4\u91cd\u7a0b\u5ea6\u300c\u4e2d\u300d\uff0c\u5df2\u56de\u5831\u4e14\u523b\u610f\u672a\u4fee\u5fa9 |\n\n\u9664\u9810\u8a2d\u7f3a\u9677\u96c6\u5916\uff0c\u53e6\u6709\u4e09\u9805\u767c\u73fe\u88ab\u56de\u5831\u3002\u5747\u975e\u8aa4\u5831\uff1a\n\n- **D1** \u2014 `next_daily_run` \u4e2d\u7684\u590f\u4ee4\u6642\u504f\u79fb\u3002\u9019\u662f\n  `03-checks\/seeded-defects.md` \u4e2d\u5217\u51fa\u7684\u7b2c\u4e09\u500b\u7f3a\u9677\uff08\u5176\u8a55\u5206\u6b78\u985e\u65bc T3 \u800c\u975e T4\uff0c\u4f46\u78ba\u5be6\u662f\u9810\u8a2d\u7684\u771f\u5be6\u932f\u8aa4\uff09\u3002\n- **D2** \u2014 `next_daily_run` \u7684\u7c21\u55ae\u8f38\u5165\u6703\u9ed8\u9ed8\u53d6\u5f97\u4e3b\u6a5f\u6642\u5340\uff0c\u4e26\u56de\u50b3\u4e00\u500b\n  \u5df2\u77e5\u6642\u5340\u7684 datetime \u7269\u4ef6\u3002\u6b64\u70ba\u771f\u5be6\u7f3a\u9677\u4e14\u53d6\u6c7a\u65bc\u4e3b\u6a5f\uff1b\u5354\u8abf\u54e1\u5df2\u6839\u64da\u6e2c\u8a66\u5957\u4ef6\u539f\u59cb\u78bc\u9032\u884c\u9a57\u8b49\u3002\n- **D3** \u2014 \u670d\u52d9\u8207\u6ce8\u5165\u6216\u5171\u7528\u5132\u5b58\u5eab\u4e4b\u9593\u7684\u8b58\u5225\u78bc\u885d\u7a81\uff0c\u5c0e\u81f4\n  \u7121\u8b66\u793a\u7684\u8986\u5beb\u3002\u771f\u5be6\u7f3a\u9677\uff1a`SchedulerService._next_identifier` \u59cb\u7d42\u5f9e 1 \u958b\u59cb\uff0c\u800c\n  `JobRepository.save` \u5247\u70ba\u672a\u53d7\u4fdd\u8b77\u7684\u5b57\u5178\u8ce6\u503c\u3002 T1 \u7368\u7acb\u5730\u5f9e\u539f\u59cb\u6e2c\u8a66\u6848\u4f8b\u4e2d\u8b58\u5225\u51fa\u76f8\u540c\u7684\n  \u6f0f\u6d1e\u3002\n\n\u8aa4\u5831\u6578\u91cf\uff1a**0**\u3002\u57f7\u884c\u5668\u4ea6\u6b63\u78ba\u56de\u5831\u672a\u767c\u73fe\u4efb\u4f55\u5b89\u5168\u554f\u984c\uff0c\u4e26\u6307\u51fa\n\u8a72\u6e2c\u8a66\u6848\u4f8b\u4e0d\u5b58\u5728\u7db2\u8def\u3001I\/O\u3001\u53cd\u5e8f\u5217\u5316\u3001\u5b50\u7a0b\u5e8f\u6216\u6191\u8b49\u66b4\u9732\u9762\u3002\n\n## \u503c\u5f97\u8a18\u9304\u7684\u504f\u5dee\n\n\u51cd\u7d50\u63d0\u793a\u8981\u6c42\u91dd\u5c0d\u300c\u4fe1\u5fc3\u5ea6\u6700\u9ad8\u7684\u5169\u500b\u7f3a\u9677\u300d\u9032\u884c\u6e2c\u8a66\u8207\u4fee\u5fa9\u3002 \u8a72\n\u57f7\u884c\u8005\u9078\u64c7\u4e86 D1\/D2\uff08\u55ae\u4e00\u4fee\u6b63\uff0c\u540c\u4e00\u500b\u51fd\u5f0f\uff09\u4ee5\u53ca D3\uff0c\u800c\u975e\u9ec3\u91d1\u5730\u5716\u4e2d\u9810\u8a2d\u7684\n\u5169\u500b\u7f3a\u9677 D4 \u548c D5\u3002\u5176\u9673\u8ff0\u7684\u7406\u7531\u662f\u5408\u7406\u7684\uff1aD4 \u548c D5 \u7686\u53d6\u6c7a\u65bc\u672a\u660e\u5b9a\u7684 API\n\u5408\u7d04\uff0c\u56e0\u6b64\u4fee\u6b63\u5b83\u5011\u5c07\u662f\u6191\u7a7a\u731c\u6e2c\u3002 \u5075\u6e2c\u6210\u7e3e\u4e0d\u53d7\u5f71\u97ff\u2014\u2014\u5169\u9805\u9810\u8a2d\u7f3a\u9677\n\u5747\u5df2\u88ab\u767c\u73fe\uff0c\u4e26\u9644\u6709\u6a94\u6848\u3001\u884c\u865f\u3001\u56b4\u91cd\u6027\u3001\u5f71\u97ff\u7bc4\u570d\u53ca\u91cd\u73fe\u6b65\u9a5f\u3002\u6240\u5957\u7528\u7684\u4fee\u6b63\u91dd\u5c0d\u7684\u662f\u771f\u5be6\n\u7f3a\u9677\uff0c\u4e14\u5df2\u901a\u904e\u7a7a\u503c\u6aa2\u67e5\u9a57\u8b49\u3002\n\n## \u5df2\u4fee\u6b63\u7684\u932f\u8aa4\n\n\u56e0\u4f7f\u7528 `tzinfo` \u6642\uff0c\u5c07\u65e5\u671f\u6642\u9593\u7684\u300c\u5be6\u6642\u300d\u8207\u300c\u7d55\u5c0d\u6642\u9593\u300d\u76f8\u6e1b\uff0c\u5c0e\u81f4\u5169\u6b21\u81ea\u9020\u7684\u6e2c\u8a66\u5931\u6557\uff1b\n\u5df2\u4fee\u6b63\u4e26\u91cd\u65b0\u9a57\u8b49\u3002\u7121\u5de5\u5177\u6216\u74b0\u5883\u932f\u8aa4\u3002\u57f7\u884c\u5f8c\u5df2\u79fb\u9664 `__pycache__`\n\u6b98\u7559\u6a94\u6848\u3002\n\n## \u53ef\u898b\u8f38\u51fa\uff08\u9010\u5b57\uff09\n\n### \u7f3a\u9677\u5831\u544a\n\n**D1 \u2014 `scheduler\/time_rules.py:10-11` \u2014 \u6bcf\u65e5\u6392\u7a0b\u5728\u590f\u4ee4\u6642\u671f\u9593\u51fa\u73fe\u4e00\u5c0f\u6642\u504f\u5dee \u2014 \u56b4\u91cd\u6027\uff1a\u9ad8**\n\n`next_daily_run` \u900f\u904e UTC \u5f80\u8fd4\u50b3\u8f38\u589e\u52a0 24 \u5c0f\u6642\u7684 *\u5be6\u969b\u8017\u6642*\uff0c\u800c\u975e\u63a8\u9032\u65e5\u66c6\u65e5\u671f\u3002 \u7531\u65bc\u6bcf\u65e5\u5de5\u4f5c\u662f\u6839\u64da\u5be6\u6642\uff08wall-clock time\uff09\u5b9a\u7fa9\u7684\uff0c\u56e0\u6b64\u81ea\u590f\u4ee4\u6642\u8f49\u63db\u65e5\u8d77\uff0c\u4f4d\u65bc\u5be6\u65bd\u590f\u4ee4\u6642\u6642\u5340\u7684\u6bcf\u500b\u5de5\u4f5c\u90fd\u6703\u5728\u4e0d\u77e5\u4e0d\u89ba\u4e2d\u63d0\u65e9\u6216\u5ef6\u9072\u4e00\u5c0f\u6642\u57f7\u884c\uff0c\u4e14\u6b64\u932f\u8aa4\u6703\u6301\u7e8c\u5b58\u5728\uff08\u6bcf\u6b21\u57f7\u884c\u90fd\u6703\u5f9e\u504f\u79fb\u5f8c\u7684\u6642\u9593\u91cd\u65b0\u521d\u59cb\u5316\uff09\u3002\u8a72\u51fd\u5f0f\u81ea\u5e36\u7684\u8aaa\u660e\u5b57\u4e32\uff08docstring\uff09\u672c\u8eab\u5df2\u627f\u8a8d\u6b64\u884c\u70ba\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\u9810\u671f\u503c\u70ba 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\u9810\u671f\u6642\u9593\u70ba 09:00-05:00\n```\n\n**D2 \u2014 `scheduler\/time_rules.py:10-11` \u2014 \u672a\u7d93\u8655\u7406\u7684\u8f38\u5165\u6703\u9ed8\u9ed8\u63a1\u7528\u7cfb\u7d71\u7684\u672c\u5730\u6642\u5340 \u2014 \u56b4\u91cd\u6027\uff1a\u4e2d\u7b49**\n\n\u540c\u6a23\u7684\u5169\u884c\u7a0b\u5f0f\u78bc\u3002\u5c0d\u300c\u672a\u610f\u8b58\u6642\u5340\u300d\u7684 `datetime` \u7269\u4ef6\u547c\u53eb `.astimezone(timezone.utc)` \u6703\u5047\u8a2d\u7cfb\u7d71\u672c\u5730\u6642\u9593\uff0c\u800c `.astimezone(None)` \u5247\u6703\u50b3\u56de\u300c\u610f\u8b58\u6642\u5340\u300d\u7684 `datetime` \u7269\u4ef6\u3002 \u82e5\u4ee5\u300c\u672a\u610f\u8b58\u6642\u5340\u300d\u7684\u503c\u4f5c\u70ba\u8f38\u5165\uff0c\u5247\u6703\u8fd4\u56de\u300c\u5df2\u610f\u8b58\u6642\u5340\u300d\u7684\u503c\uff0c\u56e0\u6b64\u7d50\u679c\u7121\u6cd5\u8207\u547c\u53eb\u8005\u7684\u5176\u4ed6\u300c\u672a\u610f\u8b58\u6642\u5340\u300d\u503c\u9032\u884c\u6bd4\u8f03\uff08\u6bd4\u8f03\u6642\u6703\u5f15\u767c `TypeError`\uff09\uff0c\u4e14\u7d50\u679c\u53d6\u6c7a\u65bc\u4e3b\u6a5f\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\u6c7a\u65bc\u4e3b\u6a5f\n```\n\n**D3 \u2014 `scheduler\/service.py:8,13,15`\uff08\u524d\u7db4\uff09\u2014 \u8b58\u5225\u78bc\u885d\u7a81\u6703\u9ed8\u9ed8\u92b7\u6bc0\u5df2\u5132\u5b58\u7684\u4efb\u52d9 \u2014 \u56b4\u91cd\u6027\uff1a\u9ad8**\n\nID \u8a08\u6578\u5668\u662f\u91dd\u5c0d\u6bcf\u500b `SchedulerService` \u8a2d\u5b9a\u7684\uff0c\u4e14\u59cb\u7d42\u5f9e 1 \u958b\u59cb\uff0c\u5ffd\u7565\u6ce8\u5165\u5132\u5b58\u5eab\u7684\u5167\u5bb9\u3002 \u4efb\u4f55\u4f7f\u7528\u5171\u7528\u5132\u5b58\u5eab\u7684\u7b2c\u4e8c\u500b\u670d\u52d9\uff0c\u6216\u4efb\u4f55\u4f7f\u7528\u9810\u5148\u586b\u5165\u8cc7\u6599\u7684\u5132\u5b58\u5eab\u7684\u670d\u52d9\uff0c\u90fd\u6703\u91cd\u65b0\u767c\u653e ID 1\uff1b\u7531\u65bc `JobRepository.save` \u5c6c\u65bc\u5b57\u5178\u8ce6\u503c\uff0c\u56e0\u6b64\u73fe\u6709\u5de5\u4f5c\u6703\u88ab\u8986\u5beb\u4e14\u4e0d\u6703\u89f8\u767c\u932f\u8aa4\u3002\u5c0e\u81f4\u8cc7\u6599\u907a\u5931\u3002\n\n```\nrepo = JobRepository()\nSchedulerService(repo).create_job(\"\u591c\u9593\u5099\u4efd\", 'Alex')    # id 1\nSchedulerService(repo).create_job(\"\u85aa\u8cc7\u532f\u51fa\", \"Blake\")   # \u518d\u6b21\u7522\u751f id 1\nrepo.all()   # -&gt; [Job(1, \"\u85aa\u8cc7\u532f\u51fa\", \"Blake\")]  \u2014 Alex \u7684\u5de5\u4f5c\u5df2\u6d88\u5931\n```\n\n**D4 \u2014 `scheduler\/repository.py:19` \u2192 `scheduler\/service.py:22` \u2014 `delete_job` \u56e0\u672a\u77e5 ID \u800c\u62cb\u51fa `KeyError` \u2014 \u56b4\u91cd\u6027\uff1a\u4e2d\u7b49**\n\n`delete` \u65b9\u6cd5\u5728\u672a\u8a2d\u5b9a\u9810\u8a2d\u503c\u7684\u60c5\u6cc1\u4e0b\u4f7f\u7528 `dict.pop`\uff0c\u800c\u5176\u540c\u7d1a\u65b9\u6cd5 `get`\uff08\u7b2c 13 \u884c\uff09\u5728\u672a\u627e\u5230\u5c0d\u61c9\u9805\u6642\u6703\u50b3\u56de `None`\u3002 \u6b64\u4e0d\u4e00\u81f4\u6027\u6703\u900f\u904e `SchedulerService.delete_job` \u6d29\u6f0f\u539f\u59cb\u7684 `KeyError`\uff0c\u800c\u547c\u53eb\u65b9\u6975\u53ef\u80fd\u7121\u6cd5\u64f7\u53d6\u6b64\u932f\u8aa4\u3002\u91cd\u73fe\u6b65\u9a5f\uff1a`SchedulerService().delete_job(999)` \u2192 `KeyError: 999`\u3002 \u4fee\u6b63\u65b9\u5f0f\u53ef\u63a1\u7528 `pop(identifier, None)` \u6216\u62cb\u51fa\u660e\u78ba\u7684\u9818\u57df\u4f8b\u5916 \u2014 \u523b\u610f\u672a\u9032\u884c\u4fee\u6b63\uff0c\u56e0\u70ba\u6b63\u78ba\u7684\u884c\u70ba\u898f\u7bc4\uff08\u975c\u9ed8\u7121\u64cd\u4f5c vs. \u985e\u578b\u5316\u932f\u8aa4\uff09\u61c9\u7531\u64c1\u6709\u8005\u900f\u904e API \u6c7a\u7b56\u6c7a\u5b9a\u3002\n\n**D5 \u2014 `scheduler\/service.py:11,13` \u2014 `owner` \u6b04\u4f4d\u672a\u7d93\u9a57\u8b49 \u2014 \u56b4\u91cd\u6027\uff1a\u4f4e**\n\n`name` \u6703\u6aa2\u67e5\u662f\u5426\u70ba\u7a7a\uff0c\u4f46 `owner` \u5247\u4e0d\u6703\uff1a`create_job('ok', '   ')` \u6703\u5132\u5b58 `owner=\"\"`\u3002 \u9019\u5169\u500b\u53c3\u6578\u7686\u5728\u672a\u52a0\u9632\u8b77\u7684\u60c5\u6cc1\u4e0b\u547c\u53eb `.strip()`\uff0c\u56e0\u6b64 `None` \u6703\u4ee5 `AttributeError: \"NoneType\" object has no attribute 'strip'` \u7684\u5f62\u5f0f\u986f\u73fe\uff0c\u800c\u975e API \u901a\u5e38\u7528\u65bc\u8655\u7406\u932f\u8aa4\u8f38\u5165\u7684 `ValueError`\u3002\u672a\u4fee\u6b63 \u2014 \u8a72\u6e2c\u8a66\u74b0\u5883\u4e2d\u4e26\u672a\u5728\u4efb\u4f55\u8655\u8aaa\u660e\u9810\u671f\u7684\u6240\u6709\u8005\u5408\u7d04\u3002\n\n**\u5b89\u5168\u6027\uff1a** \u7121\u767c\u73fe\u554f\u984c\u3002\u6b64\u6e2c\u8a66\u5957\u4ef6\u4e0d\u6d89\u53ca\u7db2\u8def\u3001I\/O\u3001\u53cd\u5e8f\u5217\u5316\u3001\u5b50\u7a0b\u5e8f\u6216\u6191\u8b49\u66b4\u9732\uff1b\u5132\u5b58\u7a7a\u9593\u70ba\u9032\u7a0b\u5167\u7684\u5b57\u5178\u3002\n\n**\u8986\u84cb\u7387\u7f3a\u53e3\uff1a** \u5728\u672c\u6b21\u57f7\u884c\u4e4b\u524d\uff0c`scheduler\/time_rules.py` \u548c `scheduler\/repository.py` \u7684\u6e2c\u8a66\u8986\u84cb\u7387\u70ba\u96f6\uff1b\u90a3\u5169\u500b\u9810\u5148\u8a2d\u5b9a\u7684\u6e2c\u8a66\u50c5\u9a57\u8b49\u4e86\u670d\u52d9\u7684\u6b63\u5e38\u6d41\u7a0b\u3002\n\n### \u5df2\u5957\u7528\u6e2c\u8a66\u8207\u4fee\u6b63\n\n\u4fe1\u5fc3\u5ea6\u6700\u9ad8\u7684\u5169\u500b\u7f3a\u9677\u70ba **D1\/D2**\uff08\u540c\u4e00\u500b\u51fd\u5f0f\uff0c\u55ae\u4e00\u4fee\u6b63\uff09\u8207 **D3**\u3002\n\n**\u4fee\u6b63 1 \u2014 `scheduler\/time_rules.py`\uff1a** \u5c07 UTC \u5f80\u8fd4\u8a08\u7b97\u66ff\u63db\u70ba `previous_run + timedelta(days=1)`\u3002 Python \u6703\u5c0d\u300c\u610f\u8b58\u5230\u6642\u5340\u300d\u7684\u65e5\u671f\u6642\u9593\u9032\u884c\u5be6\u6642\u904b\u7b97\uff0c\u800c `zoneinfo` \u6703\u6839\u64da\u65b0\u7684\u5be6\u6642\u6642\u9593\u61f6\u60f0\u5730\u91cd\u65b0\u89e3\u6790 UTC \u504f\u79fb\u91cf \u2014 \u56e0\u6b64 09:00 \u4ecd\u7dad\u6301 09:00\uff0c\u800c\u504f\u79fb\u91cf\u5247\u6b63\u78ba\u5730\u5f9e `-05:00` \u8abf\u6574\u70ba `-04:00`\u3002 \u9019\u540c\u6642\u4fee\u5fa9\u4e86 D1 \u548c D2\uff1a\u539f\u59cb\u8f38\u5165\u73fe\u5728\u6703\u4fdd\u6301\u539f\u59cb\u72c0\u614b\uff0c\u4e14\u7d55\u4e0d\u6703\u63a8\u65b7\u672c\u5730\u6642\u5340\u3002\u95dc\u65bc\u300c\u7121\u6cd5\u5230\u9054\u300d\u8207\u300c\u6a21\u7cca\u300d\u7684\u8f49\u63db\u6642\u6bb5\u60c5\u6cc1\uff0c\u6587\u4ef6\u4e2d\u5df2\u8aaa\u660e\u5c07\u9075\u5faa tzinfo \u7684\u6298\u758a\u898f\u5247\u3002\n\n**\u4fee\u6b63 2 \u2014 `scheduler\/service.py`\uff1a** \u79fb\u9664\u4e86\u6bcf\u5be6\u4f8b\u7684 `_next_identifier` \u8a08\u6578\u5668\uff1b\u8b58\u5225\u78bc\u73fe\u5728\u65bc\u5efa\u7acb\u6642\uff0c\u5f9e\u5132\u5b58\u5eab\u72c0\u614b\u4e2d\u4ee5 `max(\u73fe\u6709 ID, \u9810\u8a2d\u503c=0) + 1` \u7684\u65b9\u5f0f\u5206\u914d\u3002\u6b64\u505a\u6cd5\u5c0d\u65bc\u5171\u4eab\u53ca\u9810\u5148\u586b\u5145\u7684\u5132\u5b58\u5eab\u7686\u6b63\u78ba\u3002 \u6b0a\u8861\uff1a\u6bcf\u6b21\u5efa\u7acb\u6642\u8017\u6642 O(n) \u800c\u975e O(1)\uff0c\u5c0d\u65bc\u4ee5\u5b57\u5178\u70ba\u5f8c\u7aef\u7684\u5167\u5b58\u5132\u5b58\u800c\u8a00\u5c1a\u53ef\u63a5\u53d7\uff0c\u4e14\u76f8\u8f03\u65bc\u7121\u6cd5\u6aa2\u8996\u5176\u5beb\u5165\u76ee\u6a19\u5132\u5b58\u5340\u7684\u8a08\u6578\u5668\uff0c\u6b64\u65b9\u5f0f\u66f4\u70ba\u6b63\u78ba\u3002\n\n**\u6e2c\u8a66 \u2014 `tests\/test_time_rules.py`\uff08\u65b0\u589e\uff0c5 \u9805\u6e2c\u8a66\uff09\uff1a** \u6625\u9032\u8207\u79cb\u56de\u6642\u9418\u6642\u9593\u4fdd\u5b58\u6a5f\u5236\u3001\u8de8\u6642\u5340\u8f49\u63db\u671f\u9593 23 \u5c0f\u6642\uff0f25 \u5c0f\u6642\u7684\u7d55\u5c0d\u7d93\u904e\u6642\u9593\u3001UTC \u504f\u79fb\u91cf\u91cd\u65b0\u89e3\u6790\u3001\u300c\u7c21\u55ae\u6a21\u5f0f\u4fdd\u6301\u7c21\u55ae\u6a21\u5f0f\u300d\u4ee5\u53ca\u7d14\u7cb9\u7684 UTC \u65e5\u671f\u524d\u9032\u3002\u82e5\u672a\u627e\u5230 IANA \u8cc7\u6599\u5eab\uff0c\u5247\u6703\u4e7e\u6de8\u4fd0\u843d\u5730\u8df3\u904e\u6e2c\u8a66\u3002\n\n**\u6e2c\u8a66 \u2014 `tests\/test_scheduler.py`\uff08\u64f4\u5145\uff0c\u65b0\u589e 2 \u9805\u6e2c\u8a66\uff09\uff1a** \u5169\u500b\u5171\u7528\u540c\u4e00\u5132\u5b58\u5eab\u7684\u670d\u52d9\u5fc5\u9808\u767c\u51fa\u4e0d\u540c\u7684 ID \u4e26\u4fdd\u7559\u5169\u9805\u5de5\u4f5c\uff1b\u82e5\u67d0\u670d\u52d9\u5b58\u53d6\u7684\u5132\u5b58\u5eab\u4e2d\u5df2\u9810\u5148\u586b\u5165 ID 1 \u548c 7\uff0c\u5247\u8a72\u670d\u52d9\u5fc5\u9808\u767c\u51fa ID 8 \u4e26\u4fdd\u6301\u73fe\u6709\u5de5\u4f5c\u4e0d\u8b8a\u3002\n\n**\u7a7a\u503c\u6aa2\u67e5\uff1a** \u6211\u5728\u81e8\u6642\u526f\u672c\u4e2d\u9084\u539f\u4e86\u5169\u500b\u539f\u59cb\u5be6\u4f5c\uff0c\u4e26\u91cd\u65b0\u57f7\u884c\u6e2c\u8a66\u5957\u4ef6 \u2014 \u6240\u6709 5 \u9805\u65b0\u6e2c\u8a66\u5747\u5931\u6557\uff08`FAILED (failures=5)`\uff09\uff0c\u800c\u91dd\u5c0d\u5df2\u4fee\u6b63\u7684\u7a0b\u5f0f\u78bc\u5247\u5168\u90e8\u901a\u904e\u3002\u9019\u4e9b\u6e2c\u8a66\u78ba\u5be6\u9396\u5b9a\u4e86\u7f3a\u9677\u3002\n\n\u57f7\u884c\u904e\u7a0b\u4e2d\u6709\u4e00\u8655\u4fee\u6b63\uff1a\u6211\u7684\u521d\u7a3f\u5c07\u7d93\u904e\u7684\u590f\u4ee4\u6642\u9593\uff08DST\uff09\u8a08\u7b97\u70ba `result - previous`\uff0c\u7576\u5169\u500b\u64cd\u4f5c\u6578\u5171\u7528\u540c\u4e00\u500b tzinfo \u6642\uff0cPython \u6703\u5c07\u5176\u8996\u70ba\u5be6\u6642\u9418\u904b\u7b97\uff0c\u56e0\u6b64\u8b80\u53d6\u7d50\u679c\u70ba `24h`\uff0c\u5c0e\u81f4\u6e2c\u8a66\u5931\u6557\u3002 \u73fe\u5728\u7684\u65b7\u8a00\u6703\u5728\u6e1b\u6cd5\u904b\u7b97\u524d\u5148\u8f49\u63db\u70ba UTC\u3002\u5931\u6557\u7684\u539f\u56e0\u51fa\u5728\u6211\u7684\u6e2c\u8a66\u7a0b\u5f0f\u4e2d\uff0c\u800c\u975e\u4fee\u6b63\u7a0b\u5f0f\u3002\n\n### \u7d66\u8ca0\u8cac\u4eba\u7684\u5099\u8a3b\n\n\u7531\u65bc `fixture-manifest.json` \u672a\u88ab\u4fee\u6539\uff0c\u56e0\u6b64 `tests\/test_time_rules.py` \u662f\u4e00\u500b\u672a\u5217\u65bc `expected_files` \u4e2d\u7684\u6709\u6548\u65b0\u6a94\u6848\u2014\u2014\u82e5\u6aa2\u67e5\u6a5f\u5236\u8981\u6c42\u6a94\u6848\u96c6\u5b8c\u5168\u4e00\u81f4\uff0c\u8acb\u66f4\u65b0\u8a72\u6e05\u55ae\u3002 \u6b64\u5916\uff0cD4\/D5 \u96d6\u5df2\u901a\u5831\u4f46\u523b\u610f\u672a\u4fee\u6b63\uff1a\u5169\u8005\u7686\u53d6\u6c7a\u65bc API \u5408\u7d04\u7684\u6c7a\u7b56\uff08\u522a\u9664\u6642\u672a\u547d\u4e2d\u8a9e\u7fa9\u3001\u64c1\u6709\u8005\u9a57\u8b49\u898f\u5247\uff09\uff0c\u800c\u9019\u4e9b\u6c7a\u7b56\u5728\u6e2c\u8a66\u5957\u4ef6\u4e2d\u4e26\u672a\u660e\u6587\u898f\u5b9a\uff0c\u56e0\u6b64\u9078\u64c7\u5176\u4e2d\u4e00\u9805\u5c07\u53ea\u662f\u731c\u6e2c\uff0c\u800c\u975e\u771f\u6b63\u7684\u4fee\u6b63\u3002.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">\u6e2c\u8a66\u74b0\u5883\u9650\u5236\uff1a\u9019\u662f\u4e00\u500b\u5c0f\u578b\u96e2\u7dda Python \u5132\u5b58\u5eab\u3002Claude \u5728 CLI OAuth \u904e\u671f\u5f8c\u6703\u4f7f\u7528\u5b50\u4ee3\u7406\u4f5c\u70ba\u5099\u7528\u65b9\u6848\uff0c\u56e0\u6b64\u9694\u96e2\u72c0\u614b\u8207\u6191\u8b49\u53ef\u898b\u6027\u4e26\u4e0d\u5b8c\u5168\u4e00\u81f4\u3002.<\/p><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\u7121\u8ad6\u63a1\u7528\u54ea\u7a2e\u8a55\u5206\u65b9\u5f0f\uff0c\u90fd\u7121\u6cd5\u53d6\u4ee3\u4eba\u5de5\u5be9\u67e5\u7684\u5fc5\u8981\u6027\u3002\u7576\u4efb\u4e00\u4ee3\u7406\u7a0b\u5f0f\u5b8c\u6210\u4fee\u5fa9\u5f8c\uff0c\u8acb\u6aa2\u67e5\u5df2\u8b8a\u66f4\u7684\u4ecb\u9762\u3001\u610f\u5916\u7684\u6a94\u6848\u4f5c\u7528\u57df\u3001\u7f3a\u5931\u7684\u8ca0\u9762\u6e2c\u8a66\u3001\u6b0a\u9650\u6216\u6307\u4ee4\u6b77\u53f2\u7d00\u9304\uff0c\u4ee5\u53ca\u56de\u6efe\u8def\u5f91\u3002\u5373\u4f7f\u80fd\u7d66\u51fa\u4ee4\u4eba\u4fe1\u670d\u7684\u89e3\u91cb\uff0c\u4e5f\u7121\u6cd5\u53d6\u4ee3\u53ef\u91cd\u73fe\u7684\u6e2c\u8a66\u3002.<\/p>\n\n\n\n<h2 id=\"safety\" class=\"wp-block-heading\">\u6b0a\u9650\u3001\u6c99\u76d2\u6a5f\u5236\u8207\u904b\u4f5c\u5b89\u5168\u6027<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7de8\u78bc\u4ee3\u7406\u7a0b\u5f0f\u80fd\u5920\u8b80\u53d6\u79c1\u6709\u7a0b\u5f0f\u78bc\u3001\u57f7\u884c shell \u6307\u4ee4\u3001\u4fee\u6539\u5927\u91cf\u6a94\u6848\uff0c\u4e26\u547c\u53eb\u5916\u90e8\u5de5\u5177\u3002\u9019\u4f7f\u5f97\u6b0a\u9650\u8a2d\u8a08\u6210\u70ba\u7522\u54c1\u54c1\u8cea\u7684\u4e00\u90e8\u5206\u3002\u76f8\u95dc\u7684\u554f\u984c\u5305\u62ec\uff1a\u54ea\u4e9b\u64cd\u4f5c\u9700\u8981\u6279\u51c6\u3001\u4ee3\u7406\u7a0b\u5f0f\u9810\u8a2d\u53ef\u5b58\u53d6\u54ea\u4e9b\u5167\u5bb9\u3001\u5b83\u6703\u591a\u6e05\u695a\u5730\u9810\u89bd\u9ad8\u98a8\u96aa\u64cd\u4f5c\uff0c\u4ee5\u53ca\u958b\u767c\u4eba\u54e1\u80fd\u5426\u6aa2\u8996\u6240\u7522\u751f\u7684\u8b8a\u66f4\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8acb\u52ff\u8a8d\u70ba\u5be9\u6838\u63d0\u793a\u8d8a\u5c11\u5c31\u8d8a\u597d\u3002\u5728\u6c92\u6709\u6191\u8b49\u6216\u751f\u7522\u74b0\u5883\u9023\u7dda\u7684\u7368\u7acb\u6e2c\u8a66\u74b0\u5883\u4e2d\uff0c\u4f4e\u5e72\u64fe\u6027\u78ba\u5be6\u5f88\u6709\u7528\u3002\u4f46\u5728\u9023\u63a5\u5230\u90e8\u7f72\u8173\u672c\u3001\u771f\u5be6\u5ba2\u6236\u8cc7\u6599\u6216\u5ee3\u6cdb\u96f2\u7aef\u6b0a\u9650\u7684\u5132\u5b58\u5eab\u4e2d\uff0c\u540c\u6a23\u7684\u884c\u70ba\u537b\u53ef\u80fd\u5e36\u4f86\u98a8\u96aa\u3002\u53cd\u4e4b\uff0c\u904e\u591a\u7684\u5be9\u6838\u63d0\u793a\u53ef\u80fd\u6703\u4f7f\u5b89\u5168\u7684\u81ea\u52d5\u5316\u8b8a\u5f97\u4e0d\u5207\u5be6\u969b\uff0c\u4e26\u4fc3\u4f7f\u4f7f\u7528\u8005\u5728\u672a\u4ed4\u7d30\u95b1\u8b80\u8acb\u6c42\u5167\u5bb9\u7684\u60c5\u6cc1\u4e0b\u5c31\u4e88\u4ee5\u6279\u51c6\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u5011\u7684\u6e2c\u8a66\u4f7f\u7528\u7684\u662f\u5168\u65b0\u7684\u672c\u5730\u526f\u672c\uff0c\u672a\u6d89\u53ca\u751f\u7522\u7cfb\u7d71\u3001\u672a\u9032\u884c\u90e8\u7f72\uff0c\u4e14\u672a\u7d93\u4eba\u5de5\u5e72\u9810\u4ee5\u78ba\u4fdd\u57f7\u884c\u6709\u6548\u3002\u56e0\u6b64\uff0c\u6b64\u6e2c\u8a66\u65e8\u5728\u8a55\u4f30\u5728\u5b89\u5168\u689d\u4ef6\u4e0b\u4efb\u52d9\u7684\u5b8c\u6210\u60c5\u6cc1\uff0c\u800c\u975e\u5169\u6b3e\u7522\u54c1\u7684\u76f8\u5c0d\u5b89\u5168\u6027\u3002 \u5728\u5c07\u4efb\u4e00\u5de5\u5177\u61c9\u7528\u65bc\u91cd\u8981\u5de5\u4f5c\u4e4b\u524d\uff0c\u8acb\u5148\u4ee5\u552f\u8b80\u6b0a\u9650\u958b\u59cb\uff0c\u5b9a\u7fa9\u5141\u8a31\u5b58\u53d6\u7684\u76ee\u9304\u8207\u6307\u4ee4\uff0c\u6aa2\u8996\u5dee\u7570\u5831\u544a\uff0c\u4e26\u5728\u53ef\u6062\u5fa9\u7684\u74b0\u5883\u4e2d\u57f7\u884c\u5ba2\u89c0\u6aa2\u67e5\u3002.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5f9e\u552f\u8b80\u67b6\u69cb\u958b\u59cb\uff0c\u5426\u5247\u5c07\u9762\u81e8\u98a8\u96aa\u3002.<\/li>\n\n\n\n<li>\u8acb\u50c5\u6279\u51c6\u60a8\u5df2\u5145\u5206\u7406\u89e3\u5176\u7bc4\u570d\u8207\u5f8c\u679c\u7684\u6307\u4ee4\u3002.<\/li>\n\n\n\n<li>\u8acb\u5c07\u6191\u8b49\u3001\u751f\u7522\u8cc7\u6599\u53ca\u90e8\u7f72\u5b58\u53d6\u6b0a\u9650\u4fdd\u7559\u5728\u8a66\u7528\u7bc4\u570d\u4e4b\u5916\u3002.<\/li>\n\n\n\n<li>\u5728\u63a5\u53d7\u7d50\u679c\u4e4b\u524d\uff0c\u5fc5\u9808\u63d0\u4f9b\u5dee\u7570\u5831\u544a\u3001\u6e2c\u8a66\u7d50\u679c\u4ee5\u53ca\u660e\u78ba\u7684\u56de\u6efe\u8def\u5f91\u3002.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"customization\" class=\"wp-block-heading\">MCP\u3001\u6280\u80fd\u3001\u5c08\u6848\u8aaa\u660e\u53ca\u5ba2\u88fd\u5316<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u5169\u7a2e\u751f\u614b\u7cfb\u7d71\u7686\u53ef\u9032\u884c\u64f4\u5c55\uff0c\u4f46\u300c\u64f4\u5c55\u300d\u4e00\u8a5e\u4e0d\u61c9\u88ab\u8996\u70ba\u540c\u7fa9\u8a5e\u3002\u5c08\u6848\u6307\u793a\u6703\u544a\u77e5\u4ee3\u7406\u7a0b\u5f0f\u5728\u5132\u5b58\u5eab\u4e2d\u61c9\u5982\u4f55\u904b\u4f5c\uff1b\u53ef\u91cd\u8907\u4f7f\u7528\u7684\u6280\u80fd\uff08Reusable Skills\uff09\u5247\u5c07\u53ef\u91cd\u8907\u7684\u5de5\u4f5c\u6d41\u7a0b\u6216\u5c08\u696d\u77e5\u8b58\u5c01\u88dd\u8d77\u4f86\uff1bMCP \u5247\u5c07\u4e3b\u6a5f\u8207\u5916\u90e8\u5de5\u5177\u6216\u8cc7\u6599\u9023\u63a5\u8d77\u4f86\uff1b\u800c\u639b\u9264\uff08Hooks\uff09\u8207\u6307\u4ee4\uff08Commands\uff09\u5247\u80fd\u81ea\u52d5\u5316\u958b\u767c\u5faa\u74b0\u4e2d\u7684\u7279\u5b9a\u74b0\u7bc0\u3002 \u4e00\u6b3e\u7522\u54c1\u53ef\u4ee5\u5728\u67d0\u4e00\u5c64\u9762\u8868\u73fe\u51fa\u8272\uff0c\u800c\u7121\u9700\u5728\u53e6\u4e00\u5c64\u9762\u8207\u7279\u5b9a\u529f\u80fd\u4e00\u5c0d\u4e00\u5730\u5c0d\u61c9\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u63a1\u8cfc\u6642\u7684\u95dc\u9375\u4e0d\u5728\u65bc\u662f\u5426\u5b58\u5728\u6574\u5408\u6a19\u8a8c\uff0c\u800c\u5728\u65bc\u8a72\u9023\u63a5\u80fd\u5426\u5728\u60a8\u5be6\u969b\u4f7f\u7528\u7684\u4e3b\u6a5f\u4e0a\u5b8c\u6210\u5b89\u88dd\u3001\u9a57\u8b49\u3001\u6838\u51c6\u4e26\u6295\u5165\u904b\u4f5c\u3002\u6b64\u5916\uff0c\u5176\u6545\u969c\u6a21\u5f0f\u4e5f\u5fc5\u9808\u6e05\u6670\u6613\u61c2\u3002 \u4e00\u53f0\u5728\u4e92\u52d5\u6a21\u5f0f\u4e0b\u904b\u4f5c\u6b63\u5e38\uff0c\u4f46\u5728\u7121\u4eba\u503c\u5b88\u6703\u8a71\u4e2d\u9700\u7b49\u5f85\u6838\u51c6\u7684 MCP \u4f3a\u670d\u5668\uff0c\u96d6\u7136\u4ecd\u6709\u5176\u7528\u8655\uff0c\u4f46\u4e0d\u61c9\u88ab\u63cf\u8ff0\u70ba\u300c\u7121\u6469\u64e6\u81ea\u52d5\u5316\u300d\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u91cd\u8907\u4f7f\u7528\u7684\u6307\u793a\u4e5f\u6709\u985e\u4f3c\u7684\u6ce8\u610f\u4e8b\u9805\u3002\u5197\u9577\u7684\u6307\u793a\u6a94\u6848\u4e26\u4e0d\u80fd\u4fdd\u8b49\u5408\u898f\u6027\uff0c\u800c\u904e\u65bc\u8907\u96dc\u7684\u898f\u5247\u96c6\u53ef\u80fd\u6703\u5ffd\u7565\u4e0a\u4e0b\u6587\uff0c\u6216\u9020\u6210\u77db\u76fe\u3002\u8acb\u78ba\u4fdd\u5132\u5b58\u5eab\u6307\u5f15\u7c21\u77ed\u3001\u53ef\u6e2c\u8a66\uff0c\u4e26\u7dca\u8cbc\u7a0b\u5f0f\u78bc\u3002\u61c9\u660e\u78ba\u5217\u51fa\u5fc5\u8981\u7684\u9a57\u8b49\u6307\u4ee4\u3001\u53d7\u4fdd\u8b77\u5340\u57df\u3001\u98a8\u683c\u898f\u5247\uff0c\u4ee5\u53ca\u4ee3\u7406\u7a0b\u5f0f\u4f55\u6642\u5fc5\u9808\u66ab\u505c\u4e26\u5c0b\u6c42\u6307\u793a\u3002.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5c08\u6848\u8aaa\u660e\uff1a<\/strong> \u5132\u5b58\u5eab\u5c08\u5c6c\u7684\u898f\u5247\u8207\u9a57\u8b49\u6307\u4ee4\u3002.<\/li>\n\n\n\n<li><strong>\u6280\u80fd\uff1a<\/strong> \u53ef\u91cd\u8907\u4f7f\u7528\u7684\u7a0b\u5e8f\u6216\u5c08\u696d\u77e5\u8b58\u5957\u4ef6\u3002.<\/li>\n\n\n\n<li><strong>MCP\uff1a<\/strong> \u8207\u5916\u90e8\u5de5\u5177\u53ca\u8cc7\u6599\u7684\u9023\u7dda\u3002.<\/li>\n\n\n\n<li><strong>\u639b\u9264\u8207\u6307\u4ee4\uff1a<\/strong> \u91dd\u5c0d\u5b9a\u7fa9\u597d\u7684\u5de5\u4f5c\u6d41\u7a0b\u4e8b\u4ef6\u9032\u884c\u81ea\u52d5\u5316\u8655\u7406\u3002.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"pricing\" class=\"wp-block-heading\">Codex \u8207 Claude \u4ee3\u78bc\u7684\u5b9a\u50f9\u53ca\u4f7f\u7528\u9650\u5236<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u300cClean Consumer\u300d\u65b9\u6848\u7684\u8d77\u50f9\u70ba\u6bcf\u6708 $20\u3002\u900f\u904e\u76f8\u95dc\u7684 $20 ChatGPT \u65b9\u6848\uff0c\u53ef\u4eab\u6709 Codex \u5b58\u53d6\u6b0a\u9650\uff1b\u800c Claude Pro \u65b9\u6848\u5728\u7f8e\u570b\u7684\u6708\u8cbb\u70ba $20\uff0c\u4e26\u5305\u542b Claude Code\u3002 \u5169\u8005\u5747\u63d0\u4f9b\u6708\u8cbb\u70ba $100 \u53ca $200 \u7684\u9ad8\u7528\u91cf\u6d88\u8cbb\u8005\u65b9\u6848\u3002\u6a19\u50f9\u76f8\u8fd1\u4e26\u4e0d\u4ee3\u8868\u5bb9\u91cf\u5b8c\u5168\u76f8\u540c\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Claude Max 5x \u6bcf\u6708\u8cbb\u7528\u70ba $100\uff0c\u800c Max 20x \u6bcf\u6708\u8cbb\u7528\u70ba $200\u3002 \u300c5x\u300d\u548c\u300c20x\u300d\u7684\u540d\u7a31\u63cf\u8ff0\u7684\u662f\u76f8\u5c0d\u65bc Pro \u65b9\u6848\u7684\u55ae\u6b21\u6703\u8a71\u4f7f\u7528\u91cf\uff0c\u800c\u975e\u4fdd\u8b49\u7684\u7de8\u78bc\u4efb\u52d9\u6578\u91cf\u3002Claude \u8207 Claude Code \u5171\u4eab\u6703\u8a71\u53ca\u6bcf\u9031\u914d\u984d\u3002\u4e0a\u4e0b\u6587\u9577\u5ea6\u3001\u9644\u52a0\u6a94\u6848\u3001\u6a21\u578b\u9078\u64c7\u53ca\u529f\u80fd\u4f7f\u7528\u65b9\u5f0f\uff0c\u7686\u53ef\u80fd\u5f71\u97ff\u914d\u984d\u8017\u76e1\u7684\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 \u65b9\u6848\u9801\u9762\uff0c\u8aaa\u660e Max 5x \u8207 Max 20x \u7684\u4f7f\u7528\u5bb9\u91cf\" 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\u65b9 Max \u65b9\u6848\u9801\u9762\u8aaa\u660e\u4e86 5x \u548c 20x \u7684\u4f7f\u7528\u91cf-\u5bb9\u91cf\u9078\u9805\u3002\u8a72\u5b98\u65b9\u6587\u7ae0\u4e2d\u4ea6\u5217\u51fa\u4e86\u6bcf\u6708\u50f9\u683c\uff1b\u65b9\u6848\u8a73\u60c5\u5df2\u65bc 2026 \u5e74 7 \u6708\u78ba\u8a8d\u3002.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u555f\u7528 Claude \u7684\u9078\u7528\u4f7f\u7528\u984d\u5ea6\u5f8c\uff0c\u5728\u5305\u542b\u7684\u4f7f\u7528\u91cf\u7528\u7f44\u5f8c\uff0c\u7b26\u5408\u8cc7\u683c\u7684\u5de5\u4f5c\u4ecd\u53ef\u7e7c\u7e8c\u9032\u884c\uff0c\u800c\u9019\u4e9b\u984d\u5ea6\u5c07\u4f9d\u7167\u6a19\u6e96 API \u8cbb\u7387\u53e6\u884c\u8a08\u8cbb\u3002API \u91d1\u9470\u9a57\u8b49\u5247\u662f\u53e6\u4e00\u7a2e\u7368\u7acb\u7684\u8a08\u8cbb\u9014\u5f91\u3002\u82e5\u5c07\u4efb\u4e00\u9014\u5f91\u7a31\u70ba\u300c\u7121\u9650\u300d\uff0c\u5c07\u63a9\u84cb\u5176\u771f\u6b63\u7684\u908a\u969b\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 \u8cc7\u8cbb\u65b9\u6848\u8aaa\u660e\u6587\u4ef6\uff0c\u8a73\u8ff0\u5171\u4eab\u6703\u8a71\u53ca\u6bcf\u9031\u4f7f\u7528\u4e0a\u9650\" 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\u78bc\u6703\u4f7f\u7528\u6240\u9023\u63a5\u4e4b Pro \u6216 Max \u8a02\u95b1\u7684\u914d\u984d\uff0c\u5305\u62ec\u5171\u4eab\u5de5\u4f5c\u968e\u6bb5\u53ca\u6bcf\u9031\u4e0a\u9650\u3002\u5be6\u969b\u5bb9\u91cf\u6703\u56e0\u5de5\u4f5c\u8ca0\u8f09\u800c\u7570\u3002.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Codex \u540c\u6a23\u6703\u5c07\u5305\u542b\u5728\u5167\u7684\u6d88\u8cbb\u8005\u65b9\u6848\u7528\u91cf\u3001\u7b26\u5408\u8cc7\u683c\u7684\u5df2\u8cfc\u8cb7\u984d\u5ea6\uff0c\u4ee5\u53ca API \u8a08\u8cbb\u5206\u958b\u8655\u7406\u3002\u672c\u5730\u8a0a\u606f\u8207\u96f2\u7aef\u804a\u5929\u5171\u4eab\u4e94\u5c0f\u6642\u7684\u6642\u6bb5\uff0c\u4e14\u53ef\u80fd\u53e6\u6709\u6bcf\u9031\u4e0a\u9650\u3002CLI \u65e5\u8a8c\u4e2d\u7684\u4ee3\u5e63\u6b04\u4f4d\u7121\u6cd5\u76f4\u63a5\u8f49\u63db\u70ba\u4e94\u5c0f\u6642\u7684\u767e\u5206\u6bd4\u3001\u8a02\u95b1\u984d\u5ea6\u6216 API \u5e33\u55ae\u91d1\u984d\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u82e5\u53ea\u662f\u5076\u723e\u9032\u884c\u55ae\u4eba\u7de8\u78bc\uff0c\u7121\u8ad6\u9078\u64c7\u54ea\u4e00\u5074\u7684 $20 \u5c64\u7d1a\uff0c\u90fd\u662f\u5408\u7406\u7684\u8d77\u9ede\u3002 \u82e5\u9700\u6bcf\u65e5\u8655\u7406\u5177\u6709\u9577\u4e0a\u4e0b\u6587\u7684\u5132\u5b58\u5eab\u5de5\u4f5c\uff0c\u6216\u8a31\u6709\u7406\u7531\u9078\u64c7\u66f4\u9ad8\u4f7f\u7528\u5c64\u7d1a\uff0c\u4f46\u5fc5\u9808\u5728\u89c0\u5bdf\u5be6\u969b\u91cd\u7f6e\u60c5\u6cc1\u8207\u4efb\u52d9\u6d88\u8017\u5f8c\u518d\u884c\u6c7a\u5b9a\u3002\u9ad8\u5f37\u5ea6\u4e26\u884c\u5de5\u4f5c\u5247\u9700\u8981\u66f4\u52a0\u8b39\u614e\uff1a\u5373\u4f7f\u4ed8\u8cbb\u5347\u7d1a\u81f3\u66f4\u9ad8\u5c64\u7d1a\uff0c\u4ecd\u9700\u63a7\u5236\u4e0a\u4e0b\u6587\u3001\u62c6\u5206\u4efb\u52d9\uff0c\u4e26\u5c07\u9ad8\u6210\u672c\u7684\u63a8\u7406\u8cc7\u6e90\u4fdd\u7559\u7d66\u9700\u8981\u9ad8\u5ea6\u5224\u65b7\u529b\u7684\u5de5\u4f5c\u3002.<\/p>\n\n\n\n<h2 id=\"controlled-test\" class=\"wp-block-heading\">\u6211\u5011\u91dd\u5c0d Codex \u8207 Claude \u7de8\u78bc\u6240\u9032\u884c\u7684\u5c0d\u7167\u6e2c\u8a66\u7d50\u679c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u5169\u500b\u4ee3\u7406\u7a0b\u5f0f\u958b\u59cb\u904b\u4f5c\u4e4b\u524d\uff0c\u6211\u5011\u9810\u5148\u9396\u5b9a\u4e86\u56db\u9805\u82f1\u6587\u63d0\u793a\u3001\u4e00\u500b\u516c\u958b\u7684 Python \u6e2c\u8a66\u6848\u4f8b\u3001\u5ba2\u89c0\u6aa2\u67e5\u9805\u76ee\u3001\u8a55\u5206\u6a19\u6e96\uff0c\u4ee5\u53ca\u300c\u9996\u500b\u6709\u6548\u7d50\u679c\u300d\u898f\u5247\u3002\u4efb\u52d9\u6db5\u84cb\u5c0d\u964c\u751f\u5132\u5b58\u5eab\u7684\u7406\u89e3\u3001\u591a\u6a94\u6848\u529f\u80fd\u3001DST \u932f\u8aa4\u4fee\u5fa9\uff0c\u4ee5\u53ca\u5305\u542b\u4fee\u6b63\u7684\u7a0b\u5f0f\u78bc\u5be9\u67e5\u3002 \u6709\u6548\u7684\u7d50\u679c\u4e0d\u6703\u53d7\u5230\u4eba\u5de5\u5e72\u9810\uff0c\u800c\u96d6\u7136\u8868\u73fe\u8f03\u5f31\u4f46\u4ecd\u5c6c\u6709\u6548\u7684\u8f38\u51fa\uff0c\u5247\u7121\u6cd5\u91cd\u65b0\u57f7\u884c\u4ee5\u722d\u53d6\u66f4\u9ad8\u5206\u6578\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\">\u6e2c\u8a66\u7684\u9032\u884c\u65b9\u5f0f<\/p><h3>\u76f8\u540c\u7684\u4efb\u52d9\u3001\u56fa\u5b9a\u7684\u898f\u5247\u3001\u9996\u500b\u6709\u6548\u7684\u8f38\u51fa\u7d50\u679c<\/h3><\/header><div class=\"s-body\"><div class=\"s-grid\"><div class=\"s-stat\"><span>\u300a\u53e4\u7c4d\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\u52de\u5fb7\u00b7\u79d1\u5fb7<\/span><strong>\u514b\u52de\u5fb7-\u4f5c\u54c1\u7b2c5\u865f<\/strong><small>\u5df2\u62ab\u9732\u5b50\u4ee3\u7406\u7684\u5099\u7528\u65b9\u6848<\/small><\/div><\/div><table><tbody><tr><th>\u8cfd\u7a0b\u8868<\/th><td>\u898f\u6a21\u8f03\u5c0f\u3001\u50c5\u5305\u542b\u6a19\u6e96\u51fd\u5f0f\u5eab\u7684 Python \u5132\u5b58\u5eab<\/td><\/tr><tr><th>\u57f7\u884c\u898f\u5247<\/th><td>\u4fdd\u7559\u7b2c\u4e00\u500b\u6709\u6548\u7684\u7d50\u679c\uff1b\u7981\u6b62\u70ba\u63d0\u5347\u54c1\u8cea\u800c\u91cd\u65b0\u57f7\u884c<\/td><\/tr><tr><th>\u5b89\u5168<\/th><td>\u6700\u65b0\u526f\u672c\u3001\u96e2\u7dda\u4efb\u52d9\u3001\u7121\u751f\u7522\u74b0\u5883\u5b58\u53d6\u6b0a\u9650\u3001\u7121\u63a8\u9001\u6216\u90e8\u7f72<\/td><\/tr><tr><th>\u8a08\u5206<\/th><td>\u300a\u51b0\u96ea\u5947\u7de3\u300b100\u5206\u8a55\u5206\u6a19\u6e96\uff0c\u52a0\u4e0a\u7368\u7acb\u7684\u516c\u958b\uff0f\u96b1\u85cf\u5f0f\u6aa2\u67e5<\/td><\/tr><\/tbody><\/table><\/div><\/aside>\n\n\n\n<p class=\"wp-block-paragraph\">Codex \u91dd\u5c0d\u7368\u7acb\u7684 CLI \u7a0b\u5e8f\u57f7\u884c\u4e86\u6e2c\u8a66\uff0c\u4e26\u4fdd\u7559\u4e86\u539f\u59cb JSONL \u4ee5\u53ca CLI \u7522\u751f\u7684\u6a19\u8a18\u6b04\u4f4d\u3002\u7531\u65bc\u8a72\u540c\u4e8b\u7684 Claude CLI OAuth \u6703\u8a71\u5df2\u904e\u671f\uff0c\u56e0\u6b64 Claude Code \u4f7f\u7528\u4e86\u4e00\u500b\u5177\u5099\u5168\u65b0\u5b50\u4ee3\u7406\u4e0a\u4e0b\u6587\u7684\u5354\u8abf\u5668\u3002 \u6211\u5011\u5728\u4e7e\u6de8\u7684\u7a3d\u6838\u526f\u672c\u4e2d\u91cd\u5efa\u4e86 Claude \u7684\u4fee\u88dc\u7a0b\u5f0f\uff0c\u4e26\u91cd\u65b0\u57f7\u884c\u516c\u958b\u8207\u96b1\u85cf\u7684\u6aa2\u67e5\u3002\u6b64\u8209\u7522\u751f\u4e86\u53ef\u4fe1\u7684\u5be6\u52d9\u8b49\u64da\uff0c\u4f46\u4e26\u672a\u7522\u751f\u5b8c\u5168\u76f8\u540c\u7684\u9694\u96e2\u74b0\u5883\u6216\u6a21\u578b\u63a7\u5236\u9762\u3002.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u4efb\u52d9<\/th><th>\u300a\u53e4\u7c4d\u300b<\/th><th>\u514b\u52de\u5fb7\u00b7\u79d1\u5fb7<\/th><th>\u6709\u754c\u8a6e\u91cb<\/th><\/tr><\/thead><tbody><tr><td>T1\uff1a\u5c0d\u5132\u5b58\u5eab\u7684\u7406\u89e3<\/td><td>20\/20<\/td><td>20\/20<\/td><td>\u5e73\u5c40\uff1b\u7cbe\u7c21\u5f0f\u8207\u8a73\u76e1\u5f0f<\/td><\/tr><tr><td>T2\uff1a\u591a\u6a94\u6848\u529f\u80fd<\/td><td>30\/30<\/td><td>30\/30<\/td><td>\u529f\u80fd\u6027\u95dc\u806f\uff1b\u4e0d\u540c\u7684\u9a57\u8b49\u8207\u6e2c\u8a66\u7bc4\u570d<\/td><\/tr><tr><td>T3\uff1aDST \u4fee\u5fa9<\/td><td>30\/30<\/td><td>30\/30<\/td><td>\u5169\u8005\u5747\u901a\u904e\u6e2c\u8a66\uff1b\u8f03\u7a84\u7684\u4fee\u88dc\u7bc4\u570d\u8207\u8f03\u5bec\u7684\u908a\u7de3\u8986\u84cb\u7bc4\u570d<\/td><\/tr><tr><td>T4\uff1a\u6aa2\u4fee\u8207\u4fee\u5fa9<\/td><td>18\/20<\/td><td>19\/20<\/td><td>Claude \u4ee3\u78bc\u986f\u793a\u51fa\u66f4\u5ee3\u6cdb\u7684\u5be9\u67e5\u7bc4\u570d<\/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\u6e2c\u8a66 \u00b7 \u56fa\u5b9a\u8a55\u5206\u6a19\u6e96<\/p><h3>Codex 98\/100 \u5c0d\u6bd4 Claude Code 99\/100<\/h3><p class=\"s-sub\">\u9019\u4e00\u9ede\u4e4b\u5dee\u4e26\u975e\u653e\u8af8\u56db\u6d77\u7686\u6e96\u7684\u52dd\u51fa\u8a0a\u865f\u3002\u771f\u6b63\u6709\u7528\u7684\u5dee\u7570\u53d6\u6c7a\u65bc\u5177\u9ad4\u4efb\u52d9\u3002.<\/p><\/header><div class=\"s-body\"><div class=\"s-grid\"><div class=\"s-stat\"><span>\u300a\u53e4\u7c4d\u300b<\/span><strong>98\/100<\/strong><\/div><div class=\"s-stat\"><span>\u514b\u52de\u5fb7\u00b7\u79d1\u5fb7<\/span><strong>99\/100<\/strong><\/div><\/div><table><thead><tr><th>\u6c7a\u7b56\u5340\u57df<\/th><th>\u89c0\u5bdf\u7d50\u679c<\/th><th>\u5be6\u7528\u95b1\u8b80<\/th><\/tr><\/thead><tbody><tr><td>\u5c0d\u5132\u5b58\u5eab\u7684\u7406\u89e3<\/td><td>\u5e73\u624b \u00b7 \u5404\u5f97 20\/20 \u5206<\/td><td>Claude \u7684\u5167\u5bb9\u66f4\u70ba\u8a73\u76e1\uff1bCodex \u5247\u66f4\u70ba\u7c21\u6f54\u3002.<\/td><\/tr><tr><td>\u591a\u6a94\u6848\u529f\u80fd<\/td><td>\u5e73\u624b \u00b7 \u540430\/30<\/td><td>\u5169\u8005\u5747\u901a\u904e\u4e86\u96b1\u85cf\u6aa2\u67e5\uff1bClaude \u589e\u52a0\u4e86\u66f4\u5ee3\u6cdb\u7684\u6e2c\u8a66\u3002.<\/td><\/tr><tr><td>\u590f\u4ee4\u6642\u932f\u8aa4\u4fee\u5fa9<\/td><td>\u5e73\u624b \u00b7 \u540430\/30<\/td><td>Claude \u8986\u84cb\u7684\u908a\u7de3\u7bc4\u570d\u8f03\u5ee3\uff1bCodex \u5247\u63a1\u7528\u8f03\u7a84\u7684\u4fee\u88dc\u7247\u3002.<\/td><\/tr><tr><td>\u6aa2\u8996\u8207\u7dad\u4fee<\/td><td>Claude 19\/20\uff1bCodex 18\/20<\/td><td>Claude \u767c\u73fe\u4e86\u66f4\u591a\u53ef\u91cd\u73fe\u7684\u7f3a\u9677\u3002.<\/td><\/tr><tr><td>\u89c0\u6e2c\u901f\u5ea6<\/td><td>\u6df7\u5408<\/td><td>Claude \u9818\u5148 T1\/T2\uff1bCodex \u9818\u5148 T3\/T4\u3002.<\/td><\/tr><\/tbody><\/table><p class=\"s-note\"><strong>\u62ab\u9732\uff1a<\/strong> \u4f7f\u7528\u76f8\u540c\u7684\u63d0\u793a\u5b57\u5143\u548c\u6e2c\u8a66\u6846\u67b6\uff0c\u4f46\u9694\u96e2\u8def\u5f91\u4e0d\u540c\u3002\u8acb\u52ff\u5c07\u6b64\u5c0f\u578b\u6e2c\u8a66\u7d50\u679c\u6cdb\u5316\u81f3\u6bcf\u500b\u5132\u5b58\u5eab\u3001\u6a21\u578b\u5c64\u6216\u7368\u7acb\u57f7\u884c\u968e\u6bb5\u3002.<\/p><\/div><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\u7531\u65bc\u6b64\u6e2c\u8a66\u6846\u67b6\u898f\u6a21\u904e\u5c0f\uff0c\u7121\u6cd5\u91dd\u5c0d\u5927\u578b\u5132\u5b58\u5eab\u3001\u6240\u6709\u7a0b\u5f0f\u8a9e\u8a00\u3001\u6240\u6709\u6a21\u578b\u5c64\u7d1a\u6216\u9577\u6642\u9593\u7684\u81ea\u4e3b\u57f7\u884c\u6703\u8a71\u4f86\u8a55\u4f30\u5176\u6548\u80fd\u3002\u9019\u4e00\u500b\u9ede\u6578\u7684\u7e3d\u5dee\u8ddd\uff0c\u6700\u6070\u7576\u7684\u89e3\u8b80\u61c9\u70ba\u300c\u5169\u8005\u5747\u6210\u529f\uff0c\u4f46\u5be9\u67e5\u7bc4\u570d\u6709\u6240\u5dee\u7570\u300d\uff0c\u800c\u975e\u4e00\u7a2e\u666e\u9069\u6027\u7684\u6392\u540d\u3002.<\/p>\n\n\n\n<h2 id=\"user-experience\" class=\"wp-block-heading\">\u771f\u5be6\u7528\u6236\u7684\u53cd\u994b\u2014\u2014\u4ee5\u53ca\u8a72\u76f8\u4fe1\u591a\u5c11<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7576\u793e\u7fa4\u56de\u994b\u5305\u542b\u5c08\u6848\u3001\u4efb\u52d9\u3001\u6a21\u578b\u3001\u5de5\u4f5c\u6a21\u5f0f\u53ca\u6642\u9593\u7bc4\u570d\u7b49\u8cc7\u8a0a\u6642\uff0c\u5176\u50f9\u503c\u4fbf\u986f\u8457\u63d0\u5347\uff1b\u82e5\u8cbc\u6587\u50c5\u8868\u793a\u67d0\u6b3e\u7522\u54c1\u300c\u611f\u89ba\u66f4\u8070\u660e\u300d\u6216\u300c\u901f\u5ea6\u5feb\u5f97\u591a\u300d\uff0c\u5247\u5176\u53c3\u8003\u50f9\u503c\u8f03\u4f4e\u3002\u4e0d\u540c\u4f7f\u7528\u8005\u6703\u6bd4\u8f03\u4e0d\u540c\u7684\u5132\u5b58\u5eab\u3001\u8a02\u95b1\u65b9\u6848\u3001\u63d0\u793a\u8a5e\u3001\u64f4\u5145\u529f\u80fd\u4ee5\u53ca\u76e3\u7763\u7a0b\u5ea6\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0a\u8ff0 Reddit \u7684\u60c5\u5883\u7bc4\u4f8b\u986f\u793a\u4e86\u4e00\u7a2e\u4e92\u52d5\u4e0a\u7684\u6b0a\u8861\uff1a\u5feb\u901f\u4e14\u5177\u5c0d\u8a71\u611f\u7684\u4e92\u52d5\u53ef\u80fd\u9700\u8981\u66f4\u591a\u6ce8\u610f\u529b\uff0c\u800c\u5be9\u614e\u7684\u57f7\u884c\u96d6\u7136\u611f\u89ba\u8f03\u6162\uff0c\u4f46\u6240\u9700\u7684\u4fee\u6b63\u537b\u8f03\u5c11\u3002 \u6211\u5011\u7684\u53d7\u63a7\u6e2c\u8a66\u8207\u8a72\u5e33\u865f\u7684\u60c5\u6cc1\u50c5\u90e8\u5206\u91cd\u758a\u3002\u6e2c\u8a66\u7d50\u679c\u986f\u793a\uff0c\u5728\u6709\u6548\u7684\u57f7\u884c\u6b21\u6578\u4e2d\uff0c\u901f\u5ea6\u8868\u73fe\u53c3\u5dee\u4e0d\u9f4a\u4e14\u672a\u898b\u4eba\u70ba\u5e72\u9810\uff0c\u56e0\u6b64\u7121\u6cd5\u9a57\u8b49\u300c\u4eba\u5de5\u76e3\u63a7\u300d\u7684\u8aaa\u6cd5\u3002\u9019\u6b63\u662f\u70ba\u4f55\u61c9\u5c07\u793e\u7fa4\u8b49\u64da\u8207\u53d7\u63a7\u8b49\u64da\u4e00\u4f75\u5448\u73fe\uff0c\u800c\u975e\u5c07\u5169\u8005\u6df7\u70ba\u4e00\u8ac7\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u95dc\u65bc X \u578b\u8a2d\u8a08\u7684\u8a55\u8ad6\u9084\u63d0\u51fa\u4e86\u4e00\u500b\u6709\u7528\u7684\u89c0\u9ede\uff1a\u7de8\u78bc\u7d50\u679c\u5c6c\u65bc\u6574\u500b\u7cfb\u7d71\uff0c\u800c\u4e0d\u50c5\u50c5\u662f\u6a21\u578b\u6a19\u7c64\u3002\u9019\u5169\u7bc7\u500b\u5225\u8cbc\u6587\u90fd\u4e0d\u61c9\u88ab\u8996\u70ba\u8abf\u67e5\u6578\u64da\u3002\u61c9\u5229\u7528\u5b83\u5011\u4f86\u91d0\u6e05\u81ea\u8eab\u5be6\u9a57\u4e2d\u9700\u8981\u63a2\u8a0e\u7684\u554f\u984c\u2014\u2014\u5e72\u9810\u6b21\u6578\u3001\u5dee\u7570\u5927\u5c0f\u3001\u6e2c\u8a66\u54c1\u8cea\uff0c\u4ee5\u53ca\u5f9e\u932f\u8aa4\u5047\u8a2d\u4e2d\u6062\u5fa9\u7684\u80fd\u529b\u3002.<\/p>\n\n\n\n<h2 id=\"globalgpt\" class=\"wp-block-heading\">\u900f\u904e GlobalGPT \u64f4\u5c55 Codex \u548c Claude \u7de8\u78bc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT \u662f\u4e00\u7a2e <a href=\"https:\/\/www.glbgpt.com\/hub\/best-all-in-one-ai-tools-and-platforms-11-options-compared\/\">\u591a\u6a21\u578b\u3001\u591a\u6a21\u614b\u5de5\u4f5c\u5340<\/a>, \u4e26\u975e\u7528\u4f86\u53d6\u4ee3\u539f\u751f\u5132\u5b58\u5eab\u4ee3\u7406\u7a0b\u5f0f\u3002\u5176\u5be6\u969b\u4f5c\u7528\u5728\u65bc\u64f4\u5c55\u73fe\u6709\u4e3b\u6a5f\u7684\u529f\u80fd\uff1a\u5229\u7528\u53e6\u4e00\u7a2e\u53ef\u7528\u7684\u4ee3\u7406\u7a0b\u5f0f\u6a21\u578b\u4f86\u63d0\u4f9b\u7b2c\u4e8c\u610f\u898b\u3001\u9032\u884c\u8a08\u756b\u5be9\u67e5\u3001\u5b8c\u6210\u6587\u4ef6\u6838\u5c0d\uff0c\u6216\u7522\u751f\u7279\u6b8a\u8f38\u51fa\uff1b\u800c Codex \u6216 Claude Code \u5247\u4ecd\u8ca0\u8cac\u8655\u7406\u5132\u5b58\u5eab\u5b58\u53d6\u3001shell \u6307\u4ee4\u3001\u6e2c\u8a66\u53ca\u6838\u51c6\u7b49\u4e8b\u5b9c\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT \u767c\u5e03\u4e86\u91dd\u5c0d\u4ee5\u4e0b\u7522\u54c1\u7684\u7b2c\u4e00\u65b9 CLI \u6307\u5357\uff1a <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-globalgpt-cli-in-codex\/\">\u300a\u53e4\u7c4d\u300b<\/a> \u548c <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-globalgpt-cli-in-claude-code\/\">\u514b\u52de\u5fb7\u00b7\u79d1\u5fb7<\/a>, \uff0c\u4ee5\u53ca Cursor\u3002\u5728\u6211\u5011\u5b89\u5168\u7684 T5 \u6574\u5408\u6e2c\u8a66\u4e2d\uff0cCLI \u5728\u9019\u5169\u7a2e\u6bd4\u8f03\u74b0\u5883\u4e2d\u5747\u6210\u529f\u5b8c\u6210\u4e86\u76f8\u540c\u7684\u51cd\u7d50\u4efb\u52d9\u3002\u5728 Codex \u4e2d\uff0c\u6211\u5011\u9084\u9a57\u8b49\u4e86\u552f\u8b80\u7684 MCP \u6a21\u578b\u6e05\u55ae\u547c\u53eb\uff0c\u4e26\u5b89\u88dd\u3001\u8f09\u5165\u53ca\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\u8a08\u5165\u7de8\u78bc\u5206\u6578<\/p><h3>CLI \u5df2\u5728\u5169\u500b\u5de5\u4f5c\u6d41\u7a0b\u4e2d\u5747\u901a\u904e\u9a57\u8b49\uff1bMCP \u8207 Skill \u5df2\u5728 Codex \u4e2d\u901a\u904e\u9a57\u8b49<\/h3><p class=\"s-sub\">\u9019\u9805\u6307\u6a19\u8861\u91cf\u7684\u662f\u6574\u5408\u8def\u5f91\uff0c\u800c\u975e GlobalGPT \u662f\u5426\u53d6\u4ee3\u4e86\u4efb\u4e00\u539f\u751f\u7de8\u78bc\u56e0\u5b50\u3002.<\/p><\/header><div class=\"s-body\"><table><thead><tr><th>\u8def\u5f91<\/th><th>Codex \u74b0\u5883<\/th><th>Claude \u540c\u4e8b\u8dd1\u6b65\u6d3b\u52d5<\/th><\/tr><\/thead><tbody><tr><td>GlobalGPT \u547d\u4ee4\u5217\u4ecb\u9762<\/td><td>\u5df2\u900f\u904e gpt-5.6-sol \u548c gpt-5.6-luna \u9032\u884c\u9a57\u8b49<\/td><td>\u5df2\u900f\u904e\u76f8\u540c\u7684\u51cd\u7d50\u4efb\u52d9\u9032\u884c\u9a57\u8b49<\/td><\/tr><tr><td>MCP<\/td><td>\u5df2\u9a57\u8b49\u4e92\u52d5\u5f0f\u552f\u8b80\u6a21\u578b\u6e05\u55ae<\/td><td>\u57f7\u884c\u671f\u9593\u672a\u9023\u7dda<\/td><\/tr><tr><td>\u6280\u80fd<\/td><td>\u5df2\u5b89\u88dd\u3001\u8f09\u5165\u4e26\u9032\u884c\u6e2c\u8a66<\/td><td>\u5df2\u5b89\u88dd\uff0c\u4f46\u672a\u7528\u65bc\u8655\u7406\u51cd\u7d50\u901a\u8a71<\/td><\/tr><tr><td>\u7121\u4eba\u503c\u5b88\u7684 MCP<\/td><td>\u89c0\u5bdf\u5230\u6838\u51c6\u9650\u5236<\/td><td>\u672a\u7d93\u6e2c\u8a66<\/td><\/tr><\/tbody><\/table><details><summary>\u6aa2\u8996\u5b8c\u6574\u7684\u6574\u5408\u8b49\u64da<\/summary><pre># GlobalGPT \u6574\u5408\u6e2c\u8a66\u6458\u8981\n\n# # \u7bc4\u570d\n\nT5 \u7528\u65bc\u8a55\u4f30 GlobalGPT \u7684\u6574\u5408\u60c5\u6cc1\uff0c\u4e14\u4e0d\u8a08\u5165\u539f\u751f Codex \u7de8\u78bc\u5206\u6578\u3002\u672c\u6b21\u6e2c\u8a66\u672a\u4f7f\u7528 Yukie\u3002\n\n## \u6a21\u578b\u9396\u5b9a\u8207\u5c31\u7dd2\u72c0\u614b\n\n- \u6a21\u578b A\uff1a`gpt-5.6-sol`\n- \u6a21\u578b B\uff1a`gpt-5.6-luna`\n- \u5169\u6b3e\u6a21\u578b\u5747\u51fa\u73fe\u5728\u5373\u6642\u6a21\u578b\u6e05\u55ae\u4e2d\u3002\n- \u5169\u7a2e\u8f15\u91cf\u7d1a\u5c31\u7dd2\u6027\u63a2\u6e2c\u5747\u8fd4\u56de\u6709\u6548\u4e14\u53ef\u89e3\u6790\u7684\u6587\u5b57\u3002\n- \u6a21\u578b\u5728\u6b63\u5f0f\u7684 T5A \u548c T5B \u8f38\u51fa\u547c\u53eb\u524d\u5df2\u9396\u5b9a\u3002\n\n## \u6b63\u5f0f CLI \u7d50\u679c\n\n| \u4efb\u52d9 | \u6a21\u578b | \u72c0\u614b | \u8017\u6642 | \u63d0\u793a\u8a5e\u6a19\u8a18\u6578 | \u5b8c\u6210\u8a5e\u6a19\u8a18\u6578 | \u6240\u9700\u6a19\u984c\u6578 |\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\u9019\u5169\u6b21\u6b63\u5f0f\u547c\u53eb\u7686\u900f\u904e `glbgpt exec` \u4f7f\u7528\u76f8\u540c\u7684\u51cd\u7d50\u7248\u82f1\u6587\u7522\u54c1\u898f\u5283\u4efb\u52d9\uff0c\u50c5\u8fd4\u56de\u82f1\u6587\u53ef\u898b\u8f38\u51fa\uff0c\u4e14\u672a\u6d29\u9732\u4efb\u4f55\u6191\u8b49\u3002\u672a\u9032\u884c\u54c1\u8cea\u91cd\u8dd1\u3002\n\n## MCP \u7d50\u679c\n\n- `codex mcp list` \u986f\u793a `globalgpt` \u5df2\u555f\u7528\u3002\n- \u4e00\u500b\u975e\u4e92\u52d5\u5f0f Codex \u6703\u8a71\u5075\u6e2c\u5230\u4e26\u5617\u8a66\u57f7\u884c `mcp__globalgpt__glbgpt_list_models`\uff0c\u4f46\u56e0\u7121\u6cd5\u53d6\u5f97\u7121\u4eba\u503c\u5b88\u7684 MCP \u6279\u51c6\uff0c\u8a72\u547c\u53eb\u906d\u53d6\u6d88\u3002\u672a\u653e\u5bec\u4efb\u4f55\u5b89\u5168\u8a2d\u5b9a\u3002\n- \u6d3b\u8e8d\u7684\u4e92\u52d5\u5f0f Codex \u5de5\u4f5c\u968e\u6bb5\u6210\u529f\u547c\u53eb\u4e86\u76f8\u540c\u7684\u552f\u8b80 GlobalGPT MCP \u5de5\u5177\uff0c\u4e26\u53d6\u5f97\u4e5d\u500b\u804a\u5929\u6a21\u578b\u3002\n- \u7d50\u679c\uff1a\u5df2\u9a57\u8b49\u4e92\u52d5\u5f0f MCP \u5b58\u53d6\u6b0a\u9650\uff1b\u7121\u4eba\u503c\u5b88\u7684\u975e\u4e92\u52d5\u5f0f MCP \u57f7\u884c\u4ecd\u53d7\u6279\u51c6\u9650\u5236\u3002\n\n## \u6280\u80fd\u7d50\u679c\n\n- \u900f\u904e\u9023\u7d50\u81f3\u6346\u7d81\u7684 CLI \u6280\u80fd\u5957\u4ef6\uff0c\u5df2\u5c07 GlobalGPT \u548c GlobalGPT \u7de8\u78bc\u6280\u80fd\u5b89\u88dd\u81f3 Codex \u6280\u80fd\u76ee\u9304\u4e2d\u3002\n- \u5df2\u8f09\u5165 GlobalGPT \u6280\u80fd\u4e26\u9032\u884c\u6e2c\u8a66\uff0c\u4ee5\u9a57\u8b49\u5df2\u914d\u7f6e\u7684\u6703\u8a71\u6aa2\u67e5\u3001\u5373\u6642\u6a21\u578b\u9078\u53d6\u3001\u5c31\u7dd2\u72c0\u614b\u3001\u4fe1\u7528\u5b89\u5168\u9078\u9805\u53ca\u5931\u6557\u8655\u7406\u3002\n- \u7d50\u679c\uff1a\u5df2\u5728\u6d3b\u8e8d\u7684 Codex \u5de5\u4f5c\u6d41\u7a0b\u4e2d\u5b89\u88dd\u4e26\u57f7\u884c\u3002\n\n## \u6709\u9650\u7d50\u8ad6\n\n\u672c\u6b21\u57f7\u884c\u9a57\u8b49\u4e86 GlobalGPT CLI \u547c\u53eb\u53ef\u6b63\u5e38\u904b\u4f5c\u3001\u5f9e Codex \u767c\u8d77\u7684\u4e92\u52d5\u5f0f GlobalGPT MCP \u552f\u8b80\u547c\u53eb\uff0c\u4ee5\u53ca\u5df2\u5b89\u88dd\u4e14\u88ab\u4f7f\u7528\u7684 GlobalGPT \u6280\u80fd\u8def\u5f91\u3002 \u6b64\u6e2c\u8a66\u4e26\u672a\u8b49\u660e\u6bcf\u500b\u6a21\u578b\u3001\u5a92\u9ad4\u5de5\u5177\u3001\u4e3b\u6a5f\u3001\u5e33\u6236\u6216\u7121\u4eba\u503c\u5b88\u7684 MCP \u914d\u7f6e\u7686\u80fd\u6b63\u5e38\u904b\u4f5c\u3002\u6b64\u6e2c\u8a66\u4ea6\u672a\u6e2c\u8a66 Yukie\uff0c\u4ea6\u4e0d\u652f\u6301\u300cGlobalGPT \u53ef\u53d6\u4ee3 Codex \u6216 Claude Code\u300d\u4e4b\u4e3b\u5f35\u3002.\n<\/pre><\/details><p class=\"s-note\">\u5df2\u9a57\u8b49\u7bc4\u570d\uff1a\u7279\u5b9a\u7684 CLI \u547c\u53eb\u3001\u4e00\u6b21\u4e92\u52d5\u5f0f MCP \u8b80\u53d6\uff0c\u4ee5\u53ca\u4e00\u500b\u5df2\u5b89\u88dd\uff0f\u4f7f\u7528\u7684\u6280\u80fd\u8def\u5f91\u3002\u9019\u4e26\u4e0d\u80fd\u8b49\u660e\u6240\u6709\u6a21\u578b\u3001\u5a92\u9ad4\u5de5\u5177\u3001\u4e3b\u6a5f\u6216\u7121\u4eba\u503c\u5b88\u914d\u7f6e\u5747\u5df2\u901a\u904e\u9a57\u8b49\u3002.<\/p><\/div><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\u908a\u754c\u81f3\u95dc\u91cd\u8981\u3002\u8a72\u540c\u4e8b\u57f7\u884c\u7684 Claude \u6e2c\u8a66\u9a57\u8b49\u7684\u662f CLI \u8def\u5f91\uff0c\u800c\u975e Claude \u7aef\u7684 MCP\u3002\u8a72\u6280\u80fd\u96d6\u5df2\u5b89\u88dd\u65bc\u8a72\u8655\uff0c\u4f46\u4e26\u672a\u7528\u65bc\u8655\u7406\u90a3\u4e9b\u88ab\u51cd\u7d50\u7684\u901a\u8a71\u3002 \u5373\u4f7f\u5617\u8a66\u4ee5\u7121\u4eba\u503c\u5b88\u6a21\u5f0f\u57f7\u884c Codex MCP\uff0c\u4ecd\u9700\u4eba\u5de5\u6838\u51c6\u3002\u6a21\u578b\u7684\u53ef\u7528\u6027\u8207\u4fe1\u7528\u984d\u5ea6\u4ea6\u53d6\u6c7a\u65bc\u7576\u524d\u7684 GlobalGPT \u65b9\u6848\uff0c\u56e0\u6b64\u958b\u767c\u4eba\u54e1\u61c9\u67e5\u95b1\u5be6\u969b\u6e05\u55ae\uff0c\u800c\u975e\u5047\u8a2d\u6240\u6709\u6a21\u578b\u5747\u5df2\u5305\u542b\u5728\u5167\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT \u9084\u6db5\u84cb\u4e86\u5716\u7247\u3001\u5f71\u7247\u3001\u97f3\u8a0a\u4ee5\u53ca\u5e36\u6709\u6307\u5f15\u7684 Agent \u5de5\u4f5c\u6d41\u7a0b\u3002 Yukie \u7684\u300c\u7c21\u5831\u300d\u3001\u300c\u6587\u4ef6\u300d\u548c\u300c\u5716\u7247\u300d\u9805\u76ee\u5247\u5c6c\u65bc\u4e0d\u540c\u985e\u5225\uff1a\u5b83\u5011\u91dd\u5c0d\u7121\u9700\u7de8\u78bc\u7684\u4efb\u52d9\uff0c\u63d0\u4f9b\u660e\u78ba\u7684\u7bc4\u672c\u548c\u9010\u6b65\u7684\u700f\u89bd\u5668\u6307\u5f15\u3002\u9019\u6bd4\u958b\u555f\u7a0b\u5f0f\u8a2d\u8a08\u547d\u4ee4\u5217\u4ecb\u9762\uff08CLI\uff09\u4f86\u88fd\u4f5c\u7c21\u5831\u6216\u7d50\u69cb\u5316\u6587\u4ef6\u4f86\u5f97\u5bb9\u6613\uff0c\u4f46\u4e26\u4e0d\u80fd\u53d6\u4ee3\u8b80\u53d6\u5132\u5b58\u5eab\u3001\u57f7\u884c\u6e2c\u8a66\u6216\u9032\u884c\u7a0b\u5f0f\u78bc\u5be9\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\u7a0b\u985e\u5225<\/p><h3>Yukie \u6307\u5c0e\u7684\u700f\u89bd\u5668\u4ee3\u7406\u7a0b\u5f0f\u6e2c\u8a66<\/h3><p class=\"s-sub\">\u9069\u7528\u65bc\u7279\u5b9a\u4efb\u52d9\u7684\u7db2\u9801\u5de5\u4f5c\u6d41\u7a0b\uff1b\u5c1a\u672a\u7d93\u904e\u6e2c\u8a66\uff0c\u7121\u6cd5\u53d6\u4ee3\u5132\u5b58\u5eab\u7684\u7de8\u78bc\u4ee3\u7406\u7a0b\u5f0f\u3002.<\/p><\/header><div class=\"s-body\"><table><thead><tr><th>\u5de5\u4f5c\u6d41\u7a0b<\/th><th>\u5df2\u6eff\u8db3\u7684\u6a19\u6e96<\/th><th>\u7b2c\u4e00\u500b\u6709\u6548\u7684\u7d50\u679c<\/th><\/tr><\/thead><tbody><tr><td>\u5e7b\u71c8\u7247<\/td><td>5\/6<\/td><td>\u5df2\u751f\u6210\u4e94\u5f35\u6295\u5f71\u7247\u7684\u7c21\u5831\uff1b\u8b1b\u8005\u5099\u8a3b\u7121\u6cd5\u9a57\u8b49\u3002.<\/td><\/tr><tr><td>\u6587\u4ef6<\/td><td>6\/6<\/td><td>\u7d50\u69cb\u5316\u7684\u7814\u7a76\u6458\u8981\uff0c\u9644\u6709\u532f\u51fa\u529f\u80fd\u53ca\u7248\u672c\u6b77\u53f2\u7d00\u9304\u3002.<\/td><\/tr><tr><td>\u5716\u7247 + \u5716\u8aaa<\/td><td>5\/6<\/td><td>\u5f37\u70c8\u7684\u65b9\u5f62\u8996\u89ba\u6548\u679c\uff1b\u61c9\u6709\u7684\u5716\u8aaa\u7f3a\u5931\u3002.<\/td><\/tr><\/tbody><\/table><p class=\"s-note\">\u5408\u7406\u7684\u7d50\u8ad6\uff1a\u660e\u78ba\u7684\u5207\u5165\u9ede\u8207\u5f15\u5c0e\u5f0f\u7684\u591a\u6a21\u5f0f\u5de5\u4f5c\u6d41\u7a0b\u3002\u7f3a\u4e4f\u4f9d\u64da\u7684\u7d50\u8ad6\uff1a\u7121\u9650\u5236\u4f7f\u7528\u3001\u78ba\u5207\u50f9\u683c\uff0c\u6216\u5b8c\u5168\u53d6\u4ee3 Codex\/Claude Code\u3002.<\/p><\/div><\/article>\n\n\n\n<h2 id=\"which-one\" class=\"wp-block-heading\">\u7368\u7acb\u958b\u767c\u8005\u61c9\u8a72\u9078\u64c7\u54ea\u7a2e\u7de8\u78bc\u5de5\u5177\uff1f<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u9078\u64c7 Codex<\/strong> \u7576\u7dca\u6e4a\u4e14\u53d7\u9650\u7684\u57f7\u884c\u65b9\u5f0f\u3001\u5176\u53ef\u7528\u7684\u8868\u9762\u7d44\u5408\uff0c\u6216\u662f\u60a8\u8a2d\u5b9a\u4e2d\u53ef\u7528\u7684\u57f7\u884c\u8b49\u64da\uff0c\u7b26\u5408\u60a8\u7684\u5de5\u4f5c\u65b9\u5f0f\u6642\u3002.<\/li>\n\n\n\n<li><strong>\u9078\u64c7 Claude \u4ee3\u78bc<\/strong> \u7576\u5c0d\u8a71\u7d42\u7aef\u8ff4\u5708\u3001\u60a8\u5df2\u9a57\u8b49\u7684\u5ba2\u88fd\u5316\u529f\u80fd\uff0c\u6216\u662f\u5982\u6211\u5011\u6e2c\u8a66\u6848\u4f8b\u4e2d\u6240\u89c0\u5bdf\u5230\u7684\u66f4\u5ee3\u6cdb\u7684\u5be9\u67e5\u884c\u70ba\u66f4\u70ba\u91cd\u8981\u6642\u3002.<\/li>\n\n\n\n<li><strong>\u82e5\u9047\u5230\u4e0d\u719f\u6089\u7684\u5132\u5b58\u5eab\uff0c\u8acb\u4f7f\u7528\u5176\u4e2d\u4efb\u4e00\u7a2e<\/strong> \u53ea\u6709\u5728\u901a\u904e\u552f\u8b80\u67b6\u69cb\u8207\u98a8\u96aa\u8a55\u4f30\u5f8c\uff0c\u9019\u5169\u6b3e\u5de5\u5177\u624d\u6210\u529f\u8655\u7406\u4e86\u9019\u9805\u4efb\u52d9\u3002.<\/li>\n\n\n\n<li><strong>\u8acb\u6709\u9078\u64c7\u6027\u5730\u540c\u6642\u4f7f\u7528\u9019\u5169\u8005<\/strong> \u5728\u4f55\u7a2e\u60c5\u6cc1\u4e0b\uff0c\u7531\u7b2c\u4e8c\u500b\u4ee3\u7406\u9032\u884c\u5be9\u67e5\u6240\u7522\u751f\u7684\u984d\u5916\u8a02\u95b1\u8207\u5354\u8abf\u6210\u672c\u662f\u503c\u5f97\u7684\u3002\u8acb\u8981\u6c42\u7b2c\u4e8c\u500b\u5de5\u5177\u5c0d\u5dee\u7570\u6216\u8a08\u756b\u63d0\u51fa\u8cea\u7591\uff0c\u800c\u975e\u76f2\u76ee\u5730\u91cd\u8907\u8a72\u4efb\u52d9\u3002.<\/li>\n\n\n\n<li><strong>\u52a0\u5165 GlobalGPT<\/strong> \u7576\u591a\u6a21\u578b\u8def\u7531\u6216\u591a\u6a21\u5f0f\u4f5c\u696d\u662f\u7f3a\u5931\u7684\u4e00\u5c64\u6642\uff0c\u8acb\u5c07\u539f\u751f\u5132\u5b58\u5eab\u64cd\u4f5c\u4fdd\u7559\u5728\u7de8\u78bc\u4e3b\u6a5f\u4e2d\u3002.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u70ba\u671f\u4e03\u5929\u7684\u8a66\u7528\uff0c\u6bd4\u6392\u884c\u699c\u66f4\u80fd\u63d0\u4f9b\u5be6\u8cea\u8cc7\u8a0a\u3002 \u6311\u9078\u4e00\u9805\u771f\u5be6\u4f46\u975e\u751f\u7522\u74b0\u5883\u7684\u529f\u80fd\u3001\u932f\u8aa4\u53ca\u5be9\u67e5\u9805\u76ee\u3002\u51cd\u7d50\u63d0\u793a\u8a9e\u8207\u6210\u529f\u6307\u4ee4\u3002\u8a18\u9304\u7b2c\u4e00\u500b\u6709\u6548\u7684 diff\u3001\u901a\u904e\u7684\u6e2c\u8a66\u3001\u8017\u6642\u3001\u4eba\u5de5\u5e72\u9810\u3001\u610f\u5916\u7bc4\u570d\uff0c\u4ee5\u53ca\u9019\u9805\u5de5\u4f5c\u5982\u4f55\u5f71\u97ff\u60a8\u7684\u53ef\u7528\u914d\u984d\u3002\u66f4\u597d\u7684\u7522\u54c1\uff0c\u662f\u90a3\u7a2e\u4f60\u80fd\u5075\u6e2c\u5230\u5176\u932f\u8aa4\uff0c\u4e14\u80fd\u7dad\u6301\u5176\u5de5\u4f5c\u6d41\u7a0b\u7684\u7522\u54c1\u3002.<\/p>\n\n\n\n<h2 id=\"faq\" class=\"wp-block-heading\">Codex \u8207 Claude \u4ee3\u78bc\u5e38\u898b\u554f\u984c\u89e3\u7b54<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Codex \u662f\u5426\u6bd4 Claude \u7de8\u78bc\u66f4\u512a\u8d8a\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e26\u975e\u666e\u904d\u5982\u6b64\u3002\u5169\u8005\u5747\u5b8c\u6210\u4e86\u6211\u5011\u6e2c\u8a66\u5957\u4ef6\u4e2d\u7684\u56db\u9805\u4efb\u52d9\u3002Claude Code \u5728\u5be9\u67e5\u7bc4\u570d\u65b9\u9762\u9818\u5148\uff0c\u800c Codex \u5728\u90e8\u5206\u5be6\u4f5c\u8207\u932f\u8aa4\u4fee\u5fa9\u65b9\u9762\u5247\u66f4\u70ba\u7cbe\u7c21\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5c0d\u65bc\u5927\u578b\u5132\u5b58\u5eab\u4f86\u8aaa\uff0c\u54ea\u4e00\u7a2e\u6bd4\u8f03\u597d\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u5011\u9019\u500b\u5c0f\u5de5\u5177\u7121\u6cd5\u56de\u7b54\u9019\u500b\u554f\u984c\u3002\u5728\u5141\u8a31\u9032\u884c\u8b8a\u66f4\u4e4b\u524d\uff0c\u8acb\u5148\u5f9e\u60a8\u81ea\u5df1\u7684\u5132\u5b58\u5eab\u4e2d\uff0c\u91dd\u5c0d\u53ea\u8b80\u67b6\u69cb\u4efb\u52d9\u5c0d\u5169\u8005\u9032\u884c\u8a55\u4f30\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u54ea\u7a2e\u7de8\u78bc\u5291\u6240\u9700\u7684\u76e3\u63a7\u8f03\u5c11\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u53d6\u6c7a\u65bc\u4efb\u52d9\u7684\u660e\u78ba\u6027\u3001\u6a21\u578b\u8a2d\u5b9a\u3001\u5132\u5b58\u5eab\u8aaa\u660e\uff0c\u4ee5\u53ca\u671f\u671b\u7684\u4e92\u52d5\u98a8\u683c\u3002\u4e00\u4f4d Reddit \u7528\u6236\u66fe\u63d0\u53ca\u4e0d\u540c\u7684\u76e3\u7763\u6a21\u5f0f\uff0c\u4f46\u8a72\u500b\u4eba\u7684\u7d93\u9a57\u4e26\u4e0d\u80fd\u4f5c\u70ba\u9069\u7528\u65bc\u6574\u500b\u7522\u54c1\u7684\u898f\u5247\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u54ea\u4e00\u500b\u6bd4\u8f03\u4fbf\u5b9c\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e3b\u8981\u6d88\u8cbb\u5c64\u7d1a\u5206\u5225\u70ba\u6bcf\u6708 $20\u3001$100 \u53ca $200\uff0c\u4f46\u6240\u5305\u542b\u7684\u5bb9\u91cf\u8207\u9650\u984d\u6a5f\u5236\u6709\u6240\u4e0d\u540c\u3002\u9078\u914d\u984d\u5ea6\u8207 API \u8a08\u8cbb\u5247\u5c6c\u7368\u7acb\u9805\u76ee\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Claude \u8207 Claude \u7684\u4ee3\u78bc\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\u4e32\u806f\u7684 Pro \u6216 Max \u65b9\u6848\u4e2d\uff0cClaude \u53ca Claude Code \u6703\u63a1\u7528\u5171\u4eab\u7684\u9023\u7dda\u6642\u6bb5\u8207\u6bcf\u9031\u4e0a\u9650\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Codex \u7684\u672c\u5730\u4efb\u52d9\u8207\u96f2\u7aef\u4efb\u52d9\u662f\u5426\u5171\u7528\u914d\u984d\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u5730\u8a0a\u606f\u8207\u96f2\u7aef\u804a\u5929\u7686\u8a2d\u6709\u4e94\u5c0f\u6642\u7684\u6642\u9650\uff0c\u4e14\u53ef\u80fd\u53e6\u6709\u6bcf\u9031\u4e0a\u9650\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">GlobalGPT \u80fd\u5426\u53d6\u4ee3 Codex \u6216 Claude Code\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e0d\u3002\u5b83\u96d6\u80fd\u900f\u904e\u65b0\u589e\u7684\u6a21\u578b\u3001\u547d\u4ee4\u5217\u4ecb\u9762\uff08CLI\uff09\u3001MCP\u3001\u6280\u80fd\u53ca\u591a\u6a21\u614b\u5de5\u5177\u4f86\u64f4\u5c55\u4efb\u4e00\u5de5\u4f5c\u6d41\u7a0b\uff0c\u4f46\u5132\u5b58\u5eab\u5b58\u53d6\u6b0a\u9650\u8207\u7de8\u78bc\u4ee3\u7406\u7a0b\u5f0f\uff08coding-agent\uff09\u7684\u884c\u70ba\u4ecd\u7531\u4e3b\u6a5f\u7aef\u638c\u63a7\u3002.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6211\u53ef\u4ee5\u540c\u6642\u4f7f\u7528\u9019\u5169\u6b3e\u7522\u54c1\u4e2d\u7684 GlobalGPT \u55ce\uff1f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT \u91dd\u5c0d\u9019\u5169\u8005\u7686\u63d0\u4f9b\u5b98\u65b9\u7684 CLI \u6559\u5b78\u6307\u5357\u3002\u6211\u5011\u5df2\u9a57\u8b49\u9019\u5169\u7a2e\u74b0\u5883\u4e2d\u7684 CLI \u4f7f\u7528\u65b9\u5f0f\uff0c\u4e26\u5728 Codex \u4e2d\u9a57\u8b49\u4e86 MCP \u642d\u914d Skill \u7684\u4f7f\u7528\u60c5\u6cc1\uff0c\u5176\u4e2d\u7121\u4eba\u503c\u5b88\u7684 MCP \u5b58\u5728\u6838\u51c6\u9650\u5236\u3002.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u50f9\u683c\u3001\u65b9\u6848\u898f\u5247\u3001\u6574\u5408\u529f\u80fd\u53ca\u4f86\u6e90\u4f9d\u64da\u5747\u65bc 2026 \u5e74 7 \u6708\u9032\u884c\u904e\u6838\u5c0d\u3002\u7522\u54c1\u8a73\u60c5\u53ef\u80fd\u6709\u6240\u8b8a\u66f4\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\">\u958b\u76e4\u50f9 GlobalGPT<\/a> \u5982\u679c\u60a8\u5e0c\u671b\u5728\u73fe\u6709\u7684\u7de8\u78bc\u5de5\u4f5c\u6d41\u7a0b\u4e2d\u52a0\u5165\u591a\u6a21\u578b\u8207\u591a\u6a21\u614b\u5c64\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-hk\/wp-json\/wp\/v2\/posts\/17342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.glbgpt.com\/zh-hk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.glbgpt.com\/zh-hk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/zh-hk\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/zh-hk\/wp-json\/wp\/v2\/comments?post=17342"}],"version-history":[{"count":2,"href":"https:\/\/wp.glbgpt.com\/zh-hk\/wp-json\/wp\/v2\/posts\/17342\/revisions"}],"predecessor-version":[{"id":17393,"href":"https:\/\/wp.glbgpt.com\/zh-hk\/wp-json\/wp\/v2\/posts\/17342\/revisions\/17393"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/zh-hk\/wp-json\/wp\/v2\/media\/17361"}],"wp:attachment":[{"href":"https:\/\/wp.glbgpt.com\/zh-hk\/wp-json\/wp\/v2\/media?parent=17342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/zh-hk\/wp-json\/wp\/v2\/categories?post=17342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/zh-hk\/wp-json\/wp\/v2\/tags?post=17342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}