{"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\/kr\/hub\/codex-vs-claude-code","title":{"rendered":"Codex \ub300 Claude \ucf54\ub4dc: \uc5b4\ub5a4 \ucf54\ub529 \uc5d0\uc774\uc804\ud2b8\uac00 \uc5ec\ub7ec\ubd84\uc758 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc5d0 \uc801\ud569\ud560\uae4c\uc694?"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>Codex \ub300 Claude \ucf54\ub4dc. \uc5ec\uae30\uc11c \uc911\uc694\ud55c \uac83\uc740 \ub2e8 \ud558\ub098\uc758 \uc808\ub300\uc801\uc778 \uc2b9\uc790\ub97c \uac00\ub9ac\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \ub9e4\uc77c \ubbff\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc791\uc5c5 \ubc29\uc2dd\uc744 \uc120\ud0dd\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/strong> \ub450 \uc81c\ud488 \ubaa8\ub450 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uac80\ud1a0\ud558\uace0, \uc5ec\ub7ec \ud30c\uc77c\uc744 \ud3b8\uc9d1\ud558\uba70, \uba85\ub839\uc744 \uc2e4\ud589\ud558\uace0, \ud14c\uc2a4\ud2b8\ub97c \uc218\ud589\ud558\uace0, \ud328\uce58\ub97c \uc124\uba85\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub450 \ub3c4\uad6c \uac04\uc758 \uc2e4\uc9c8\uc801\uc778 \ucc28\uc774\ub294 \uc791\uc5c5\uc744 \uc704\uc784\ud558\ub294 \ubc29\uc2dd, \uc5d0\uc774\uc804\ud2b8\ub97c \uc81c\uc5b4\ud558\ub294 \ube48\ub3c4, \uac80\ud1a0\ud560 \uc218 \uc788\ub294 \uc99d\uac70\uc758 \uc591, \uadf8\ub9ac\uace0 \uac01 \ub3c4\uad6c\uac00 \uae30\uc874 \uac1c\ubc1c \ud658\uacbd\uc5d0 \uc5bc\ub9c8\ub098 \uc798 \ubd80\ud569\ud558\ub294\uc9c0\uc5d0 \ub098\ud0c0\ub0a9\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud1b5\uc81c\ub41c 4\uac00\uc9c0 \uc791\uc5c5\uc73c\ub85c \uad6c\uc131\ub41c \uc800\uc7a5\uc18c \ud14c\uc2a4\ud2b8\uc5d0\uc11c Codex\ub294 100\uc810 \ub9cc\uc810\uc5d0 98\uc810\uc744, Claude Code\ub294 99\uc810\uc744 \uae30\ub85d\ud588\uc2b5\ub2c8\ub2e4. \ub450 \ubaa8\ub378 \ubaa8\ub450 \ud575\uc2ec \uc791\uc5c5\uc744 \uc644\ub8cc\ud588\uc2b5\ub2c8\ub2e4. Claude Code\ub294 \ub354 \uad11\ubc94\uc704\ud55c \uac80\ud1a0\uc640 \uacbd\uacc4 \uc0ac\ub840 \ucee4\ubc84\ub9ac\uc9c0\ub97c \ubcf4\uc778 \ubc18\uba74, Codex\ub294 \uc6b0\ub9ac \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc5d0\uc11c \ub354 \uc881\uc740 \ubc94\uc704 \ub0b4\uc5d0\uc11c \uc694\uad6c\ub418\ub294 \uacb0\uacfc\uc5d0 \ub3c4\ub2ec\ud558\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc558\uc73c\uba70, \uc2e4\ud589 \uc218\uc900\uc5d0\uc11c \ub354 \uac15\ub825\ud55c \uc99d\uac70\ub97c \uc81c\uc2dc\ud588\uc2b5\ub2c8\ub2e4. \uc18c\uaddc\ubaa8 Python \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc5d0\uc11c 1\uc810 \ucc28\uc774\ub294 \uc804\uccb4\uc801\uc778 \uc2b9\uc790\ub97c \uac00\ub9b4 \ub9cc\ud55c \uadfc\uac70\uac00 \ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub098\uba38\uc9c0 \uc6cc\ud06c\ud50c\ub85c\uc6b0\ub97c \ud2b9\uc815 \ucf54\ub529 \uc5d0\uc774\uc804\ud2b8\uc5d0 \ubb36\uc5ec \uc788\uac8c \ud558\uace0 \uc2f6\uc9c0 \uc54a\uc740 \uac1c\ubc1c\uc790\ub294 GlobalGPT\ub97c \ubcc4\ub3c4\uc758 \ub2e4\uc911 \ubaa8\ub378 \ubc0f \ub2e4\uc911 \ubaa8\ub2ec \ub808\uc774\uc5b4\ub85c \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. GlobalGPT\ub294 GPT 5.6, Claude Opus 5, GPT Image 2 \ub4f1 100\uac1c \uc774\uc0c1\uc758 \ucd5c\uc0c1\uc704 \ubaa8\ub378\uc744 \ud558\ub098\uc758 \ub300\uc2dc\ubcf4\ub4dc\uc5d0 \ud1b5\ud569\ud569\ub2c8\ub2e4. \ub610\ud55c, \uc774 <a href=\"https:\/\/www.glbgpt.com\/home\/cli?inviter=hub_content_cli&amp;login=1\">GlobalGPT CLI<\/a>, MCP \ubc0f Skill \uacbd\ub85c\ub294 \ucf54\ub371\uc2a4(Codex)\ub098 Claude \ucf54\ub4dc\uc5d0\uc11c \uc81c2\uc758 \uc758\uacac \uc218\ub834, \uacc4\ud68d \uc218\ub9bd, \ubb38\uc11c\ud654 \ub610\ub294 \uae30\ud0c0 \uc9c0\uc6d0\ub418\ub294 \ubaa8\ub378\uc744 \uc704\ud574 \ud65c\uc6a9\ud560 \uc218 \uc788\uc73c\uba70, \uc774 \uacfc\uc815\uc5d0\uc11c \ub124\uc774\ud2f0\ube0c \ucf54\ub529 \ud638\uc2a4\ud2b8\ub294 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc218\uc815 \ubc0f \ud14c\uc2a4\ud2b8\uc5d0 \ub300\ud55c \ud1b5\uc81c\uad8c\uc744 \uc720\uc9c0\ud569\ub2c8\ub2e4.<\/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 \ub300\uc2dc\ubcf4\ub4dc\" 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>GlobalGPT\uc5d0\uc11c 100\uac1c \uc774\uc0c1\uc758 \uc778\uae30 \ubaa8\ub378\uc744 \uccb4\ud5d8\ud574 \ubcf4\uc138\uc694<\/strong><\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ube44\uad50 \ubd84\uc11d\uc740 \uacf5\uc2dd \uacc4\ud68d \uc815\ubcf4, \uc2e4\uc81c \uc800\uc7a5\uc18c \uc791\uc5c5, \uc644\ubcbd\ud558\uac8c \ud655\uc7a5 \uac00\ub2a5\ud55c \ucd9c\ub825 \uacb0\uacfc, \uadf8\ub9ac\uace0 \uba85\ud655\ud558\uac8c \ubd84\ub958\ub41c \ucee4\ubba4\ub2c8\ud2f0 \uacbd\ud5d8\uc744 \uc885\ud569\ud558\uc5ec \uc774\ub8e8\uc5b4\uc84c\uc2b5\ub2c8\ub2e4. \uadf8 \ubaa9\uc801\uc740 \ub3c5\ub9bd \uac1c\ubc1c\uc790\uac00 \uad6c\ub3c5 \ubc29\uc2dd\uc758 \uc811\uadfc \uad8c\ud55c, \ucd94\uac00 \ud06c\ub808\ub527, API \uacfc\uae08 \ub4f1\uc758 \ubcf5\uc7a1\ud55c \uc694\uc18c\uc5d0 \ud63c\ub780\uc744 \uacaa\uc9c0 \uc54a\uace0 \uc8fc\ub41c \ucf54\ub529 \ub3c4\uad6c\ub97c \uc120\ud0dd\ud560 \uc218 \uc788\ub3c4\ub85d \ub3d5\ub294 \ub370 \uc788\uc2b5\ub2c8\ub2e4.<\/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=\"\ubaa9\ucc28\">\n  <div class=\"head\"><h2>\uc774\ubc88 \ube44\uad50\uc5d0\uc11c<\/h2><span class=\"hint\">\ud574\ub2f9 \uc139\uc158\uc73c\ub85c \uc774\ub3d9<\/span><\/div>\n  <ol>\n    <li><a href=\"#quick-comparison\">\uac04\ub2e8\ud55c \ube44\uad50<\/a><\/li><li><a href=\"#what-they-are\">\ub3c4\uad6c\uac00 \ubb34\uc5c7\uc778\uc9c0<\/a><\/li><li><a href=\"#workflow-control\">\uc6cc\ud06c\ud50c\ub85c\uc6b0 \ubc0f \uc81c\uc5b4<\/a><\/li><li><a href=\"#repository-understanding\">\uc800\uc7a5\uc18c \uc774\ud574<\/a><\/li><li><a href=\"#implementation\">\uad6c\ud604 \ubc0f \ubc84\uadf8 \uc218\uc815<\/a><\/li><li><a href=\"#code-review\">\ucf54\ub4dc \uac80\ud1a0 \ud488\uc9c8<\/a><\/li><li><a href=\"#safety\">\uad8c\ud55c \ubc0f \uc548\uc804<\/a><\/li><li><a href=\"#customization\">MCP, \uc2a4\ud0ac, \ubc0f \uc0ac\uc6a9\uc790 \uc9c0\uc815<\/a><\/li><li><a href=\"#pricing\">\uc694\uae08 \ubc0f \ud55c\ub3c4<\/a><\/li><li><a href=\"#controlled-test\">\ud1b5\uc81c\ub41c \uc2e4\ud5d8<\/a><\/li><li><a href=\"#user-experience\">\uc0ac\uc6a9\uc790 \ud6c4\uae30<\/a><\/li><li><a href=\"#globalgpt\">GlobalGPT \ud655\uc7a5 \uacc4\uce35<\/a><\/li><li><a href=\"#which-one\">\uc5b4\ub290 \uac83\uc744 \uace8\ub77c\uc57c \ud560\uae4c<\/a><\/li><li><a href=\"#faq\">\uc790\uc8fc \ubb3b\ub294 \uc9c8\ubb38<\/a><\/li>\n  <\/ol>\n<\/nav>\n\n\n\n<h2 id=\"quick-comparison\" class=\"wp-block-heading\">Codex\uc640 Claude \ucf54\ub4dc \ube44\uad50 \ud55c\ub208\uc5d0 \ubcf4\uae30<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\uacb0\uc815 \uc694\uc778<\/th><th>\ucf54\ub371\uc2a4<\/th><th>\ud074\ub85c\ub4dc \ucf54\ub4dc<\/th><\/tr><\/thead><tbody><tr><td>\ud575\uc2ec \uc800\uc7a5\uc18c \uad00\ub828 \uc5c5\ubb34<\/td><td>\uc9c0\uc6d0\ub418\ub294 \ubaa8\ub4e0 Codex \ud658\uacbd\uc5d0\uc11c \ub0b4\uc6a9\uc744 \uc77d\uace0, \ud3b8\uc9d1\ud558\uace0, \uba85\ub839\uc744 \uc2e4\ud589\ud558\uba70, \ubcc0\uacbd \uc0ac\ud56d\uc744 \ud655\uc778\ud569\ub2c8\ub2e4.<\/td><td>\uba85\ub839\uc5b4 \uc77d\uae30, \ud3b8\uc9d1, \uc2e4\ud589 \ubc0f \ubcc0\uacbd \uc0ac\ud56d \ud655\uc778\uc744 \uc704\ud55c \ub300\ud654\ud615 \ud130\ubbf8\ub110 \uc5d0\uc774\uc804\ud2b8<\/td><\/tr><tr><td>\ud14c\uc2a4\ud2b8\uc5d0\uc11c \ud655\uc778\ub41c \uc2a4\ud0c0\uc77c<\/td><td>\uad6c\ud604 \ubc0f \ubc84\uadf8 \uc218\uc815 \uce21\uba74\uc5d0\uc11c \ub354\uc6b1 \uac04\uacb0\ud574\uc84c\uc2b5\ub2c8\ub2e4.<\/td><td>\uc800\uc7a5\uc18c \ubd84\uc11d, \ud14c\uc2a4\ud2b8 \ubc0f \uac80\ud1a0 \ubc94\uc704 \uba74\uc5d0\uc11c \ub354\uc6b1 \ucca0\uc800\ud568<\/td><\/tr><tr><td>\uc800\uc7a5\uc18c \uc774\ud574<\/td><td colspan=\"2\">\ub3d9\uacb0\ub41c \uc791\uc5c5\uc5d0 \ub300\ud55c \uae30\ub2a5\uc801 \uc5f0\uacb0<\/td><\/tr><tr><td>\ucf54\ub4dc \uac80\ud1a0<\/td><td>\uc911\uc694\ub3c4\uac00 \ub354 \ub192\uc740 \uc720\ud6a8\ud55c \uacb0\ud568 \ub450 \uac74\uc744 \ubc1c\uacac\ud558\uace0 \uc218\uc815\ud588\uc2b5\ub2c8\ub2e4.<\/td><td>\uc7ac\ud604 \uac00\ub2a5\ud55c \ubb38\uc81c\ub97c \ucd94\uac00\ub85c \ubcf4\uace0\ud588\uc73c\uba70, 20\uac74 \uc911 19\uac74\uc744 20\uac74 \uc911 18\uac74\uc73c\ub85c \uc218\uc815\ud588\uc2b5\ub2c8\ub2e4.<\/td><\/tr><tr><td>\uce21\uc815\ub41c \uc18d\ub3c4<\/td><td colspan=\"2\">\ud63c\uc7ac\ub41c \uacb0\uacfc; \uac01 \ud658\uacbd \uac04\uc758 \uc720\uc0ac\uc131\uc774 \ucda9\ubd84\ud558\uc9c0 \uc54a\uc544 \ub2e8\uc77c \uc6b0\uc2b9\uc790\ub97c \uac00\ub9ac\uae30 \uc5b4\ub824\uc6e0\ub2e4<\/td><\/tr><tr><td>\uc18c\ube44\uc790\uc6a9 \ubcf4\uae09\ud615 \uc81c\ud488\uad70<\/td><td>\uad00\ub828 ChatGPT \ud50c\ub79c\uc744 \ud1b5\ud574 \uc6d4 $20<\/td><td>Claude Pro: \ubbf8\uad6d \ub0b4 \uc6d4 $20<\/td><\/tr><tr><td>\uc774\uc6a9\ub7c9\uc774 \ub9ce\uc740 \uc694\uae08\uc81c<\/td><td>$100 \ubc0f $200 \ub4f1\uae09<\/td><td>$100\uc5d0\uc11c\ub294 \ucd5c\ub300 5\ubc30, $200\uc5d0\uc11c\ub294 \ucd5c\ub300 20\ubc30<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ud45c\ub294 \uad6c\ub9e4 \uacb0\uc815\uc744 \uc704\ud55c \ucc38\uace0 \uc790\ub8cc\uc77c \ubfd0, \ubaa8\ub378 \uc21c\uc704\ud45c\uac00 \uc544\ub2d9\ub2c8\ub2e4. \ubaa8\ub378 \uc124\uc815, \uc800\uc7a5\uc18c, \uad8c\ud55c \uad6c\uc131 \ub610\ub294 \uc791\uc5c5 \uc0ac\uc591\uc774 \ub2e4\ub974\uba74 \uacb0\uacfc\uac00 \ub2ec\ub77c\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ubbf8 \ud2b9\uc815 \uc81c\ud488\uc744 \uc0ac\uc6a9\ud558\uace0 \uacc4\uc2e0\ub2e4\uba74, \ub3d9\uc77c\ud55c \uc131\uacf5 \uba85\ub839\uc5b4\ub97c \uc0ac\uc6a9\ud558\uace0 \ud488\uc9c8 \uc7ac\uc2dc\ub3c4\uac00 \uc5c6\ub294, \uc790\uccb4 \ucf54\ub4dc\ubca0\uc774\uc2a4\uc758 \uc81c\ud55c\ub41c \uc791\uc5c5\uc744 \uae30\uc900\uc73c\ub85c \ube44\uad50\ud558\ub294 \uac83\uc774 \uac00\uc7a5 \uc88b\uc2b5\ub2c8\ub2e4.<\/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=\"\ud1b5\uc81c\ub41c \uc2dc\ud5d8 \uc131\uc801 \ubd84\ud3ec\">\n  <h3>\uc81c\uc5b4\ub41c \ud14c\uc2a4\ud2b8 \ud504\ub85c\ud544<\/h3>\n  <p class=\"sub\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \uacb0\uacfc\uc774\uba70, \ud3c9\uac00 \uae30\uc900\uc740 \ub3d9\uc77c\ud558\uac8c \uace0\uc815\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \ub9c9\ub300 \uadf8\ub798\ud504\ub294 \uac01 \uacfc\uc81c\uc758 \ub9cc\uc810\uc744 \uae30\uc900\uc73c\ub85c \uc815\uaddc\ud654\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n  <div class=\"legend\"><span><i class=\"dot\" style=\"background:#2563eb\"><\/i>\ucf54\ub371\uc2a4<\/span><span><i class=\"dot\" style=\"background:#d97706\"><\/i>\ud074\ub85c\ub4dc \ucf54\ub4dc<\/span><\/div>\n  <div class=\"task\"><strong>T1 \u00b7 \uc800\uc7a5\uc18c \uc774\ud574<\/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 \ub2e4\uc911 \ud30c\uc77c \uae30\ub2a5<\/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 DST \ubc84\uadf8 \uc218\uc815<\/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 \uc810\uac80 \ubc0f \uc218\ub9ac<\/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\">\uc774 \uadf8\ub9bc\uc740 1\uc810 \ucc28\uac00 \uc5b4\ub514\uc11c \ube44\ub86f\ub418\uc5c8\ub294\uc9c0\ub97c \ubcf4\uc5ec\uc904 \ubfd0, \uc791\uc740 \uacbd\uae30\ub97c \uc885\ud569 \uc21c\uc704\ub85c \ud655\ub300 \ud574\uc11d\ud558\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4.<\/p>\n<\/section>\n\n\n\n<h2 id=\"what-they-are\" class=\"wp-block-heading\">\ucf54\ub371\uc2a4\uc640 Claude \ucf54\ub4dc\uac00 \uc2e4\uc81c\ub85c \ubb34\uc5c7\uc778\uc9c0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Codex\uc640 Claude Code\ub294 \ub2e8\uc21c\ud788 \ubaa8\ub378\uba85\uc774 \uc544\ub2cc \uc5d0\uc774\uc804\ud2b8 \uc81c\ud488\uc785\ub2c8\ub2e4. \uadf8 \uae30\ubc18\uc774 \ub418\ub294 <a href=\"https:\/\/www.glbgpt.com\/hub\/best-ai-model-for-coding\/\">\ucf54\ub529\uc6a9 AI \ubaa8\ub378<\/a> \ubaa8\ub378\ub3c4 \uc911\uc694\ud558\uc9c0\ub9cc, \uc774\ub97c \ub458\ub7ec\uc2fc \ud504\ub808\uc784\uc6cc\ud06c \uc5ed\uc2dc \uc5d0\uc774\uc804\ud2b8\uac00 \uc5b4\ub5a4 \ud30c\uc77c\uc744 \ubcfc \uc218 \uc788\ub294\uc9c0, \uc5b4\ub5a4 \uba85\ub839\uc744 \uc2e4\ud589\ud560 \uc218 \uc788\ub294\uc9c0, \uc2b9\uc778 \uc808\ucc28\uac00 \uc5b4\ub5bb\uac8c \uc9c4\ud589\ub418\ub294\uc9c0, \ucee8\ud14d\uc2a4\ud2b8\uac00 \uc5b4\ub5bb\uac8c \uc720\uc9c0\ub418\ub294\uc9c0, \uadf8\ub9ac\uace0 \uc791\uc5c5\uc774 \ub05d\ub09c \ud6c4 \uc5b4\ub5a4 \uc99d\uac70\uac00 \ub0a8\ub294\uc9c0 \ub4f1\uc744 \uacb0\uc815\ud569\ub2c8\ub2e4. \ubaa8\ub378\uc758 \ud3c9\ud310\ub9cc\uc744 \ube44\uad50\ud558\ub294 \uac83\uc740 \uac1c\ubc1c\uc790\uac00 \uc5bb\ub294 \uacbd\ud5d8\uc758 \uc0c1\ub2f9 \ubd80\ubd84\uc744 \uac04\uacfc\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Codex\ub294 \uba85\ub839\uc904, IDE, \ub370\uc2a4\ud06c\ud1b1 \ubc0f \ud074\ub77c\uc6b0\ub4dc \uae30\ubc18 \uc6cc\ud06c\ud50c\ub85c\ub97c \uc544\uc6b0\ub985\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud3ed\ub113\uc740 \uc9c0\uc6d0 \ub355\ubd84\uc5d0 \uc9c1\uc811\uc801\uc778 \ub85c\uceec \ud611\uc5c5\uc740 \ubb3c\ub860, \ubc94\uc704\uac00 \ub354 \uc81c\ud55c\ub41c \uc5c5\ubb34 \uc704\uc784\uc5d0\ub3c4 \uc801\ud569\ud569\ub2c8\ub2e4. Claude Code\ub294 \uc9c0\uc6d0\ub418\ub294 \ud1b5\ud569 \uae30\ub2a5\uacfc \ud3ed\ub113\uc740 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc635\uc158\uc744 \uac16\ucd98 \ub300\ud654\ud615 \ud130\ubbf8\ub110 \uc6cc\ud06c\ud50c\ub85c\ub97c \uc911\uc2ec\uc73c\ub85c \uc124\uacc4\ub418\uc5c8\uc73c\uba70, \uc774\ub294 <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-claude-ai-for-coding\/\">\ucf54\ub529 \uc2dc Claude \uc0ac\uc6a9 \uc548\ub0b4<\/a> \ud574\ub2f9 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc5d0 \ub300\ud574 \ubcf4\ub2e4 \ud3ed\ub113\uac8c \uc18c\uac1c\ud569\ub2c8\ub2e4. \uc77c\ubd80 \uac1c\ubc1c\uc790\uc5d0\uac8c\ub294 \ud130\ubbf8\ub110\uc5d0\uc11c \uc5d0\uc774\uc804\ud2b8\uac00 \uc791\ub3d9\ud558\ub294 \ubaa8\uc2b5\uc744 \uc9c0\ucf1c\ubcf4\ub294 \uac83\ub9cc\uc73c\ub85c\ub3c4 \uc548\uc2ec\uc774 \ub429\ub2c8\ub2e4. \ubc18\uba74 \ub2e4\ub978 \uac1c\ubc1c\uc790\ub4e4\uc5d0\uac8c\ub294 \ub04a\uc784\uc5c6\ub294 \ub300\ud654\ubcf4\ub2e4\ub294 \ucd5c\uc885 diff, \ud14c\uc2a4\ud2b8 \uacb0\uacfc, \uac10\uc0ac \ucd94\uc801\uc774 \ub354 \uc911\uc694\ud55c \uc0b0\ucd9c\ubb3c\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7ec\ud55c \uad6c\ubd84\uc740 \uba85\ubaa9\uc0c1 \uac15\ub825\ud55c \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud558\ub294 \ub450 \uac00\uc9c0 \ud14c\uc2a4\ud2b8\uac00 \uc11c\ub85c \ub2e4\ub978 \uacb0\uacfc\ub97c \ubcf4\uc774\ub294 \uc774\uc720\ub3c4 \uc124\uba85\ud574 \uc90d\ub2c8\ub2e4. \ud638\uc2a4\ud2b8\ub294 \uc9c0\uce68\uc774 \uc5b4\ub5bb\uac8c \uc81c\uc2dc\ub420\uc9c0, \ub3c4\uad6c\uac00 \uc5b4\ub5bb\uac8c \ud638\ucd9c\ub420\uc9c0, \uadf8\ub9ac\uace0 \uc5b8\uc81c \uc0ac\ub78c\uc774 \ud589\ub3d9\uc744 \uc2b9\uc778\ud574\uc57c \ud558\ub294\uc9c0\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc744 \ubb34\uc2dc\ud55c \ucee4\ubba4\ub2c8\ud2f0 \uac04 \ube44\uad50\ub294 \uc81c\ud488 \uc218\uc900\uc758 \ud589\ub3d9\uc744 \ubaa8\ub378 \uc218\uc900\uc758 \uc9c4\ub9ac\ub85c \uc624\ud574\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\ubaa8\ub378<\/strong> \ucd94\ub860 \ubc0f \uc0dd\uc131 \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uc5d0\uc774\uc804\ud2b8 \ud558\ub124\uc2a4<\/strong> \ud30c\uc77c, \uba85\ub839\uc5b4, \ucee8\ud14d\uc2a4\ud2b8, \uc2b9\uc778 \ubc0f \ubcf5\uad6c \uae30\ub2a5\uc744 \uc81c\uc5b4\ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uc0ac\uc6a9\uc790\uc758 \uc791\uc5c5 \uacc4\uc57d<\/strong> \ubc94\uc704, \uc131\uacf5 \uc5ec\ubd80 \ud655\uc778, \uadf8\ub9ac\uace0 \uc5d0\uc774\uc804\ud2b8\uac00 \uc5b8\uc81c \uc911\ub2e8\ud574\uc57c \ud558\ub294\uc9c0\ub97c \uacb0\uc815\ud569\ub2c8\ub2e4.<\/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=\"\uc5d0\uc774\uc804\ud2b8 \ud558\ub124\uc2a4\uac00 \ucf54\ub529-\uc5d0\uc774\uc804\ud2b8 \ube44\uad50\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\uc74c\uc744 \uc9c0\uc801\ud55c \uc8fc\uc11d\uc774 \ub2ec\ub9b0 X \uac8c\uc2dc\ubb3c\" 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\">X\uc758 \ud55c \ub313\uae00\uc740 \ube44\uad50 \uc2dc \uc8fc\uc758\ud574\uc57c \ud560 \uc911\uc694\ud55c \uc810\uc744 \uc9c0\uc801\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ubc14\ub85c \uc5d0\uc774\uc804\ud2b8 \ud558\ub124\uc2a4\uac00 \uacb0\uacfc\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc788\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4. \uc774\ub294 \uc720\uc6a9\ud55c \ubc30\uacbd \uc815\ubcf4\uc77c \ubfd0, \uc5b4\ub290 \uc81c\ud488\uc774 \ub354 \uc6b0\uc218\ud558\ub2e4\ub294 \uac83\uc744 \uc785\uc99d\ud558\ub294 \uacb0\uc815\uc801\uc778 \uc99d\uac70\ub294 \uc544\ub2d9\ub2c8\ub2e4.<\/figcaption><\/figure>\n\n\n\n<h2 id=\"workflow-control\" class=\"wp-block-heading\">\uc5c5\ubb34 \ud750\ub984\uacfc \ud1b5\uc81c: \uad8c\ud55c \uc704\uc784\uc778\uac00, \uc9c0\uc18d\uc801\uc778 \uc9c0\ub3c4\uc778\uac00?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Codex\uc640 Claude \ucf54\ub4dc \uc911 \uc5b4\ub290 \uac83\uc774 \ub354 \uc720\uc6a9\ud55c\uc9c0\uc5d0 \ub300\ud55c \uc9c8\ubb38\uc740 \ub300\uac1c \u201c\uc5b4\ub290 \ucabd\uc774 \ub354 \ub098\uc740 \ucf54\ub4dc\ub97c \uc791\uc131\ud558\ub294\uac00?\u201d\uac00 \uc544\ub2c8\ub77c \u201c\uc5b4\ub5bb\uac8c \uc791\uc5c5\ud558\uace0 \uc2f6\uc740\uac00?\u201d\uc785\ub2c8\ub2e4. \uba85\ud655\ud558\uace0 \ubc94\uc704\uac00 \uc815\ud574\uc9c4 \uc791\uc5c5\uc740 \uc815\ud655\ud55c \ubaa9\ud45c, \ud5c8\uc6a9\ub41c \ubc94\uc704, \uac80\uc99d \uba85\ub839\uacfc \ud568\uaed8 \uc704\uc784\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubaa8\ud638\ud55c \ub9ac\ud329\ud1a0\ub9c1\uc758 \uacbd\uc6b0, \ub17c\uc758\uc640 \uc911\uac04 \uc810\uac80\uc744 \uac70\uce58\uace0, \ubcc0\uacbd\uc774 \ub108\ubb34 \ub9ce\uc774 \uc9c4\ud589\ub418\uae30 \uc804\uc5d0 \ub2f4\ub2f9\uc790\uc758 \ubc29\ud5a5\uc744 \uc7ac\uc870\uc815\ud560 \uae30\ud68c\ub97c \uac16\ub294 \uac83\uc774 \ub3c4\uc6c0\uc774 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc694\uad6c \uc0ac\ud56d\uc774 \uc9c0\uc18d\uc801\uc73c\ub85c \ubcc0\ud654\ud558\uac70\ub098 \uc544\ud0a4\ud14d\ucc98\uc5d0 \ub300\ud55c \ud310\ub2e8\uc774 \uc544\uc9c1 \ub17c\uc758 \uc911\uc778 \uc0c1\ud669\uc5d0\uc11c\ub294 \uc9c0\uc18d\uc801\uc778 \uc870\uc815\uc774 \uc720\uc6a9\ud569\ub2c8\ub2e4. \ubc18\uba74, \uc5d0\uc774\uc804\ud2b8\uac00 \uc800\uc7a5\uc18c\uc758 \uc9c0\uce68\ub9cc\uc73c\ub85c\ub3c4 \ud574\uacb0\ub420 \uc218 \uc788\ub294 \uc0ac\uc548\uc5d0 \ub300\ud574 \ubc18\ubcf5\uc801\uc73c\ub85c \uacb0\uc815\uc744 \uc694\uccad\ud560 \uacbd\uc6b0 \uc774\ub294 \ube44\uc6a9\uc73c\ub85c \uc791\uc6a9\ud569\ub2c8\ub2e4. \uc791\uc5c5 \uacc4\uc57d\uc774 \uc548\uc815\uc801\uc778 \uc0c1\ud669\uc5d0\uc11c\ub294 \uc790\uc728\uc801 \uc2e4\ud589\uc774 \uc720\uc6a9\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uc5d0\uc774\uc804\ud2b8\uac00 \uac80\uc99d\ub418\uc9c0 \uc54a\uc740 \uac00\uc815\uc744 \ud558\uac70\ub098 \uba85\ud655\ud55c \ub864\ubc31 \uacbd\ub85c \uc5c6\uc774 \ubc94\uc704\ub97c \ud655\uc7a5\ud560 \uacbd\uc6b0 \uc774\ub294 \uc704\ud5d8 \uc694\uc18c\uac00 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2026\ub144 4\uc6d4 13\uc77c\uc790 \ub808\ub527(Reddit)\uc758 \ud55c \uc0c1\uc138\ud55c \ubcf4\uace0\uc11c\uc5d0 \ub530\ub974\uba74, \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\uac00 \uc57d 2,800\uac1c\uc778 \uc57d 80,000\uc904 \uaddc\ubaa8\uc758 \ud30c\uc774\uc36c \ubc0f \ud0c0\uc785\uc2a4\ud06c\ub9bd\ud2b8 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c Claude Code\ub97c \uc0ac\uc6a9\ud55c \uc2dc\uac04\uc740 \uc57d 100\uc2dc\uac04, Codex\ub97c \uc0ac\uc6a9\ud55c \uc2dc\uac04\uc740 20\uc2dc\uac04\uc774\uc5c8\ub2e4. \uc791\uc131\uc790\ub294 Claude\ub97c \ub354 \ube60\ub974\uace0 \uc0c1\ud638\uc791\uc6a9\uc774 \ud65c\ubc1c\ud558\uc9c0\ub9cc \ub354 \ub9ce\uc740 \uad00\ub9ac\uac00 \ud544\uc694\ud55c \ubc18\uba74, Codex\ub294 \ub354 \ub290\ub9ac\uace0 \uc2e0\uc911\ud55c \ubc29\uc2dd\uc774\ub77c\uace0 \ud3c9\uac00\ud588\uc2b5\ub2c8\ub2e4. \uc774 \ubcf4\uace0\uc11c\ub294 \ud504\ub85c\uc81d\ud2b8 \ubc0f \uacbd\ud5d8\uc801 \ub9e5\ub77d\uc744 \ud3ec\ud568\ud558\uace0 \uc788\uc5b4 \uc720\ub09c\ud788 \uc720\uc6a9\ud558\uc9c0\ub9cc, \uc5ec\uc804\ud788 \ud55c \uac1c\ubc1c\uc790\uc758 \uc6cc\ud06c\ud50c\ub85c\uc6b0\ub97c \ubc18\uc601\ud55c \uac83\uc5d0 \ubd88\uacfc\ud569\ub2c8\ub2e4.<\/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=\"8\ub9cc \uc904 \uaddc\ubaa8\uc758 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c Claude \ucf54\ub4dc\uc640 \ucf54\ub371\uc2a4\ub97c \ube44\uad50\ud55c \ub808\ub527 \uacbd\ud5d8\ub2f4 (\ud574\uc124 \ud3ec\ud568)\" 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\">\ud55c \uac1c\ubc1c\uc790\uac00 Claude Code \ubc0f Codex\ub97c \uc0ac\uc6a9\ud558\uba70 \ud2b9\uc815 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc5bb\uc740 \uacbd\ud5d8\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc11c \uac15\uc870\ub41c \uad00\ucc30 \uacb0\uacfc\ub294 \uc81c\ud488 \uc804\ubc18\uc758 \uc131\ub2a5 \ub370\uc774\ud130\uac00 \uc544\ub2c8\ub77c, \uac80\uc99d\ud574\uc57c \ud560 \uac00\uc124\ub85c \uac04\uc8fc\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc800\ud76c\uac00 \uc9c1\uc811 \uce21\uc815\ud55c \uacb0\uacfc\uc5d0\uc11c\ub294 \uba85\ud655\ud55c \uc2b9\uc790\ub97c \uac00\ub9b4 \uc218 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4. Claude\ub294 \ucc98\uc74c \ub450 \uacfc\uc81c\ub97c \ub354 \ube68\ub9ac \uc644\ub8cc\ud55c \ubc18\uba74, Codex\ub294 \ub098\uba38\uc9c0 \ub450 \uacfc\uc81c\ub97c \ub354 \ube68\ub9ac \uc644\ub8cc\ud588\uc2b5\ub2c8\ub2e4. \ub610\ud55c Claude\ub294 CLI \uc778\uc99d \uacbd\ub85c\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uac8c \ub418\uc790 \uc11c\ube0c\uc5d0\uc774\uc804\ud2b8 \ub300\uccb4 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud588\uae30 \ub54c\ubb38\uc5d0, \ub450 \uc2dc\uc2a4\ud15c\uc758 \uc2e4\ud589 \uacbd\ub85c\ub294 \uc2e4\ud5d8\uc2e4 \ud658\uacbd\uc5d0\uc11c \ub3d9\uc77c\ud558\uac8c \uc7ac\ud604\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc2e0\uc911\ud55c \uacb0\ub860\uc740 \uc18d\ub3c4\uac00 \uacfc\uc81c, \uc120\ud0dd\ub41c \ubaa8\ub378, \ub178\ub825 \uc124\uc815, \ub9e5\ub77d \ubc0f \ud638\uc2a4\ud2b8\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c4\ub2e4\ub294 \uac83\uc774\uba70, \uc5b4\ub290 \ud55c \uc81c\ud488\uc774 \ud56d\uc0c1 \ub354 \ube60\ub974\ub2e4\uace0 \ub2e8\uc815\ud560 \uc218\ub294 \uc5c6\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 id=\"repository-understanding\" class=\"wp-block-heading\">\uc800\uc7a5\uc18c \uc774\ud574 \ubc0f \ucee8\ud14d\uc2a4\ud2b8 \uad00\ub9ac<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc774\ud574\ud55c\ub2e4\ub294 \uac83\uc740 \ub2e8\uc21c\ud788 \ud3f4\ub354 \uc774\ub984\uc744 \uc9d3\ub294 \uac83 \uc774\uc0c1\uc758 \uc758\ubbf8\ub97c \uc9c0\ub2d9\ub2c8\ub2e4. \uc720\uc6a9\ud55c \uc5d0\uc774\uc804\ud2b8\ub294 \ub370\uc774\ud130\uac00 \ud30c\uc77c \uac04\uc5d0 \uc5b4\ub5bb\uac8c \uc774\ub3d9\ud558\ub294\uc9c0 \ucd94\uc801\ud558\uace0, \ubcc0\uacbd\uc744 \uc81c\ud55c\ud558\ub294 \uacc4\uc57d \uc0ac\ud56d\uc744 \ud30c\uc545\ud558\uba70, \ud14c\uc2a4\ud2b8\ub97c \ucc3e\uc544\ub0b4\uace0, \uc99d\uc0c1\uacfc \uadf8 \uc6d0\uc778\uc744 \uad6c\ubd84\ud558\uba70, \uc798\ubabb\ub41c \uacc4\uce35\uc744 \uc218\uc815\ud560 \uacbd\uc6b0\uc758 \uc704\ud5d8\uc744 \uc124\uba85\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ucca0\uc800\ud55c \ub9f5\uc740 \uc228\uaca8\uc9c4 \ubd88\uc77c\uce58\ub97c \ub4dc\ub7ec\ub0bc \uc218 \uc788\uace0, \uac04\uacb0\ud55c \ub9f5\uc740 \uac1c\ubc1c\uc790\uac00 \ub354 \ube60\ub974\uac8c \uc548\uc804\ud55c \uad6c\ud604 \uacb0\uc815\uc744 \ub0b4\ub9b4 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc90d\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77d\uae30 \uc804\uc6a9 T1 \uacfc\uc81c\uc5d0\uc11c \ub450 \uc5d0\uc774\uc804\ud2b8 \ubaa8\ub450 20\uc810 \ub9cc\uc810\uc5d0 20\uc810\uc744 \ud68d\ub4dd\ud588\uc73c\uba70, \ub2f5\ubcc0\uc744 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 \uadfc\uac70\ub97c \ub450\uc5c8\uc2b5\ub2c8\ub2e4. Claude Code\ub294 \ub354 \ucca0\uc800\ud558\uc5ec \ucd94\uac00\uc801\uc778 \uacc4\uc57d \ubd88\uc77c\uce58 \uc0ac\ud56d\uc744 \ucc3e\uc544\ub0c8\uc2b5\ub2c8\ub2e4. Codex\ub294 \ub354 \uac04\uacb0\ud558\uba74\uc11c\ub3c4 \uad00\ub828 \ud30c\uc77c, \uc704\ud5d8 \uc694\uc18c \ubc0f \uad6c\ud604 \uacc4\ud68d\uc744 \uc815\ud655\ud788 \ud30c\uc545\ud588\uc2b5\ub2c8\ub2e4. \uc5b4\ub290 \ud55c \ubc29\uc2dd\uc774 \uc790\ub3d9\uc73c\ub85c \ub354 \uc6b0\uc218\ud558\ub2e4\uace0 \ud560 \uc218\ub294 \uc5c6\uc2b5\ub2c8\ub2e4. \ucca0\uc800\ud568\uc740 \uc775\uc219\ud558\uc9c0 \uc54a\uc740 \ub9c8\uc774\uadf8\ub808\uc774\uc158\uc774\ub098 \uac10\uc0ac \uacfc\uc815\uc5d0\uc11c \ub3c4\uc6c0\uc774 \ub418\uba70, \uac04\uacb0\ud568\uc740 \uac1c\ubc1c\uc790\uac00 \uc774\ubbf8 \uc544\ud0a4\ud14d\ucc98\ub97c \uc798 \uc54c\uace0 \uc788\uace0 \ud575\uc2ec\uc5d0 \uc9d1\uc911\ub41c \ubcc0\uacbd \uacc4\ud68d\uc744 \uc6d0\ud560 \ub54c \uc720\uc6a9\ud569\ub2c8\ub2e4.<\/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 \uc81c\uc5b4\ub41c \uc800\uc7a5\uc18c \ud14c\uc2a4\ud2b8<\/p><h3 class=\"d-title\">\uc775\uc219\ud558\uc9c0 \uc54a\uc740 \uc800\uc7a5\uc18c\ub97c \ubcc0\uacbd\ud558\uae30 \uc804\uc5d0 \uadf8 \ub0b4\uc6a9\uc744 \ud30c\uc545\ud558\uc2ed\uc2dc\uc624<\/h3><p class=\"d-sub\">\uc544\ud0a4\ud14d\ucc98\ub97c \ub9e4\ud551\ud558\uace0, \ub370\uc774\ud130 \ud750\ub984\uc744 \ucd94\uc801\ud558\uba70, \uc6b0\uc120\uc21c\uc704 \uae30\ub2a5\uc758 \uc704\ud5d8 \uc694\uc18c\ub97c \ud30c\uc545\ud558\ub418, \ud30c\uc77c \ubcc0\uacbd\uc740 \ud558\uc9c0 \ub9c8\uc2ed\uc2dc\uc624.<\/p><\/div><span class=\"d-pill\">\ub3d9\uc810<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"\ucf54\ub371\uc2a4 \uacb0\uacfc\"><div class=\"d-product\"><span>\ucf54\ub371\uc2a4<\/span><span class=\"d-score\">20<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\uae30\uac04<\/span><strong>108\ucd08<\/strong><\/div><div class=\"d-metric\"><span>\uc218\ud45c<\/span><strong>2 \uae30\uc900\uc120<\/strong><\/div><div class=\"d-metric\"><span>\ubc94\uc704<\/span><strong>\uc77d\uae30 \uc804\uc6a9<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825 \ubc1c\ucdcc\ubb38<\/div><pre>\uc544\ud0a4\ud14d\ucc98: \ubaa8\ub378, \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac, \uc11c\ube44\uc2a4, \uadf8\ub9ac\uace0 \uc5f0\uacb0\ub418\uc9c0 \uc54a\uc740 \uc2dc\uac04 \uc720\ud2f8\ub9ac\ud2f0.\n\n\uc8fc\uc694 \uc704\ud5d8 \uc694\uc18c: \uc815\uc758\ub418\uc9c0 \uc54a\uc740 \uc6b0\uc120\uc21c\uc704 \uc758\ubbf8\ub860, \ud638\ud658\uc131, \uc21c\uc11c, \uc720\ud6a8\uc131 \uac80\uc0ac, \ubc94\uc704 \ubd88\uc77c\uce58.<\/pre><\/div><p class=\"d-take\"><strong>\ub9ac\ubdf0\uc5b4\uc758 \uc758\uacac:<\/strong> \uac04\uacb0\ud558\uace0, \uc0ac\uc2e4\uc5d0 \uadfc\uac70\ud558\uba70, \ud574\ub2f9 \uacb0\uc815\uc5d0 \ucda9\ubd84\ud55c \uadfc\uac70\ub97c \uc81c\uacf5\ud55c\ub2e4.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \ucf54\ub4dc \uacb0\uacfc\"><div class=\"d-product\"><span>\ud074\ub85c\ub4dc \ucf54\ub4dc<\/span><span class=\"d-score\">20<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\uae30\uac04<\/span><strong>61\ucd08<\/strong><\/div><div class=\"d-metric\"><span>\uc218\ud45c<\/span><strong>2 \uae30\uc900\uc120<\/strong><\/div><div class=\"d-metric\"><span>\ubc94\uc704<\/span><strong>\uc77d\uae30 \uc804\uc6a9<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825 \ubc1c\ucdcc\ubb38<\/div><pre>3\uac1c\uc758 \ub808\uc774\uc5b4\uc640 \ud558\ub098\uc758 \uace0\uc544 \ubaa8\ub4c8. \uc0ac\uc774\ud074 \uc5c6\uc74c; \uc758\uc874\uc131 \uc8fc\uc785 \ucd5c\uc18c\ud654.\n\n\ub610\ud55c \uc2dd\ubcc4\uc790 \ud560\ub2f9, \ube44\ub300\uce6d \uc624\ub958 \uacc4\uc57d, \uadf8\ub9ac\uace0 \ubd80\uc871\ud55c \ud14c\uc2a4\ud2b8 \ucee4\ubc84\ub9ac\uc9c0\uac00 \ub4dc\ub7ec\ub0ac\ub2e4.<\/pre><\/div><p class=\"d-take\"><strong>\ub9ac\ubdf0\uc5b4\uc758 \uc758\uacac:<\/strong> \ub3d9\uc77c\ud55c \uc77d\uae30 \uc804\uc6a9 \uacc4\uc57d \uc870\uac74\uc744 \ucda9\uc871\ud558\uba74\uc11c\ub3c4 \ub354 \ucca0\uc800\ud569\ub2c8\ub2e4.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>Codex \ucd9c\ub825 \uacb0\uacfc \uc804\uccb4 \ubcf4\uae30<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\uc644\uc804\ud558\uac8c \uc815\uc81c\ub41c \uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825<\/p><pre>## \uc544\ud0a4\ud14d\ucc98\n\n\uc774 \ud328\ud0a4\uc9c0\ub294 \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub9cc \uc0ac\uc6a9\ud558\ub294 \uc18c\uaddc\ubaa8 \ud30c\uc774\uc36c \ud328\ud0a4\uc9c0\ub85c, \ub2e4\uc74c \ub124 \uac00\uc9c0 \uae30\ub2a5 \uacc4\uce35\uc73c\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4:\n\n- **\ub370\uc774\ud130 \ubaa8\ub378:** [`Job`]()\uc740 `identifier`, `name`, `owner`\ub97c \ud3ec\ud568\ud558\ub294 \ubd88\ubcc0 \ub370\uc774\ud130 \ud074\ub798\uc2a4\uc785\ub2c8\ub2e4. `Job.to_dict()`\ub294 `dataclasses.asdict()`\ub97c \ud1b5\ud574 \uc774\ub97c \uc9c1\ub82c\ud654\ud569\ub2c8\ub2e4.\n- **\ub9ac\ud3ec\uc9c0\ud1a0\ub9ac:** [`JobRepository`]()\ub294 \uc2dd\ubcc4\uc790\ub97c \ud0a4\ub85c \uc0ac\uc6a9\ud558\uc5ec \uba54\ubaa8\ub9ac \ub0b4 \uc0ac\uc804(dictionary)\uc5d0 \uc791\uc5c5\uc744 \uc800\uc7a5\ud569\ub2c8\ub2e4. \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub098 \uc601\uad6c \uc800\uc7a5 \uae30\ub2a5\uc740 \uc5c6\uc2b5\ub2c8\ub2e4.\n- **\uc11c\ube44\uc2a4:** [`SchedulerService`]()\ub294 \uc2dd\ubcc4\uc790 \ud560\ub2f9, \uc785\ub825 \uc815\uaddc\ud654, \uc0dd\uc131, \ubaa9\ub85d \ud45c\uc2dc \ubc0f \uc0ad\uc81c\ub97c \ub2f4\ub2f9\ud569\ub2c8\ub2e4.\n- **\uc2dc\uac04 \uc720\ud2f8\ub9ac\ud2f0:** [`next_daily_run()`]()\ub294 \ub2e4\uc74c \uc2e4\ud589 \uc2dc\uac04\uc744 \uacc4\uc0b0\ud558\uc9c0\ub9cc, \uc774\ub97c `Job`, `SchedulerService` \ub610\ub294 `JobRepository`\ub85c \uac00\uc838\uc624\uac70\ub098 \uc5f0\uacb0\ud558\ub294 \ucf54\ub4dc\ub294 \uc5c6\uc2b5\ub2c8\ub2e4.\n- **\uacf5\uac1c API:** [`scheduler.__init__`]()\ub294 `SchedulerService`\ub9cc \ub178\ucd9c\ud569\ub2c8\ub2e4.\n\n\ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc774\ub984\uacfc\ub294 \ub2ec\ub9ac, \ud604\uc7ac \uc791\uc5c5(job)\uc5d0\ub294 \uc2a4\ucf00\uc904\ub9c1 \uc815\ubcf4\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc73c\uba70 \uc2e4\ud589 \ub300\uae30\uc5f4\ub3c4 \uc5c6\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc6b0\uc120\uc21c\uc704\ub294 \uc800\uc7a5\ub41c \uba54\ud0c0\ub370\uc774\ud130\uc640 \ubaa9\ub85d \ud45c\uc2dc \uc21c\uc11c\uc5d0\ub294 \uc601\ud5a5\uc744 \uc904 \uc218 \uc788\uc9c0\ub9cc, \uc2dc\uc2a4\ud15c\uc744 \uc0c1\ub2f9\ud788 \ud655\uc7a5\ud558\uc9c0 \uc54a\ub294 \ud55c \uc2e4\uc81c \uc791\uc5c5 \uc2e4\ud589\uc5d0\ub294 \uc601\ud5a5\uc744 \ubbf8\uce60 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\n\n## \uc0dd\uc131 \ubc0f \ubaa9\ub85d \ud45c\uc2dc \ub370\uc774\ud130 \ud750\ub984\n\n`SchedulerService.create_job(name, owner)`\ub97c \ud1b5\ud55c \uc0dd\uc131:\n\n1. [`create_job()`]()\uc740 \uacf5\ubc31\ub9cc\uc73c\ub85c \uad6c\uc131\ub41c \uc774\ub984\uc744 \uac70\ubd80\ud569\ub2c8\ub2e4.\n2. `name`\uacfc `owner`\uc758 \uacf5\ubc31\uc744 \uc81c\uac70\ud55c \ud6c4, \uc11c\ube44\uc2a4\uc758 `_next_identifier`\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubcc0\uacbd \ubd88\uac00\ub2a5\ud55c `Job` \uac1d\uccb4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.\n3. [`JobRepository.save()`]()\ub294 \uac1d\uccb4\ub97c `_jobs[job.identifier]`\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4.\n4. \uc11c\ube44\uc2a4\ub294 `_next_identifier`\ub97c \uc99d\uac00\uc2dc\ud0a4\uace0 \ub3d9\uc77c\ud55c `Job`\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.\n\n`SchedulerService.list_jobs()`\ub97c \ud1b5\ud55c \ubaa9\ub85d \uc870\ud68c:\n\n1. [`list_jobs()`]()\ub294 `repository.all()`\ub85c \uc9c1\uc811 \uc704\uc784\ud569\ub2c8\ub2e4.\n2. [`JobRepository.all()`]()\uc740 \uc0ac\uc804 \ud0a4\ub97c \uc22b\uc790 \uc21c\uc73c\ub85c \uc815\ub82c\ud569\ub2c8\ub2e4.\n3. \ub530\ub77c\uc11c \uc791\uc5c5\uc740 \uc77c\uc815\uc774\ub098 \uc6b0\uc120\uc21c\uc704 \uc21c\uc11c\uac00 \uc544\ub2cc, \uc2dd\ubcc4\uc790\/\uc0dd\uc131 \uc21c\uc11c(\uc624\ub984\ucc28\uc21c)\ub85c \ubc18\ud658\ub429\ub2c8\ub2e4.\n\n## \uc791\uc5c5 \uc6b0\uc120\uc21c\uc704\uc758 \uc601\ud5a5\uc744 \ubc1b\uc744 \uac00\ub2a5\uc131\uc774 \uc788\ub294 \ud30c\uc77c\n\n\ud544\uc218:\n\n- [`scheduler\/models.py`](): priority \ud544\ub4dc\uc640 \uae30\ubcf8\uac12\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4. `to_dict()`\ub294 `asdict()`\ub97c \uc0ac\uc6a9\ud558\ubbc0\ub85c \uc774 \ud544\ub4dc\ub97c \uc790\ub3d9\uc73c\ub85c \ud3ec\ud568\ud569\ub2c8\ub2e4.\n- [`scheduler\/service.py`](): \uc6b0\uc120\uc21c\uc704\ub97c \uc218\ub77d\ud558\uace0 \uc720\ud6a8\uc131\uc744 \uac80\uc0ac\ud55c \ud6c4 `Job`\uc73c\ub85c \uc804\ub2ec\ud569\ub2c8\ub2e4.\n- [`tests\/test_scheduler.py`](): \uae30\ubcf8\uac12, \uba85\uc2dc\uc801 \uac12, \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uac12, \uc9c1\ub82c\ud654\ub41c \uac12 \ubc0f \uc815\ub82c \ub3d9\uc791\uc744 \ud14c\uc2a4\ud2b8\ud569\ub2c8\ub2e4.\n\n\uc870\uac74\ubd80:\n\n- [`scheduler\/repository.py`](): \uc6b0\uc120\uc21c\uc704\uac00 \ubaa9\ub85d\uc758 \uc21c\uc11c\ub97c \uc81c\uc5b4\ud558\uae30 \uc704\ud55c \ubaa9\uc801\uc73c\ub85c\ub9cc \uc0ac\uc6a9\ub418\ub294 \uacbd\uc6b0\uc5d0\ub9cc `all()`\uc744 \ubcc0\uacbd\ud569\ub2c8\ub2e4. \ub3d9\uc810 \uc0c1\ud669\uc740 `identifier`\uc640 \uac19\uc740 \uacb0\uc815\ub860\uc801 \ubcf4\uc870 \ud0a4\ub85c \ucc98\ub9ac\ud574\uc57c \ud569\ub2c8\ub2e4.\n- [`scheduler\/__init__.py`](): \uc6b0\uc120\uc21c\uc704\uac00 \uacf5\uac1c \uc5f4\uac70\ud615(enum) \ub610\ub294 \uac12 \uac1d\uccb4\uac00 \ub418\ub294 \uacbd\uc6b0\uc5d0\ub9cc \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4.\n- [`README.md`](): \ud5c8\uc6a9\ub418\ub294 \uac12, \uae30\ubcf8\uac12 \ubc0f \uc815\ub82c \uaddc\uce59\uc744 \ubb38\uc11c\ud654\ud558\uc2ed\uc2dc\uc624.\n\n\uc601\ud5a5\uc744 \ubc1b\uc9c0 \uc54a\uc744 \uac83\uc73c\ub85c \uc608\uc0c1\ub428:\n\n- `scheduler\/time_rules.py`: \uc774 \ud30c\uc77c\uc758 \uc720\uc77c\ud55c \uc2ec\ubcfc\uc740 \uc81c\uacf5\ub41c datetime\uc744 \ucc98\ub9ac\ud560 \ubfd0\uc774\uba70, \uc791\uc5c5\uc774\ub098 \ubaa9\ub85d\uacfc \uc544\ubb34\ub7f0 \uad00\ub828\uc774 \uc5c6\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.\n\n## \uc8fc\uc694 \uc704\ud5d8 \uc694\uc18c\n\n- **\uc815\uc758\ub418\uc9c0 \uc54a\uc740 \uc758\ubbf8\ub860:** \ucf54\ub4dc\uc5d0\ub294 \uac12\uc774 \ud074\uc218\ub85d \uc6b0\uc120\uc21c\uc704\uac00 \ub192\uc740\uc9c0, \uc791\uc740 \uac12\uc774 \uc6b0\uc120\uc21c\uc704\uac00 \ub192\uc740\uc9c0, \uc5b4\ub5a4 \uac12\uc774 \uc720\ud6a8\ud55c\uc9c0, \ub610\ub294 \uc6b0\uc120\uc21c\uc704\uac00 \ubaa9\ub85d \uc21c\uc11c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\ub294\uc9c0\uc5d0 \ub300\ud55c \uc120\ub840\uac00 \uc804\ud600 \uc5c6\uc2b5\ub2c8\ub2e4.\n- **\ud638\ud658\uc131:** `Job` \ub610\ub294 `create_job()`\uc5d0 \ud544\uc218 \uc778\uc218\ub97c \ucd94\uac00\ud558\uba74 \ud604\uc7ac \ud14c\uc2a4\ud2b8\uc5d0 \uc788\ub294 `create_job(\"Daily report\", \"Alex\")`\uc640 \uac19\uc740 \uae30\uc874 \ud638\ucd9c \ucf54\ub4dc\uac00 \uc791\ub3d9\ud558\uc9c0 \uc54a\uac8c \ub429\ub2c8\ub2e4. \uae30\ubcf8\uac12\uc744 \uc9c0\uc815\ud558\uba74 \ud574\ub2f9 \ud638\ucd9c\uc740 \uc720\uc9c0\ub429\ub2c8\ub2e4.\n- **\uc704\uce58 \uae30\ubc18 \uc0dd\uc131\uc790 \ubb38\uc81c:** `Job`\uc740 \ud604\uc7ac `SchedulerService.create_job()`\uc5d0\uc11c \uc704\uce58 \uae30\ubc18\uc73c\ub85c \uc0dd\uc131\ub429\ub2c8\ub2e4. \ud544\ub4dc \ubc30\uce58\ub098 \ud5a5\ud6c4 \uc704\uce58 \uae30\ubc18 \ud638\ucd9c \uc2dc \uc798\ubabb\ub41c \uac12\uc774 \uc870\uc6a9\ud788 \ud560\ub2f9\ub420 \uc218 \uc788\uc73c\ubbc0\ub85c, \ud0a4\uc6cc\ub4dc \uae30\ubc18 \uc0dd\uc131\uc790\uac00 \ub354 \uc548\uc804\ud560 \uac83\uc785\ub2c8\ub2e4.\n- **\uc21c\uc11c \ubcc0\uacbd:** `JobRepository.all()`\uc5d0\uc11c \uc2dd\ubcc4\uc790 \uc21c\uc11c\ub97c \ubcc0\uacbd\ud558\uba74 \uae30\uc874 \ub3d9\uc791\uc774 \ub2ec\ub77c\uc9d1\ub2c8\ub2e4. \uc6b0\uc120\uc21c\uc704\uac00 \ub3d9\uc77c\ud55c \uacbd\uc6b0 \uc548\uc815\uc801\uc778 \ub3d9\uc810 \ucc98\ub9ac \uae30\uc900\uc774 \ud544\uc694\ud569\ub2c8\ub2e4.\n- **\uc720\ud6a8\uc131 \uac80\uc0ac \ubaa8\ud638\uc131:** \uc81c\ud55c \uc5c6\ub294 Python \uac12\uc744 \ud5c8\uc6a9\ud558\uba74 \ubb38\uc790\uc5f4, \ubd80\uc6b8 \uac12 \ub610\ub294 \uc784\uc758\uc758 \uc815\uc218\uac00 \ud3ec\ud568\ub420 \uc218 \uc788\uc73c\uba70, \uc774\ub97c \uc77c\uad00\ub418\uac8c \ube44\uad50\ud558\uae30 \uc5b4\ub835\uc2b5\ub2c8\ub2e4.\n- **\uc2e4\ud589 \ubc94\uc704 \ubd88\uc77c\uce58:** \ub514\uc2a4\ud328\ucc98\ub098 \uc2e4\ud589 \ud050\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \uc6b0\uc120\uc21c\uc704\uc5d0 \ub530\ub77c \uc5b4\ub5a4 \uc791\uc5c5\uc774 \uba3c\uc800 \uc2e4\ud589\ub418\ub294\uc9c0 \uacb0\uc815\ud55c\ub2e4\ub294 \uc8fc\uc7a5\uc740 \ud604\uc7ac\uc758 \uc5b4\ub5a4 \uc2ec\ubcfc\ub85c\ub3c4 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n- **\uba54\ubaa8\ub9ac \ub0b4 \uc81c\ud55c:** `_jobs`\ub294 \ub2e8\uc21c\ud55c \uc778\uc2a4\ud134\uc2a4 \uc0ac\uc804(dictionary)\uc774\ubbc0\ub85c, \ub2e4\ub978 \ubaa8\ub4e0 \uc791\uc5c5 \ud544\ub4dc\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc6b0\uc120\uc21c\uc704\ub3c4 \ud504\ub85c\uc138\uc2a4\uac00 \uc885\ub8cc\ub418\uba74 \uc0ac\ub77c\uc9d1\ub2c8\ub2e4.\n\n## \uad6c\ud604 \ubc0f \uc720\ud6a8\uc131 \uac80\uc0ac \uacc4\ud68d\n\n1. \uba3c\uc800 \uacc4\uc57d(contract)\uc744 \uc815\uc758\ud569\ub2c8\ub2e4: \ud45c\ud604 \ubc29\uc2dd, \ud5c8\uc6a9\ub418\ub294 \uac12, \uae30\ubcf8\uac12, \uc6b0\uc120\uc21c\uc704 \ubc29\ud5a5, \ub3d9\uc810 \ucc98\ub9ac \ubc29\uc2dd, \uadf8\ub9ac\uace0 \ubaa9\ub85d \uc21c\uc11c\uc5d0 \uc601\ud5a5\uc744 \ubbf8\uce58\ub294\uc9c0 \uc5ec\ubd80.\n2. `Job`\uc5d0 `priority`\ub97c \ucd94\uac00\ud558\uba70, \uac00\uae09\uc801 \ud558\uc704 \ud638\ud658\uc131\uc774 \ubcf4\uc7a5\ub418\ub294 \uae30\ubcf8\uac12\uc744 \uc124\uc815\ud55c\ub2e4.\n3. `SchedulerService.create_job()`\uc744 \uae30\ubcf8\uac12\uc774 \uc124\uc815\ub41c \uc6b0\uc120\uc21c\uc704 \ub9e4\uac1c\ubcc0\uc218\ub85c \ud655\uc7a5\ud558\uace0, \uc774\ub97c \uac80\uc99d\ud55c \ud6c4 \ud0a4\uc6cc\ub4dc \uc778\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec `Job`\uc744 \uc0dd\uc131\ud55c\ub2e4.\n4. \ub098\uc5f4 \uc21c\uc11c\uac00 \uc6b0\uc120\uc21c\uc704\ub97c \ubc18\uc601\ud558\ub294 \uacbd\uc6b0, `JobRepository.all()`\uc744 \uc6b0\uc120\uc21c\uc704 \uc21c\uc73c\ub85c \uba3c\uc800 \uc815\ub82c\ud55c \ud6c4 \uc2dd\ubcc4\uc790 \uc21c\uc73c\ub85c \uc815\ub82c\ub418\ub3c4\ub85d \ubcc0\uacbd\ud569\ub2c8\ub2e4. \uadf8\ub807\uc9c0 \uc54a\uc740 \uacbd\uc6b0 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc815\ub82c \uc21c\uc11c\ub294 \ubcc0\uacbd\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n5. \ub2e4\uc74c \ud56d\ubaa9\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4:\n   - \uae30\uc874\uc758 \ub450 \uc778\uc790 \uc0dd\uc131 \ubc29\uc2dd.\n   - \uba85\uc2dc\uc801 \uc6b0\uc120\uc21c\uc704 \uc720\uc9c0.\n   - \uae30\ubcf8 \uc6b0\uc120\uc21c\uc704.\n   - \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc720\ud615 \ubc0f \ubc94\uc704 \uc678 \uac12.\n   - `Job.to_dict()` \ucd9c\ub825.\n   - \ub2e4\uc911 \uc6b0\uc120\uc21c\uc704 \ubaa9\ub85d \uc815\ub82c \uc21c\uc11c.\n   - \ub3d9\uc77c\ud55c \uc6b0\uc120\uc21c\uc704\uc5d0 \ub300\ud55c \uc548\uc815\uc801\uc778 \uc815\ub82c \uc21c\uc11c.\n   - \uae30\uc874 \ube48 \uc774\ub984 \ucc98\ub9ac \ub3d9\uc791.\n6. \uc815\ud655\ud55c \uacf5\uac1c \uacc4\uc57d \ub0b4\uc6a9\uc744 README\uc5d0 \ubc18\uc601\ud558\uc2ed\uc2dc\uc624.\n7. `python3 -m unittest discover -s tests -v` \uba85\ub839\uc5b4\ub85c \uc804\uccb4 \uc624\ud504\ub77c\uc778 \ud14c\uc2a4\ud2b8 \uc2a4\uc704\ud2b8\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4.\n\n## \uac80\uc99d \uc644\ub8cc\n\n- \uae30\uc900 \ud14c\uc2a4\ud2b8 \uc2a4\uc704\ud2b8: **\ud14c\uc2a4\ud2b8 2\uac1c \ud1b5\uacfc**.\n- \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc804\uccb4 \uc2ec\ubcfc \uac80\uc0c9 \uacb0\uacfc, `next_daily_run()`\uc774 \ubd84\ub9ac\ub418\uc5b4 \uc788\uc73c\uba70 \uae30\uc874 \uc6b0\uc120\uc21c\uc704 \uc2ec\ubcfc\uc774 \uc5c6\ub294 \uac83\uc774 \ud655\uc778\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n- \ubcc0\uacbd\ub41c \ud30c\uc77c: **\uc5c6\uc74c**.\n- \uae30\ub2a5 \uad6c\ud604: \uc694\uad6c \uc0ac\ud56d\uc5d0 \ub530\ub77c **\uc2e4\uc2dc\ub418\uc9c0 \uc54a\uc74c**.\n\n&gt; **\uacb0\ub860 + \uacb0\uc815**\n&gt;\n&gt; \uc6b0\uc120\uc21c\uc704\uac00 \uba54\ud0c0\ub370\uc774\ud130\ub098 \ub098\uc5f4 \uc21c\uc11c\uc5d0 \ubd88\uacfc\ud558\ub2e4\uba74 \ubcc0\uacbd \uc0ac\ud56d\uc740 \ubbf8\ubbf8\ud569\ub2c8\ub2e4. \uc8fc\ub85c `models.py`, `service.py`, `repository.py` \ubc0f \ud14c\uc2a4\ud2b8\uac00 \ud574\ub2f9\ub429\ub2c8\ub2e4. \uad6c\ud604 \uc804\uc5d0, \uc6b0\uc120\uc21c\uc704\uac00 \ub2e8\uc21c\ud788 \uc791\uc5c5\uc744 \uc124\uba85\ud558\ub294 \uac83\uc778\uc9c0, \uc544\ub2c8\uba74 `list_jobs()`\uc758 \uc21c\uc11c\ub97c \ubcc0\uacbd\ud558\ub294 \uac83\uc778\uc9c0, \uadf8\ub9ac\uace0 \uac12\uc758 \ucc99\ub3c4, \uae30\ubcf8\uac12, \ubc29\ud5a5 \ubc0f \ub3d9\uc810 \ucc98\ub9ac \uaddc\uce59\uc744 \uacb0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/pre><\/div><\/details><details class=\"d-full\"><summary>Claude \ucf54\ub4dc \ucd9c\ub825 \uc804\uccb4 \ubcf4\uae30<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825\uc744 \uadf8\ub300\ub85c \ud3ec\ud568\ud558\ub294 \uc644\uc804\ud55c \ud578\ub4dc\uc624\ud504 \uae30\ub85d<\/p><pre># T1 \uc2e4\ud589 \uae30\ub85d \u2014 \uc54c \uc218 \uc5c6\ub294 \uc800\uc7a5\uc18c \ud30c\uc545\n\n## \uc2e4\ud589 \ub9e4\uac1c\ubcc0\uc218\n\n| \ud544\ub4dc | \uac12 |\n| --- | --- |\n| \uc791\uc5c5 | `T1` |\n| \uace0\uc815 \ud504\ub86c\ud504\ud2b8 | `01-prompts\/T1.md` |\n| \uace0\uc815 \ud504\ub86c\ud504\ud2b8 SHA-256 | `a571ff15c2502ec29b172ae2e77dd9ab0caca2869b91f9468d47571434d16c17` |\n| \uc2e4\ud589 \ub2e8\uc704 | \uaca9\ub9ac\ub41c Claude \uc11c\ube0c\uc5d0\uc774\uc804\ud2b8, `general-purpose`, \uc0c8\ub85c\uc6b4 \ucee8\ud14d\uc2a4\ud2b8 |\n| \uaca9\ub9ac \ubc29\ubc95 | **\uc11c\ube0c\uc5d0\uc774\uc804\ud2b8 \ud3f4\ubc31** (\ubb38\uc11c\ud654\ub41c \ub2e4\uc6b4\uadf8\ub808\uc774\ub4dc \u2014 `results\/isolation-decision.md` \ucc38\uc870) |\n| \ud560\ub2f9\ub41c \uae68\ub057\ud55c \uc0ac\ubcf8 | `runtime\/workspaces\/T1` |\n| Claude \ucf54\ub4dc \ubc84\uc804 | `2.1.220` |\n| \ubaa8\ub378 \uc124\uc815 | `claude-opus-5` |\n| start_utc | `2026-07-28T10:27:31Z` |\n| end_utc | `2026-07-28T10:28:32Z` |\n| \uc18c\uc694 \uc2dc\uac04 | 61\ucd08 (T2\u2013T4\uc640 \ub3d9\uc2dc \uc2e4\ud589; \uc815\ud655\ud55c \uc9c0\uc5f0 \uc2dc\uac04 \uce21\uc815\uc774 \uc544\ub2d8) |\n| \uc2dc\ub3c4 \ud69f\uc218 | 1 |\n| \uc0c1\ud0dc | `valid` |\n| \uc218\ub3d9 \uac1c\uc785 | \uc5c6\uc74c |\n\n## Safe \ub3c4\uad6c \uc694\uc57d\n\n`date`, `find`, `ls`, `wc`, `stat`, `grep`, \uc791\uc5c5 \uacf5\uac04 \ud30c\uc77c 7\uac1c\uc5d0 \ub300\ud55c `Read`, `python3 -V`,\n`python3 -m unittest discover -s tests -v`. \ubaa8\ub4e0 \uc77d\uae30 \uc791\uc5c5\uc740 \ud560\ub2f9\ub41c \uc791\uc5c5 \uacf5\uac04 \ub0b4\uc5d0\uc11c\ub9cc \uc218\ud589\ub428.\n\ub124\ud2b8\uc6cc\ud06c \uc811\uc18d \uc5c6\uc74c, \uc124\uce58 \uc5c6\uc74c, \uc4f0\uae30 \uc791\uc5c5 \uc5c6\uc74c.\n\n## \uc624\ud504\ub77c\uc778 \uac80\uc0ac \uacb0\uacfc\n\n`python3 -m unittest discover -s tests -v` \u2192 \ud14c\uc2a4\ud2b8 2\uac1c, OK (\uc885\ub8cc \ucf54\ub4dc 0).\n\uc6cc\ud06c\uc2a4\ud398\uc774\uc2a4 \uc678\ubd80\uc5d0\uc11c \ucf54\ub514\ub124\uc774\ud130\uac00 \uc7ac\ud655\uc778\ud568: `results\/checks\/T1-public.txt` \ucc38\uc870.\n\n## \ud328\uce58\n\n\uc5c6\uc74c. `results\/T1\/patch.diff`\ub294 \ube44\uc5b4 \uc788\uc73c\uba70, `diff -ru 02-fixture runtime\/workspaces\/T1`\n\uba85\ub839\uc740 \ucc28\uc774\uc810\uc744 \ubc18\ud658\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc740 \ud30c\uc77c\uc744 \ubcc0\uacbd\ud558\uc9c0 \uc54a\uace0 \uac80\uc0ac\ud574\uc57c \ud588\uc73c\uba70, \uc774\ub294\n\ub2e8\uc21c\ud788 \ud655\uc778\ub41c \uc0ac\ud56d\uc77c \ubfd0 \uba85\uc2dc\uc801\uc73c\ub85c \uc8fc\uc7a5\ub41c \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4.\n\n## \uc815\uc81c\ub41c \uc624\ub958\n\n\ubcf5\uad6c \uac00\ub2a5\ud55c \uc178 \uc624\ub958 1\uac74: \ucd08\uae30 `grep` \uba85\ub839\uc5d0\uc11c \ub530\uc634\ud45c\ub85c \ubb36\uc774\uc9c0 \uc54a\uc740 `--include=*.py` \ud328\ud134\uc744 \uc0ac\uc6a9\ud588\uc73c\ubbc0\ub85c\n\uc178\uc774 \uae00\ub85c\ube0c \ucc98\ub9ac\ub97c \uc2dc\ub3c4\ud588\uc2b5\ub2c8\ub2e4. \ud328\ud134\uc744 \ub530\uc634\ud45c\ub85c \ubb36\uc5b4 \ub2e4\uc2dc \uc2e4\ud589\ud558\ub2c8 \uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4. \uacb0\uacfc\uc5d0\ub294 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\n\n## \ud45c\uc2dc\ub41c \ucd9c\ub825(\uc6d0\ubb38 \uadf8\ub300\ub85c)\n\n### 1. \uc774 \uc800\uc7a5\uc18c\uc758 \ub0b4\uc6a9\n\n`local-scheduler-1.0.0`(`fixture-manifest.json`)\uc774\ub77c\ub294 \uc774\ub984\uc758 \ub3c5\ub9bd\ud615 \ud30c\uc774\uc36c \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac \ud53c\ucc98\ub85c, MIT \ub77c\uc774\uc120\uc2a4\ub97c \ub530\ub974\uba70 \ub124\ud2b8\uc6cc\ud06c\ub098 \ud504\ub85c\ub355\uc158 \uc758\uc874\uc131\uc774 \uc5c6\uc2b5\ub2c8\ub2e4(`README.md`, `\"network_required\": false`). \ud06c\uae30\uac00 \ub9e4\uc6b0 \uc791\uc2b5\ub2c8\ub2e4: \uc18c\uc2a4\/\ubb38\uc11c \ud30c\uc77c 8\uac1c\uc640 \ub9e4\ub2c8\ud398\uc2a4\ud2b8\ub97c \ud569\uccd0 \ucd1d 103\uc904\uc785\ub2c8\ub2e4. \uc0ac\uc6a9\ub41c \uc778\ud130\ud504\ub9ac\ud130\ub294 **Python 3.9.6**\uc785\ub2c8\ub2e4. `pyproject.toml`, `setup.py`, CI \uad6c\uc131, \ub9b0\ud130 \ub610\ub294 \ud0c0\uc785 \uccb4\ucee4 \uad6c\uc131\uc740 \uc5c6\uc2b5\ub2c8\ub2e4. \uc120\uc5b8\ub41c \uc720\uc77c\ud55c \uc6cc\ud06c\ud50c\ub85c\ub294 `python3 -m unittest discover -s tests -v`\uc785\ub2c8\ub2e4(`README.md`).\n\n### 2. \uc544\ud0a4\ud14d\ucc98\n\n\uc138 \uac1c\uc758 \ub808\uc774\uc5b4\uc640 \ud558\ub098\uc758 \ub3c5\ub9bd \ubaa8\ub4c8\ub85c \uad6c\uc131\ub418\uc5b4 \uc788\uc73c\uba70, \ubaa8\ub450 `scheduler\/` \uc544\ub798\uc5d0 \uc704\uce58\ud569\ub2c8\ub2e4:\n\n| \ub808\uc774\uc5b4 | \ud30c\uc77c | \uc2ec\ubcfc | \uc5ed\ud560 |\n|---|---|---|---|\n| \ud328\ud0a4\uc9c0 \ud30c\uc0ac\ub4dc | `scheduler\/__init__.py` | `__all__ = [\"SchedulerService\"]` | `SchedulerService`\ub9cc \uc7ac\uc218\ucd9c\ud558\uba70, `Job`, `JobRepository` \ubc0f `time_rules`\ub294 \uacf5\uac1c \uc778\ud130\ud398\uc774\uc2a4\uc758 \uc77c\ubd80\uac00 \uc544\ub2d8 |\n| \ub3c4\uba54\uc778 \ubaa8\ub378 | `scheduler\/models.py` | `Job` (`@dataclass(frozen=True)`) | `identifier: int`, `name: str`, `owner: str` \ud544\ub4dc\ub97c \uac00\uc9c4 \ubd88\ubcc0 \uac12 \uac1d\uccb4\uc774\uba70, `to_dict()` \uba54\uc11c\ub4dc\ub294 `asdict(self)`\ub85c \uad6c\ud604\ub428 |\n| \uc9c0\uc18d\uc131 | `scheduler\/repository.py` | `JobRepository` | `identifier`\ub97c \ud0a4\ub85c \ud558\ub294 \uba54\ubaa8\ub9ac \ub0b4 `dict`; `save`, `get`, `all`, `delete` |\n| \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc11c\ube44\uc2a4 | `scheduler\/service.py` | `SchedulerService` | \uc720\ud6a8\uc131 \uac80\uc0ac, \uc2dd\ubcc4\uc790 \ud560\ub2f9, \uc624\ucf00\uc2a4\ud2b8\ub808\uc774\uc158: `create_job`, `list_jobs`, `delete_job` |\n| \uace0\uc544 | `scheduler\/time_rules.py` | `next_daily_run` | \ubc18\ubcf5 \uacc4\uc0b0 \u2014 **\uc5b4\ub514\uc5d0\uc11c\ub3c4 \uc784\ud3ec\ud2b8\ub418\uc9c0 \uc54a\uc74c** |\n\n\uc758\uc874\uc131 \ubc29\ud5a5\uc740 \uba85\ud655\ud558\uace0 \ub2e8\ubc29\ud5a5\uc785\ub2c8\ub2e4: `service.py`\ub294 `.models`\uc640 `.repository`\uc5d0\uc11c \uac00\uc838\uc624\uace0, `repository.py`\ub294 `.models`\uc5d0\uc11c \uac00\uc838\uc624\uba70, `models.py`\ub294 `dataclasses`\ub9cc \uac00\uc838\uc635\ub2c8\ub2e4. \uc21c\ud658 \uc758\uc874\uc131\uc740 \uc5c6\uc2b5\ub2c8\ub2e4. \uc758\uc874\uc131 \uc8fc\uc785\uc774 \uc874\uc7ac\ud558\uc9c0\ub9cc \ucd5c\uc18c\ud55c\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4 \u2014 `SchedulerService.__init__(self, repository=None)`\uc740 `self.repository = repository or JobRepository()`\ub97c \uc218\ud589\ud558\ubbc0\ub85c, \ud14c\uc2a4\ud2b8 \uc2dc \uac00\uc9dc \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \ub300\uc785\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n\ud604\uc7ac `scheduler\/time_rules.py`\ub294 \uc0ac\uba78\ub41c \ucf54\ub4dc\uc785\ub2c8\ub2e4. \uc804\uccb4 \ub514\ub809\ud1a0\ub9ac \ud2b8\ub9ac\uc5d0\uc11c `time_rules`\uc640 `next_daily_run`\uc744 grep\uc73c\ub85c \uac80\uc0c9\ud574 \ubcf8 \uacb0\uacfc, \ud574\ub2f9 \ud30c\uc77c\uc758 \uc815\uc758\uc640 `fixture-manifest.json`\uc758 `expected_files`\uc5d0 \ub098\uc5f4\ub41c \ud56d\ubaa9\ub9cc\uc774 \uac80\uc0c9\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774 \ud30c\uc77c\uc740 \ubc30\ud3ec\ub418\uc5c8\uc73c\ub098 \uc2e4\uc81c\ub85c\ub294 \uc5f0\uacb0\ub418\uc9c0 \uc54a\uc740 \uc0c1\ud0dc\uc785\ub2c8\ub2e4.\n\n### 3. \ub370\uc774\ud130 \ud750\ub984\n\n**\uc791\uc5c5 \uc0dd\uc131** \u2014 `SchedulerService.create_job(name, owner)`:\n1. \uac00\ub4dc: `if not name.strip(): raise ValueError('name is required\")`. \uc774\uac83\uc774 \uc2dc\uc2a4\ud15c \ub0b4 *\uc720\uc77c\ud55c* \uc720\ud6a8\uc131 \uac80\uc0ac\uc785\ub2c8\ub2e4 \u2014 `owner`\ub294 \uc808\ub300 \ud655\uc778\ub418\uc9c0 \uc54a\uc73c\ubbc0\ub85c, \ube48 \uc18c\uc720\uc790\ub3c4 \ud5c8\uc6a9\ub429\ub2c8\ub2e4.\n2. \uc0dd\uc131: `Job(self._next_identifier, name.strip(), owner.strip())` \u2014 \uc704\uce58 \uae30\ubc18 \uc0dd\uc131\uc774\uba70, \ub450 \ubb38\uc790\uc5f4 \ubaa8\ub450 \uacf5\ubc31\uc744 \uc81c\uac70\ud558\uc5ec \uc815\uaddc\ud654\ub429\ub2c8\ub2e4.\n3. \uc800\uc7a5: `self.repository.save(job)`, \uc774\ub294 `self._jobs[job.identifier] = job`\uc744 \uc218\ud589\ud558\uace0 \uc791\uc5c5 \uc778\uc2a4\ud134\uc2a4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.\n4. \uce74\uc6b4\ud130 \uc99d\uac00: `self._next_identifier += 1` \u2014 \uc800\uc7a5 *\ud6c4*\uc5d0 \uc218\ud589\ub418\ubbc0\ub85c, \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\ub354\ub77c\ub3c4 \uce74\uc6b4\ud130\ub294 \uc18c\ube44\ub418\uc9c0 \uc54a\uc740 \uc0c1\ud0dc\ub85c \ub0a8\uc2b5\ub2c8\ub2e4.\n5. `Job` \uc778\uc2a4\ud134\uc2a4 \ubc18\ud658 (\uc11c\ube44\uc2a4\ub294 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc758 \ubc18\ud658 \uac12\uc774 \uc544\ub2cc \uc790\uccb4 \ub85c\uceec `job`\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4).\n\n\uc2dd\ubcc4\uc790 \ud560\ub2f9\uc740 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uac00 \uc544\ub2cc **\uc11c\ube44\uc2a4** \ub0b4\uc5d0\uc11c \uc774\ub8e8\uc5b4\uc9d1\ub2c8\ub2e4(`SchedulerService.__init__` \ub0b4\uc758 `self._next_identifier = 1`). \uc774\ub294 \uc911\uc694\ud55c \uacbd\uacc4\uc810\uc785\ub2c8\ub2e4. \uc774\ubbf8 \uc791\uc5c5\uc774 \ud3ec\ud568\ub41c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc8fc\uc785\ud558\uba74, \uc0c8\ub85c \uc0dd\uc131\ub41c \uc11c\ube44\uc2a4\uac00 \ubc88\ud638 \ub9e4\uae30\uae30\ub97c 1\ubd80\ud130 \ub2e4\uc2dc \uc2dc\uc791\ud558\uae30 \ub54c\ubb38\uc5d0 \uae30\uc874 \uc791\uc5c5\ub4e4\uc774 \uc544\ubb34\ub7f0 \uacbd\uace0 \uc5c6\uc774 \ub36e\uc5b4\uc4f0\uc774\uac8c \ub429\ub2c8\ub2e4.\n\n**\uc791\uc5c5 \ub098\uc5f4** \u2014 `SchedulerService.list_jobs()`\ub294 `JobRepository.all()`\uc744 \uadf8\ub300\ub85c \uc804\ub2ec\ud558\ub294 \ud568\uc218\uc774\uba70, \uc774 \ud568\uc218\ub294 `[self._jobs[key] for key in sorted(self._jobs)]`\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc815\ub82c \uc21c\uc11c\ub294 **\uc815\uc218 \uc2dd\ubcc4\uc790 \uae30\uc900 \uc624\ub984\ucc28\uc21c**\uc774\uba70, \ud604\uc7ac \uc774\ub294 \uc0bd\uc785 \uc21c\uc11c\uc640 \uc77c\uce58\ud569\ub2c8\ub2e4. \ud638\ucd9c\ud560 \ub54c\ub9c8\ub2e4 \uc0c8\ub85c\uc6b4 \ub9ac\uc2a4\ud2b8\uac00 \uc0dd\uc131\ub418\uc9c0\ub9cc, `Job` \uac1d\uccb4\ub4e4\uc740 \uacf5\uc720 \ucc38\uc870\uc785\ub2c8\ub2e4. `Job`\uc774 \uace0\uc815(frozen)\ub418\uc5b4 \uc788\uae30 \ub54c\ubb38\uc5d0 \uc548\uc804\ud569\ub2c8\ub2e4.\n\n**\uc0ad\uc81c** \u2014 `SchedulerService.delete_job(identifier)`\ub294 `JobRepository.delete`\ub85c \uc704\uc784\ub418\ub294\ub370, \uc774\ub294 \uae30\ubcf8\uac12\uc774 \uc5c6\ub294 `self._jobs.pop(identifier)`\uc640 \ub3d9\uc77c\ud558\ubbc0\ub85c, \ub530\ub77c\uc11c ID\uac00 \ub204\ub77d\ub41c \uacbd\uc6b0 `KeyError`\ub97c \ubc1c\uc0dd\uc2dc\ud0b5\ub2c8\ub2e4. \uc774\ub294 \ub3d9\uc77c\ud55c \uc870\uac74\uc5d0\uc11c `None`\uc744 \ubc18\ud658\ud558\ub294 `JobRepository.get`\uacfc \uc77c\uad00\uc131\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.\n\n**\uc774 \uacbd\ub85c\ub4e4\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8 \ucee4\ubc84\ub9ac\uc9c0** \u2014 `tests\/test_scheduler.py`\uc5d0\ub294 \uc815\ud655\ud788 \ub450 \uac00\uc9c0 \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\uac00 \uc788\uc2b5\ub2c8\ub2e4: `test_create_and_list_jobs`(`job.identifier == 1` \ubc0f `[job] == service.list_jobs()`\ub97c \uac80\uc99d)\uc640 `test_blank_name_is_rejected`\uc785\ub2c8\ub2e4. \ub450 \ud14c\uc2a4\ud2b8 \ubaa8\ub450 \ud604\uc7ac \ud2b8\ub9ac\uc5d0\uc11c\ub294 \ud1b5\uacfc\ud569\ub2c8\ub2e4.\n\n### 4. \uc791\uc5c5 \uc6b0\uc120\uc21c\uc704 \ucd94\uac00\ub85c \uc601\ud5a5\uc744 \ubc1b\uc744 \uac00\ub2a5\uc131\uc774 \uc788\ub294 \ud30c\uc77c\n\n\ud655\uc2e4\uc131 \uc21c\uc11c\ub300\ub85c \ub098\uc5f4\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:\n\n1. **`scheduler\/models.py`** \u2014 \ud655\uc2e4\ud568. `Job`\uc5d0 `priority` \ud544\ub4dc\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ub370\uc774\ud130\ud074\ub798\uc2a4\uac00 `frozen=True`\uc774\uace0 \ud544\ub4dc\uac00 \uc704\uce58 \uae30\ubc18\uc774\ubbc0\ub85c, \uc0c8 \ud544\ub4dc\uc5d0\ub294 \uae30\ubcf8\uac12(\uc608: `priority: int = 0`)\uc744 \uac00\uc838\uc57c \ud558\uac70\ub098, \uae30\uc874 \uc138 \ud544\ub4dc \ub4a4\uc5d0 \ubc30\uce58\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \uae30\uc874\uc758 \ubaa8\ub4e0 \uc704\uce58 \ub9e4\uac1c\ubcc0\uc218 \uad6c\uc131\uc774 \uae68\uc9d1\ub2c8\ub2e4. `to_dict()`\ub294 \uc218\uc815\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. `asdict(self)`\uac00 \ud574\ub2f9 \ud544\ub4dc\ub97c \uc790\ub3d9\uc73c\ub85c \uc778\uc2dd\ud558\ubbc0\ub85c, \uc774\ub294 \ucf54\ub4dc \ubcc0\uacbd\uc774 \uc544\ub2cc \uba85\uc2dc\ub418\uc9c0 \uc54a\uc740 \uc9c1\ub82c\ud654 \uacc4\uc57d\uc758 \ubcc0\uacbd\uc5d0 \ud574\ub2f9\ud569\ub2c8\ub2e4.\n2. **`scheduler\/service.py`** \u2014 \ud655\uc2e4\ud569\ub2c8\ub2e4. `create_job`\uc5d0\ub294 `priority` \ub9e4\uac1c\ubcc0\uc218\uac00 \ud544\uc694\ud558\uba70, 13\ud589\uc758 `Job(...)` \uc704\uce58 \uae30\ubc18 \uc0dd\uc131\uc790\uc5d0 \uc774\ub97c \uc804\ub2ec\ud574\uc57c \ud569\ub2c8\ub2e4. \uc6b0\uc120\uc21c\uc704\uac00 \uc720\ud6a8\uc131 \uac80\uc0ac(\ubc94\uc704, \uc5f4\uac70\ud615 \uba64\ubc84\uc2ed)\ub97c \uac70\uce5c\ub2e4\uba74, \ud574\ub2f9 \uc870\uac74\ubb38\uc740 \uae30\uc874 `name.strip()` \uac80\uc0ac \ubc14\ub85c \uc606\uc5d0 \uc704\uce58\ud574\uc57c \ud569\ub2c8\ub2e4. \ubaa9\ub85d\uc744 \uc6b0\uc120\uc21c\uc704 \uc21c\uc73c\ub85c \uc815\ub82c\ud574\uc57c \ud55c\ub2e4\uba74, \uc800\uc7a5\uc18c\ub97c \ub2e8\uc21c\ud55c \uc800\uc7a5\uc18c\ub85c \uc720\uc9c0\ud558\uace0 \uc2f6\uc744 \uacbd\uc6b0 `list_jobs`\uc5d0 \uc815\ub82c \ub85c\uc9c1\uc744 \ubc30\uce58\ud574\uc57c \ud569\ub2c8\ub2e4.\n3. **`scheduler\/repository.py`** \u2014 \uac00\ub2a5\uc131\uc774 \ub192\uc74c. `JobRepository.all()`\uc758 `sorted(self._jobs)`\ub294 \ub515\uc154\ub108\ub9ac\uc758 *\ud0a4*, \uc989 \uc2dd\ubcc4\uc790\ub97c \uae30\uc900\uc73c\ub85c \uc815\ub82c\ud569\ub2c8\ub2e4. \uc6b0\uc120\uc21c\uc704 \uc21c\uc11c\ub85c \ubaa9\ub85d\uc744 \ud45c\uc2dc\ud558\ub824\uba74 \uc774\ub97c `(-job.priority, job.identifier)`\uc640 \uac19\uc740 \ud0a4\ub97c \uae30\uc900\uc73c\ub85c \uac12\uc744 \uc815\ub82c\ud558\ub3c4\ub85d \ubcc0\uacbd\ud558\uac70\ub098, \ubcc4\ub3c4\uc758 \uc815\ub82c\ub41c \uc561\uc138\uc11c\ub97c \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4. \ub3d9\uc810 \ucc98\ub9ac \ubc29\uc2dd\uc744 \uc554\ubb35\uc801\uc73c\ub85c \ub0a8\uaca8\ub450\uc9c0 \ub9c8\uc2ed\uc2dc\uc624. \ub515\uc154\ub108\ub9ac\uc758 \uc0bd\uc785 \uc21c\uc11c\ub294 \uc758\uc874\ud560 \uc218 \uc788\ub294 \uc548\uc815\uc801\uc778 \uacc4\uc57d\uc774 \uc544\ub2d9\ub2c8\ub2e4.\n4. **`tests\/test_scheduler.py`** \u2014 \ud655\uc2e4\ud568. \uae30\ubcf8 \uc6b0\uc120\uc21c\uc704, \uba85\uc2dc\uc801 \uc6b0\uc120\uc21c\uc704, \uc815\ub82c, \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc6b0\uc120\uc21c\uc704 \uac70\ubd80 \ub4f1\uc5d0 \ub300\ud55c \uc0c8\ub85c\uc6b4 \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4. \uae30\uc874\uc758 `assertEqual([job], service.list_jobs())`\ub294 *\ub3d9\uc77c\ud55c* \uac1d\uccb4\ub97c \ube44\uad50\ud558\ubbc0\ub85c \ud544\ub4dc \ucd94\uac00 \ud6c4\uc5d0\ub3c4 \uc815\uc0c1 \uc791\ub3d9\ud558\uc9c0\ub9cc, \uc0c8\ub85c \uc0dd\uc131\ub41c `Job` \ub9ac\ud130\ub7f4\uc744 \ube44\uad50\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uc744 \uac83\uc785\ub2c8\ub2e4.\n5. **`README.md`** \u2014 \uc6b0\uc120\uc21c\uc704 \uc758\ubbf8\ub860(\ubc94\uc704\uc758 \uc5b4\ub290 \ucabd\uc774 \uc6b0\uc120\ud558\ub294\uc9c0, \uae30\ubcf8\uac12 \ub4f1)\uc744 \uc5b4\ub514\uc5d0\ub4e0 \uba85\uc2dc\ud574\uc57c \ud560 \uacbd\uc6b0, \uc218\uc815\ub420 \uac00\ub2a5\uc131\uc774 \ub192\uc2b5\ub2c8\ub2e4.\n6. **`scheduler\/__init__.py`** \u2014 `SchedulerService`\uc640 \ud568\uaed8 \uc6b0\uc120\uc21c\uc704 \uc5f4\uac70\ud615\uc774\ub098 \uc0c1\uc218\ub97c \ub0b4\ubcf4\ub0b4\uc57c \ud558\ub294 \uacbd\uc6b0\uc5d0\ub9cc \uc218\uc815\ub429\ub2c8\ub2e4.\n7. **`fixture-manifest.json`** \u2014 \uc0c8\ub85c\uc6b4 \ubaa8\ub4c8 \ud30c\uc77c\uc744 \ucd94\uac00\ud558\ub294 \uacbd\uc6b0\uc5d0\ub9cc \ud574\ub2f9\ub429\ub2c8\ub2e4. \uc774 \ud30c\uc77c\uc758 `expected_files` \ubc30\uc5f4\uc740 \uba85\uc2dc\uc801\uc778 \ubaa9\ub85d\uc774\ubbc0\ub85c \ubcc0\uacbd\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n8. **`scheduler\/time_rules.py`** \u2014 *\uc808\ub300* \uc218\uc815\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \uc6b0\uc120\uc21c\uc704\ub294 \ubc18\ubcf5\uc131\uacfc \ubb34\uad00\ud558\uba70, \uc774 \ubaa8\ub4c8\uc740 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n\n### 5. \uc8fc\uc694 \uc704\ud5d8 \uc694\uc18c\n\n- **\uc815\ub82c \uaddc\uce59\uc740 \uba85\uc2dc\ub418\uc9c0 \uc54a\uc740 \ub3d9\uc791 \ubcc0\uacbd\uc785\ub2c8\ub2e4.** `JobRepository.all()`\uc740 \ud604\uc7ac \uc2dd\ubcc4\uc790 \uc624\ub984\ucc28\uc21c \uc815\ub82c\uc744 \ubcf4\uc7a5\ud558\uba70, `list_jobs`\ub3c4 \uc774\ub97c \uc0c1\uc18d\ubc1b\uc2b5\ub2c8\ub2e4. \uc774 \ubcf4\uc7a5\uc5d0 \uc758\uc874\ud558\ub294 \ubaa8\ub4e0 \uc18c\ube44\uc790\ub294 \uc7ac\uc815\ub82c\ub85c \uc778\ud574 \uc624\ub958\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4. \uba85\ud655\ud788 \uacb0\uc815\ud558\uc2ed\uc2dc\uc624: `list_jobs()`\uc758 \uc758\ubbf8\uac00 \ubcc0\uacbd\ub418\ub294 \uac83\uc778\uc9c0, \uc544\ub2c8\uba74 \uc0c8\ub85c\uc6b4 `list_jobs_by_priority()`\uac00 \ud568\uaed8 \ucd94\uac00\ub418\ub294 \uac83\uc778\uc9c0? \uc804\uc790\uac00 \ub354 \uc704\ud5d8\ud55c \uc120\ud0dd\uc774\uba70, \uae30\uc874 \ud14c\uc2a4\ud2b8\uc778 `test_create_and_list_jobs`\ub294 \ud68c\uadc0 \ud604\uc0c1(\uc694\uc18c\uac00 \ud558\ub098\ubfd0\uc778 \ub9ac\uc2a4\ud2b8)\uc744 \ud3ec\ucc29\ud558\uae30\uc5d0\ub294 \ub108\ubb34 \ucde8\uc57d\ud569\ub2c8\ub2e4.\n- **\uc815\ub82c \ubc29\ud5a5\uc740 \uc2e4\uc81c\ub85c \ubaa8\ud638\ud569\ub2c8\ub2e4.** \"\uc6b0\uc120\uc21c\uc704 1'\uc740 \uc2dc\uc2a4\ud15c\uc5d0 \ub530\ub77c \uad00\ub840\uc801\uc73c\ub85c *\uac00\uc7a5 \ub192\uc74c*\uc744 \uc758\ubbf8\ud558\uae30\ub3c4 \ud558\uace0 *\uac00\uc7a5 \ub0ae\uc74c*\uc744 \uc758\ubbf8\ud558\uae30\ub3c4 \ud569\ub2c8\ub2e4. \uc774 \uc800\uc7a5\uc18c\uc5d0\ub294 \uc774\ub97c \uba85\ud655\ud788 \ud558\ub294 \ub0b4\uc6a9 \u2014 \uc8fc\uc11d, docstring, README \ubb38\uad6c \ub4f1 \u2014\uc774 \uc804\ud600 \uc5c6\uc2b5\ub2c8\ub2e4. \uaddc\uce59\uc744 \uc815\ud558\uace0, `models.py`\uc5d0 \ubb38\uc11c\ud654\ud55c \ub2e4\uc74c, \uc815\ub82c \ubc29\ud5a5\uc774 \uba85\ud655\ud788 \uace0\uc815\ub418\ub3c4\ub85d \ucd5c\uc18c \uc138 \uac00\uc9c0 \uc11c\ub85c \ub2e4\ub978 \uc6b0\uc120\uc21c\uc704\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud14c\uc2a4\ud2b8\uc5d0 \ubc18\uc601\ud558\uc2ed\uc2dc\uc624.\n- **\ub3d9\uc810 \ucc98\ub9ac \ubc29\uc2dd\uc774 \ubd88\uc548\uc815\ud569\ub2c8\ub2e4.** \ub450 \uc791\uc5c5\uc758 \uc6b0\uc120\uc21c\uc704\uac00 \uac19\ub354\ub77c\ub3c4 \uacb0\uacfc\ub294 \uc5ec\uc804\ud788 \uacb0\uc815\ub860\uc801\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ud30c\uc774\uc36c\uc758 `sorted`\ub294 \uc548\uc815\uc801\uc774\uc9c0\ub9cc, \uc548\uc815\uc131\uc740 \uc785\ub825 \uc21c\uc11c \uc790\uccb4\uac00 \uc815\uc758\ub418\uc5b4 \uc788\uc744 \ub54c\ub9cc \uc720\uc6a9\ud569\ub2c8\ub2e4. \ud56d\uc0c1 `identifier`\ub97c \uba85\uc2dc\uc801\uc778 \ubcf4\uc870 \ud0a4\ub85c \ud3ec\ud568\uc2dc\ud0a4\uc138\uc694.\n- **Frozen-dataclass \ud544\ub4dc \uc21c\uc11c.** `Job`\uc740 \uc138 \uac1c\uc758 \uc704\uce58 \uae30\ubc18 \ud544\ub4dc\ub97c \uac00\uc9c4 `@dataclass(frozen=True)`\uc774\uba70, `service.py:13`\uc5d0\uc11c \uc704\uce58 \uae30\ubc18\uc73c\ub85c \uc0dd\uc131\ub429\ub2c8\ub2e4. `priority`\ub97c \ub9c8\uc9c0\ub9c9 \uc704\uce58 \uc774\uc678\uc758 \uacf3\uc5d0 \uc0bd\uc785\ud558\uac70\ub098 \uae30\ubcf8\uac12\uc744 \uc9c0\uc815\ud558\uc9c0 \uc54a\ub294 \uac83\uc740 \ud638\ud658\uc131\uc744 \uae68\ub294 \ubcc0\uacbd \uc0ac\ud56d\uc774\uba70, \uae30\uc874 \ub450 \uac1c\uc758 \ud14c\uc2a4\ud2b8\ub9cc\uc73c\ub85c\ub294 \uc774 \ubb38\uc81c\uac00 \uba85\ud655\ud558\uac8c \ub4dc\ub7ec\ub098\uc9c0 \uc54a\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n- **`to_dict()` \uacc4\uc57d \ud655\uc7a5.** `asdict(self)`\ub294 \ubaa8\ub4e0 \ud544\ub4dc\ub97c \ubc18\uc601\ud569\ub2c8\ub2e4. `priority`\ub97c \ucd94\uac00\ud558\uba74 `models.py`\uc758 \uba54\uc11c\ub4dc \ubcf8\ubb38\uc5d0 \ub208\uc5d0 \ub744\ub294 \uc218\uc815 \uc5c6\uc774\ub3c4 \ubaa8\ub4e0 \uc9c1\ub82c\ud654\ub41c \ud398\uc774\ub85c\ub4dc\uac00 \ubcc0\uacbd\ub429\ub2c8\ub2e4. \uc815\ud655\ud55c \ub515\uc154\ub108\ub9ac \ud615\uc2dd\uc744 \ud655\uc778\ud558\ub294 \ubaa8\ub4e0 \ucf54\ub4dc\ub294 \uc791\ub3d9\ud558\uc9c0 \uc54a\uac8c \ub429\ub2c8\ub2e4.\n- **Python 3.9.6 \uc81c\uc57d \uc870\uac74.** `@dataclass(slots=True)`(3.10 \uc774\uc0c1) \ubc0f `kw_only=True`(3.10 \uc774\uc0c1)\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc73c\uba70, PEP 604\uc758 `int | None` \uc5b4\ub178\ud14c\uc774\uc158\uc740 `from __future__ import annotations`\uac00 \uc5c6\uc73c\uba74 \ub7f0\ud0c0\uc784\uc5d0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4. \uc6b0\uc120\uc21c\uc704\ub97c \uc5f4\uac70\ud615(enum)\uc73c\ub85c \ubaa8\ub378\ub9c1\ud560 \uacbd\uc6b0, `enum.StrEnum`\uc740 3.11 \uc774\uc0c1\uc5d0\uc11c\ub9cc \uc9c0\uc6d0\ub418\ubbc0\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc774 \uc911 \uc5b4\ub290 \ud558\ub098\ub77c\ub3c4 \uc774 \uc778\ud130\ud504\ub9ac\ud130\uc5d0\uc11c \ud53c\ucc98(fixture)\ub97c \uc791\ub3d9\ud558\uc9c0 \uc54a\uac8c \ub9cc\ub4ed\ub2c8\ub2e4.\n- **\uc2dd\ubcc4\uc790 \ud560\ub2f9\uc774 \uc798\ubabb\ub41c \uacc4\uce35\uc5d0 \uc704\uce58\ud574 \uc788\uc2b5\ub2c8\ub2e4.** `SchedulerService._next_identifier`\ub294 \uc11c\ube44\uc2a4\uac00 ID \uc0dd\uc131\uc744 \ub2f4\ub2f9\ud558\ub294 \ubc18\uba74, \uc800\uc7a5\uc18c\ub294 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uac00 \uad00\ub9ac\ud568\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. \uc6b0\uc120\uc21c\uc704 \uad00\ub828 \uc791\uc5c5\uc73c\ub85c \uc778\ud574 \ub450 \ubc88\uc9f8 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uad6c\ud604\uc774\ub098 \uc0ac\uc804 \ub85c\ub4dc\ub41c \ud53c\ucc98\uac00 \ud544\uc694\ud574\uc9c8 \uacbd\uc6b0, \uc774\ub7ec\ud55c \ubd84\ud560\ub85c \uc778\ud574 ID \ucda9\ub3cc\uc774 \ubc1c\uc0dd\ud558\uace0 \uc791\uc5c5\uc774 \ub36e\uc5b4\uc4f0\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n- **\ube44\ub300\uce6d\uc801\uc778 \uc624\ub958 \ucc98\ub9ac \ubc29\uc2dd.** `JobRepository.get`\uc740 \uc870\ud68c\uc5d0 \uc2e4\ud328\ud560 \uacbd\uc6b0 `None`\uc744 \ubc18\ud658\ud558\ub294 \ubc18\uba74, `JobRepository.delete`\ub294 `KeyError`\ub97c \ubc1c\uc0dd\uc2dc\ud0b5\ub2c8\ub2e4. \uc6b0\uc120\uc21c\uc704\uc640 \uad00\ub828\ub41c \uc0c8\ub85c\uc6b4 \uc870\ud68c \uae30\ub2a5\uc740 \uc6b0\uc5f0\ud788 \uc774\ub7ec\ud55c \ubd88\uc77c\uce58\ub97c \ubb3c\ub824\ubc1b\uae30\ubcf4\ub2e4\ub294 \uc758\ub3c4\uc801\uc73c\ub85c \ud558\ub098\uc758 \uaddc\uce59\uc744 \uc120\ud0dd\ud574\uc57c \ud569\ub2c8\ub2e4.\n- **\uc720\ud6a8\uc131 \uac80\uc0ac \ub204\ub77d\uc758 \uc120\ub840.** `create_job`\uc740 `name`\uc744 \uc720\ud6a8\uc131 \uac80\uc0ac\ud558\uc9c0\ub9cc `owner`\ub294 \uac80\uc0ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. `priority`\uc5d0 \ub300\ud574 \uc774\ub7ec\ud55c \ub290\uc2a8\ud55c \uae30\uc900\uc744 \uadf8\ub300\ub85c \uc801\uc6a9\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \uc720\ud6a8\uc131 \uac80\uc0ac\uac00 \uc774\ub8e8\uc5b4\uc9c0\uc9c0 \uc54a\uc740 \uc6b0\uc120\uc21c\uc704\ub294 \uc815\ub82c \ud0a4\ub85c \uc804\ud30c\ub418\uc5b4, \ud638\ucd9c \uc9c0\uc810\uc774 \uc544\ub2cc `sorted`\uc758 \uae4a\uc740 \ub0b4\ubd80\uc5d0\uc11c `TypeError`\ub97c \ubc1c\uc0dd\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4(\uc608: `int`\uc640 `None`\uc744 \ube44\uad50\ud558\ub294 \uacbd\uc6b0).\n- **\uc0ac\ub9dd \ucf54\ub4dc \ud568\uc815.** `scheduler\/time_rules.py`\ub294 \uc2a4\ucf00\uc904\ub9c1 \ub85c\uc9c1\ucc98\ub7fc \ubcf4\uc774\uae30 \ub54c\ubb38\uc5d0 \uc218\uc815 \uc720\ud639\uc744 \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud30c\uc77c\uc740 \uc5b4\ub514\uc5d0\uc11c\ub3c4 \uc784\ud3ec\ud2b8\ub418\uc9c0 \uc54a\uc73c\uba70, \uc790\uccb4 docstring\uc5d0\uc11c\ub3c4 \ubc84\uadf8\ub97c \uc778\uc815\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc989, UTC \uae30\uc900\uc73c\ub85c \uacbd\uacfc \uc2dc\uac04 24\uc2dc\uac04\uc744 \ub354\ud558\uace0 \"\uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc804\ud658 \uc2dc \ud604\uc9c0 \uc2e4\uc2dc\uac04\uc744 \uc870\uc815\"\ud569\ub2c8\ub2e4. \uc774 \ud30c\uc77c\uc744 \uc218\uc815\ud574\ub3c4 \ud14c\uc2a4\ud2b8 \ub300\uc0c1 \uc2dc\uc2a4\ud15c\uc5d0 \ub208\uc5d0 \ub744\ub294 \uc601\ud5a5\uc740 \uc804\ud600 \uc5c6\uc73c\ubbc0\ub85c, \uc5ec\uae30\uc5d0 \uc3df\ub294 \ub178\ub825\uc740 \ub0ad\ube44\uc774\uba70, \uc774\ub97c \ub300\uc0c1\uc73c\ub85c \uc791\uc131\ub41c \ud14c\uc2a4\ud2b8\ub294 \ucd9c\uc2dc\ub41c \ubc84\uc804\uc758 \uc5b4\ub5a4 \ubd80\ubd84\ub3c4 \uac80\uc99d\ud558\uc9c0 \ubabb\ud569\ub2c8\ub2e4.\n- **\ud5c8\uc220\ud55c \uc548\uc804\ub9dd.** \ud14c\uc2a4\ud2b8\ub294 \ub450 \uac1c\ubfd0\uc774\uba70, CI, \ub9b0\ud130, \ud0c0\uc785 \uac80\uc0ac\ub3c4 \uc5c6\uc2b5\ub2c8\ub2e4. \uc9c1\uc811 \uc791\uc131\ud55c \ucf54\ub4dc \uc678\uc5d0\ub294 \ud68c\uadc0 \ud604\uc0c1\uc744 \uc7a1\uc544\ub0bc \uc218\ub2e8\uc774 \uc804\ud600 \uc5c6\uc2b5\ub2c8\ub2e4. \uae30\uc874 \ud14c\uc2a4\ud2b8 \ubaa8\uc74c\uc744 '\uac8c\uc774\ud2b8'\uac00 \uc544\ub2cc, \ubd88\ucda9\ubd84\ud55c \uae30\ubcf8 \ucee4\ubc84\ub9ac\uc9c0\ub85c \uac04\uc8fc\ud558\uc2ed\uc2dc\uc624.\n\n### 6. \uad6c\ud604 \uacc4\ud68d (\uc2e4\ud589\ub418\uc9c0 \uc54a\uc74c)\n\n1. **\uba3c\uc800 \uc758\ubbf8\ub860\uc744 \ubb38\uc11c\ud654\ud558\uc5ec \ud655\uc815\ud558\uc2ed\uc2dc\uc624.** \uc6b0\uc120\uc21c\uc704 \uc720\ud615(`int` \ub300 \uc5f4\uac70\ud615), \uc720\ud6a8 \ubc94\uc704, \uae30\uc874\/\ubbf8\uc9c0\uc815 \uc791\uc5c5\uc5d0 \ub300\ud55c \uae30\ubcf8\uac12, \uc815\ub82c \ubc29\ud5a5. \uc774\ub97c `scheduler\/models.py`\uc758 `Job` \ud074\ub798\uc2a4\uc5d0 docstring\uc73c\ub85c \uae30\ub85d\ud558\uc2ed\uc2dc\uc624. \uc774\ub294 \ubaa8\ub4e0 \uacc4\uce35\uc774 \uc774\ubbf8 \uc758\uc874\ud558\uace0 \uc788\ub294 \uc720\uc77c\ud55c \uc704\uce58\uc785\ub2c8\ub2e4.\n2. **\ubaa8\ub378\uc744 \ud655\uc7a5\ud569\ub2c8\ub2e4.** `scheduler\/models.py`\uc758 `Job` \ud074\ub798\uc2a4\uc5d0 `priority: int = 0`\uc744 *\ub9c8\uc9c0\ub9c9* \ud544\ub4dc\ub85c \ucd94\uac00\ud558\ub418, `service.py:13`\uacfc\uc758 \uc704\uce58 \ud638\ud658\uc131\uc744 \uc720\uc9c0\ud558\uace0 `to_dict()`\ub294 \ubcc0\uacbd\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n3. **\uc11c\ube44\uc2a4 \uc804\ubc18\uc5d0 \uc774\ub97c \ubc18\uc601\ud558\uc138\uc694.** `SchedulerService.create_job`\uc5d0 \uae30\ubcf8\uac12\uc774 \uc124\uc815\ub41c `priority` \ub9e4\uac1c\ubcc0\uc218\ub97c \ucd94\uac00\ud558\uace0, \uae30\uc874 `name.strip()` \uac80\uc99d \uc870\uac74 \uc606\uc5d0 \uc720\ud6a8\uc131 \uac80\uc0ac\ub97c \ucd94\uac00\ud55c \ud6c4(\uae30\uc874 \uc624\ub958 \uc720\ud615\uacfc \uc77c\uce58\ud558\ub3c4\ub85d `ValueError`\ub97c \ubc1c\uc0dd\uc2dc\ud0b4), \uc774\ub97c `Job` \uc0dd\uc131\uc790\uc5d0 \uc804\ub2ec\ud558\uc138\uc694.\n4. **\ubaa9\ub85d \uc81c\uacf5 \ubc29\uc2dd\uc744 \uba85\uc2dc\uc801\uc73c\ub85c \uacb0\uc815\ud569\ub2c8\ub2e4.** \uad8c\uc7a5\ub418\ub294 \uc800\uc704\ud5d8 \uc635\uc158: `JobRepository.all()`\uc740 \uc2dd\ubcc4\uc790 \uc21c\uc11c\ub85c \uc815\ub82c\ub41c \uae30\ubcf8 \uae30\ub2a5\uc73c\ub85c \uadf8\ub300\ub85c \ub450\uace0, \ubcc4\ub3c4\ub85c \uc6b0\uc120\uc21c\uc704 \uc21c\uc11c\ub85c \uc815\ub82c\ub41c \uc561\uc138\uc11c\ub9ac\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub300\uc2e0 `list_jobs()`\uc758 \uc758\ubbf8\uac00 \ubcc0\uacbd\ub418\uc5b4\uc57c \ud55c\ub2e4\uba74, `JobRepository.all()`\uc758 \uc774\ud574\uc2dd\uc744 \uc218\uc815\ud558\uc5ec `identifier`\ub97c \ub3d9\uc810 \ucc98\ub9ac \uae30\uc900\uc73c\ub85c \ud3ec\ud568\ud558\ub294 \uba85\uc2dc\uc801\uc778 \ubcf5\ud569 \ud0a4\ub85c \uac12\uc744 \uc815\ub82c\ud558\uace0, `README.md`\uc5d0 \ubcc0\uacbd \uc0ac\ud56d\uc744 \uae30\ub85d\ud558\uc2ed\uc2dc\uc624.\n5. **`scheduler\/__init__.py`\ub97c \ub3d9\uae30\ud654**\ud558\ub294 \uac83\uc740 \uacf5\uac1c \uc5f4\uac70\ud615\uc774\ub098 \uc0c1\uc218\uac00 \ub3c4\uc785\ub41c \uacbd\uc6b0\uc5d0\ub9cc \uc218\ud589\ud558\uc2ed\uc2dc\uc624.\n6. **`scheduler\/time_rules.py`\ub294 \uc218\uc815\ud558\uc9c0 \ub9c8\uc2ed\uc2dc\uc624**. \ub610\ud55c, \ub3d9\uc77c\ud55c \ubcc0\uacbd \uc0ac\ud56d\uc5d0\uc11c `fixture-manifest.json`\uc758 `expected_files`\uac00 \uc5c5\ub370\uc774\ud2b8\ub418\uc9c0 \uc54a\ub294 \ud55c \ud30c\uc77c\uc744 \ucd94\uac00\ud558\uc9c0 \ub9c8\uc2ed\uc2dc\uc624.\n\n### 7. \uac80\uc99d \uacc4\ud68d\n\n- **\uba3c\uc800 \uae30\uc900 \uc0c1\ud0dc\ub97c \ud655\uc778\ud569\ub2c8\ub2e4.** \uc218\uc815\ud558\uae30 \uc804\uc5d0 `python3 -m unittest discover -s tests -v`\ub97c \uc2e4\ud589\ud558\uc5ec 2\uac1c\uc758 \ud14c\uc2a4\ud2b8\uac00 \ud1b5\uacfc\ub418\ub294\uc9c0 \ud655\uc778\ud558\uc2ed\uc2dc\uc624. \uc800\ub294 \uc774\ubbf8 \uc774 \uc791\uc5c5\uc744 \uc218\ud589\ud588\uc73c\uba70, \ud14c\uc2a4\ud2b8\ub294 \ubb38\uc81c\uc5c6\uc774 \ud1b5\uacfc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n- **\ud68c\uadc0 \ud14c\uc2a4\ud2b8 \uac8c\uc774\ud2b8.** \uae30\uc874 \ud14c\uc2a4\ud2b8 \ub450 \uac1c\ub294 \uc218\uc815 \uc5c6\uc774\ub3c4 \uc5ec\uc804\ud788 \ud1b5\uacfc\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ub9cc\uc57d `test_create_and_list_jobs`\ub97c \uc218\uc815\ud574\uc57c \ud55c\ub2e4\uba74, \uc774\ub294 \ubcc0\uacbd \uc0ac\ud56d\uc774 \ud638\ud658\uc131\uc744 \uae68\uace0 \uc788\ub2e4\ub294 \uc2e0\ud638\uc77c \ubfd0, \ud14c\uc2a4\ud2b8\ub97c \uc218\uc815\ud574\uc57c \ud560 \uc774\uc720\ub294 \uc544\ub2d9\ub2c8\ub2e4.\n- **`tests\/test_scheduler.py`\uc758 \uc0c8\ub85c\uc6b4 \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4:**\n  - \uae30\uc874 \ub450 \uac1c\uc758 \uc778\uc790\ub97c \uc0ac\uc6a9\ud558\ub294 \uc2dc\uadf8\ub2c8\ucc98\ub85c `create_job`\uc774 \ud638\ucd9c\ub420 \ub54c\uc758 \uae30\ubcf8 \uc6b0\uc120\uc21c\uc704 (\ud558\uc704 \ubc84\uc804 \ud638\ud658\uc131 \uac80\uc99d).\n  - `create_job` \u2192 `list_jobs`\ub97c \uac70\uce58\ub294 \uba85\uc2dc\uc801\uc778 \uc6b0\uc120\uc21c\uc704 \uc655\ubcf5 \ud14c\uc2a4\ud2b8.\n  - **\uc138 \uac1c \uc774\uc0c1\uc758** \uc11c\ub85c \ub2e4\ub978 \uc6b0\uc120\uc21c\uc704\ub97c \uac00\uc9c4 \uc815\ub82c \uc2dc \uc804\uccb4 \ubaa9\ub85d\uc744 \uac80\uc99d \u2014 \uc774\uac83\uc774 \uc815\ub82c \ubc29\ud5a5\uc744 \ud655\uc815\ud569\ub2c8\ub2e4.\n  - \ub3d9\uc810 \ucc98\ub9ac: \uc6b0\uc120\uc21c\uc704\uac00 \ub3d9\uc77c\ud55c \ub450 \uc791\uc5c5\uc740 \uc2dd\ubcc4\uc790 \uc624\ub984\ucc28\uc21c\uc73c\ub85c \ubc18\ud658\ub429\ub2c8\ub2e4.\n  - \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc6b0\uc120\uc21c\uc704\ub294 `ValueError`\ub97c \ubc1c\uc0dd\uc2dc\ud0a4\uba70, \uc774\ub294 \uc774\ub984\uc774 \ube44\uc5b4 \uc788\ub294 \uacbd\uc6b0\uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4.\n  - `to_dict()`\ub294 \uc608\uc0c1\ub41c \uac12\uc744 \uac00\uc9c4 `priority`\ub97c \ud3ec\ud568\ud569\ub2c8\ub2e4.\n  - \uc8fc\uc785\ub41c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uacbd\ub85c: `SchedulerService(repository=fake)`\ub294 \uc5ec\uc804\ud788 \uc6b0\uc120\uc21c\uc704\ub97c \uc62c\ubc14\ub974\uac8c \ud560\ub2f9\ud558\uba70, `repository or JobRepository()` \uc5f0\uacb0 \uc9c0\uc810\uc744 \ud65c\uc6a9\ud569\ub2c8\ub2e4.\n- **\ud638\ud658\uc131 \ud655\uc778.** \ud2b9\ud788 Python 3.9.6\uc5d0\uc11c \ubaa8\ub4e0 \uac83\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc2e4\ud589\ub418\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. `slots=`, `kw_only=`, PEP 604 \uc5f0\ud569(unions)\uc758 \ub2e8\uc21c \uc0ac\uc6a9, `StrEnum`\uc740 \ud5c8\uc6a9\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n- **\uc778\ubca4\ud1a0\ub9ac \ud655\uc778.** `fixture-manifest.json`\uc744 \ub2e4\uc2dc \uc77d\uace0, \ub514\uc2a4\ud06c\uc0c1\uc758 \ud30c\uc77c \uc138\ud2b8\uac00 \uc5ec\uc804\ud788 `expected_files`\uc640 \uc77c\uce58\ud558\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.\n- **\uacb0\uc815\uc131.** \ud14c\uc2a4\ud2b8 \uc2a4\uc704\ud2b8\ub97c \ub450\uc138 \ubc88 \uc2e4\ud589\ud569\ub2c8\ub2e4. \ub515\uc154\ub108\ub9ac \ubc18\ubcf5 \uc21c\uc11c\uc640 \uad00\ub828\ub41c \ubc84\uadf8\ub294 \uac04\ud5d0\uc801\uc73c\ub85c \ub098\ud0c0\ub0a0 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n- **\uc815\ub9ac \uc0c1\ud0dc.** `PYTHONDONTWRITEBYTECODE=1`\uc744 \uc124\uc815\ud558\uc5ec \uc2e4\ud589\ud558\uba74, `__pycache__` \ub514\ub809\ud130\ub9ac\uac00 \ub9e4\ub2c8\ud398\uc2a4\ud2b8\uc5d0 \ube44\ud574 \ucd94\uc801\ub418\uc9c0 \uc54a\uc740 \ud3b8\ucc28\ub85c \ub098\ud0c0\ub098\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">Fixture\uc758 \uc81c\ud55c \uc0ac\ud56d: \uc774\ub294 \uc18c\uaddc\ubaa8\uc758 \uc624\ud504\ub77c\uc778 Python \uc800\uc7a5\uc18c\uc600\uc2b5\ub2c8\ub2e4. Claude\ub294 CLI OAuth\uac00 \ub9cc\ub8cc\ub41c \ud6c4 \uc11c\ube0c\uc5d0\uc774\uc804\ud2b8 \ub300\uccb4 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud588\uae30 \ub54c\ubb38\uc5d0, \uaca9\ub9ac \uc0c1\ud0dc\uc640 \ud1a0\ud070 \uac00\uc2dc\uc131\uc774 \ub3d9\uc77c\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.<\/p><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uacb0\uacfc\ub294 \ub300\uaddc\ubaa8 \ubaa8\ub178\ub808\ud3ec\ub098 \uc77c\uc8fc\uc77c \ub3d9\uc548 \uc9c4\ud589\ub418\ub294 \uc790\uc728 \uc138\uc158\uc5d0\uc11c\uc758 \uc131\ub2a5\uc744 \uc785\uc99d\ud558\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uc774\ubc88 \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc740 \uc758\ub3c4\uc801\uc73c\ub85c \uaddc\ubaa8\ub97c \uc791\uac8c \uc7a1\uace0 \ud1b5\uc81c\ub41c \uc870\uac74\uc5d0\uc11c \uc9c4\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc2e4\uc81c \ud3c9\uac00\ub97c \uc9c4\ud589\ud558\ub824\uba74 \uc77d\uae30 \uc804\uc6a9 \ud504\ub86c\ud504\ud2b8\ubd80\ud130 \uc2dc\uc791\ud558\uc2ed\uc2dc\uc624. \uac01 \ub3c4\uad6c\uc5d0 \ud638\ucd9c \uacbd\ub85c\ub97c \ub9e4\ud551\ud558\uace0, \ubcc0\uacbd\ub420 \ud30c\uc77c \uc774\ub984\uc744 \uc9c0\uc815\ud558\uba70, \ud14c\uc2a4\ud2b8\ub97c \uc2dd\ubcc4\ud558\uace0, \ud574\uacb0\ub418\uc9c0 \uc54a\uc740 \uac00\uc815\uc744 \ub098\uc5f4\ud558\ub3c4\ub85d \uc694\uccad\ud55c \ud6c4, \ud3b8\uc9d1\uc744 \ud5c8\uc6a9\ud558\uc2ed\uc2dc\uc624.<\/p>\n\n\n\n<h2 id=\"implementation\" class=\"wp-block-heading\">\uad6c\ud604 \ubc29\uc2dd, \ud328\uce58 \ubc94\uc704 \ubc0f \ubc84\uadf8 \uc218\uc815<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc5ec\ub7ec \ud30c\uc77c\uc744 \ub300\uc0c1\uc73c\ub85c \ud55c \uc791\uc5c5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ub85c \ub2e4\ub978 \uc124\uacc4 \uc120\ud0dd\uc5d0 \ub530\ub77c \ub3d9\uc77c\ud55c \ud1b5\uacfc \uacb0\uacfc\uac00 \ub098\ud0c0\ub0a0 \uc218 \uc788\uc2b5\ub2c8\ub2e4. T2 \ud14c\uc2a4\ud2b8\uc5d0\uc11c \ub450 \uc81c\ud488 \ubaa8\ub450 30\/30\uc744 \uae30\ub85d\ud558\uba70 \u2018frozen hidden\u2019 \uc720\ud6a8\uc131 \uac80\uc0ac\uae30\ub97c \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4. Claude Code\ub294 \ud558\ub098 \uc774\uc0c1\uc758 \uacbd\uacc4\uc5d0 \uc720\ud6a8\uc131 \uac80\uc0ac\ub97c \ubc30\uce58\ud558\uace0, \ub354 \uad11\ubc94\uc704\ud55c \uc9c1\uc811 \ubaa8\ub378 \ubc0f \uc784\uacc4\uac12 \ud14c\uc2a4\ud2b8\ub97c \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4. Codex\ub294 \uacc4\uc57d\uc744 \ucda9\uc871\ud558\ub294 \ub354 \uc791\uc740 \uaddc\ubaa8\uc758 \uc11c\ube44\uc2a4 \uc911\uc2ec \uad6c\ud604 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub3c5\ub9bd \uac1c\ubc1c\uc790\uc5d0\uac8c \uc788\uc5b4 \uc774\ub294 \uc9c4\uc815\ud55c \ud0c0\ud611\uc758 \ubb38\uc81c\uc785\ub2c8\ub2e4. \uac80\uc99d \ubc94\uc704\ub97c \ub113\ud788\uba74 \uc5ec\ub7ec \uacbd\ub85c\ub97c \ud1b5\ud574 \uac1d\uccb4\uac00 \uc0dd\uc131\ub420 \ub54c \ubd88\ubcc0 \uc870\uac74\uc744 \ubcf4\ud638\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubc18\uba74, \ud558\ub098\uc758 \uc11c\ube44\uc2a4\uac00 \uc758\ub3c4\ub41c \uc9c4\uc785\uc810\uc77c \uacbd\uc6b0 \ud328\uce58 \ud06c\uae30\ub97c \uc904\uc774\uba74 \ud68c\uadc0 \ubc1c\uc0dd \uac00\ub2a5\uc131\uc744 \uc904\uc774\uace0 \uac80\ud1a0 \uc2dc\uac04\uc744 \ub2e8\ucd95\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc62c\ubc14\ub978 \ub2f5\uc740 \ubcc0\uacbd\ub41c \uc904 \uc218\ub098 \ud14c\uc2a4\ud2b8\ub97c \uac1c\ubcc4\uc801\uc73c\ub85c \uacc4\uc0b0\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc758 \uc18c\uc720\uad8c \uaddc\uce59\uc5d0 \ub530\ub77c \uacb0\uc815\ub429\ub2c8\ub2e4.<\/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 \uc81c\uc5b4\ub41c \uc800\uc7a5\uc18c \ud14c\uc2a4\ud2b8<\/p><h3 class=\"d-title\">\uc5ec\ub7ec \ud30c\uc77c\uc5d0 \uac78\uccd0 \uc6b0\uc120\uc21c\uc704 \uae30\ub2a5\uc744 \uad6c\ud604\ud569\ub2c8\ub2e4<\/h3><p class=\"d-sub\">\ub3d9\uacb0\ub41c \ub3d9\uc791\uc744 \ucd94\uac00\ud558\uace0, \ud638\ud658\uc131\uc744 \uc720\uc9c0\ud558\uba70, \uacf5\uac1c \ubc0f \uc228\uaca8\uc9c4 \uac80\uc0ac \ud56d\ubaa9\uc744 \ubaa8\ub450 \ud1b5\uacfc\ud569\ub2c8\ub2e4.<\/p><\/div><span class=\"d-pill\">\uae30\ub2a5\uc131 \ub125\ud0c0\uc774<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"\ucf54\ub371\uc2a4 \uacb0\uacfc\"><div class=\"d-product\"><span>\ucf54\ub371\uc2a4<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\uae30\uac04<\/span><strong>115\ucd08<\/strong><\/div><div class=\"d-metric\"><span>\uc218\ud45c<\/span><strong>7 + \uc228\uaca8\uc9c4<\/strong><\/div><div class=\"d-metric\"><span>\ubc94\uc704<\/span><strong>\ub354 \uc791\uc740 \ud328\uce58<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825 \ubc1c\ucdcc\ubb38<\/div><pre>\ubd88\ubcc0 \ubaa8\ub378\uc5d0 \uc6b0\uc120\uc21c\uc704\ub97c \ubd80\uc5ec\ud558\uace0, \uc11c\ube44\uc2a4 \uacbd\uacc4\uc5d0\uc11c \uc720\ud6a8\uc131\uc744 \uac80\uc99d\ud558\uba70, \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ub0b4 \uc21c\uc11c\ub97c \uc720\uc9c0\ud588\uc2b5\ub2c8\ub2e4.\n\n7\uac1c\uc758 \uacf5\uac1c \ud14c\uc2a4\ud2b8\uc640 \uace0\uc815\ub41c \uc228\uaca8\uc9c4 \uc720\ud6a8\uc131 \uac80\uc0ac\uae30 \ubaa8\ub450 \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4.<\/pre><\/div><p class=\"d-take\"><strong>\ub9ac\ubdf0\uc5b4\uc758 \uc758\uacac:<\/strong> \ubaa8\ub4e0 \uace0\uc815\ub41c \ud589\ub3d9 \uc591\uc0c1\uc744 \ucda9\uc871\uc2dc\ud0a8, \uc11c\ube44\uc2a4 \uc911\uc2ec\uc758 \uc18c\uaddc\ubaa8 \uad6c\ud604 \ubc29\uc2dd.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \ucf54\ub4dc \uacb0\uacfc\"><div class=\"d-product\"><span>\ud074\ub85c\ub4dc \ucf54\ub4dc<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\uae30\uac04<\/span><strong>101\ucd08<\/strong><\/div><div class=\"d-metric\"><span>\uc218\ud45c<\/span><strong>14 + \uc228\uaca8\uc9c4<\/strong><\/div><div class=\"d-metric\"><span>\ubc94\uc704<\/span><strong>\ubcf4\ub2e4 \uad11\ubc94\uc704\ud55c \uac80\uc0ac<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825 \ubc1c\ucdcc\ubb38<\/div><pre>\uc11c\ube44\uc2a4 \uacbd\uacc4\uc640 \ubd88\ubcc0 \ubaa8\ub378 \ubaa8\ub450\uc5d0\uc11c \uc6b0\uc120\uc21c\uc704\uac00 \uac80\uc99d\ub418\uc5c8\uc73c\uba70, \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ud544\ud130\ub9c1 \uae30\ub2a5\uc774 \uc720\uc9c0\ub418\uc5c8\uace0, \uc784\uacc4\uac12 \ucee4\ubc84\ub9ac\uc9c0\uac00 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n14\uac1c\uc758 \uacf5\uac1c \ud14c\uc2a4\ud2b8\uc640 \uc228\uaca8\uc9c4 \uac80\uc99d\uae30\uac00 \ubaa8\ub450 \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4.<\/pre><\/div><p class=\"d-take\"><strong>\ub9ac\ubdf0\uc5b4\uc758 \uc758\uacac:<\/strong> \uae30\ub2a5 \uc810\uc218 \uba74\uc5d0\uc11c\uc758 \uc774\uc810\uc740 \uc5c6\uc73c\uba74\uc11c\ub3c4, \uc9c1\uc811 \ubaa8\ub378 \ubc0f \uc784\uacc4\uac12 \ubaa8\ub378\uc758 \uc801\uc6a9 \ubc94\uc704\uac00 \ub354 \ub113\uc5b4\uc84c\ub2e4.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>Codex \ucd9c\ub825 \uacb0\uacfc \uc804\uccb4 \ubcf4\uae30<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\uc644\uc804\ud558\uac8c \uc815\uc81c\ub41c \uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825<\/p><pre>\uc608\uc57d \uc791\uc5c5 \uc6b0\uc120\uc21c\uc704 \uae30\ub2a5\uc744 \uad6c\ud604\ud588\uc2b5\ub2c8\ub2e4.\n\n\ubcc0\uacbd\ub41c \ud30c\uc77c:\n\n- [scheduler\/models.py](.\/scheduler\/models.py:5) \u2014 \uc9c1\ub82c\ud654\ub41c `priority`\ub97c \ucd94\uac00\ud588\uc73c\uba70, \uae30\ubcf8\uac12\uc740 `0`\uc785\ub2c8\ub2e4.\n- [scheduler\/service.py](.\/scheduler\/service.py:11) \u2014 \uc2dd\ubcc4\uc790 \uc21c\uc11c\ub97c \uc720\uc9c0\ud558\uba74\uc11c \uc720\ud6a8\uc131 \uac80\uc0ac, \uc800\uc7a5 \ubc0f `list_jobs(min_priority=0)` \ud544\ud130\ub9c1 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4.\n- [tests\/test_scheduler.py](.\/tests\/test_scheduler.py:16) \u2014 \uae30\ubcf8\uac12, \uc9c1\ub82c\ud654, \uc800\uc7a5, \uacbd\uacc4, \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uac12 \ubc0f \ud544\ud130\ub9c1\uc5d0 \ub300\ud55c \ucee4\ubc84\ub9ac\uc9c0 \ud14c\uc2a4\ud2b8\ub97c \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4.\n\n\uc2e4\ud589\ub41c \ud14c\uc2a4\ud2b8:\n\n```text\npython3 -m unittest discover -s tests -v\n7\uac1c\uc758 \ud14c\uc2a4\ud2b8 \uc2e4\ud589 \u2014 OK\n```\n\n**\uacb0\ub860:** \ub3d9\uacb0\ub41c \uc791\uc5c5\uc774 \uc644\ub8cc\ub418\uc5c8\uc73c\uba70 \uac80\uc99d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.  \n**\uacb0\uc815 \uc0ac\ud56d:** \uc5c6\uc74c.<\/pre><\/div><\/details><details class=\"d-full\"><summary>Claude \ucf54\ub4dc \ucd9c\ub825 \uc804\uccb4 \ubcf4\uae30<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825\uc744 \uadf8\ub300\ub85c \ud3ec\ud568\ud558\ub294 \uc644\uc804\ud55c \ud578\ub4dc\uc624\ud504 \uae30\ub85d<\/p><pre># T2 \uc2e4\ud589 \uae30\ub85d \u2014 \ub2e4\uc911 \ud30c\uc77c \uc6b0\uc120\uc21c\uc704 \uae30\ub2a5\n\n## \uc2e4\ud589 \ub9e4\uac1c\ubcc0\uc218\n\n| \ud544\ub4dc | \uac12 |\n| --- | --- |\n| \uc791\uc5c5 | `T2` |\n| \uace0\uc815 \ud504\ub86c\ud504\ud2b8 | `01-prompts\/T2.md` |\n| \uace0\uc815 \ud504\ub86c\ud504\ud2b8 SHA-256 | `8476a56034c4e719b97ee4081b32b4c73efd45feafe1bda9d477c83cb8fdb698` |\n| \uc2e4\ud589 \ub2e8\uc704 | \uaca9\ub9ac\ub41c Claude \uc11c\ube0c\uc5d0\uc774\uc804\ud2b8, `general-purpose`, \uc0c8\ub85c\uc6b4 \ucee8\ud14d\uc2a4\ud2b8 |\n| \uaca9\ub9ac \ubc29\ubc95 | **\uc11c\ube0c\uc5d0\uc774\uc804\ud2b8 \ud3f4\ubc31** (\ubb38\uc11c\ud654\ub41c \ub2e4\uc6b4\uadf8\ub808\uc774\ub4dc \u2014 `results\/isolation-decision.md` \ucc38\uc870) |\n| \ud560\ub2f9\ub41c \uae68\ub057\ud55c \uc0ac\ubcf8 | `runtime\/workspaces\/T2` |\n| Claude \ucf54\ub4dc \ubc84\uc804 | `2.1.220` |\n| \ubaa8\ub378 \uc124\uc815 | `claude-opus-5` |\n| start_utc | `2026-07-28T10:27:52Z` |\n| end_utc | `2026-07-28T10:29:33Z` |\n| \uc18c\uc694 \uc2dc\uac04 | 101\ucd08 (T1, T3, T4\uc640 \ub3d9\uc2dc \uc2e4\ud589; \uc815\ud655\ud55c \uc9c0\uc5f0 \uc2dc\uac04 \uce21\uc815\uc774 \uc544\ub2d8) |\n| \uc2dc\ub3c4 \ud69f\uc218 | 1 |\n| \uc0c1\ud0dc | `valid` |\n| \uc218\ub3d9 \uac1c\uc785 | \uc5c6\uc74c |\n\n## \uc548\uc804 \ub3c4\uad6c \uc694\uc57d\n\n`date`, \ud560\ub2f9\ub41c \uc791\uc5c5 \uacf5\uac04 \ub0b4\uc5d0\uc11c\uc758 `Read`\/`Edit`\/`Write`\ub9cc \ud5c8\uc6a9, `grep`,\n`python3 -m unittest discover`, `python3 -m compileall`, \uc778\ub77c\uc778 `python3 -c` \uc2a4\ubaa8\ud06c \ud14c\uc2a4\ud2b8.\n\ub124\ud2b8\uc6cc\ud06c \uc5c6\uc74c, \uc124\uce58 \uc5c6\uc74c, \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub9cc \uc0ac\uc6a9.\n\n## \ubcc0\uacbd\ub41c \ud30c\uc77c\n\n`scheduler\/models.py`, `scheduler\/repository.py`, `scheduler\/service.py`,\n`tests\/test_scheduler.py`. \ucd94\uac00\ub418\uac70\ub098 \uc81c\uac70\ub41c \ud30c\uc77c\uc774 \uc5c6\uc73c\ubbc0\ub85c `fixture-manifest.json`\uc740\n\uc815\ud655\ud55c \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud569\ub2c8\ub2e4. \uc804\uccb4 \ud328\uce58: `results\/T2\/patch.diff`.\n\n## \uc624\ud504\ub77c\uc778 \uac80\uc0ac \uacb0\uacfc\n\n\ud0dc\uc2a4\ud06c \ub7ec\ub108\uc5d0\uc11c \ubcf4\uace0\ud55c \ub0b4\uc6a9:\n\n| \uac80\uc0ac | \uacb0\uacfc |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v` (\uae30\uc900, \ubcc0\uacbd \uc804) | 2\uac1c \ud1b5\uacfc, 0\uac1c \uc2e4\ud328 |\n| `python3 -m compileall -q scheduler tests` | \ubb38\uc81c \uc5c6\uc74c |\n| \uc778\ub77c\uc778 \uc2a4\ubaa8\ud06c \ud14c\uc2a4\ud2b8 (\ub808\uac70\uc2dc 3-\uc778\uc790 \uad6c\ubb38, \ud0a4\uc6cc\ub4dc\/\uc704\uce58 \uae30\ubc18 \uc784\uacc4\uac12, `to_dict`) | \ud1b5\uacfc |\n| `python3 -m unittest discover -s tests -v` (\ucd5c\uc885) | **14\uac1c \ud1b5\uacfc, 0\uac1c \uc2e4\ud328** |\n\n\uc6cc\ud06c\uc2a4\ud398\uc774\uc2a4 \uc678\ubd80\uc5d0\uc11c \ucf54\ub514\ub124\uc774\ud130\uac00 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc7ac\uac80\uc99d\ud55c \uacb0\uacfc:\n\n| \uac80\uc0ac | \uc885\ub8cc | \uacb0\uacfc |\n| --- | --- | --- |\n| \uacf5\uac1c \ud14c\uc2a4\ud2b8 \ubaa8\uc74c (`results\/checks\/T2-public.txt`) | 0 | 14\uac1c \ud14c\uc2a4\ud2b8, OK |\n| \uc228\uaca8\uc9c4 \uac80\uc99d\uae30 `03-checks\/test_t2_hidden.py` (`results\/checks\/T2-hidden.txt`) | 0 | 2\uac1c \ud14c\uc2a4\ud2b8, OK |\n\n\uc228\uaca8\uc9c4 \uac80\uc99d\uae30\ub294 \ucd08\uae30\ud654\ub41c \ud53c\ucc98 \ubcf5\uc0ac\ubcf8\uc5d0 \ub300\ud574 \uc2e4\ud328(\uc885\ub8cc \ucf54\ub4dc 1)\ud558\uba70, \uc774\ub294 \ud1b5\uacfc \uacb0\uacfc\uac00\n\uc758\ubbf8 \uc788\uc74c\uc744 \ud655\uc778\ud574 \uc90d\ub2c8\ub2e4. `results\/checks\/validator-controls.md`\ub97c \ucc38\uc870\ud558\uc2ed\uc2dc\uc624.\n\n## \uace8\ub4dc \ub9f5 \ub3d9\uc791 \ucee4\ubc84\ub9ac\uc9c0\n\n`03-checks\/gold-map.json`\uc5d0 \uba85\uc2dc\ub41c 5\uac00\uc9c0 \ud544\uc218 \ub3d9\uc791\uc774 \ubaa8\ub450 \ucda9\uc871\ub429\ub2c8\ub2e4:\n\n| \ud544\uc218 \ub3d9\uc791 | \uc99d\uac70 |\n| --- | --- |\n| \uc6b0\uc120\uc21c\uc704 \uae30\ubcf8\uac12 0 | `Job.priority: int = MIN_PRIORITY`; `create_job(..., priority=MIN_PRIORITY)`; `test_priority_defaults_to_zero` |\n| 0\ubd80\ud130 9\uae4c\uc9c0\uc758 \uc815\uc218 \ubc94\uc704 | `validate_priority`\ub294 \uc815\uc218\uac00 \uc544\ub2c8\uac70\ub098 \ubc94\uc704\ub97c \ubc97\uc5b4\ub09c \uac12\uc744 \uac70\ubd80\ud569\ub2c8\ub2e4; `test_out_of_range_priority_is_rejected`, `test_non_integer_priority_is_rejected` |\n| \uc9c1\ub82c\ud654\ub41c \uc6b0\uc120\uc21c\uc704 | `asdict`\ub97c \ud1b5\ud55c `to_dict()`; `test_priority_appears_in_serialized_output`\ub294 \uc815\ud655\ud55c \ub515\uc154\ub108\ub9ac\ub97c \uac80\uc99d\ud569\ub2c8\ub2e4 |\n| \ucd5c\uc18c \uc6b0\uc120\uc21c\uc704 \ud544\ud130\ub9c1 | `list_jobs(min_priority=0)` \u2192 `JobRepository.all(min_priority)`; `test_filter_is_inclusive_of_the_threshold` |\n| \uc2dd\ubcc4\uc790 \uc815\ub82c \uc21c\uc11c | \uae30\uc874 `sorted(self._jobs)` \uc774\ud574\uc2dd \ub0b4\ubd80\uc5d0\uc11c \ud544\ud130 \uc801\uc6a9; `test_filter_preserves_ascending_identifier_order` |\n\n## \uc624\ub958 \uc815\ub9ac\n\n\uc5c6\uc74c. \ud14c\uc2a4\ud2b8 \uc2e4\ud589\uc5d0\uc11c \ubc1c\uc0dd\ud55c `__pycache__` \uc794\uc5ec\ubb3c\uc740 \ud0dc\uc2a4\ud06c \ub7ec\ub108\uc5d0 \uc758\ud574 \uc81c\uac70\ub418\uc5c8\uc73c\uba70, \ucf54\ub514\ub124\uc774\ud130\n\uc2a4\uc715\uc744 \ud1b5\ud574 \uc791\uc5c5 \uacf5\uac04\uc774 \uae68\ub057\ud55c \uac83\uc73c\ub85c \ud655\uc778\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n## \ud45c\uc2dc\ub41c \ucd9c\ub825 (\uc6d0\ubb38 \uadf8\ub300\ub85c)\n\n\ub85c\uceec \uc2a4\ucf00\uc904\ub7ec \ud53c\ucc98\uc758 \ubaa8\ub378, \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ubc0f \uc11c\ube44\uc2a4 \uacc4\uce35 \uc804\ubc18\uc5d0 \uac78\uccd0 \uc608\uc57d\ub41c \uc791\uc5c5\uc5d0 \uc815\uc218\ud615 `priority` \ud544\ub4dc\ub97c \ucd94\uac00\ud558\uace0, \ud544\ud130\ub9c1\ub41c \ubaa9\ub85d\uc744 \uc81c\uacf5\ud588\uc2b5\ub2c8\ub2e4.\n\n**`scheduler\/models.py`** \u2014 \ubaa8\ub4c8 \uc0c1\uc218 `MIN_PRIORITY = 0` \/ `MAX_PRIORITY = 9`\uc640 \uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud55c `validate_priority(priority)` \ud568\uc218\ub97c \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4. \uc774 \ud568\uc218\ub294 \uc815\uc218\uac00 \uc544\ub2c8\uac70\ub098 0~9(\ud3ec\ud568) \ubc94\uc704\ub97c \ubc97\uc5b4\ub09c \uac12\uc5d0 \ub300\ud574 `ValueError`\ub97c \ubc1c\uc0dd\uc2dc\ud0b5\ub2c8\ub2e4. `bool`\uc740 `int`\uc758 \uc11c\ube0c\ud074\ub798\uc2a4\uc784\uc5d0\ub3c4 \uba85\uc2dc\uc801\uc73c\ub85c \uac70\ubd80\ub418\ubbc0\ub85c, `True`\uac00 \uc6b0\uc120\uc21c\uc704 1\ub85c \ucc98\ub9ac\ub418\ub294 \uac83\uc744 \ubc29\uc9c0\ud569\ub2c8\ub2e4. \uace0\uc815\ub41c `Job` \ub370\uc774\ud130 \ud074\ub798\uc2a4\uc5d0\ub294 \uae30\ubcf8\uac12\uc774 \uc9c0\uc815\ub41c \ud6c4\ud589 \ud544\ub4dc `priority: int = MIN_PRIORITY`\uac00 \ucd94\uac00\ub418\uc5b4 \uae30\uc874 3\uac1c \uc778\uc790 \uc0dd\uc131\uc790\uac00 \uacc4\uc18d \uc791\ub3d9\ud558\ub3c4\ub85d \ud588\uc73c\uba70, \uc720\ud6a8\uc131 \uac80\uc0ac\uae30\ub97c \ud638\ucd9c\ud558\ub294 `__post_init__` \uba54\uc11c\ub4dc\uac00 \ucd94\uac00\ub418\uc5b4 \uc5b4\ub5a4 \uacbd\ub85c\ub97c \ud1b5\ud574\uc11c\ub3c4 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc6b0\uc120\uc21c\uc704\uac00 \uc0dd\uc131\ub420 \uc218 \uc5c6\ub3c4\ub85d \ud588\uc2b5\ub2c8\ub2e4. `to_dict()`\ub294 `asdict(self)`\ub85c \uc720\uc9c0\ub418\uc5c8\uc73c\ubbc0\ub85c, \uc6b0\uc120\uc21c\uc704\ub294 \uc9c1\ub82c\ud654 \ucd9c\ub825\uc5d0 \ud544\ub4dc \uc21c\uc11c\ub300\ub85c \uc790\ub3d9\uc73c\ub85c \ud45c\uc2dc\ub429\ub2c8\ub2e4.\n\n**`scheduler\/repository.py`** \u2014 `JobRepository.all()`\uc740 \uc120\ud0dd\uc801 `min_priority`\ub97c \ubc1b\uc544 \uae30\uc874 `sorted(self._jobs)` \uc774\ud574\uc2dd \ub0b4\uc5d0\uc11c \ud544\ud130\ub9c1\ud558\ubbc0\ub85c, \ud544\ud130\ub9c1 \ud6c4 \ub2e4\uc2dc \uc815\ub82c\ud560 \ud544\uc694 \uc5c6\uc774 \uc774\ubbf8 \uc774\ub97c \uc81c\uacf5\ud558\ub358 \ub3d9\uc77c\ud55c \ub2e8\uc77c \ucf54\ub4dc \uacbd\ub85c\ub97c \ud1b5\ud574 \uc2dd\ubcc4\uc790 \uc624\ub984\ucc28\uc21c \uc815\ub82c\uc774 \ubcf4\uc7a5\ub429\ub2c8\ub2e4. \uae30\ubcf8 \uc778\uc218\ub294 \uae30\uc874 \ud638\ucd9c\uc790\uc5d0 \ub300\ud574 \uc774\uc804\uc758 \uc778\uc790 \uc5c6\uc74c \ub3d9\uc791\uc744 \uc720\uc9c0\ud569\ub2c8\ub2e4. \uc2a4\ud1a0\ub9ac\uc9c0 \uc790\uccb4\uc5d0\ub294 \ubcc0\uacbd\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub294 \uc804\uccb4 `Job` \uc778\uc2a4\ud134\uc2a4\ub97c \uc800\uc7a5\ud558\ubbc0\ub85c, \uc6b0\uc120\uc21c\uc704\ub294 \uc720\uc9c0\ub418\uba70 `save`\/`get`\/`all`\uc744 \ud1b5\ud574 \uc655\ubcf5 \uc804\ub2ec\ub429\ub2c8\ub2e4.\n\n**`scheduler\/service.py`** \u2014 `create_job`\uc740 \uc120\ud0dd\uc801 \ud6c4\ud589 `priority` \uc778\uc790(\uae30\ubcf8\uac12 0)\ub97c \ubc1b\uc544\ub4e4\uc774\uba70, `Job`\uc744 \uc0dd\uc131\ud558\uae30 \uc804\uc5d0 \uc774\ub97c \uc720\ud6a8\uc131 \uac80\uc0ac\ud558\ubbc0\ub85c, \uae30\uc874 \ube48 \uc774\ub984 \uac80\uc0ac\uc640 \ub3d9\uc77c\ud55c `ValueError` \uacc4\uc57d\uc5d0 \ub530\ub77c \uc11c\ube44\uc2a4 \uacbd\uacc4\uc5d0\uc11c \uc624\ub958\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4. `list_jobs(min_priority=0)`\ub294 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 \uc704\uc784\ud569\ub2c8\ub2e4. \uc815\ub82c\uacfc \ud544\ud130\ub9c1\uc740 \uc911\ubcf5\ub418\uc9c0 \uc54a\uace0 \ud55c \uacf3\uc5d0\uc11c \ucc98\ub9ac\ub429\ub2c8\ub2e4.\n\n**`min_priority` \uc720\ud6a8\uc131 \uac80\uc0ac\uc5d0 \ub300\ud55c \uc124\uacc4 \ucc38\uace0 \uc0ac\ud56d:** \uc815\uc218\ud615\uc73c\ub85c \ud0c0\uc785 \uac80\uc0ac\uac00 \uc774\ub8e8\uc5b4\uc9c0\uc9c0\ub9cc, \uc758\ub3c4\uc801\uc73c\ub85c 0\u20139 \ubc94\uc704\ub85c \uc81c\ud55c\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. 0\u20139 \uaddc\uce59\uc740 \uc791\uc5c5\uc774 \uc800\uc7a5\ud560 \uc218 \uc788\ub294 \uac12\uc744 \uc81c\ud55c\ud569\ub2c8\ub2e4. \uc784\uacc4\uac12\uc740 \ucffc\ub9ac \ub9e4\uac1c\ubcc0\uc218\uc774\uba70, \uc608\ub97c \ub4e4\uc5b4 `min_priority=10`\uc744 \uac70\ubd80\ud558\uba74 \uc720\ud6a8\ud55c \"\uc77c\uce58\ud558\ub294 \ud56d\ubaa9 \uc5c6\uc74c\" \ucffc\ub9ac\uac00 \uc624\ub958\ub85c \ubcc0\ud658\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc6b0\uc120\uc21c\uc704\uac00 9\uc778 \uc791\uc5c5\uc774 \uc5c6\uc744 \ub54c `list_jobs(min_priority=9)`\uac00 `[]`\ub97c \ubc18\ud658\ud558\ub294 \uacbd\uc6b0\ub294 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 \uac80\uc99d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n`scheduler\/time_rules.py` \ud30c\uc77c\uc740 \uac80\ud1a0\ud588\uc73c\ub098 \uc218\uc815\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc774 \ud30c\uc77c\uc5d0 \ubb38\uc11c\ud654\ub41c \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc804\ud658\uc740 \uae30\uc874\uc5d0 \uc124\uc815\ub41c \ub3d9\uc791\uc774\uba70, \uc774\ubc88 \uc791\uc5c5\uc758 \ubc94\uc704 \ubc16\uc774\uace0, \uc774\ub97c \ubcc0\uacbd\ud558\ub294 \uac83\uc740 \ubcf8 \uc791\uc5c5\uacfc \ubb34\uad00\ud55c \ub3d9\uc791 \ubcc0\uacbd\uc774 \ub418\uc5c8\uc744 \uac83\uc785\ub2c8\ub2e4. \ud30c\uc77c\uc774 \ucd94\uac00\ub418\uac70\ub098 \uc81c\uac70\ub41c \uac83\uc774 \uc5c6\uc73c\ubbc0\ub85c `fixture-manifest.json`\uc740 \uc815\ud655\ud55c \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud569\ub2c8\ub2e4(\ud504\ub85c\uadf8\ub798\ubc0d \ubc29\uc2dd\uc73c\ub85c \uac80\uc99d\ub428).\n\n### \ud14c\uc2a4\ud2b8 \ucee4\ubc84\ub9ac\uc9c0 \ucd94\uac00\n\n\uae30\ubcf8\uac12 0; `JobRepository`\ub97c \ud1b5\ud55c \uc2a4\ud1a0\ub9ac\uc9c0 \uc655\ubcf5; `to_dict()` \ucd9c\ub825\uc758 \uc6b0\uc120\uc21c\uc704; \uacbd\uacc4\uac12 0 \ubc0f 9 \ud5c8\uc6a9; \ubc94\uc704 \uc678 \uac12 \u22121\/10\/100 \uac70\ubd80; \ube44\uc815\uc218 `\"3\"`\/`3.5`\/`None`\/`True`\ub294 \uac70\ubd80\ub428; \ubaa8\ub378 \uc218\uc900 \uc9c1\uc811 \uc720\ud6a8\uc131 \uac80\uc0ac; \ud544\ud130\ub9c1\ub418\uc9c0 \uc54a\uc740 \ub098\uc5f4 \uc21c\uc11c; \uc2dd\ubcc4\uc790 \uc624\ub984\ucc28\uc21c \uc21c\uc11c\ub97c \uc720\uc9c0\ud558\ub294 \ud544\ud130\ub9c1\ub41c \ub098\uc5f4; \ud3ec\uad04\uc801 \uc784\uacc4\uac12; \ube48 \uacb0\uacfc; \ube44\uc815\uc218 `min_priority`\ub294 \uac70\ubd80\ub428.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">Fixture\uc758 \uc81c\ud55c \uc0ac\ud56d: \uc774\ub294 \uc18c\uaddc\ubaa8\uc758 \uc624\ud504\ub77c\uc778 Python \uc800\uc7a5\uc18c\uc600\uc2b5\ub2c8\ub2e4. Claude\ub294 CLI OAuth\uac00 \ub9cc\ub8cc\ub41c \ud6c4 \uc11c\ube0c\uc5d0\uc774\uc804\ud2b8 \ub300\uccb4 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud588\uae30 \ub54c\ubb38\uc5d0, \uaca9\ub9ac \uc0c1\ud0dc\uc640 \ud1a0\ud070 \uac00\uc2dc\uc131\uc774 \ub3d9\uc77c\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.<\/p><\/article>\n\n\n\n<h3 class=\"wp-block-heading\">\uc608\uc678\uc801\uc778 \uc0c1\ud669\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 \ubc84\uadf8 \uc218\uc815<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">T3\ub294 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uad00\ub828 \uc2a4\ucf00\uc904\ub9c1 \uacb0\ud568\uc744 \ud14c\uc2a4\ud2b8\ud588\uc2b5\ub2c8\ub2e4. \ub450 \uc5d0\uc774\uc804\ud2b8 \ubaa8\ub450 30\/30\uc744 \uae30\ub85d\ud588\uc73c\uba70, \ubd04\uacfc \uac00\uc744\uc5d0 \uc2e4\uc2dc\ub41c \ub3d9\uc77c\ud55c \uc228\uaca8\uc9c4 \uc810\uac80\uc744 \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4. Claude \ucf54\ub4dc\ub294 \ubaa8\ud638\ud558\uac70\ub098 \uc0dd\ub7b5\ub41c \ud604\uc9c0 \uc2dc\uac04, \ub2e8\uc21c \uc785\ub825, \uadf8\ub9ac\uace0 \uba70\uce60\uc5d0 \uac78\uce5c \ub864\uc624\ubc84\uc5d0 \ub300\ud55c \uba85\uc2dc\uc801\uc778 \ucee4\ubc84\ub9ac\uc9c0\ub97c \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4. Codex\ub294 \ub2ec\ub825 \uc77c\uc790 \ubcc0\uacbd \ubc94\uc704\ub97c \ub354 \uc881\uac8c \uc870\uc815\ud588\uc73c\uba70, \ub3d9\uacb0\ub41c \uacc4\uc57d\uc744 \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \uad11\ubc94\uc704\ud558\uac8c \uc7ac\uc0ac\uc6a9\ub418\uac70\ub098 \uc2a4\ucf00\uc904\ub9c1 \uc624\ub958\ub85c \uc778\ud55c \ube44\uc6a9\uc774 \ud074 \uacbd\uc6b0, \ub354 \uad11\ubc94\uc704\ud55c \uacbd\uacc4 \uc0ac\ub840 \ud14c\uc2a4\ud2b8\ub97c \uc218\ud589\ud558\uba74 \uc2e0\ub8b0\ub3c4\ub97c \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacb0\ud568\uc774 \uba85\ud655\ud558\uac8c \uaca9\ub9ac\ub418\uc5b4 \uc788\uace0 \ud300\uc774 \ub3d9\uc791 \ubcc0\ud654\ub97c \ucd5c\uc18c\ud654\ud558\uace0\uc790 \ud560 \ub54c\ub294 \uad6d\uc18c\uc801\uc778 \ubcc0\uacbd\uc774 \ubc14\ub78c\uc9c1\ud569\ub2c8\ub2e4. \uc2e4\ubb34\uc801\uc778 \uac80\ud1a0 \uc9c8\ubb38\uc740 \u201c\ub204\uac00 \ub354 \ub9ce\uc774 \uc37c\ub294\uac00?\u201d\uac00 \uc544\ub2d9\ub2c8\ub2e4. \ud328\uce58\uac00 \uba85\uc2dc\ub41c \uadfc\ubcf8 \uc6d0\uc778\uc744 \ud574\uacb0\ud558\uace0, \uc8fc\ubcc0 \uacc4\uc57d\uc744 \uc720\uc9c0\ud558\uba70, \uc704\ud5d8\ud55c \uacbd\uacc4\ub97c \uac80\uc99d\ud558\ub294\uc9c0 \uc5ec\ubd80\uc785\ub2c8\ub2e4.<\/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 \uc81c\uc5b4\ub41c \uc800\uc7a5\uc18c \ud14c\uc2a4\ud2b8<\/p><h3 class=\"d-title\">\uc77c\uad11\uc808\uc57d\uc2dc\uac04\uc81c(DST) \uc804\ud658 \uc2dc \ub9e4\uc77c\uc758 \uc77c\uc815 \uc870\uc815\uc744 \uc218\uc815\ud569\ub2c8\ub2e4<\/h3><p class=\"d-sub\">\ubd04\uacfc \uac00\uc744\uc758 \uacc4\uc808\uc774 \ubc14\ub00c\ub294 \uc2dc\uae30\uc5d0\ub3c4 \uc694\uccad\ub41c \ub274\uc695\uc2dd \ubcbd\uc2dc\uacc4 \uc2dc\uac04\uc744 \uc720\uc9c0\ud558\uc2ed\uc2dc\uc624.<\/p><\/div><span class=\"d-pill\">\ub125\ud0c0\uc774 \u00b7 \ub2e4\uc591\ud55c \ub450\uaed8<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"\ucf54\ub371\uc2a4 \uacb0\uacfc\"><div class=\"d-product\"><span>\ucf54\ub371\uc2a4<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\uae30\uac04<\/span><strong>99\ucd08<\/strong><\/div><div class=\"d-metric\"><span>\uc218\ud45c<\/span><strong>4 + 2 (\uc228\uae40)<\/strong><\/div><div class=\"d-metric\"><span>\ubc94\uc704<\/span><strong>\ubd80\ubd84\uc801\uc778 \uc218\uc815<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825 \ubc1c\ucdcc\ubb38<\/div><pre>\uadfc\ubcf8 \uc6d0\uc778: \uad6c\ud604 \uacfc\uc815\uc5d0\uc11c UTC \uae30\uc900 24\uc2dc\uac04\uc774 \ucd94\uac00\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n\uc218\uc815 \uc0ac\ud56d: \ud604\uc9c0 \ub2ec\ub825 \uae30\uc900\uc73c\ub85c \ud558\ub8e8\ub97c \uc55e\ub2f9\uacbc\uc2b5\ub2c8\ub2e4. \ub3d9\uacb0\ub41c \ubd04 \ubc0f \uac00\uc744 \uc810\uac80 \ubaa8\ub450 \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4.<\/pre><\/div><p class=\"d-take\"><strong>\ub9ac\ubdf0\uc5b4\uc758 \uc758\uacac:<\/strong> \ub354 \uc881\uc740 \ubc94\uc704\uc758 \uc218\uc815\uc548\uc774 \ub3d9\uacb0\ub41c \uacc4\uc57d\uc548\uc744 \uadf8\ub300\ub85c \ud1b5\uacfc\uc2dc\ucf30\ub2e4.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \ucf54\ub4dc \uacb0\uacfc\"><div class=\"d-product\"><span>\ud074\ub85c\ub4dc \ucf54\ub4dc<\/span><span class=\"d-score\">30<small>\/30<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\uae30\uac04<\/span><strong>118\ucd08<\/strong><\/div><div class=\"d-metric\"><span>\uc218\ud45c<\/span><strong>10 + 2 (\uc228\uae40)<\/strong><\/div><div class=\"d-metric\"><span>\ubc94\uc704<\/span><strong>\uac00\uc7a5\uc790\ub9ac \ucee4\ubc84\ub9ac\uc9c0<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825 \ubc1c\ucdcc\ubb38<\/div><pre>\ubd04, \uac00\uc744, \ub204\ub77d\ub418\uac70\ub098 \ubaa8\ud638\ud55c \ud604\uc9c0 \uc2dc\uac04, \ub2e8\uc21c \uc785\ub825, \uadf8\ub9ac\uace0 \uba70\uce60\uc5d0 \uac78\uce5c \ub864\uc744 \ub2e4\ub918\uc2b5\ub2c8\ub2e4.\n\n\ud68c\uadc0 \ud14c\uc2a4\ud2b8 \ubc94\uc704\ub97c \ud655\ub300\ud55c \ud6c4, \ub3d9\uacb0\ub41c \uc228\uaca8\uc9c4 \uac80\uc0ac \ub450 \uac00\uc9c0 \ubaa8\ub450 \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4.<\/pre><\/div><p class=\"d-take\"><strong>\ub9ac\ubdf0\uc5b4\uc758 \uc758\uacac:<\/strong> \uc608\uc678 \uc0ac\ub840\uc5d0 \ub300\ud55c \ud3ec\uad04\uc801\uc778 \ucee4\ubc84\ub9ac\uc9c0; \uace0\uc815\ub41c \ud3c9\uac00 \uae30\uc900\uc5d0 \ub530\ub978 \ub3d9\uc77c\ud55c \uae30\ub2a5 \uc810\uc218.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>Codex \ucd9c\ub825 \uacb0\uacfc \uc804\uccb4 \ubcf4\uae30<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\uc644\uc804\ud558\uac8c \uc815\uc81c\ub41c \uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825<\/p><pre>\uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c(DST) \uc218\uc815 \uc0ac\ud56d\uc744 \uc801\uc6a9\ud588\uc2b5\ub2c8\ub2e4.\n\n\ubcc0\uacbd\ub41c \ud30c\uc77c:\n\n- [scheduler\/time_rules.py](.\/scheduler\/time_rules.py)\n- [tests\/test_time_rules.py](.\/tests\/test_time_rules.py)\n\n\ubcc0\uacbd \uc0ac\ud56d:\n\n- UTC \uae30\uc900 24\uc2dc\uac04 \ub300\uc2e0 \ud604\uc9c0 \ub2ec\ub825 \uae30\uc900\uc73c\ub85c \ud558\ub8e8\ub97c \uc55e\ub2f9\uae41\ub2c8\ub2e4.\n- \ub274\uc695\uc758 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c(\ubd04\/\uac00\uc744)\uc5d0 \ub300\ud55c \ud68c\uadc0 \ud14c\uc2a4\ud2b8\ub97c \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4.\n- \uacbd\uacfc\ud55c UTC \uac04\uaca9\uc774 \uac01\uac01 23\uc2dc\uac04\uacfc 25\uc2dc\uac04\uc778\uc9c0 \ud655\uc778\ud588\uc2b5\ub2c8\ub2e4.\n\n\uac80\uc99d \uacb0\uacfc:\n\n- \ub2e8\uc704 \ud14c\uc2a4\ud2b8: 4\uac1c \ud1b5\uacfc.\n- \uba54\ubaa8\ub9ac \ub0b4 \uad6c\ubb38 \uac80\uc0ac: 7\uac1c\uc758 Python \ud30c\uc77c\uc774 \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4.\n- Python\uc774 \ud560\ub2f9\ub41c \uc791\uc5c5 \uacf5\uac04 \uc678\ubd80\ub85c \uce90\uc2dc\ub97c \ub9ac\ub514\ub809\uc158\ud558\uae30 \ub54c\ubb38\uc5d0 \ubc14\uc774\ud2b8\ucf54\ub4dc \ucef4\ud30c\uc77c\uc774 \ucc28\ub2e8\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc678\ubd80 \ud30c\uc77c\uc5d0 \ub300\ud55c \uc4f0\uae30 \uc791\uc5c5\uc740 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\n\n**\uacb0\ub860:** `next_daily_run`\uc740 \uc774\uc81c \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c(DST) \uc804\ud658 \uc2dc\uc5d0\ub3c4 \uc694\uccad\ub41c \uc2e4\uc81c \uc2dc\uac04\uc744 \uc720\uc9c0\ud569\ub2c8\ub2e4. \ubcc4\ub3c4\uc758 \uacb0\uc815\uc774 \ud544\uc694\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/pre><\/div><\/details><details class=\"d-full\"><summary>Claude \ucf54\ub4dc \ucd9c\ub825 \uc804\uccb4 \ubcf4\uae30<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825\uc744 \uadf8\ub300\ub85c \ud3ec\ud568\ud558\ub294 \uc644\uc804\ud55c \ud578\ub4dc\uc624\ud504 \uae30\ub85d<\/p><pre># T3 \uc2e4\ud589 \uae30\ub85d \u2014 DST \ubc84\uadf8 \uc218\uc815\n\n## \uc2e4\ud589 \ub9e4\uac1c\ubcc0\uc218\n\n| \ud544\ub4dc | \uac12 |\n| --- | --- |\n| \uc791\uc5c5 | `T3` |\n| \uace0\uc815 \ud504\ub86c\ud504\ud2b8 | `01-prompts\/T3.md` |\n| \uace0\uc815 \ud504\ub86c\ud504\ud2b8 SHA-256 | `3fee50d0230f27f8d6dd7f12e050fa3f0b7f5fb77d9559361fee96e5f1a47307` |\n| \uc2e4\ud589 \ub2e8\uc704 | \uaca9\ub9ac\ub41c Claude \uc11c\ube0c\uc5d0\uc774\uc804\ud2b8, `general-purpose`, \uc0c8\ub85c\uc6b4 \ucee8\ud14d\uc2a4\ud2b8 |\n| \uaca9\ub9ac \ubc29\ubc95 | **\uc11c\ube0c\uc5d0\uc774\uc804\ud2b8 \ud3f4\ubc31** (\ubb38\uc11c\ud654\ub41c \ub2e4\uc6b4\uadf8\ub808\uc774\ub4dc \u2014 `results\/isolation-decision.md` \ucc38\uc870) |\n| \ud560\ub2f9\ub41c \uae68\ub057\ud55c \uc0ac\ubcf8 | `runtime\/workspaces\/T3` |\n| Claude \ucf54\ub4dc \ubc84\uc804 | `2.1.220` |\n| \ubaa8\ub378 \uc124\uc815 | `claude-opus-5` |\n| start_utc | `2026-07-28T10:28:05Z` |\n| end_utc | `2026-07-28T10:30:03Z` |\n| \uc18c\uc694 \uc2dc\uac04 | 118\ucd08 (T1, T2, T4\uc640 \ub3d9\uc2dc \uc2e4\ud589; \uc815\ud655\ud55c \uc9c0\uc5f0 \uc2dc\uac04 \uce21\uc815\uc774 \uc544\ub2d8) |\n| \uc2dc\ub3c4 \ud69f\uc218 | 1 |\n| \uc0c1\ud0dc | `valid` |\n| \uc218\ub3d9 \uac1c\uc785 | \uc5c6\uc74c |\n\n## Safe \ub3c4\uad6c \uc694\uc57d\n\n`date`, \uc9c0\uc815\ub41c \uc791\uc5c5 \uacf5\uac04 \ub0b4\uc5d0\uc11c\uc758 `\uc77d\uae30`\/`\ud3b8\uc9d1`\ub9cc \ud5c8\uc6a9, `python3 -m unittest discover`,\n`python3 -m compileall`, \uba54\ubaa8\ub9ac \ub0b4 \uc74c\uc131 \ub300\uc870\uad70 \uc2e4\ud589, \ub9e4\ub2c8\ud398\uc2a4\ud2b8 \ubb34\uacb0\uc131 \uac80\uc0ac.\n\ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub9cc \uc0ac\uc6a9 (`datetime`, `zoneinfo`, `unittest`). \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0 \uc5c6\uc74c, \uc124\uce58 \uc5c6\uc74c.\n\n## \ubcc0\uacbd\ub41c \ud30c\uc77c\n\n`scheduler\/time_rules.py` (`next_daily_run`\uc758 \ubcf8\ubb38 \ubc0f docstring\ub9cc \uc218\uc815),\n`tests\/test_scheduler.py` (`NextDailyRunTests` \ucd94\uac00, \ud14c\uc2a4\ud2b8 8\uac1c, `_elapsed` \ud5ec\ud37c \ucd94\uac00;\n\uae30\uc874 \ud14c\uc2a4\ud2b8\ub294 \uc218\uc815\ub418\uc9c0 \uc54a\uc74c). \ub2e4\ub978 \ubaa8\ub4c8\uc740 \uc218\uc815\ub418\uc9c0 \uc54a\uc558\uc73c\uba70, \ud30c\uc77c\ub3c4 \ucd94\uac00\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc804\uccb4 \ud328\uce58:\n`results\/T3\/patch.diff`.\n\n## \uc624\ud504\ub77c\uc778 \uac80\uc0ac \uacb0\uacfc\n\n\ud0dc\uc2a4\ud06c \uc2e4\ud589\uae30\uac00 \ubcf4\uace0\ud55c \ub0b4\uc6a9:\n\n| \uac80\uc0ac | \uacb0\uacfc |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v` | **10\uac1c \ud1b5\uacfc, 0\uac1c \uc2e4\ud328** (\uae30\uc874 2\uac1c + \uc2e0\uaddc 8\uac1c) |\n| `python3 -m compileall -q scheduler tests` | \uc815\uc0c1 |\n| `fixture-manifest.json` \ub300\ube44 \ub9e4\ub2c8\ud398\uc2a4\ud2b8 \ubb34\uacb0\uc131 | \ub204\ub77d 0\uac1c, \uc608\uc0c1\uce58 \ubabb\ud55c \ud56d\ubaa9 0\uac1c |\n| \ub124\uac70\ud2f0\ube0c \ucee8\ud2b8\ub864: \uba54\ubaa8\ub9ac \ub0b4\uc5d0\uc11c \ud328\uce58\ub41c \uc2dc\ub4dc \uad6c\ud604, `NextDailyRunTests`\ub9cc | 8\uac1c \uc2e4\ud589, **\uc608\uc0c1\ub300\ub85c 5\uac1c \uc2e4\ud328**, DST \ud14c\uc2a4\ud2b8 2\uac1c \ud3ec\ud568 |\n\n\uc6cc\ud06c\uc2a4\ud398\uc774\uc2a4 \uc678\ubd80\uc5d0\uc11c \ucf54\ub514\ub124\uc774\ud130\uac00 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc7ac\uac80\uc99d\ud568:\n\n| \uac80\uc0ac | \uc885\ub8cc | \uacb0\uacfc |\n| --- | --- | --- |\n| \uacf5\uac1c \ud14c\uc2a4\ud2b8 \ubaa8\uc74c (`results\/checks\/T3-public.txt`) | 0 | 10\uac1c \ud14c\uc2a4\ud2b8, OK |\n| \uc228\uaca8\uc9c4 \uac80\uc99d\uae30 `03-checks\/test_t3_hidden.py` (`results\/checks\/T3-hidden.txt`) | 0 | \ud14c\uc2a4\ud2b8 2\uac1c, OK |\n\n\uc228\uaca8\uc9c4 \uac80\uc99d\uae30\ub294 \ucd08\uae30 \uc0c1\ud0dc\uc758 \ud53c\ucc98 \ubcf5\uc0ac\ubcf8\uc5d0 \ub300\ud574 \uc2e4\ud328\ud569\ub2c8\ub2e4(\uc885\ub8cc \ucf54\ub4dc 1).\n`results\/checks\/validator-controls.md`\ub97c \ucc38\uc870\ud558\uc2ed\uc2dc\uc624.\n\n## \uace8\ub4dc \ub9f5 \ub3d9\uc791 \ucee4\ubc84\ub9ac\uc9c0\n\n`03-checks\/gold-map.json`\uc5d0 \uba85\uc2dc\ub41c 4\uac00\uc9c0 \ud544\uc218 \ub3d9\uc791\uc774 \ubaa8\ub450 \ucda9\uc871\ub418\uc5c8\uc2b5\ub2c8\ub2e4:\n\n| \ud544\uc218 \ub3d9\uc791 | \uc99d\uac70 |\n| --- | --- |\n| \uc2e4\uc81c \uc2dc\uacc4 \uc2dc\uac04 \uc720\uc9c0 | \ub2e8\uc21c \ub85c\uceec \uc2e4\uc81c \uc2dc\uacc4\uc5d0 \uc99d\ubd84\uc774 \uc801\uc6a9\ub418\uace0, \uc2dc\uac04\ub300\uac00 \uc7ac\uc5f0\uacb0\ub428; \ubaa8\ub4e0 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04(DST) \ud14c\uc2a4\ud2b8\uc5d0\uc11c \uac80\uc99d\ub428 |\n| \ubd04 \uc2dc\uac04 \ubcc0\uacbd \ucc98\ub9ac | `test_spring_forward_keeps_requested_hour` \u2014 09:30 \uc2dc\uac04 \uc720\uc9c0, \uc624\ud504\uc14b `-04:00`, \uacbd\uacfc \uc2dc\uac04 23\uc2dc\uac04 |\n| \uac00\uc744 \uc2dc\uac04 \ubcc0\uacbd \ud3ec\ud568 | `test_fall_back_keeps_requested_hour` \u2014 09:30 \uc2dc\uac04 \uc720\uc9c0, \uc624\ud504\uc14b `-05:00`, \uacbd\uacfc \uc2dc\uac04 25\uc2dc\uac04 |\n| IANA \uc2dc\uac04\ub300 \uc0ac\uc6a9 | \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc758 `ZoneInfo(\"America\/New_York\")` |\n\n\ud544\uc218 \ud14c\uc2a4\ud2b8 \uc138\ud2b8 \uc678\uc5d0\ub3c4, \uc2e4\ud589\uae30\ub294 PEP 495\uc758 \ub450 \uac00\uc9c0 \uacbd\uacc4 \uc0ac\ub840 \u2014 \ubd04 \uc2dc\uac04 \ubcc0\uacbd\uc73c\ub85c \uc778\ud574\n\uac74\ub108\ub6f4 \uc2e4\uc81c \uc2dc\uac04\uacfc \uac00\uc744 \uc2dc\uac04 \ubcc0\uacbd \uc911 \ubaa8\ud638\ud55c \uc2e4\uc81c \uc2dc\uac04 \u2014 \ubfd0\ub9cc \uc544\ub2c8\ub77c \uac01 \uc804\ud658 \uc2dc\uc810\uc744\n\ub118\ub098\ub4dc\ub294 7\uc77c \ub864\uc624\ubc84 \ubc0f \ub2e8\uc21c \uc785\ub825 \ucc98\ub9ac \ub3d9\uc791\uae4c\uc9c0 \ubaa8\ub450 \ud14c\uc2a4\ud2b8\ud588\uc2b5\ub2c8\ub2e4.\n\n## \uc815\uc81c\ub41c \uc624\ub958\n\n\ub450 \uac74\uc758 \uc790\uccb4 \uc720\ubc1c \ud14c\uc2a4\ud2b8 \uc5b4\uc124\uc158 \uc2e4\ud328: \ub3d9\uc77c\ud55c\n`tzinfo`\ub97c \uacf5\uc720\ud558\ub294 \ub450 \ub0a0\uc9dc\/\uc2dc\uac04\uc5d0 \ub300\ud574 `following - previous` \uc5f0\uc0b0\uc744 \uc218\ud589\ud558\uba74 \uc21c\uc218 \uc6d4\uac04 \uc2dc\uacc4\uac00 \ucc28\uac10\ub418\uc5b4, \uacbd\uacfc \uc2dc\uac04 \uc5b4\uc124\uc158\uc774 1\uc77c\ub85c \ud310\uc815\ub418\uc5b4 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4.\n\uad6c\ud604\uc740 \uc62c\ubc14\ub790\uc73c\ub098 \uc5b4\uc124\uc158\uc774 \uc798\ubabb\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub450 \ud53c\uc5f0\uc0b0\uc790\ub97c \uba3c\uc800 UTC\ub85c \ubcc0\ud658\ud558\ub294 `_elapsed`\n\ud5ec\ud37c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc218\uc815\ud588\uc2b5\ub2c8\ub2e4. \ud234, \uc784\ud3ec\ud2b8 \ub610\ub294 \ud658\uacbd \uad00\ub828 \uc624\ub958\ub294 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4.\n\uc2e4\ud589 \ud6c4 `__pycache__` \uc544\ud2f0\ud329\ud2b8\uac00 \uc81c\uac70\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n## \ud45c\uc2dc\ub41c \ucd9c\ub825 (\uc6d0\ubb38 \uadf8\ub300\ub85c)\n\n**\uc7ac\ud604 \ubc29\ubc95**\n\n2024\ub144 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c(DST) \uc804\ud658 \uc804\ud6c4\uc758 \uc591\ucabd \ub05d\uc5d0 `America\/New_York` \ub0a0\uc9dc\/\uc2dc\uac04\uc744 \uc9c0\uc815\ud558\uc5ec `scheduler\/time_rules.py::next_daily_run`\uc744 \ud638\ucd9c\ud588\uc2b5\ub2c8\ub2e4:\n\n```\n2024-03-09T09:30:00-05:00 -&gt; 2024-03-10T10:30:00-04:00   # \uc2dc\uac04 \ud3b8\ucc28 +1\n2024-11-02T09:30:00-04:00 -&gt; 2024-11-03T08:30:00-05:00   # \uc2dc\uac04 \ud3b8\ucc28 -1\n```\n\n\ud604\uc9c0 \uc2dc\uac04 09:30\uc5d0 \uc694\uccad\ub41c \uc791\uc5c5\uc774 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc2dc\uc791 \ud6c4 10:30\uc5d0, \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc885\ub8cc \ud6c4 08:30\uc5d0 \uc2e4\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n**\uadfc\ubcf8 \uc6d0\uc778**\n\n\uc2dc\ub4dc\ub41c \uad6c\ud604\uc5d0\uc11c\ub294 \"daily\"\ub97c \uace0\uc815\ub41c \uc808\ub300 \uae30\uac04\uc73c\ub85c \ucc98\ub9ac\ud588\uc2b5\ub2c8\ub2e4:\n\n```python\nelapsed = previous_run.astimezone(timezone.utc) + timedelta(hours=24)\nreturn elapsed.astimezone(previous_run.tzinfo)\n```\n\n\uba3c\uc800 UTC\ub85c \ubcc0\ud658\ud558\uba74 `timedelta(hours=24)`\ub294 \uc815\ud655\ud788 24\uc2dc\uac04\uc758 \uacbd\uacfc \uc2dc\uac04\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uadf8\ub7ec\ub098 IANA \uc2dc\uac04\ub300\uc5d0\uc11c\uc758 \ud604\uc9c0 \ub2ec\ub825 \uc0c1 \ud558\ub8e8\ub294 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc2dc\uc791\uc77c(spring-forward)\uc5d0\ub294 23\uc2dc\uac04, \uc885\ub8cc\uc77c(fall-back)\uc5d0\ub294 25\uc2dc\uac04\uc774\ubbc0\ub85c, \uc77c\uc815\ud55c 24\uc2dc\uac04 \uc624\ud504\uc14b\uc744 \uc801\uc6a9\ud558\uba74 \uc694\uccad\ub41c \uc2e4\uc81c \uc2dc\uac01\uc5d0\uc11c \ud544\uc5f0\uc801\uc73c\ub85c 1\uc2dc\uac04 \ucc28\uc774\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4.\n\n**\uc218\uc815 \ubc29\ubc95** (`scheduler\/time_rules.py`)\n\n\uc77c\uc77c \ubc18\ubcf5\uc740 \ub2ec\ub825 \uaddc\uce59\uc774\ubbc0\ub85c, \uc774\uc81c \uc99d\ubd84 \uac12\uc744 \uc21c\uc218\ud55c \ud604\uc9c0 \uc2e4\uc81c \uc2dc\uac04\uc5d0 \uc801\uc6a9\ud55c \ud6c4, \uadf8 \ub4a4\uc5d0 \uc2dc\uac04\ub300\ub97c \ub2e4\uc2dc \uc5f0\uacb0\ud569\ub2c8\ub2e4:\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\uc774 \ubc29\ubc95\uc774 \uc62c\ubc14\ub978 \uc774\uc720:\n- \ub2e8\uc21c \uac12\uc5d0 \ub300\ud55c \uc2e4\uc81c \uc2dc\uacc4 \uc5f0\uc0b0\uc740 \uc624\ud504\uc14b\uacfc \ubb34\uad00\ud558\ubbc0\ub85c, \uc694\uccad\ub41c \uc2dc:\ubd84\uc740 \uad6c\uc870\uc0c1 \uadf8\ub300\ub85c \uc720\uc9c0\ub429\ub2c8\ub2e4; `zoneinfo`\ub294 \uc0c8\ub85c\uc6b4 \ub0a0\uc9dc\uc5d0 \uc801\uc6a9\ub418\ub294 UTC \uc624\ud504\uc14b\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4(\uac80\uc99d \uacb0\uacfc: \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc2dc\uc791 \ud6c4 `-04:00`, \uc885\ub8cc \ud6c4 `-05:00`, \uac01\uac01 \uc2e4\uc81c \uacbd\uacfc \uc2dc\uac04 23\uc2dc\uac04 \ubc0f 25\uc2dc\uac04).\n- `fold=0`\uc5d0 UTC \uc655\ubcf5 \ucc98\ub9ac\ub97c \ub354\ud558\uba74, \uc21c\uc218\ud55c \uc2e4\uc81c \uc2dc\uac04 \uc5f0\uc0b0\uc73c\ub85c\ub294 \uc815\uc758\ub418\uc9c0 \uc54a\ub294 \ub450 \uac00\uc9c0 \uacbd\uacc4 \uc0ac\ub840\ub97c \ucc98\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. PEP 495\uc5d0 \ub530\ub974\uba74, *\uac74\ub108\ub6f4* \uc2e4\uc81c \uc2dc\uac04 (2024-03-10 02:30)\uc740 `fold=0`\uc77c \ub54c \uc804\ud658 \uc804 \uc624\ud504\uc14b\uc744 \uac00\uc9c0\ubbc0\ub85c, \uc655\ubcf5 \ucc98\ub9ac\ub97c \ud1b5\ud574 \ud2b9\uc815 \uc2dc\uc810\uc744 \uba85\uc2dc\ud558\uc9c0 \uc54a\ub294 datetime\uc744 \ubc18\ud658\ud558\ub294 \ub300\uc2e0 \uc2e4\uc81c \uc2dc\uc810\uc778 03:30 EDT\ub85c \uc815\uaddc\ud654\ub429\ub2c8\ub2e4. *\ubaa8\ud638\ud55c* \uc2e4\uc81c \uc2dc\uac04(2024-11-03 01:30)\uc740 \uc784\uc758\uc801\uc73c\ub85c \ucc98\ub9ac\ub418\ub294 \ub300\uc2e0, \uccab \ubc88\uc9f8 \ubc1c\uc0dd \uc2dc\uc810(EDT)\uc73c\ub85c \uacb0\uc815\ub860\uc801\uc73c\ub85c \ud574\uacb0\ub429\ub2c8\ub2e4.\n- \ub2e8\uc21c\ud55c \uc785\ub825\uc740 \uae30\uc874 \uc758\ubbf8(\ub2e8\uc21c\ud788 +1 \uce98\ub9b0\ub354 \uc77c)\ub97c \uc720\uc9c0\ud569\ub2c8\ub2e4. \ud638\ucd9c\uc790\uc5d0\uac8c \uc0c8\ub85c\uc6b4 `tzinfo` \uc694\uad6c \uc0ac\ud56d\uc774 \ubd80\uacfc\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n\n\ubcc0\uacbd \ubc94\uc704\ub294 \uc881\uac8c \uc720\uc9c0\ub418\uc5c8\uc2b5\ub2c8\ub2e4. `next_daily_run`\uc758 \ubcf8\ubb38\/docstring\ub9cc \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. `service.py`, `models.py`, `repository.py` \ubc0f `__init__.py`\ub294 \ubcc0\uacbd\ub418\uc9c0 \uc54a\uc558\uc73c\uba70, \uc0c8\ub85c\uc6b4 \ud30c\uc77c\ub3c4 \ucd94\uac00\ub418\uc9c0 \uc54a\uc558\uace0, \ud53c\ucc98 \ub9e4\ub2c8\ud398\uc2a4\ud2b8\ub294 \uc5ec\uc804\ud788 \uc815\ud655\ud788 \uc77c\uce58\ud569\ub2c8\ub2e4(\ub204\ub77d\ub418\uac70\ub098 \uc608\uc0c1\uce58 \ubabb\ud55c \ud30c\uc77c\uc774 \uc5c6\uc74c). \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub9cc \uc0ac\uc6a9\ub418\uc5c8\uc2b5\ub2c8\ub2e4(`datetime`, `zoneinfo`, `unittest`).\n\n**\ud68c\uadc0 \ud14c\uc2a4\ud2b8** (`tests\/test_scheduler.py`, \uc0c8\ub85c\uc6b4 `NextDailyRunTests`, 8\uac1c \ud14c\uc2a4\ud2b8)\ub294 \ub2e4\uc74c\uc744 \ub2e4\ub8f9\ub2c8\ub2e4: \ud3c9\uc0c1\uc2dc \uc548\uc815\uc131, \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc2dc\uc791(\uc2dc\uac04 + \uc624\ud504\uc14b + 23\uc2dc\uac04 \uacbd\uacfc), \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc885\ub8cc(\uc2dc\uac04 + \uc624\ud504\uc14b + 25\uc2dc\uac04 \uacbd\uacfc), \uac01 \uc804\ud658 \uc2dc\uc810\uc744 \uc544\uc6b0\ub974\ub294 7\uc77c \ub864, \uac74\ub108\ub6f4 \uc2e4\uc81c \uc2dc\uac04, \ubaa8\ud638\ud55c \uc2e4\uc81c \uc2dc\uac04, \uadf8\ub9ac\uace0 \ub2e8\uc21c \uc785\ub825.\n\n\uae30\ub85d\ud574 \ub458 \ub9cc\ud55c \ub450 \uac00\uc9c0 \uc0ac\ud56d\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uccab\uc9f8, \ucd08\uae30 \uacbd\uacfc \uc2dc\uac04 \uc5b4\uc124\uc158\uc5d0\uc11c\ub294 `following - previous`\ub97c \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. \ud30c\uc774\uc36c\uc740 \uacf5\uc720\ub41c `tzinfo`\ub97c \ubb34\uc2dc\ud558\uace0 \uc21c\uc218 \ubcbd\uc2dc\uacc4\ub97c \ube80 \uac12\uc744 \uacc4\uc0b0\ud558\ubbc0\ub85c, \ub450 \uacbd\uc6b0 \ubaa8\ub450 1\uc77c\uc744 \ubc18\ud658\ud558\uc5ec \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uad6c\ud604\uc740 \uc62c\ubc14\ub790\uace0 \uc5b4\uc124\uc158\uc774 \uc798\ubabb\ub41c \uac83\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \ub450 \ud53c\uc5f0\uc0b0\uc790\ub97c \ubaa8\ub450 UTC\ub85c \ubcc0\ud658\ud558\ub294 `_elapsed` \ud5ec\ud37c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc218\uc815\ud588\uc2b5\ub2c8\ub2e4. \ub458\uc9f8, \uc2dc\ub4dc\ub41c \uad6c\ud604\uccb4\uc758 \uba54\ubaa8\ub9ac \ub0b4 \ubcf5\uc0ac\ubcf8\uc744 \ub300\uc0c1\uc73c\ub85c `NextDailyRunTests`\ub97c \uc7ac\uc2e4\ud589\ud558\uc5ec \ud14c\uc2a4\ud2b8\uac00 \uc2e4\uc81c\ub85c \uc6d0\ub798 \uacb0\ud568\uc744 \ud3ec\ucc29\ud558\ub294\uc9c0 \ud655\uc778\ud588\uc2b5\ub2c8\ub2e4. 8\uac1c \uc911 5\uac1c\uac00 \uc2e4\ud328\ud588\uc73c\uba70, \uc5ec\uae30\uc5d0\ub294 \ub450 \uac00\uc9c0 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04(DST) \ud14c\uc2a4\ud2b8\ub3c4 \ud3ec\ud568\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ubc84\uadf8\uac00 \uc788\ub294 \ubc84\uc804\uc5d0\uc11c \ud1b5\uacfc\ud55c \uc138 \uac00\uc9c0 \uc0ac\ub840(\ud3c9\uc77c, \uac74\ub108\ub700, \ubaa8\ud638\ud55c \uacbd\uc6b0)\ub294 \ud68c\uadc0 \uacb0\ud568\uc744 \ud3ec\ucc29\ud558\uae30\ubcf4\ub2e4\ub294 \ub3d9\uc791\uc744 \ubb38\uc11c\ud654\ud558\ub294 \uac83\uc5d0 \uac00\uae5d\uc2b5\ub2c8\ub2e4. \uac74\ub108\ub700\/\ubaa8\ud638\ud55c \uc0ac\ub840\uac00 \uc6b0\uc5f0\ud788 \uc77c\uce58\ud558\ub294 \uc774\uc720\ub294 +24\uc2dc\uac04\uc758 \uc808\ub300\uc801 \uc2dc\ud504\ud2b8\uac00 \uc6b0\uc5f0\ud788 \ub3d9\uc77c\ud55c \uc815\uaddc\ud654\ub41c \uc21c\uac04\uc5d0 \ud574\ub2f9\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">Fixture\uc758 \uc81c\ud55c \uc0ac\ud56d: \uc774\ub294 \uc18c\uaddc\ubaa8\uc758 \uc624\ud504\ub77c\uc778 Python \uc800\uc7a5\uc18c\uc600\uc2b5\ub2c8\ub2e4. Claude\ub294 CLI OAuth\uac00 \ub9cc\ub8cc\ub41c \ud6c4 \uc11c\ube0c\uc5d0\uc774\uc804\ud2b8 \ub300\uccb4 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud588\uae30 \ub54c\ubb38\uc5d0, \uaca9\ub9ac \uc0c1\ud0dc\uc640 \ud1a0\ud070 \uac00\uc2dc\uc131\uc774 \ub3d9\uc77c\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.<\/p><\/article>\n\n\n\n<h2 id=\"code-review\" class=\"wp-block-heading\">\ucf54\ub4dc \uac80\ud1a0 \ud488\uc9c8 \ubc0f \uc218\ub3d9 \uac80\uc99d<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ucf54\ub4dc \uac80\ud1a0 \uc791\uc5c5\uc740 \uae30\ub2a5 \uad6c\ud604\uacfc\ub294 \ub2e4\ub978 \uae30\uc220\uc744 \uc694\uad6c\ud569\ub2c8\ub2e4. \uc720\ub2a5\ud55c \uac80\ud1a0\uc790\ub294 \uc7ac\ud604 \uac00\ub2a5\ud55c \ubb38\uc81c\ub97c \ucc3e\uc544\ub0b4\uace0, \uadf8 \uc601\ud5a5\ub3c4\ub97c \ud3c9\uac00\ud558\uba70, \uc815\ud655\ud55c \ucf54\ub4dc \uacbd\ub85c\ub97c \uc81c\uc2dc\ud558\uace0, \uc2e4\uc81c \uacb0\ud568\uacfc \ucd94\uce21\uc5d0 \uae30\ubc18\ud55c \uacbd\uace0\ub97c \uad6c\ubd84\ud574\uc57c \ud569\ub2c8\ub2e4. \ubb38\uc81c\ub97c \uc218\uc815\ud560 \ub54c\ub294 \ub610 \ub2e4\ub978 \ud14c\uc2a4\ud2b8\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ud328\uce58\ub85c \uc778\ud574 \uc0c8\ub85c\uc6b4 \ud68c\uadc0 \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Claude Code\ub294 T4\uc5d0\uc11c \uac00\uc7a5 \ub69c\ub837\ud55c \uc6b0\uc704\ub97c \ubcf4\uc600\uc2b5\ub2c8\ub2e4. \uc774 \ud300\uc740 \ubbf8\ub9ac \uc124\uc815\ub41c \uac80\ud1a0 \ub300\uc0c1 \ub450 \uac00\uc9c0\ub97c \ud3ec\ud568\ud574 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc7ac\ud604 \uac00\ub2a5\ud55c 5\uac00\uc9c0 \ubc1c\uacac \uc0ac\ud56d\uc744 \ubcf4\uace0\ud588\uc73c\uba70, 20\uc810 \ub9cc\uc810\uc5d0 19\uc810\uc744 \ud68d\ub4dd\ud588\uc2b5\ub2c8\ub2e4. Codex\ub294 \uc720\ud6a8\ud55c \uace0\uc704\ud5d8 \uacb0\ud568 \ub450 \uac00\uc9c0\ub97c \ubcf4\uace0\ud558\uace0 \uc218\uc815\ud588\uc73c\ub098, \ubbf8\ub9ac \uc124\uc815\ub41c \ub450 \uac00\uc9c0 \uacb0\ud568\uc5d0 \ub300\ud574\uc11c\ub294 \uc5b8\uae09\ud558\uc9c0 \uc54a\uc544 20\uc810 \ub9cc\uc810\uc5d0 18\uc810\uc744 \ud68d\ub4dd\ud588\uc2b5\ub2c8\ub2e4. Codex\uc758 \ubc1c\uacac \uc0ac\ud56d\uc740 \uc624\ud0d0\uc774 \uc544\ub2c8\uc5c8\uc73c\uba70, \uad00\ucc30\ub41c \ucc28\uc774\ub294 \uae30\ubcf8\uc801\uc778 \uc815\ud655\uc131\ubcf4\ub2e4\ub294 \uac80\ud1a0 \ubc94\uc704\uc758 \ud3ed\uc5d0 \uae30\uc778\ud55c \uac83\uc774\uc5c8\uc2b5\ub2c8\ub2e4.<\/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 \uc81c\uc5b4\ub41c \uc800\uc7a5\uc18c \ud14c\uc2a4\ud2b8<\/p><h3 class=\"d-title\">\uc7ac\ud604 \uac00\ub2a5\ud55c \uacb0\ud568\uc744 \ucc3e\uc544\ub0b4\uace0, \uc2e0\ub8b0\ub3c4\uac00 \uac00\uc7a5 \ub192\uc740 \ubb38\uc81c\ub97c \uc218\uc815\ud558\uc2ed\uc2dc\uc624<\/h3><p class=\"d-sub\">\ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub97c \uac80\ud1a0\ud558\uace0, \uc2e4\uc81c \uacb0\ud568\uc744 \uc7ac\ud604\ud558\uba70, \ud5c8\uc6a9\ub41c \uc218\uc815 \uc0ac\ud56d\uc744 \uc801\uc6a9\ud55c \ud6c4, \ud68c\uadc0 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 \ud574\ub2f9 \ub3d9\uc791\uc774 \uc81c\ub300\ub85c \ubc18\uc601\ub418\uc5c8\uc74c\uc744 \uc785\uc99d\ud558\uc2ed\uc2dc\uc624.<\/p><\/div><span class=\"d-pill\">Claude \ucee4\ubc84\ub9ac\uc9c0 \uacbd\uacc4<\/span><\/header><div class=\"d-grid\"><section class=\"d-side\" aria-label=\"\ucf54\ub371\uc2a4 \uacb0\uacfc\"><div class=\"d-product\"><span>\ucf54\ub371\uc2a4<\/span><span class=\"d-score\">18<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\uae30\uac04<\/span><strong>223\ucd08<\/strong><\/div><div class=\"d-metric\"><span>\uc218\ud45c<\/span><strong>4\uba85 \ud569\uaca9<\/strong><\/div><div class=\"d-metric\"><span>\ubc94\uc704<\/span><strong>2\uac1c \uc218\uc815\ub428<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825 \ubc1c\ucdcc\ubb38<\/div><pre>1. \ub192\uc74c \u2014 \uae30\uc874 \uc791\uc5c5\uc774 \uac10\uc9c0\ub418\uc9c0 \uc54a\uc740 \ucc44 \ub36e\uc5b4\uc4f0\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n2. \uc911\uac04 \u2014 \uc77c\uc77c \uc2e4\ud589 \uc77c\uc815\uc774 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc804\ud658 \uc2dc\uae30\uc5d0 \ub530\ub77c \uc5b4\uae0b\ub0ac\uc2b5\ub2c8\ub2e4.\n\n\uac80\uc99d \uacb0\uacfc: \ud14c\uc2a4\ud2b8 4\uac1c \ud1b5\uacfc, \uc2e4\ud328 0\uac1c.<\/pre><\/div><p class=\"d-take\"><strong>\ub9ac\ubdf0\uc5b4\uc758 \uc758\uacac:<\/strong> \uc911\uc694\ub3c4\uac00 \ub192\uc740 \uc720\uc6a9\ud55c \ubb38\uc81c\uc810\ub4e4\uc774 \ubc1c\uacac\ub418\uc5c8\uace0 \uc9d1\uc911\uc801\uc778 \uc218\uc815 \uc791\uc5c5\uc774 \uc774\ub8e8\uc5b4\uc84c\uc73c\ub098, \ub450 \uac00\uc9c0 \uc6b0\uc120 \uac80\ud1a0 \ub300\uc0c1\uc740 \ub193\ucce4\uc2b5\ub2c8\ub2e4.<\/p><\/section><section class=\"d-side\" aria-label=\"Claude \ucf54\ub4dc \uacb0\uacfc\"><div class=\"d-product\"><span>\ud074\ub85c\ub4dc \ucf54\ub4dc<\/span><span class=\"d-score\">19<small>\/20<\/small><\/span><\/div><div class=\"d-metrics\"><div class=\"d-metric\"><span>\uae30\uac04<\/span><strong>235\ucd08<\/strong><\/div><div class=\"d-metric\"><span>\uc218\ud45c<\/span><strong>9\uba85 \ud569\uaca9<\/strong><\/div><div class=\"d-metric\"><span>\ubc94\uc704<\/span><strong>5\uac74 \ubcf4\uace0\ub428<\/strong><\/div><\/div><div class=\"d-preview\"><div class=\"d-preview-label\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825 \ubc1c\ucdcc\ubb38<\/div><pre>D1 DST \ub4dc\ub9ac\ud504\ud2b8 \u00b7 \ub192\uc74c\nD2 \ub2e8\uc21c \uc2dc\uac04\ub300 \ud68d\ub4dd \u00b7 \uc911\uac04\nD3 \uc2dd\ubcc4\uc790 \ucda9\ub3cc \u00b7 \ub192\uc74c\nD4 \uc0ad\uc81c \ub204\ub77d \uc2dc KeyError \ubc1c\uc0dd \u00b7 \uc911\uac04\nD5 \uc18c\uc720\uc790 \uc720\ud6a8\uc131 \uac80\uc0ac \ubbf8\uc2e4\uc2dc \u00b7 \ub0ae\uc74c<\/pre><\/div><p class=\"d-take\"><strong>\ub9ac\ubdf0\uc5b4\uc758 \uc758\uacac:<\/strong> \uc7ac\ud604\ub41c \uc624\ud0d0\uc774 \uc804\ud600 \uc5c6\ub294, \ub354 \uad11\ubc94\uc704\ud55c \uac80\ud1a0 \ubc94\uc704; \uacc4\uc57d\uc5d0 \ub530\ub978 \ub450 \uac00\uc9c0 \ubc1c\uacac \uc0ac\ud56d\uc740 \uc218\uc815\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.<\/p><\/section><\/div><div class=\"d-fulls\"><details class=\"d-full\"><summary>Codex \ucd9c\ub825 \uacb0\uacfc \uc804\uccb4 \ubcf4\uae30<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\uc644\uc804\ud558\uac8c \uc815\uc81c\ub41c \uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825<\/p><pre>## \uc870\uce58 \ud544\uc694 \uc0ac\ud56d\n\n1. **\ub192\uc74c \u2014 \uae30\uc874 \uc791\uc5c5\uc774 \uc0ac\uc6a9\uc790 \ubaa8\ub974\uac8c \ub36e\uc5b4\uc4f0\uc77c \uc218 \uc788\uc74c**\n\n   - \uadfc\uac70: [service.py](.\/scheduler\/service.py:8)\uc758 \uc2dd\ubcc4\uc790 \ucd08\uae30\ud654\uc640 [repository.py](.\/scheduler\/repository.py:9)\uc758 \uc0ac\uc804 \ub300\uccb4\uac00 \uacb0\ud569\ub41c \uacbd\uc6b0.\n   - \uc601\ud5a5: \uae30\uc874 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uac00 \uc788\ub294 \uc0c1\ud0dc\uc5d0\uc11c \uc11c\ube44\uc2a4\ub97c \uc0dd\uc131\ud558\uba74 \uc2dd\ubcc4\uc790 `1`\uc774 \uc7ac\uc0ac\uc6a9\ub418\uc5b4 \uc800\uc7a5\ub41c \uc791\uc5c5\uc774 \ub300\uccb4\ub418\uace0 \ub370\uc774\ud130 \uc190\uc2e4\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n   - \ucd5c\uc18c \uc7ac\ud604 \ubc29\ubc95: `Job(1, ...)`\uc744 \uc800\uc7a5\ud558\uace0, `SchedulerService(repository)`\ub97c \uc0dd\uc131\ud55c \ub2e4\uc74c, \ub2e4\ub978 \uc791\uc5c5\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \uc218\uc815 \uc804\uc5d0\ub294 \uc0c8\ub85c\uc6b4 \uc791\uc5c5\ub9cc \ub0a8\uc544 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.\n   - \uc218\uc815: \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc5d0 \uc874\uc7ac\ud558\ub294 \uac00\uc7a5 \ub192\uc740 \uc2dd\ubcc4\uc790\ubd80\ud130 \ub2e4\uc74c \uc2dd\ubcc4\uc790\ub97c \ucd08\uae30\ud654\ud569\ub2c8\ub2e4.\n   - \ud68c\uadc0 \ud14c\uc2a4\ud2b8: [test_scheduler.py](.\/tests\/test_scheduler.py:22).\n\n2. **\uc911\uac04 \u2014 \uc77c\uc77c \uc2e4\ud589 \uc77c\uc815\uc774 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc804\ud658 \uc2dc\uc810\uc5d0 \uc5b4\uae0b\ub0a8**\n\n   - \uc99d\uac70: [time_rules.py](.\/scheduler\/time_rules.py:4)\uc5d0\uc11c \uacc4\uc0b0 \ubc29\uc2dd \uc218\uc815.\n   - \uc601\ud5a5: 09:00\uc5d0 \uc608\uc57d\ub41c \uc77c\uc77c \uc791\uc5c5\uc774 \ubd04 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c \uc804\ud658 \ud6c4 10:00\uc5d0 \uc2e4\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n   - \ucd5c\uc18c \uc7ac\ud604 \uc870\uac74: `2026-03-07 09:00 America\/New_York` \uc774\ud6c4\uc758 \ub2e4\uc74c \uc2e4\ud589 \uc2dc\uac04\uc744 \uacc4\uc0b0\ud574 \ubcf4\uc138\uc694. \uc218\uc815 \uc804 \uacb0\uacfc\ub294 `2026-03-08 10:00`\uc774\uc5c8\uc2b5\ub2c8\ub2e4.\n   - \uc218\uc815 \uc0ac\ud56d: \uacbd\uacfc\ud55c UTC \uc2dc\uac04 24\uc2dc\uac04 \ub300\uc2e0 \ud604\uc9c0 \ub2ec\ub825 \uc0c1\uc758 \ud558\ub8e8\ub97c \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4.\n   - \ud68c\uadc0 \ud14c\uc2a4\ud2b8: [test_scheduler.py](.\/tests\/test_scheduler.py:33).\n\n## \ubcc0\uacbd\ub41c \ud30c\uc77c\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## \uac80\uc99d\n\n- \uc218\uc815 \uc804 \ub450 \ud68c\uadc0 \ud14c\uc2a4\ud2b8 \ubaa8\ub450 \uc2e4\ud328\ud55c \uac83\uc73c\ub85c \ud655\uc778\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n- \uac01 \ud14c\uc2a4\ud2b8\ub294 \ud574\ub2f9 \uc218\uc815 \ud6c4 \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4.\n- `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -v`\n- \uacb0\uacfc: **4\uac1c \ud14c\uc2a4\ud2b8 \ud1b5\uacfc, 0\uac1c \uc2e4\ud328**.\n- \uc0dd\uc131\ub41c Python \uce90\uc2dc \uc544\ud2f0\ud329\ud2b8\ub294 \ub0a8\uc544 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n\n## \uacb0\ub860 \ubc0f \uacb0\uc815\n\n- **\uacb0\ub860:** \ud655\uc778\ub41c \ub450 \uacb0\ud568 \ubaa8\ub450 \uc218\uc815\ub418\uc5c8\uc73c\uba70, \uc9d1\uc911\uc801\uc778 \ud68c\uadc0 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\ud574 \uac80\uc99d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n- **\ud544\uc694\ud55c \uacb0\uc815:** \uc5c6\uc74c.<\/pre><\/div><\/details><details class=\"d-full\"><summary>Claude \ucf54\ub4dc \ucd9c\ub825 \uc804\uccb4 \ubcf4\uae30<\/summary><div class=\"d-full-pane\"><p class=\"d-full-note\">\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \ucd9c\ub825\uc744 \uadf8\ub300\ub85c \ud3ec\ud568\ud558\ub294 \uc644\uc804\ud55c \ud578\ub4dc\uc624\ud504 \uae30\ub85d<\/p><pre># T4 \uc2e4\ud589 \uae30\ub85d \u2014 \ud14c\uc2a4\ud2b8 \ubc0f \ucf54\ub4dc \uac80\ud1a0\n\n## \uc2e4\ud589 \ub9e4\uac1c\ubcc0\uc218\n\n| \ud544\ub4dc | \uac12 |\n| --- | --- |\n| \uc791\uc5c5 | `T4` |\n| \uace0\uc815 \ud504\ub86c\ud504\ud2b8 | `01-prompts\/T4.md` |\n| \uace0\uc815 \ud504\ub86c\ud504\ud2b8 SHA-256 | `5e69546007ea776f40b3d334ddb75671ff684c151c77551bad27de3b0fdce640` |\n| \uc2e4\ud589 \ub2e8\uc704 | \uaca9\ub9ac\ub41c Claude \uc11c\ube0c\uc5d0\uc774\uc804\ud2b8, `\uc77c\ubc18 \ubaa9\uc801`, \uc0c8\ub85c\uc6b4 \ucee8\ud14d\uc2a4\ud2b8 |\n| \uaca9\ub9ac \ubc29\ubc95 | **\uc11c\ube0c\uc5d0\uc774\uc804\ud2b8 \ud3f4\ubc31** (\ubb38\uc11c\ud654\ub41c \ub2e4\uc6b4\uadf8\ub808\uc774\ub4dc \u2014 `results\/isolation-decision.md` \ucc38\uc870) |\n| \ud560\ub2f9\ub41c \uae68\ub057\ud55c \uc0ac\ubcf8 | `runtime\/workspaces\/T4` |\n| Claude \ucf54\ub4dc \ubc84\uc804 | `2.1.220` |\n| \ubaa8\ub378 \uc124\uc815 | `claude-opus-5` |\n| start_utc | `2026-07-28T10:28:22Z` |\n| end_utc | `2026-07-28T10:32:17Z` |\n| \uc18c\uc694 \uc2dc\uac04 | 235\ucd08 (T1\u2013T3\uc640 \ub3d9\uc2dc \uc2e4\ud589; \uc815\ud655\ud55c \uc9c0\uc5f0 \uc2dc\uac04 \uce21\uc815\uac12 \uc544\ub2d8) |\n| \uc2dc\ub3c4 \ud69f\uc218 | 1 |\n| \uc0c1\ud0dc | `\uc720\ud6a8` |\n| \uc218\ub3d9 \uac1c\uc785 | \uc5c6\uc74c |\n\n\ub3d9\uacb0\ub41c \ud504\ub86c\ud504\ud2b8\uc5d0 \ud3ec\ud568\ub41c \uc870\uac74\ubb38 \u2014 \"\ub3d9\uacb0\ub41c \uc2e4\ud589 \uad6c\uc131\uc774 \uc218\uc815\uc744 \ud5c8\uc6a9\ud558\ub294 \uacbd\uc6b0\n\uc218\uc815\ud558\ub77c\" \u2014 \ub294 \ucf54\ub514\ub124\uc774\ud130\uac00 `00-control\/run-config.json` \ubc0f\n`00-control\/safety-policy.json`\uc5d0\uc11c \ucf54\ub514\ub124\uc774\ud130\uc5d0 \uc758\ud574 \ud574\uacb0\ub418\uc5c8\uc73c\uba70, \uc774 \uc124\uc815\ub4e4\uc740 \uaca9\ub9ac\ub41c \ud53c\ucc98 \uc0ac\ubcf8 \uc791\uc131\uc744 \ud5c8\uc6a9\ud569\ub2c8\ub2e4. \ub7ec\ub108\uc5d0\uac8c\ub294\n\uc218\uc815 \uc791\uc5c5\uc774 \ud5c8\uc6a9\ub41c\ub2e4\ub294 \uc9c0\uc2dc\uac00 \uc804\ub2ec\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub7ec\ub108\uc5d0\uac8c\ub294 \uc5b4\ub5a0\ud55c \uc81c\uc5b4 \ud30c\uc77c\ub3c4 \ud45c\uc2dc\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\n\n## \uc548\uc804\ud55c \ub3c4\uad6c \uc694\uc57d\n\n`date`, \ud560\ub2f9\ub41c \uc791\uc5c5 \uacf5\uac04 \ub0b4\uc5d0\uc11c\uc758 `Read`\/`Edit`\/`Write`\ub9cc \ud5c8\uc6a9, `grep`,\n`python3 -m unittest discover`, `python3 -m compileall`, \uc2a4\ud06c\ub798\uce58 \uc0ac\ubcf8\uc744 \uc0ac\uc6a9\ud55c \ube48 \uc2e4\ud589,\n\ub9e4\ub2c8\ud398\uc2a4\ud2b8 \uc874\uc7ac \uc5ec\ubd80 \ud655\uc778. \ub124\ud2b8\uc6cc\ud06c \uc5c6\uc74c, \uc124\uce58 \uc5c6\uc74c, \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub9cc \uc0ac\uc6a9.\n\n## \ubcc0\uacbd\ub41c \ud30c\uc77c\n\n`scheduler\/time_rules.py` (\uc218\uc815\ub428), `scheduler\/service.py` (\uc218\uc815\ub428),\n`tests\/test_scheduler.py` (\uc218\uc815\ub428, \ud14c\uc2a4\ud2b8 2\uac1c \ucd94\uac00), `tests\/test_time_rules.py` (\ucd94\uac00\ub428, \ud14c\uc2a4\ud2b8 5\uac1c).\n\uc804\uccb4 \ud328\uce58: `results\/T4\/patch.diff`.\n\n## \uc624\ud504\ub77c\uc778 \uac80\uc0ac \uacb0\uacfc\n\n\ud0dc\uc2a4\ud06c \uc2e4\ud589\uae30\uac00 \ubcf4\uace0\ud55c \ub0b4\uc6a9:\n\n| \uac80\uc0ac | \uacb0\uacfc |\n| --- | --- |\n| `python3 -m unittest discover -s tests -v` | **9\uac1c \ud1b5\uacfc, 0\uac1c \uc2e4\ud328, 0\uac1c \uac74\ub108\ub700** (\uae30\uc900 2) |\n| `python3 -m compileall -q scheduler tests` | \ud1b5\uacfc |\n| `expected_files` \ub300\ube44 \ub9e4\ub2c8\ud398\uc2a4\ud2b8 \uc874\uc7ac \uc5ec\ubd80 \ud655\uc778 | 8\uac1c \ubaa8\ub450 \uc874\uc7ac |\n| \ubcf5\uc6d0\ub41c \uc6d0\ub798 \uad6c\ud604\uc5d0 \ub300\ud55c vacuity \uc2e4\ud589 | 5\uac1c \uc2e4\ud328, 4\uac1c \ud1b5\uacfc, \uc608\uc0c1\ub300\ub85c |\n\n\uc6cc\ud06c\uc2a4\ud398\uc774\uc2a4 \uc678\ubd80\uc5d0\uc11c \ucf54\ub514\ub124\uc774\ud130\uac00 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc7ac\ud655\uc778\ud55c \uacb0\uacfc:\n\n| \ud655\uc778 \ud56d\ubaa9 | \uc885\ub8cc \uc0c1\ud0dc | \uacb0\uacfc |\n| --- | --- | --- |\n| \uacf5\uac1c \ud14c\uc2a4\ud2b8 \ubaa8\uc74c (`results\/checks\/T4-public.txt`) | 0 | \ud14c\uc2a4\ud2b8 9\uac1c, \uc815\uc0c1 |\n\n\uc810\uc218 \uc0b0\uc815 \ub300\uc0c1\uc774 \uc544\ub2cc \ucc38\uace0\uc6a9 \uad50\ucc28 \ud655\uc778: T3 \uc228\uaca8\uc9c4 \uac80\uc99d\uae30\ub3c4 \uc774\n\uc6cc\ud06c\uc2a4\ud398\uc774\uc2a4\uc5d0\uc11c \ud1b5\uacfc\ud569\ub2c8\ub2e4(\uc885\ub8cc \ucf54\ub4dc 0). \uc774\ub294 T4\uac00 \ub3d9\uc77c\ud55c `next_daily_run` \uacb0\ud568\uc744 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc218\uc815\ud588\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.\n`results\/checks\/validator-controls.md`\ub97c \ucc38\uc870\ud558\uc2ed\uc2dc\uc624.\n\n## \uace8\ub4dc\ub9f5 \uacb0\ud568 \ucee4\ubc84\ub9ac\uc9c0\n\n`03-checks\/gold-map.json`\uc740 T4 \uc810\uc218 \uc0b0\uc815\uc744 \uc704\ud574 \ub450 \uac1c\uc758 \uacb0\ud568\uc744 \uc2dc\ub4dc\ud569\ub2c8\ub2e4. \ub450 \uacb0\ud568 \ubaa8\ub450 \ubc1c\uacac\ub418\uc5c8\uc2b5\ub2c8\ub2e4:\n\n| \uc2dc\ub4dc\ub41c \uacb0\ud568 | \ubc1c\uacac\ub428 | \ubcf4\uace0\ub428 |\n| --- | --- | --- |\n| \uc18c\uc720\uc790 \ubbf8\uc9c0\uc815(blank owner) \ud5c8\uc6a9 | \uc608 | **D5**, `scheduler\/service.py:11,13`, \uc2ec\uac01\ub3c4 \ub0ae\uc74c(Low), \ubcf4\uace0\ub428 \ubc0f \uc758\ub3c4\uc801\uc73c\ub85c \uc218\uc815\ub418\uc9c0 \uc54a\uc74c |\n| \ub204\ub77d\ub41c \uc2dd\ubcc4\uc790 \uc0ad\uc81c \uc2dc `KeyError` \ubc1c\uc0dd | \uc608 | **D4**, `scheduler\/repository.py:19` \u2192 `service.py:22`, \uc2ec\uac01\ub3c4 Medium, \ubcf4\uace0\ub418\uc5c8\uc73c\ub098 \uc758\ub3c4\uc801\uc73c\ub85c \uc218\uc815\ub418\uc9c0 \uc54a\uc74c |\n\n\uc124\uc815\ub41c \uacb0\ud568 \uc138\ud2b8 \uc678\uc5d0\ub3c4 \uc138 \uac74\uc758 \ucd94\uac00 \uacb0\ud568\uc774 \ubcf4\uace0\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc624\ud0d0\uc740 \uc5c6\uc2b5\ub2c8\ub2e4:\n\n- **D1** \u2014 `next_daily_run`\uc758 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04(DST) \ud3b8\ucc28. \uc774\ub294\n  `03-checks\/seeded-defects.md`\uc5d0 \ub098\uc5f4\ub41c \uc138 \ubc88\uc9f8 \uacb0\ud568\uc785\ub2c8\ub2e4(T4\uac00 \uc544\ub2cc T3\ub85c \ud3c9\uac00\ub418\uc5c8\uc73c\ub098, \uc2e4\uc81c \uc2dc\ub4dc\ub41c \ubc84\uadf8\uc785\ub2c8\ub2e4).\n- **D2** \u2014 `next_daily_run`\uc5d0 \uc804\ub2ec\ub41c \ub2e8\uc21c \uc785\ub825\uac12\uc774 \ud638\uc2a4\ud2b8\uc758 \uc2dc\uac04\ub300\ub97c \uc790\ub3d9\uc73c\ub85c \ubc18\uc601\ud558\uc5ec\n  \uc2dc\uac04\ub300\ub97c \uace0\ub824\ud55c datetime \uac12\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc2e4\uc81c \ubb38\uc81c\uc774\uba70 \ud638\uc2a4\ud2b8\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9d1\ub2c8\ub2e4. \ucf54\ub514\ub124\uc774\ud130\uac00 \ud53c\ucc98 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \ub300\uc870\ud558\uc5ec \ud655\uc778\ud588\uc2b5\ub2c8\ub2e4.\n- **D3** \u2014 \uc11c\ube44\uc2a4\uc640 \uc8fc\uc785\ub418\uac70\ub098 \uacf5\uc720\ub41c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uac04\uc758 \uc2dd\ubcc4\uc790 \ucda9\ub3cc\ub85c \uc778\ud574\n  \uc54c \uc218 \uc5c6\ub294 \ub36e\uc5b4\uc4f0\uae30\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4. \uc2e4\uc81c: `SchedulerService._next_identifier`\ub294 \ud56d\uc0c1 1\ubd80\ud130 \uc2dc\uc791\ud558\uc9c0\ub9cc\n  `JobRepository.save`\ub294 \ubcf4\ud638\ub418\uc9c0 \uc54a\uc740 \ub515\uc154\ub108\ub9ac \ud560\ub2f9\uc785\ub2c8\ub2e4. T1\uc740 \uc6d0\ubcf8 \ud53c\ucc98\uc5d0\uc11c \ub3d9\uc77c\ud55c\n  \ucde8\uc57d\uc810\uc744 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc2dd\ubcc4\ud588\uc2b5\ub2c8\ub2e4.\n\n\uc624\ud0d0\uc9c0 \uc218: **0**. \ub7ec\ub108\ub294 \ub610\ud55c \ud53c\ucc98\uc5d0 \ub124\ud2b8\uc6cc\ud06c, I\/O, \uc5ed\uc9c1\ub82c\ud654, \ud558\uc704 \ud504\ub85c\uc138\uc2a4 \ub610\ub294 \uc790\uaca9 \uc99d\uba85 \ub178\ucd9c\uc774\n\uc5c6\uc74c\uc744 \uc9c0\uc801\ud558\uba70 \ubcf4\uc548 \ubc1c\uacac \uc0ac\ud56d\uc774 \uc5c6\uc74c\uc744 \uc62c\ubc14\ub974\uac8c \ubcf4\uace0\ud588\uc2b5\ub2c8\ub2e4.\n\n## \uae30\ub85d\ud560 \uac00\uce58\uac00 \uc788\ub294 \ud3b8\ucc28\n\n\uace0\uc815\ub41c \ud504\ub86c\ud504\ud2b8\ub294 \"\uc2e0\ub8b0\ub3c4\uac00 \uac00\uc7a5 \ub192\uc740 \ub450 \uac00\uc9c0 \uacb0\ud568\"\uc5d0 \ub300\ud55c \ud14c\uc2a4\ud2b8\uc640 \uc218\uc815 \uc0ac\ud56d\uc744 \uc694\uccad\ud588\uc2b5\ub2c8\ub2e4.\n\ub7ec\ub108\ub294 \uace8\ub4dc \ub9f5\uc5d0 \ubbf8\ub9ac \uc124\uc815\ub41c \ub450 \uacb0\ud568\uc778 D4\uc640 D5 \ub300\uc2e0 D1\/D2(\ud558\ub098\uc758 \uc218\uc815, \ub3d9\uc77c\ud55c \ud568\uc218)\uc640 D3\ub97c \uc120\ud0dd\ud588\uc2b5\ub2c8\ub2e4. \uadf8\uac00 \ubc1d\ud78c \uc774\uc720\ub294 \ud0c0\ub2f9\ud569\ub2c8\ub2e4. D4\uc640 D5\ub294 \ubaa8\ub450 \uba85\uc2dc\ub418\uc9c0 \uc54a\uc740 API\n\uacc4\uc57d\uc5d0 \uc758\uc874\ud558\ubbc0\ub85c, \uc774\ub97c \uc218\uc815\ud558\ub294 \uac83\uc740 \ucd94\uce21\uc5d0 \ubd88\uacfc\ud560 \uac83\uc785\ub2c8\ub2e4. \ud0d0\uc9c0 \ud06c\ub808\ub527\uc5d0\ub294 \uc601\ud5a5\uc744 \ubbf8\uce58\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub450 \uc2dc\ub4dc \uacb0\ud568 \ubaa8\ub450\n\ud30c\uc77c, \uc904 \ubc88\ud638, \uc2ec\uac01\ub3c4, \uc601\ud5a5\ub3c4 \ubc0f \uc7ac\ud604 \uc815\ubcf4\ub97c \ud3ec\ud568\ud558\uc5ec \ubc1c\uacac\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc801\uc6a9\ub41c \uc218\uc815 \uc0ac\ud56d\uc740 \uc2e4\uc81c\n\uacb0\ud568\uc5d0 \ub300\ud55c \uac83\uc774\uba70, \uacf5\ubc31 \uac80\uc0ac\ub97c \ud1b5\ud574 \uadf8 \ud0c0\ub2f9\uc131\uc774 \uc785\uc99d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n## \uc815\uc81c\ub41c \uc624\ub958\n\n`tzinfo`\ub97c \uacf5\uc720\ud558\ub294 \ub0a0\uc9dc\/\uc2dc\uac04\uc5d0 \ub300\ud574 \uc2e4\uc81c \uc2dc\uac04(wall-clock)\uacfc \uc808\ub300 \uc2dc\uac04(absolute-time)\uc744 \ube80 \uacb0\uacfc \ubc1c\uc0dd\ud55c \ub450 \uac74\uc758 \uc790\uccb4 \uc720\ubc1c \ud14c\uc2a4\ud2b8 \uc2e4\ud328\uac00 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.\n\uc774\ub97c \uc218\uc815\ud558\uace0 \uc7ac\uac80\uc99d\ud588\uc2b5\ub2c8\ub2e4. \ub3c4\uad6c \ub610\ub294 \ud658\uacbd \uc624\ub958\ub294 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4. \uc2e4\ud589 \ud6c4 `__pycache__`\n\uc794\uc5ec\ubb3c\uc774 \uc81c\uac70\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n## \ud45c\uc2dc\ub41c \ucd9c\ub825 (\uc6d0\ubb38 \uadf8\ub300\ub85c)\n\n### \uacb0\ud568 \ubcf4\uace0\uc11c\n\n**D1 \u2014 `scheduler\/time_rules.py:10-11` \u2014 \uc77c\uc77c \uc2a4\ucf00\uc904\uc774 \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c(DST) \uc801\uc6a9 \uc2dc 1\uc2dc\uac04\uc529 \uc5b4\uae0b\ub0a8 \u2014 \uc2ec\uac01\ub3c4: \ub192\uc74c**\n\n`next_daily_run`\uc740 \ub2ec\ub825 \ub0a0\uc9dc\ub97c \uc55e\ub2f9\uae30\ub294 \ub300\uc2e0 UTC \uc655\ubcf5 \uc2dc\uac04\uc744 \ud1b5\ud574 24\uc2dc\uac04\uc758 *\uacbd\uacfc* \uc2dc\uac04\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4. \uc77c\uc77c \uc791\uc5c5\uc740 \uc2e4\uc81c \uc2dc\uacc4 \uc2dc\uac04\uc73c\ub85c \uc815\uc758\ub418\ubbc0\ub85c, \uc77c\uad11 \uc808\uc57d \uc2dc\uac04\uc81c\ub97c \uc801\uc6a9\ud558\ub294 \uc2dc\uac04\ub300\uc5d0\uc11c\ub294 \uc804\ud658\uc77c \uc774\ud6c4\ubd80\ud130 \ubaa8\ub4e0 \uc791\uc5c5\uc774 1\uc2dc\uac04 \uc77c\ucc0d \ub610\ub294 \ub2a6\uac8c \ubb34\uc74c\uc73c\ub85c \uc2e4\ud589\ub418\uba70, \uc774 \uc624\ub958\ub294 \uc9c0\uc18d\ub429\ub2c8\ub2e4(\uac01 \uc2e4\ud589 \uc2dc \uc774\ub3d9\ub41c \uc2dc\uac04\uc744 \uae30\uc900\uc73c\ub85c \uc7ac\uc124\uc815\ub428). \ubb38\uc11c \ubb38\uc790\uc5f4 \uc790\uccb4\uc5d0\uc11c\ub3c4 \uc774\ub7ec\ud55c \ub3d9\uc791\uc744 \uc778\uc815\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.\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, \uc608\uc0c1\uac12 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, \uc608\uc0c1 09:00-05:00\n```\n\n**D2 \u2014 `scheduler\/time_rules.py:10-11` \u2014 \ub2e8\uc21c \uc785\ub825\uac12\uc740 \uc2dc\uc2a4\ud15c\uc758 \ub85c\uceec \uc2dc\uac04\ub300\ub97c \uc790\ub3d9\uc73c\ub85c \uc801\uc6a9\ud569\ub2c8\ub2e4 \u2014 \uc2ec\uac01\ub3c4: \uc911\uac04**\n\n\ub3d9\uc77c\ud55c \ub450 \uc904\uc785\ub2c8\ub2e4. `naive` \ud615\uc2dd\uc758 datetime\uc5d0 `.astimezone(timezone.utc)`\ub97c \uc801\uc6a9\ud558\uba74 \uc2dc\uc2a4\ud15c \ub85c\uceec \uc2dc\uac04\uc744 \uac00\uc815\ud558\uba70, `.astimezone(None)`\uc740 `aware` \ud615\uc2dd\uc758 datetime\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \ub098\uc785(naive) \uac12\uc744 \uc785\ub825\uc73c\ub85c \ubc1b\uc73c\uba74 \ud0c0\uc784\uc874\uc744 \uc778\uc2dd\ud558\ub294 \uac12\uc744 \ubc18\ud658\ud558\ubbc0\ub85c, \uacb0\uacfc\ub294 \ud638\ucd9c\uc790\uc758 \ub2e4\ub978 \ub098\uc785 \uac12\ub4e4\uacfc \ube44\uad50\ud560 \uc218 \uc5c6\uc73c\uba70(\ube44\uad50 \uc2dc `TypeError` \ubc1c\uc0dd), \uacb0\uacfc\ub294 \ud638\uc2a4\ud2b8\uc758 `TZ`\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9d1\ub2c8\ub2e4.\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'))  # \ud638\uc2a4\ud2b8\uc5d0 \ub530\ub77c \ub2e4\ub984\n```\n\n**D3 \u2014 `scheduler\/service.py:8,13,15` (pre-fix) \u2014 \uc2dd\ubcc4\uc790 \ucda9\ub3cc \uc2dc \uc800\uc7a5\ub41c \uc791\uc5c5\uc774 \ubb34\ud1b5\ubcf4\ub85c \uc0ad\uc81c\ub428 \u2014 \uc2ec\uac01\ub3c4: \ub192\uc74c**\n\nID \uce74\uc6b4\ud130\ub294 `SchedulerService`\ubcc4\ub85c \uad00\ub9ac\ub418\uc5c8\uc73c\uba70, \uc8fc\uc785\ub41c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc758 \ub0b4\uc6a9\uc744 \ubb34\uc2dc\ud558\uace0 \ud56d\uc0c1 1\ubd80\ud130 \uc2dc\uc791\ud588\uc2b5\ub2c8\ub2e4. \uacf5\uc720 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \ub450 \ubc88\uc9f8 \uc11c\ube44\uc2a4\ub098 \ubbf8\ub9ac \ucc44\uc6cc\uc9c4 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \uc0ac\uc6a9\ud558\ub294 \uc11c\ube44\uc2a4\ub294 ID 1\uc744 \ub2e4\uc2dc \ud560\ub2f9\ud588\uc2b5\ub2c8\ub2e4. `JobRepository.save`\ub294 \ub515\uc154\ub108\ub9ac \ud560\ub2f9 \uc5f0\uc0b0\uc774\ubbc0\ub85c, \uae30\uc874 \uc791\uc5c5\uc774 \uc624\ub958 \uc5c6\uc774 \ub36e\uc5b4\uc4f0\uc5ec\uc84c\uc2b5\ub2c8\ub2e4. \ub370\uc774\ud130 \uc190\uc2e4.\n\n```\nrepo = JobRepository()\nSchedulerService(repo).create_job(\"\uc57c\uac04 \ubc31\uc5c5\", \"Alex\")    # ID 1\nSchedulerService(repo).create_job(\"Payroll export\", \"Blake\")   # \ub2e4\uc2dc id 1\nrepo.all()   # -&gt; [Job(1, 'Payroll export', 'Blake')]  \u2014 Alex\uc758 \uc791\uc5c5\uc774 \uc0ac\ub77c\uc84c\uc2b5\ub2c8\ub2e4\n```\n\n**D4 \u2014 `scheduler\/repository.py:19` \u2192 `scheduler\/service.py:22` \u2014 `delete_job`\uc774 \uc54c \uc218 \uc5c6\ub294 ID\uc5d0 \ub300\ud574 `KeyError`\ub97c \ubc1c\uc0dd\uc2dc\ud0b5\ub2c8\ub2e4 \u2014 \uc2ec\uac01\ub3c4: \uc911\uac04**\n\n`delete`\ub294 \uae30\ubcf8\uac12 \uc5c6\uc774 `dict.pop`\uc744 \uc0ac\uc6a9\ud558\ub294 \ubc18\uba74, \uac19\uc740 \uadf8\ub8f9\uc758 `get`(13\ud589)\uc740 \ud574\ub2f9 \ud56d\ubaa9\uc774 \uc5c6\uc744 \ub54c `None`\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubd88\uc77c\uce58\ub85c \uc778\ud574 `SchedulerService.delete_job`\uc744 \ud1b5\ud574 \uc6d0\uc2dc `KeyError`\uac00 \ub204\ucd9c\ub418\ub294\ub370, \ud638\ucd9c \uce21\uc5d0\uc11c \uc774\ub97c \ud3ec\ucc29\ud558\uae30\ub294 \uc5b4\ub824\uc6b8 \uac83\uc785\ub2c8\ub2e4. \uc7ac\ud604 \ubc29\ubc95: `SchedulerService().delete_job(999)` \u2192 `KeyError: 999`. \uc218\uc815 \ubc29\uc548\uc740 `pop(identifier, None)` \ub610\ub294 \uba85\uc2dc\uc801\uc778 \ub3c4\uba54\uc778 \uc608\uc678\ub97c \ub358\uc9c0\ub294 \uac83\uc785\ub2c8\ub2e4. \uc62c\ubc14\ub978 \uacc4\uc57d(\ubb34\uc791\uc704 \ubb34\uc791\uc704 \uc791\uc5c5 vs. \uc720\ud615 \uc9c0\uc815 \uc624\ub958)\uc740 \uc18c\uc720\uc790\uc758 API \uacb0\uc815 \uc0ac\ud56d\uc774\ubbc0\ub85c \uc758\ub3c4\uc801\uc73c\ub85c \uc218\uc815\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\n\n**D5 \u2014 `scheduler\/service.py:11,13` \u2014 owner \ud544\ub4dc \uc720\ud6a8\uc131 \uac80\uc0ac \ub204\ub77d \u2014 \uc2ec\uac01\ub3c4: \ub0ae\uc74c**\n\n`name`\uc740 \uacf5\ubc31 \uc5ec\ubd80\ub97c \uac80\uc0ac\ud558\uc9c0\ub9cc `owner`\ub294 \uac80\uc0ac\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4: `create_job(\"ok\", \"   \")`\ub294 `owner=''`\ub97c \uc800\uc7a5\ud569\ub2c8\ub2e4. \ub450 \ub9e4\uac1c\ubcc0\uc218 \ubaa8\ub450 \ubcf4\ud638 \uc870\uce58 \uc5c6\uc774 `.strip()`\uc744 \ud638\ucd9c\ud558\ubbc0\ub85c, `None`\uc774 `AttributeError: 'NoneType' object has no attribute 'strip'` \uc624\ub958\ub85c \ub178\ucd9c\ub418\uba70, \uc774\ub294 API\uac00 \uc798\ubabb\ub41c \uc785\ub825\uc5d0 \ub300\ud574 \uc77c\ubc18\uc801\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 `ValueError`\uc640\ub294 \ub2e4\ub985\ub2c8\ub2e4. \uc218\uc815\ud558\uc9c0 \uc54a\uc74c \u2014 \uc758\ub3c4\ub41c \uc18c\uc720\uc790 \uacc4\uc57d\uc774 \ud53c\ucc98 \uc5b4\ub514\uc5d0\ub3c4 \uba85\uc2dc\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\n\n**\ubcf4\uc548:** \ubc1c\uacac\ub41c \uc0ac\ud56d \uc5c6\uc74c. \uc774 \ud53c\ucc98\uc5d0\ub294 \ub124\ud2b8\uc6cc\ud06c, I\/O, \uc5ed\uc9c1\ub82c\ud654, \uc11c\ube0c\ud504\ub85c\uc138\uc2a4 \ub610\ub294 \uc790\uaca9 \uc99d\uba85 \ub178\ucd9c \uc9c0\uc810\uc774 \uc5c6\uc73c\uba70, \uc800\uc7a5\uc18c\ub294 \ud504\ub85c\uc138\uc2a4 \ub0b4 \ub515\uc154\ub108\ub9ac\uc785\ub2c8\ub2e4.\n\n**\ud14c\uc2a4\ud2b8 \ucee4\ubc84\ub9ac\uc9c0 \uaca9\ucc28:** \uc774\ubc88 \uc2e4\ud589 \uc804\uae4c\uc9c0 `scheduler\/time_rules.py`\uc640 `scheduler\/repository.py`\uc758 \ud14c\uc2a4\ud2b8 \ucee4\ubc84\ub9ac\uc9c0\ub294 0%\uc600\uc2b5\ub2c8\ub2e4. \uc2dc\ub4dc\ub41c \ub450 \ud14c\uc2a4\ud2b8\ub294 \uc11c\ube44\uc2a4\uc758 \uc815\uc0c1 \uacbd\ub85c\ub9cc \uac80\uc99d\ud588\uc2b5\ub2c8\ub2e4.\n\n### \ud14c\uc2a4\ud2b8 \ubc0f \uc218\uc815 \uc0ac\ud56d \uc801\uc6a9\n\n\uc2e0\ub8b0\ub3c4\uac00 \uac00\uc7a5 \ub192\uc740 \ub450 \uac00\uc9c0 \uacb0\ud568\uc740 **D1\/D2**(\ub3d9\uc77c\ud55c \ud568\uc218, \ud558\ub098\uc758 \uc218\uc815)\uc640 **D3**\uc774\uc5c8\uc2b5\ub2c8\ub2e4.\n\n**\uc218\uc815 \uc0ac\ud56d 1 \u2014 `scheduler\/time_rules.py`:** UTC \uc655\ubcf5 \uc5f0\uc0b0\uc744 `previous_run + timedelta(days=1)`\ub85c \ub300\uccb4\ud588\uc2b5\ub2c8\ub2e4. Python\uc740 \uc778\uc2dd \uac00\ub2a5\ud55c datetime\uc5d0 \ub300\ud574 \uc2e4\uc81c \uc2dc\uac04 \uc5f0\uc0b0\uc744 \uc218\ud589\ud558\uba70, `zoneinfo`\ub294 \uc0c8\ub85c\uc6b4 \uc2e4\uc81c \uc2dc\uac04\uc744 \uae30\ubc18\uc73c\ub85c UTC \uc624\ud504\uc14b\uc744 \uc9c0\uc5f0\uc801\uc73c\ub85c \uc7ac\ud574\uacb0\ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c 09:00\uc740 \uadf8\ub300\ub85c 09:00\uc73c\ub85c \uc720\uc9c0\ub418\ub294 \ubc18\uba74, \uc624\ud504\uc14b\uc740 `-05:00 \u2192 -04:00`\uc73c\ub85c \uc62c\ubc14\ub974\uac8c \ubcc0\uacbd\ub429\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 D1\uacfc D2\uac00 \ud568\uaed8 \uc218\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4: \ub2e8\uc21c \uc785\ub825\uac12\uc740 \uc774\uc81c \uadf8\ub300\ub85c \uc720\uc9c0\ub418\uba70, \ud604\uc9c0 \uc2dc\uac04\ub300\ub294 \uc808\ub300 \ucd94\ub860\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub3c4\ub2ec \ubd88\uac00\ub2a5\ud55c \uacbd\uc6b0\uc640 \ubaa8\ud638\ud55c \uacbd\uc6b0 \uac04\uc758 \uc804\ud658 \uc2dc\uac04\ub300 \ucc98\ub9ac\uc5d0 \ub300\ud574\uc11c\ub294 tzinfo\uc758 \uc811\ud569 \uaddc\uce59\uc744 \ub530\ub974\ub3c4\ub85d \ubb38\uc11c\ud654\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.\n\n**\uc218\uc815 \uc0ac\ud56d 2 \u2014 `scheduler\/service.py`:** \uc778\uc2a4\ud134\uc2a4\ubcc4 `_next_identifier` \uce74\uc6b4\ud130\ub97c \uc81c\uac70\ud588\uc2b5\ub2c8\ub2e4. \uc774\uc81c \uc2dd\ubcc4\uc790\ub294 \uc0dd\uc131 \uc2dc\uc810\uc5d0 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc0c1\ud0dc\uc5d0\uc11c `max(\uae30\uc874 ID, \uae30\ubcf8\uac12=0) + 1`\ub85c \ud560\ub2f9\ub429\ub2c8\ub2e4. \uc774\ub294 \uacf5\uc720 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\uc640 \ubbf8\ub9ac \ucc44\uc6cc\uc9c4 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ubaa8\ub450\uc5d0 \ub300\ud574 \uc62c\ubc14\ub978 \ubc29\uc2dd\uc785\ub2c8\ub2e4. \uc7a5\ub2e8\uc810: \uc0dd\uc131 \uc2dc\ub9c8\ub2e4 O(1) \ub300\uc2e0 O(n)\uc774 \uc18c\uc694\ub418\uc9c0\ub9cc, \ub515\uc154\ub108\ub9ac \uae30\ubc18\uc758 \uba54\ubaa8\ub9ac \ub0b4 \uc800\uc7a5\uc18c\uc5d0\ub294 \ud5c8\uc6a9 \uac00\ub2a5\ud55c \uc218\uc900\uc774\uba70, \uae30\ub85d \ub300\uc0c1 \uc800\uc7a5\uc18c\ub97c \uc778\uc2dd\ud560 \uc218 \uc5c6\ub294 \uce74\uc6b4\ud130\ubcf4\ub2e4 \uc815\ud655\uc131\uc774 \ubcf4\uc7a5\ub429\ub2c8\ub2e4.\n\n**\ud14c\uc2a4\ud2b8 \u2014 `tests\/test_time_rules.py` (\uc2e0\uaddc, 5\uac1c \ud14c\uc2a4\ud2b8):** \ubd04 \uc2dc\uac04 \ubcc0\uacbd \ubc0f \uac00\uc744 \uc2dc\uac04 \ubcc0\uacbd \uc2dc \uc2e4\uc81c \uc2dc\uac04 \ubcf4\uc874, \ud574\ub2f9 \uc804\ud658 \uae30\uac04 \ub3d9\uc548 23\uc2dc\uac04\/25\uc2dc\uac04\uc758 \uc808\ub300 \uacbd\uacfc \uc2dc\uac04, UTC \uc624\ud504\uc14b \uc7ac\uc124\uc815, \u2018naive-stays-naive\u2019 \uaddc\uce59, \uadf8\ub9ac\uace0 \ub2e8\uc21c\ud55c UTC \ub0a0\uc9dc \uc804\uc9c4. IANA \ub370\uc774\ud130\ubca0\uc774\uc2a4\uac00 \uc5c6\uc73c\uba74 \uae54\ub054\ud558\uac8c \uac74\ub108\ub701\ub2c8\ub2e4.\n\n**\ud14c\uc2a4\ud2b8 \u2014 `tests\/test_scheduler.py` (\ud655\uc7a5, \ud14c\uc2a4\ud2b8 2\uac1c \ucd94\uac00):** \ud558\ub098\uc758 \uc800\uc7a5\uc18c\ub97c \uacf5\uc720\ud558\ub294 \ub450 \uc11c\ube44\uc2a4\ub294 \uc11c\ub85c \ub2e4\ub978 ID\ub97c \ubc1c\uae09\ud558\uace0 \ub450 \uc791\uc5c5 \ubaa8\ub450\ub97c \uc720\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4. ID 1\uacfc 7\uc774 \ubbf8\ub9ac \ucc44\uc6cc\uc9c4 \uc800\uc7a5\uc18c\ub97c \uc0ac\uc6a9\ud558\ub294 \uc11c\ube44\uc2a4\ub294 ID 8\uc744 \ubc1c\uae09\ud558\uace0 \uae30\uc874 \uc791\uc5c5\uc744 \uadf8\ub300\ub85c \uc720\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4.\n\n**\uacb0\ud568 \ud655\uc778:** \uc784\uc2dc \ubcf5\uc0ac\ubcf8\uc5d0 \uc6d0\ub798 \uad6c\ud604\uc744 \ubaa8\ub450 \ubcf5\uc6d0\ud558\uace0 \ud14c\uc2a4\ud2b8 \ubaa8\uc74c\uc744 \ub2e4\uc2dc \uc2e4\ud589\ud588\uc2b5\ub2c8\ub2e4. \uc0c8\ub85c\uc6b4 \ud14c\uc2a4\ud2b8 5\uac1c \ubaa8\ub450 \uc2e4\ud328\ud588\uc73c\uba70(`FAILED (failures=5)`), \uc218\uc815\ub41c \ucf54\ub4dc\uc5d0\uc11c\ub294 \ubaa8\ub450 \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4. \ud14c\uc2a4\ud2b8\uac00 \uacb0\ud568\uc744 \ud655\uc2e4\ud788 \ud3ec\ucc29\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.\n\n\uc2e4\ud589 \uc911 \ud55c \uac00\uc9c0 \uc218\uc815 \uc0ac\ud56d: \ucd08\uc548\uc5d0\uc11c\ub294 \uacbd\uacfc\ud55c DST \uc2dc\uac04\uc744 `result - previous`\ub85c \ud655\uc778\ud588\ub294\ub370, \ub450 \ud53c\uc5f0\uc0b0\uc790\uac00 \ub3d9\uc77c\ud55c tzinfo\ub97c \uacf5\uc720\ud560 \uacbd\uc6b0 Python\uc740 \uc774\ub97c \uc2e4\uc81c \uc2dc\uac04 \uc5f0\uc0b0\uc73c\ub85c \ud3c9\uac00\ud558\uc5ec `24h`\ub85c \ud574\uc11d\ud588\uace0, \uc774\ub85c \uc778\ud574 \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud328\ud588\uc2b5\ub2c8\ub2e4. \uc774\uc81c \ud655\uc778 \uc870\uac74\uc5d0\uc11c \ube7c\uae30 \uc5f0\uc0b0\uc744 \uc218\ud589\ud558\uae30 \uc804\uc5d0 UTC\ub85c \ubcc0\ud658\ud558\ub3c4\ub85d \uc218\uc815\ud588\uc2b5\ub2c8\ub2e4. \uc2e4\ud328 \uc6d0\uc778\uc740 \uc218\uc815 \uc0ac\ud56d\uc774 \uc544\ub2c8\ub77c \uc81c \ud14c\uc2a4\ud2b8\uc5d0 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.\n\n### \ub2f4\ub2f9\uc790 \ucc38\uace0 \uc0ac\ud56d\n\n`fixture-manifest.json`\uc740 \ubcc0\uacbd\ub418\uc9c0 \uc54a\uc558\uc73c\ubbc0\ub85c, `tests\/test_time_rules.py`\ub294 `expected_files`\uc5d0 \ub098\uc5f4\ub418\uc9c0 \uc54a\uc740 \uc815\ub2f9\ud55c \uc0c8 \ud30c\uc77c\uc785\ub2c8\ub2e4. \ud2b9\uc815 \ud30c\uc77c \uc138\ud2b8\ub97c \uc815\ud655\ud788 \uc900\uc218\ud574\uc57c \ud558\ub294 \uac80\uc0ac\uac00 \uc788\ub2e4\uba74 \ub9e4\ub2c8\ud398\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uc2ed\uc2dc\uc624. \ub610\ud55c D4\/D5\ub294 \ubcf4\uace0\ub418\uc5c8\uc73c\ub098 \uc758\ub3c4\uc801\uc73c\ub85c \uc218\uc815\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ub450 \ubb38\uc81c \ubaa8\ub450 \ud53c\ucc98 \uc5b4\ub514\uc5d0\ub3c4 \uba85\uc2dc\ub418\uc9c0 \uc54a\uc740 API \uacc4\uc57d \uacb0\uc815(\uc0ad\uc81c \uc2dc \ub204\ub77d \uc138\ubbf8\uc5b8\ud2f1, \uc18c\uc720\uc790 \uc720\ud6a8\uc131 \uac80\uc0ac \uaddc\uce59)\uc5d0 \ub2ec\ub824 \uc788\uc73c\ubbc0\ub85c, \uadf8\uc911 \ud558\ub098\ub97c \uc120\ud0dd\ud558\ub294 \uac83\uc740 \uc218\uc815\uc774\ub77c\uae30\ubcf4\ub2e4\ub294 \ucd94\uce21\uc5d0 \ubd88\uacfc\ud588\uc744 \uac83\uc785\ub2c8\ub2e4.\n<\/pre><\/div><\/details><\/div><p class=\"d-limit\">Fixture\uc758 \uc81c\ud55c \uc0ac\ud56d: \uc774\ub294 \uc18c\uaddc\ubaa8\uc758 \uc624\ud504\ub77c\uc778 Python \uc800\uc7a5\uc18c\uc600\uc2b5\ub2c8\ub2e4. Claude\ub294 CLI OAuth\uac00 \ub9cc\ub8cc\ub41c \ud6c4 \uc11c\ube0c\uc5d0\uc774\uc804\ud2b8 \ub300\uccb4 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud588\uae30 \ub54c\ubb38\uc5d0, \uaca9\ub9ac \uc0c1\ud0dc\uc640 \ud1a0\ud070 \uac00\uc2dc\uc131\uc774 \ub3d9\uc77c\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.<\/p><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5b4\ub290 \uc810\uc218\ub77c\ub3c4 \uc0ac\ub78c\uc758 \uac80\ud1a0\ub97c \ub300\uccb4\ud560 \uc218\ub294 \uc5c6\uc2b5\ub2c8\ub2e4. \uc5d0\uc774\uc804\ud2b8 \uc911 \ud558\ub098\uac00 \uc218\ub9ac\ub97c \uc644\ub8cc\ud55c \ud6c4\uc5d0\ub294 \ubcc0\uacbd\ub41c \uc778\ud130\ud398\uc774\uc2a4, \uc608\uc0c1\uce58 \ubabb\ud55c \ud30c\uc77c \ubc94\uc704, \ub204\ub77d\ub41c \ubd80\uc815 \ud14c\uc2a4\ud2b8, \uad8c\ud55c \ub610\ub294 \uba85\ub839\uc5b4 \uc774\ub825, \ub864\ubc31 \uacbd\ub85c\ub97c \uc810\uac80\ud574\uc57c \ud569\ub2c8\ub2e4. \ud655\uc2e0\uc5d0 \ucc2c \uc124\uba85\uc740 \uc7ac\ud604 \uac00\ub2a5\ud55c \ud14c\uc2a4\ud2b8\ub97c \ub300\uc2e0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 id=\"safety\" class=\"wp-block-heading\">\uad8c\ud55c, \uc0cc\ub4dc\ubc15\uc2f1 \ubc0f \uc6b4\uc601 \uc548\uc804\uc131<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ucf54\ub529 \uc5d0\uc774\uc804\ud2b8\ub294 \ube44\uacf5\uac1c \ucf54\ub4dc\ub97c \uc77d\uac70\ub098, \uc178 \uba85\ub839\uc744 \uc2e4\ud589\ud558\uac70\ub098, \uc5ec\ub7ec \ud30c\uc77c\uc744 \uc218\uc815\ud558\uac70\ub098, \uc678\ubd80 \ub3c4\uad6c\ub97c \ud638\ucd9c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \uad8c\ud55c \uc124\uacc4\ub294 \uc81c\ud488 \ud488\uc9c8\uc758 \uc911\uc694\ud55c \uc694\uc18c\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc11c \uace0\ub824\ud574\uc57c \ud560 \uc0ac\ud56d\uc740 \uc5b4\ub5a4 \uc791\uc5c5\uc5d0 \uc2b9\uc778\uc774 \ud544\uc694\ud55c\uc9c0, \uc5d0\uc774\uc804\ud2b8\uac00 \uae30\ubcf8\uc801\uc73c\ub85c \uc5b4\ub5a4 \ud56d\ubaa9\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub294\uc9c0, \uc704\ud5d8\ud55c \uc791\uc5c5\uc774 \uc5bc\ub9c8\ub098 \uba85\ud655\ud558\uac8c \ubbf8\ub9ac \ud45c\uc2dc\ub418\ub294\uc9c0, \uadf8\ub9ac\uace0 \uac1c\ubc1c\uc790\uac00 \uadf8 \uacb0\uacfc\ub85c \ubc1c\uc0dd\ud55c \ubcc0\uacbd \uc0ac\ud56d\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub294\uc9c0 \uc5ec\ubd80\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2b9\uc778 \uc694\uccad \ud69f\uc218\uac00 \uc801\ub2e4\uace0 \ud574\uc11c \ubb34\uc870\uac74 \ub354 \ub0ab\ub2e4\uace0 \uc0dd\uac01\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \uc778\uc99d \uc815\ubcf4\ub098 \ud504\ub85c\ub355\uc158 \uc5f0\uacb0\uc774 \uc5c6\ub294 \ub3c5\ub9bd\ub41c \ud658\uacbd\uc5d0\uc11c\ub294 \ub9c8\ucc30\uc744 \ucd5c\uc18c\ud654\ud558\ub294 \uac83\uc774 \uc720\uc6a9\ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ubc30\ud3ec \uc2a4\ud06c\ub9bd\ud2b8, \uc2e4\uc81c \uace0\uac1d \ub370\uc774\ud130, \ub610\ub294 \uad11\ubc94\uc704\ud55c \ud074\ub77c\uc6b0\ub4dc \uad8c\ud55c\uacfc \uc5f0\uacb0\ub41c \uc800\uc7a5\uc18c\uc5d0\uc11c\ub294 \ub3d9\uc77c\ud55c \ubc29\uc2dd\uc774 \uc704\ud5d8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubc18\ub300\ub85c, \uc2b9\uc778 \uc808\ucc28\uac00 \uc9c0\ub098\uce58\uac8c \ub9ce\uc73c\uba74 \uc548\uc804\ud55c \uc790\ub3d9\ud654\uac00 \ube44\uc2e4\uc6a9\uc801\uc73c\ub85c \ubcc0\ud560 \ubfd0\ub9cc \uc544\ub2c8\ub77c, \uc0ac\uc6a9\uc790\uac00 \uc694\uccad \ub0b4\uc6a9\uc744 \uc77d\uc9c0 \uc54a\uace0 \ubb34\ud131\ub300\uace0 \uc2b9\uc778\ud558\ub3c4\ub85d \uc720\ub3c4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubc88 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub294 \uc2e4\uc81c \uc6b4\uc601 \uc2dc\uc2a4\ud15c\uc774\ub098 \ubc30\ud3ec \uacfc\uc815\uc744 \uac70\uce58\uc9c0 \uc54a\uc558\uc73c\uba70, \uc720\ud6a8\uc131 \uac80\uc99d\uc744 \uc704\ud55c \uc0ac\ub78c\uc758 \uac1c\uc785\ub3c4 \uc5c6\uc774 \uc0c8\ub85c \uc0dd\uc131\ub41c \ub85c\uceec \uc0ac\ubcf8\ub9cc\uc744 \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \uc774 \ud14c\uc2a4\ud2b8\ub294 \ub450 \uc81c\ud488\uc758 \uc0c1\ub300\uc801\uc778 \ubcf4\uc548\uc131\uc744 \ud3c9\uac00\ud55c \uac83\uc774 \uc544\ub2c8\ub77c, \uc548\uc804\ud55c \uc870\uac74 \ud558\uc5d0\uc11c \uc791\uc5c5 \uc644\ub8cc \uc5ec\ubd80\ub97c \ud3c9\uac00\ud55c \uac83\uc785\ub2c8\ub2e4. \uc911\uc694\ud55c \uc5c5\ubb34\uc5d0 \ub450 \ub3c4\uad6c \uc911 \ud558\ub098\ub97c \uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0, \uba3c\uc800 \uc77d\uae30 \uc804\uc6a9 \uad8c\ud55c\uc73c\ub85c \uc2dc\uc791\ud558\uace0, \ud5c8\uc6a9\ub418\ub294 \ub514\ub809\ud130\ub9ac\uc640 \uba85\ub839\uc5b4\ub97c \uc815\uc758\ud558\uba70, \ubcc0\uacbd \ub0b4\uc5ed\uc744 \uac80\ud1a0\ud558\uace0, \ubcf5\uad6c \uac00\ub2a5\ud55c \ud658\uacbd\uc5d0\uc11c \uac1d\uad00\uc801\uc778 \uac80\uc99d\uc744 \uc218\ud589\ud558\uc2ed\uc2dc\uc624.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc77d\uae30 \uc804\uc6a9 \uc544\ud0a4\ud14d\ucc98\ub85c \uc2dc\uc791\ud558\uac70\ub098, \uadf8\ub807\uc9c0 \uc54a\uc73c\uba74 \uc704\ud5d8\uc744 \uac10\uc218\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n\n\n\n<li>\ubc94\uc704\uc640 \uacb0\uacfc\ub97c \ud655\uc2e4\ud788 \uc774\ud574\ud55c \uba85\ub839\ub9cc \uc2b9\uc778\ud558\uc2ed\uc2dc\uc624.<\/li>\n\n\n\n<li>\uc778\uc99d \uc815\ubcf4, \ud504\ub85c\ub355\uc158 \ub370\uc774\ud130 \ubc0f \ubc30\ud3ec \uc561\uc138\uc2a4 \uad8c\ud55c\uc740 \ud3c9\uac00\ud310 \uc678\ubd80\uc5d0 \ubcf4\uad00\ud558\uc2ed\uc2dc\uc624.<\/li>\n\n\n\n<li>\uacb0\uacfc\ub97c \uc2b9\uc778\ud558\uae30 \uc804\uc5d0 diff, \ud14c\uc2a4\ud2b8 \uacb0\uacfc \ubc0f \uba85\ud655\ud55c \ub864\ubc31 \uacbd\ub85c\ub97c \uc81c\ucd9c\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"customization\" class=\"wp-block-heading\">MCP, \uae30\uc220, \ud504\ub85c\uc81d\ud2b8 \uc9c0\uce68 \ubc0f \uc0ac\uc6a9\uc790 \uc815\uc758<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ub450 \uc0dd\ud0dc\uacc4 \ubaa8\ub450 \ud655\uc7a5\ud560 \uc218 \uc788\uc9c0\ub9cc, \u2018\ud655\uc7a5\u2019\uc774\ub77c\ub294 \uc6a9\uc5b4\ub97c \ub3d9\uc758\uc5b4\ub85c \ucde8\uae09\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8 \uc9c0\uce68\uc740 \uc5d0\uc774\uc804\ud2b8\uc5d0\uac8c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ub0b4\uc5d0\uc11c \uc5b4\ub5bb\uac8c \ud589\ub3d9\ud574\uc57c \ud558\ub294\uc9c0 \uc54c\ub824\uc90d\ub2c8\ub2e4. \uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc2a4\ud0ac(Reusable Skills)\uc740 \ubc18\ubcf5 \uac00\ub2a5\ud55c \uc6cc\ud06c\ud50c\ub85c\uc6b0\ub098 \uc804\ubb38 \uc9c0\uc2dd\uc744 \ud328\ud0a4\uc9c0\ud654\ud55c \uac83\uc785\ub2c8\ub2e4. MCP\ub294 \ud638\uc2a4\ud2b8\ub97c \uc678\ubd80 \ub3c4\uad6c\ub098 \ub370\uc774\ud130\uc5d0 \uc5f0\uacb0\ud569\ub2c8\ub2e4. \ud6c4\ud06c(Hooks)\uc640 \uba85\ub839\uc5b4(commands)\ub294 \uac1c\ubc1c \ub8e8\ud504\uc758 \ud2b9\uc815 \ub2e8\uacc4\ub97c \uc790\ub3d9\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud55c \uacc4\uce35\uc5d0\uc11c \ub6f0\uc5b4\ub09c \uc131\ub2a5\uc744 \ubcf4\uc774\ub294 \uc81c\ud488\uc774 \ub2e4\ub978 \uacc4\uce35\uc758 \uae30\ub2a5\uc744 \uc77c\ub300\uc77c\ub85c \ubaa8\ub450 \uac16\ucd94\uace0 \uc788\uc9c0 \uc54a\uc744 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uad6c\ub9e4 \uc2dc \uace0\ub824\ud574\uc57c \ud560 \ud575\uc2ec\uc740 \ud1b5\ud569 \ub85c\uace0\uac00 \uc788\ub294\uc9c0 \uc5ec\ubd80\uac00 \uc544\ub2d9\ub2c8\ub2e4. \uc2e4\uc81c\ub85c \uc0ac\uc6a9\ud558\ub294 \ud638\uc2a4\ud2b8 \ud658\uacbd\uc5d0\uc11c \ud574\ub2f9 \uc5f0\uacb0\uc744 \uc124\uce58\ud558\uace0, \uc778\uc99d\ud558\uace0, \uc2b9\uc778\ubc1b\uc73c\uba70, \uc2e4\ud589\ud560 \uc218 \uc788\ub294\uc9c0 \uc5ec\ubd80\uc785\ub2c8\ub2e4. \ub610\ud55c \uc624\ub958 \ubc1c\uc0dd \uc2dc \uadf8 \uc6d0\uc778\uc744 \ud30c\uc545\ud558\uae30 \uc26c\uc6b4 \ubc29\uc2dd\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. \ub300\ud654\ud615 \ubaa8\ub4dc\uc5d0\uc11c\ub294 \uc791\ub3d9\ud558\uc9c0\ub9cc \ubb34\uc778 \uc138\uc158\uc5d0\uc11c\ub294 \uc2b9\uc778\uc744 \uae30\ub2e4\ub9ac\ub294 MCP \uc11c\ubc84\ub3c4 \uc5ec\uc804\ud788 \uc720\uc6a9\ud558\uc9c0\ub9cc, \uc774\ub97c \u2018\ub9c8\ucc30 \uc5c6\ub294 \uc790\ub3d9\ud654\u2019\ub77c\uace0 \ubb18\uc0ac\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc9c0\uce68\uc5d0\ub3c4 \ube44\uc2b7\ud55c \uc8fc\uc758\uc0ac\ud56d\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc9c0\uce68 \ubb38\uc11c\uac00 \uae38\ub2e4\uace0 \ud574\uc11c \ubc18\ub4dc\uc2dc \uc900\uc218\ub41c\ub2e4\ub294 \ubcf4\uc7a5\uc740 \uc5c6\uc73c\uba70, \uc9c0\ub098\uce58\uac8c \ubcf5\uc7a1\ud55c \uaddc\uce59 \uc138\ud2b8\ub294 \ub9e5\ub77d\uc744 \ud750\ub9ac\uac70\ub098 \ubaa8\uc21c\uc744 \uc57c\uae30\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc800\uc7a5\uc18c \uc9c0\uce68\uc740 \uac04\uacb0\ud558\uace0, \ud14c\uc2a4\ud2b8 \uac00\ub2a5\ud558\uba70, \ucf54\ub4dc\uc640 \ubc00\uc811\ud558\uac8c \uc5f0\uacc4\ub418\ub3c4\ub85d \uc791\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. \ud544\uc218 \uac80\uc99d \uba85\ub839\uc5b4, \ubcf4\ud638 \ub300\uc0c1 \uc601\uc5ed, \uc2a4\ud0c0\uc77c \uaddc\uce59, \uadf8\ub9ac\uace0 \uc5d0\uc774\uc804\ud2b8\uac00 \uc791\uc5c5\uc744 \uc911\ub2e8\ud558\uace0 \ud655\uc778\uc744 \uc694\uccad\ud574\uc57c \ud558\ub294 \uc2dc\uc810\uc744 \uba85\uc2dc\ud558\uc2ed\uc2dc\uc624.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\ud504\ub85c\uc81d\ud2b8 \uc9c0\uce68:<\/strong> \uc800\uc7a5\uc18c\ubcc4 \uaddc\uce59 \ubc0f \uac80\uc99d \uba85\ub839\uc5b4.<\/li>\n\n\n\n<li><strong>\uae30\uc220:<\/strong> \uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uc808\ucc28 \ub610\ub294 \uc804\ubb38 \uc9c0\uc2dd \ud328\ud0a4\uc9c0.<\/li>\n\n\n\n<li><strong>MCP:<\/strong> \uc678\ubd80 \ub3c4\uad6c \ubc0f \ub370\uc774\ud130\uc640\uc758 \uc5f0\ub3d9.<\/li>\n\n\n\n<li><strong>\ud6c4\ud06c\uc640 \uba85\ub839\uc5b4:<\/strong> \uc815\uc758\ub41c \uc6cc\ud06c\ud50c\ub85c \uc774\ubca4\ud2b8\ub97c \uc911\uc2ec\uc73c\ub85c \ud55c \uc790\ub3d9\ud654.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"pricing\" class=\"wp-block-heading\">Codex \ub300 Claude \ucf54\ub4dc\uc758 \uac00\uaca9 \ubc0f \uc0ac\uc6a9 \uc81c\ud55c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub9b0 \uc18c\ube44\uc790 \uc694\uae08\uc81c \ube44\uad50\ub294 \uc6d4 $20\ubd80\ud130 \uc2dc\uc791\ub429\ub2c8\ub2e4. \uad00\ub828 $20 ChatGPT \uc694\uae08\uc81c\ub97c \ud1b5\ud574 Codex \uc774\uc6a9 \uad8c\ud55c\uc774 \ud3ec\ud568\ub418\uba70, Claude Pro\ub294 \ubbf8\uad6d\uc5d0\uc11c \uc6d4 $20\uc774\uba70 Claude Code\uac00 \ud3ec\ud568\ub429\ub2c8\ub2e4. \ub450 \uc694\uae08\uc81c \ubaa8\ub450 $100 \ubc0f $200\uc758 \ub300\uc6a9\ub7c9 \uc18c\ube44\uc790 \uc694\uae08\uc81c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc815\uac00\uac00 \ube44\uc2b7\ud558\ub2e4\uace0 \ud574\uc11c \uc6a9\ub7c9\uc774 \ub3d9\uc77c\ud55c \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Claude Max 5x\uc758 \uc6d4 \uc774\uc6a9\ub8cc\ub294 $100\uc774\uba70, Max 20x\uc758 \uc6d4 \uc774\uc6a9\ub8cc\ub294 $200\uc785\ub2c8\ub2e4. \u201c5x\u201d \ubc0f \u201c20x\u201d\ub77c\ub294 \uba85\uce6d\uc740 \ubcf4\uc7a5\ub41c \ucf54\ub529 \uc791\uc5c5 \uc218\ub97c \uc758\ubbf8\ud558\uae30\ubcf4\ub2e4\ub294 Pro \uc694\uae08\uc81c\uc640 \ube44\uad50\ud55c \uc138\uc158\ub2f9 \uc0ac\uc6a9\ub7c9\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. Claude\uc640 Claude Code\ub294 \uc138\uc158 \ubc0f \uc8fc\uac04 \ud55c\ub3c4\ub97c \uacf5\uc720\ud569\ub2c8\ub2e4. \ucee8\ud14d\uc2a4\ud2b8 \uae38\uc774, \ucca8\ubd80 \ud30c\uc77c, \ubaa8\ub378 \uc120\ud0dd \ubc0f \uae30\ub2a5 \uc0ac\uc6a9 \uc5ec\ubd80\uc5d0 \ub530\ub77c \ud560\ub2f9\ub7c9\uc774 \uc18c\uc9c4\ub418\ub294 \uc18d\ub3c4\uac00 \ub2ec\ub77c\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/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=\"Max 5x \ubc0f Max 20x \uc0ac\uc6a9 \uc6a9\ub7c9\uc744 \uc124\uba85\ud558\ub294 Claude Max \uc694\uae08\uc81c \ud398\uc774\uc9c0\" 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\uc758 \uacf5\uc2dd Max \uc694\uae08\uc81c \ud398\uc774\uc9c0\uc5d0\ub294 5\ubc30 \ubc0f 20\ubc30 \uc0ac\uc6a9\ub7c9-\uc6a9\ub7c9 \uc635\uc158\uc5d0 \ub300\ud55c \uc124\uba85\uc774 \ub098\uc640 \uc788\uc2b5\ub2c8\ub2e4. \uc6d4 \uc774\uc6a9\ub8cc\ub294 \ub3d9\uc77c\ud55c \uacf5\uc2dd \ubb38\uc11c\uc5d0 \uba85\uc2dc\ub418\uc5b4 \uc788\uc73c\uba70, \uc694\uae08\uc81c \uc138\ubd80 \uc0ac\ud56d\uc740 2026\ub144 7\uc6d4\uc5d0 \ud655\uc778\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Claude\uc758 \uc120\ud0dd\uc801 \uc0ac\uc6a9 \ud06c\ub808\ub527\uc740 \ud65c\uc131\ud654 \uc2dc \ud3ec\ud568\ub41c \uc0ac\uc6a9\ub7c9 \uc774\ud6c4\uc5d0\ub3c4 \uc801\uaca9 \uc791\uc5c5\uc744 \uacc4\uc18d\ud560 \uc218 \uc788\uac8c \ud574\uc8fc\uba70, \ud574\ub2f9 \ud06c\ub808\ub527\uc740 \ud45c\uc900 API \uc694\uc728\uc5d0 \ub530\ub77c \ubcc4\ub3c4\ub85c \uccad\uad6c\ub429\ub2c8\ub2e4. API \ud0a4 \uc778\uc99d \uc5ed\uc2dc \ubcc4\ub3c4\uc758 \uccad\uad6c \ubc29\uc2dd\uc785\ub2c8\ub2e4. \ub450 \ubc29\uc2dd \uc911 \uc5b4\ub290 \ud558\ub098\ub97c \u201c\ubb34\uc81c\ud55c\u201d\uc774\ub77c\uace0 \ubd80\ub978\ub2e4\uba74 \uc2e4\uc81c \ud55c\uacc4 \ube44\uc6a9\uc744 \uac04\uacfc\ud558\uac8c \ub420 \uac83\uc785\ub2c8\ub2e4.<\/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=\"\uacf5\uc720 \uc138\uc158 \ubc0f \uc8fc\uac04 \uc0ac\uc6a9 \ud55c\ub3c4\uc5d0 \ub300\ud574 \uc124\uba85\ud558\ub294 Claude \uc694\uae08\uc81c \uc548\ub0b4\uc11c\" 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 \ucf54\ub4dc\ub294 \uc5f0\uacb0\ub41c Pro \ub610\ub294 Max \uad6c\ub3c5\uc758 \ud560\ub2f9\ub7c9(\uacf5\uc720 \uc138\uc158 \ubc0f \uc8fc\uac04 \ud55c\ub3c4 \ud3ec\ud568)\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc815\ud655\ud55c \uc6a9\ub7c9\uc740 \uc6cc\ud06c\ub85c\ub4dc\uc5d0 \ub530\ub77c \ub2e4\ub985\ub2c8\ub2e4.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Codex \uc5ed\uc2dc \ud3ec\ud568\ub41c \uc18c\ube44\uc790 \uc694\uae08\uc81c \uc0ac\uc6a9\ub7c9, \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uad6c\ub9e4 \ud06c\ub808\ub527, API \uccad\uad6c\uc561\uc744 \ubcc4\ub3c4\ub85c \uad6c\ubd84\ud569\ub2c8\ub2e4. \ub85c\uceec \uba54\uc2dc\uc9c0\uc640 \ud074\ub77c\uc6b0\ub4dc \ucc44\ud305\uc740 5\uc2dc\uac04\uc758 \uc0ac\uc6a9 \ud55c\ub3c4 \ubc94\uc704\ub97c \uacf5\uc720\ud558\uba70, \uc8fc\uac04 \ud55c\ub3c4\uac00 \uc801\uc6a9\ub420 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. CLI \ub85c\uadf8\uc5d0 \ud45c\uc2dc\ub41c \ud1a0\ud070 \ud544\ub4dc\ub294 5\uc2dc\uac04 \uae30\uc900 \ubc31\ubd84\uc728, \uad6c\ub3c5 \ud06c\ub808\ub527 \uae08\uc561 \ub610\ub294 API \uccad\uad6c\uc561\uc73c\ub85c \uc9c1\uc811 \ubcc0\ud658\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac00\ub054\uc529 \ud63c\uc790 \ucf54\ub529\uc744 \ud560 \ub54c\ub294 \uc591\ucabd \ubaa8\ub450\uc5d0\uc11c $20 \ud2f0\uc5b4\uac00 \ud569\ub9ac\uc801\uc778 \uc2dc\uc791\uc810\uc785\ub2c8\ub2e4. \uae34 \ucee8\ud14d\uc2a4\ud2b8\uac00 \ud3ec\ud568\ub41c \uc77c\uc0c1\uc801\uc778 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc791\uc5c5\uc758 \uacbd\uc6b0 \ub354 \ub192\uc740 \uc0ac\uc6a9\ub7c9 \ud2f0\uc5b4\ub97c \uc120\ud0dd\ud558\ub294 \uac83\uc774 \ud0c0\ub2f9\ud560 \uc218 \uc788\uc9c0\ub9cc, \uc774\ub294 \uc2e4\uc81c \ub9ac\uc14b \ud69f\uc218\uc640 \uc791\uc5c5 \uc18c\ube44\ub7c9\uc744 \uad00\ucc30\ud55c \ud6c4\uc5d0\uc57c \uacb0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. \uace0\uac15\ub3c4 \ubcd1\ub82c \uc791\uc5c5\uc758 \uacbd\uc6b0 \ub354\uc6b1 \uc138\uc2ec\ud55c \uc8fc\uc758\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ub354 \ud070 \ud2f0\uc5b4\ub97c \uc120\ud0dd\ud55c\ub2e4\uace0 \ud574\uc11c \ucee8\ud14d\uc2a4\ud2b8\ub97c \uad00\ub9ac\ud558\uace0, \uc791\uc5c5\uc744 \ubd84\ud560\ud558\uba70, \ud310\ub2e8\ub825\uc774 \ub9ce\uc774 \ud544\uc694\ud55c \uc791\uc5c5\uc5d0 \ube44\uc6a9\uc774 \ub9ce\uc774 \ub4dc\ub294 \ucd94\ub860 \uc790\uc6d0\uc744 \ud560\ub2f9\ud574\uc57c \ud560 \ud544\uc694\uc131\uc774 \uc0ac\ub77c\uc9c0\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 id=\"controlled-test\" class=\"wp-block-heading\">\u2018Codex \ub300 Claude \ucf54\ub4dc\u2019 \ube44\uad50 \ud14c\uc2a4\ud2b8 \uacb0\uacfc<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ub450 \uc5d0\uc774\uc804\ud2b8\uac00 \uc2e4\ud589\ub418\uae30 \uc804\uc5d0, \ub124 \uac00\uc9c0 \uc601\uc5b4 \ud504\ub86c\ud504\ud2b8, \uacf5\uac1c \ud30c\uc774\uc36c \ud53d\uc2a4\ucc98, \uac1d\uad00\uc2dd \ubb38\uc81c, \ucc44\uc810 \uae30\uc900\ud45c, \uadf8\ub9ac\uace0 \u2018\uccab \ubc88\uc9f8 \uc720\ud6a8 \uacb0\uacfc\u2019 \uaddc\uce59\uc744 \uace0\uc815\ud574 \ub450\uc5c8\uc2b5\ub2c8\ub2e4. \uacfc\uc81c\ub294 \ub0af\uc120 \uc800\uc7a5\uc18c \uc774\ud574, \ub2e4\uc911 \ud30c\uc77c \uae30\ub2a5, DST \ubc84\uadf8 \uc218\uc815, \uc218\uc815 \uc0ac\ud56d\uc744 \ud3ec\ud568\ud55c \ucf54\ub4dc \uac80\ud1a0\ub85c \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc720\ud6a8\ud55c \uacb0\uacfc\uc5d0\ub294 \uc0ac\ub78c\uc758 \uac1c\uc785\uc774 \uc5c6\uc5c8\uc73c\uba70, \uc810\uc218\ub294 \ub0ae\uc9c0\ub9cc \uc720\ud6a8\ud55c \ucd9c\ub825\uc758 \uacbd\uc6b0 \ub354 \ub192\uc740 \uc810\uc218\ub97c \uc5bb\uae30 \uc704\ud574 \uc7ac\uc2e4\ud589\ud560 \uc218 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4.<\/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\">\uc2dc\ud5d8 \uc2e4\uc2dc \ubc29\ubc95<\/p><h3>\ub3d9\uc77c\ud55c \uc791\uc5c5, \uace0\uc815\ub41c \uaddc\uce59, \uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \uacb0\uacfc<\/h3><\/header><div class=\"s-body\"><div class=\"s-grid\"><div class=\"s-stat\"><span>\ucf54\ub371\uc2a4<\/span><strong>gpt-5.6-sol<\/strong><small>\uc911\uac04 T1\u2013T3 \u00b7 \ub192\uc74c T4<\/small><\/div><div class=\"s-stat\"><span>\ud074\ub85c\ub4dc \ucf54\ub4dc<\/span><strong>\ud074\ub85c\ub4dc-\uc624\ud478\uc2a4-5<\/strong><small>\ud558\uc704 \uc5d0\uc774\uc804\ud2b8 \ub300\uccb4 \ubc29\uc548 \uacf5\uac1c<\/small><\/div><\/div><table><tbody><tr><th>\uacbd\uae30 \uc77c\uc815<\/th><td>\uaddc\ubaa8\uac00 \uc791\uace0 \ud45c\uc900 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub9cc \ud3ec\ud568\ub41c Python \uc800\uc7a5\uc18c<\/td><\/tr><tr><th>\ub7f0 \ub8f0<\/th><td>\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \uacb0\uacfc\ub97c \uc720\uc9c0\ud558\uba70, \ud488\uc9c8 \uc7ac\uc2e4\ud589\uc740 \uae08\uc9c0\ub429\ub2c8\ub2e4.<\/td><\/tr><tr><th>\uc548\uc804<\/th><td>\uc0c8 \ubcf5\uc0ac\ubcf8, \uc624\ud504\ub77c\uc778 \uc791\uc5c5, \ud504\ub85c\ub355\uc158 \ud658\uacbd \uc811\uadfc \ubd88\uac00, \ud478\uc2dc \ub610\ub294 \ubc30\ud3ec \uc5c6\uc74c<\/td><\/tr><tr><th>\uc810\uc218<\/th><td>\uace0\uc815\ub41c 100\uc810 \ub9cc\uc810 \ud3c9\uac00 \uae30\uc900\ud45c \ubc0f \ub3c5\ub9bd\uc801\uc778 \uacf5\uac1c\/\ube44\uacf5\uac1c \uc810\uac80<\/td><\/tr><\/tbody><\/table><\/div><\/aside>\n\n\n\n<p class=\"wp-block-paragraph\">Codex\ub294 \uc6d0\uc2dc JSONL\uc744 \uc0ac\uc6a9\ud558\uc5ec \uaca9\ub9ac\ub41c CLI \ud504\ub85c\uc138\uc2a4\ub97c \uc2e4\ud589\ud588\uc73c\uba70, CLI\uc5d0\uc11c \uc0dd\uc131\ub41c \ud1a0\ud070 \ud544\ub4dc\ub294 \uadf8\ub300\ub85c \uc720\uc9c0\ud588\uc2b5\ub2c8\ub2e4. \ub3d9\ub8cc\uc758 Claude CLI OAuth \uc138\uc158\uc774 \ub9cc\ub8cc\ub418\uc5c8\uae30 \ub54c\ubb38\uc5d0, Claude Code\ub294 \uc0c8\ub85c\uc6b4 \uc11c\ube0c\uc5d0\uc774\uc804\ud2b8 \ucee8\ud14d\uc2a4\ud2b8\ub97c \uac00\uc9c4 \ucf54\ub514\ub124\uc774\ud130\ub97c \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. \uc6b0\ub9ac\ub294 \uae68\ub057\ud55c \uac10\uc0ac \uc0ac\ubcf8\uc5d0\uc11c Claude\uc758 \ud328\uce58\ub97c \uc7ac\uad6c\uc131\ud55c \ud6c4, \uacf5\uac1c \ubc0f \uc228\uaca8\uc9c4 \uac80\uc0ac\ub97c \ub2e4\uc2dc \uc2e4\ud589\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc2e0\ub8b0\ud560 \uc218 \uc788\ub294 \uc2e4\uc9c8\uc801\uc778 \uc99d\uac70\ub97c \ud655\ubcf4\ud560 \uc218 \uc788\uc5c8\uc73c\ub098, \uc644\uc804\ud788 \ub3d9\uc77c\ud55c \uaca9\ub9ac \ud658\uacbd\uc774\ub098 \ubaa8\ub378 \uc81c\uc5b4 \ud45c\uba74\uc740 \ud655\ubcf4\ud558\uc9c0 \ubabb\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\uc791\uc5c5<\/th><th>\ucf54\ub371\uc2a4<\/th><th>\ud074\ub85c\ub4dc \ucf54\ub4dc<\/th><th>\uc720\uacc4 \ud574\uc11d<\/th><\/tr><\/thead><tbody><tr><td>T1: \uc800\uc7a5\uc18c \uc774\ud574<\/td><td>20\/20<\/td><td>20\/20<\/td><td>\ub3d9\uc810: \uac04\uacb0\ud55c \uc811\uadfc\ubc95 \ub300 \ucca0\uc800\ud55c \uc811\uadfc\ubc95<\/td><\/tr><tr><td>T2: \ub2e4\uc911 \ud30c\uc77c \uae30\ub2a5<\/td><td>30\/30<\/td><td>30\/30<\/td><td>\uae30\ub2a5\uc801 \uc5f0\uacc4; \uc11c\ub85c \ub2e4\ub978 \uac80\uc99d \ubc0f \ud14c\uc2a4\ud2b8 \ubc94\uc704<\/td><\/tr><tr><td>T3: DST \uc218\ub9ac<\/td><td>30\/30<\/td><td>30\/30<\/td><td>\ub458 \ub2e4 \ud1b5\uacfc\ud588\uc2b5\ub2c8\ub2e4. \uc881\uc740 \ud328\uce58 \ub300 \ub113\uc740 \uac00\uc7a5\uc790\ub9ac \ucee4\ubc84\ub9ac\uc9c0<\/td><\/tr><tr><td>T4: \uc810\uac80 \ubc0f \uc218\ub9ac<\/td><td>18\/20<\/td><td>19\/20<\/td><td>Claude \ucf54\ub4dc\ub294 \uac80\ud1a0 \ubc94\uc704\uac00 \ub354 \ub113\uc740 \uac83\uc73c\ub85c \ub098\ud0c0\ub0ac\ub2e4<\/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\">\ud1b5\uc81c\ub41c \uc2dc\ud5d8 \u00b7 \uace0\uc815\ub41c \ud3c9\uac00 \uae30\uc900<\/p><h3>\ucf54\ub371\uc2a4 98\/100 \ub300 Claude \ucf54\ub4dc 99\/100<\/h3><p class=\"s-sub\">1\uc810 \ucc28\uc774\ub294 \ubcf4\ud3b8\uc801\uc778 \uc2b9\ub9ac \uc2e0\ud638\uac00 \uc544\ub2d9\ub2c8\ub2e4. \uc720\uc6a9\ud55c \ucc28\uc774\ub294 \uacfc\uc81c\uc5d0 \ub530\ub77c \ub2e4\ub985\ub2c8\ub2e4.<\/p><\/header><div class=\"s-body\"><div class=\"s-grid\"><div class=\"s-stat\"><span>\ucf54\ub371\uc2a4<\/span><strong>98\/100<\/strong><\/div><div class=\"s-stat\"><span>\ud074\ub85c\ub4dc \ucf54\ub4dc<\/span><strong>99\/100<\/strong><\/div><\/div><table><thead><tr><th>\uc758\uc0ac\uacb0\uc815 \uc601\uc5ed<\/th><th>\uad00\uce21\ub41c \uacb0\uacfc<\/th><th>\uc2e4\uc6a9\uc801\uc778 \uc77d\uae30<\/th><\/tr><\/thead><tbody><tr><td>\uc800\uc7a5\uc18c \uc774\ud574<\/td><td>\ubb34\uc2b9\ubd80 \u00b7 \uac01 20\/20<\/td><td>Claude\ub294 \ub354 \uc0c1\uc138\ud588\uace0, Codex\ub294 \ub354 \uac04\uacb0\ud588\ub2e4.<\/td><\/tr><tr><td>\ub2e4\uc911 \ud30c\uc77c \uae30\ub2a5<\/td><td>\ubb34\uc2b9\ubd80 \u00b7 \uac01 30\/30<\/td><td>\ub458 \ub2e4 \ube44\uacf5\uac1c \uac80\uc0ac\ub97c \ud1b5\uacfc\ud588\uc73c\uba70, Claude\ub294 \ub354 \uad11\ubc94\uc704\ud55c \ud14c\uc2a4\ud2b8\ub97c \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4.<\/td><\/tr><tr><td>\uc77c\uad11\uc808\uc57d\uc2dc\uac04\uc81c(DST) \uc624\ub958 \uc218\uc815<\/td><td>\ubb34\uc2b9\ubd80 \u00b7 \uac01 30\/30<\/td><td>Claude\ub294 \ub354 \ub9ce\uc740 \uac00\uc7a5\uc790\ub9ac\ub97c \ub36e\uc5c8\uace0, Codex\ub294 \ub354 \uc881\uc740 \ud328\uce58\ub97c \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/td><\/tr><tr><td>\uc810\uac80 \ubc0f \uc218\ub9ac<\/td><td>Claude 19\/20; \ucf54\ub371\uc2a4 18\/20<\/td><td>Claude\uc5d0\uc11c\ub294 \uc7ac\ud604\uc131\uc774 \ub354 \ub192\uc740 \uacb0\ud568\uc774 \ubc1c\uacac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/td><\/tr><tr><td>\uce21\uc815\ub41c \uc18d\ub3c4<\/td><td>\ud63c\ud569<\/td><td>Claude\uac00 T1\/T2\ub97c \uc774\ub04c\uc5c8\uace0, Codex\uac00 T3\/T4\ub97c \uc774\ub04c\uc5c8\ub2e4.<\/td><\/tr><\/tbody><\/table><p class=\"s-note\"><strong>\uacf5\uac1c \uc0ac\ud56d:<\/strong> \ud504\ub85c\u30f3\u30d7\ud2b8\uc640 \ud53c\ucc98\ub294 \ub3d9\uc77c\ud558\uc9c0\ub9cc, \uaca9\ub9ac \uacbd\ub85c\ub294 \ub2e4\ub985\ub2c8\ub2e4. \uc774 \uc18c\uaddc\ubaa8 \ud14c\uc2a4\ud2b8 \uacb0\uacfc\ub97c \ubaa8\ub4e0 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac, \ubaa8\ub378 \uacc4\uce35 \ub610\ub294 \uc790\uc728 \uc138\uc158\uc5d0 \uc77c\ubc18\ud654\ud574\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.<\/p><\/div><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc740 \uaddc\ubaa8\uac00 \ub108\ubb34 \uc791\uc544 \ub300\uaddc\ubaa8 \uc800\uc7a5\uc18c, \ubaa8\ub4e0 \uc5b8\uc5b4, \ubaa8\ub4e0 \ubaa8\ub378 \uacc4\uce35 \ub610\ub294 \uc7a5\uc2dc\uac04\uc758 \uc790\uc728 \uc2e4\ud589 \uc138\uc158\uc5d0 \ub300\ud55c \uc131\ub2a5\uc744 \ud3c9\uac00\ud558\uae30\uc5d0\ub294 \ud55c\uacc4\uac00 \uc788\uc2b5\ub2c8\ub2e4. \ucd1d \uc810\uc218 \ucc28\uac00 1\uc810\uc778 \uacb0\uacfc\ub294 \u201c\ub450 \uac00\uc9c0 \ubaa8\ub450 \uc131\uacf5\ud588\uc73c\ub098 \uac80\ud1a0 \ubc94\uc704\uc5d0 \ucc28\uc774\uac00 \uc788\ub2e4\u2019\ub294 \uc758\ubbf8\ub85c \ud574\uc11d\ud558\ub294 \uac83\uc774 \uac00\uc7a5 \uc801\uc808\ud558\uba70, \uc774\ub97c \ubcf4\ud3b8\uc801\uc778 \uc21c\uc704 \ud3c9\uac00\ub85c \ubcf4\uc544\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 id=\"user-experience\" class=\"wp-block-heading\">\uc2e4\uc81c \uc0ac\uc6a9\uc790\ub4e4\uc758 \ud6c4\uae30\u2014\uadf8\ub9ac\uace0 \uc774\ub97c \uc5bc\ub9c8\ub098 \uc2e0\ub8b0\ud574\uc57c \ud560\uae4c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ucee4\ubba4\ub2c8\ud2f0 \ud53c\ub4dc\ubc31\uc740 \ud504\ub85c\uc81d\ud2b8, \uc791\uc5c5, \ubaa8\ub378, \ub178\ub825 \uc218\uc900, \uae30\uac04 \ub4f1\uc758 \uc815\ubcf4\uac00 \ud3ec\ud568\ub420 \ub54c \uac00\uce58\uac00 \uc788\uc2b5\ub2c8\ub2e4. \ubc18\uba74, \ub2e8\uc21c\ud788 \ud2b9\uc815 \uc81c\ud488\uc774 \u201c\ub354 \ub611\ub611\ud574 \ubcf4\uc778\ub2e4\u201d\uac70\ub098 \u201c\ud6e8\uc52c \ube60\ub974\ub2e4\u201d\ub294 \ub0b4\uc6a9\ub9cc \ub2f4\uc740 \uac8c\uc2dc\ubb3c\uc740 \uc124\ub4dd\ub825\uc774 \ub5a8\uc5b4\uc9d1\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\ub9c8\ub2e4 \ube44\uad50\ud558\ub294 \ub300\uc0c1(\ub9ac\ud3ec\uc9c0\ud1a0\ub9ac, \uad6c\ub3c5 \ub4f1\uae09, \ud504\ub86c\ud504\ud2b8, \ud655\uc7a5 \uae30\ub2a5, \uac10\ub3c5 \uc218\uc900 \ub4f1)\uc774 \ub2e4\ub974\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704\uc758 \ub808\ub527 \uc0ac\ub840\ub97c \ud1b5\ud574 \ubcfc \ub54c, \uc0c1\ud638\uc791\uc6a9\uc5d0\ub294 \uc0c1\ucda9 \uad00\uacc4\uac00 \uc874\uc7ac\ud568\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc989, \ube60\ub974\uace0 \ub300\ud654\ud615\uc778 \ubc29\uc2dd\uc740 \ub354 \ub9ce\uc740 \uc8fc\uc758\ub97c \uc694\uad6c\ud560 \uc218 \uc788\ub294 \ubc18\uba74, \uc2e0\uc911\ud558\uac8c \uc2e4\ud589\ud558\ub294 \ubc29\uc2dd\uc740 \ub354 \ub290\ub9ac\uac8c \ub290\uaef4\uc9c8 \uc218 \uc788\uc9c0\ub9cc \uc218\uc815\ud560 \ubd80\ubd84\uc774 \uc801\uc2b5\ub2c8\ub2e4. \uc6b0\ub9ac\uc758 \ud1b5\uc81c\ub41c \ud14c\uc2a4\ud2b8\ub294 \ud574\ub2f9 \uacc4\uc815\uc758 \uc0ac\ub840\uc640 \ubd80\ubd84\uc801\uc73c\ub85c\ub9cc \uacb9\uce69\ub2c8\ub2e4. \uc774 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub294 \uc720\ud6a8\ud55c \uc2e4\ud589\uc5d0\uc11c \uc18d\ub3c4\uac00 \uc81c\uac01\uac01\uc774\uc5c8\uace0 \uc0ac\ub78c\uc758 \uac1c\uc785\uc774 \uc804\ud600 \uc5c6\uc5c8\uae30 \ub54c\ubb38\uc5d0, \u2018\uc9c0\uc18d\uc801\uc778 \uad00\ub9ac\u2019 \uc8fc\uc7a5\uc744 \uc785\uc99d\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ubc14\ub85c \uc774 \ub54c\ubb38\uc5d0 \ucee4\ubba4\ub2c8\ud2f0 \uc99d\uac70\uc640 \ud1b5\uc81c\ub41c \uc99d\uac70\ub294 \uc11c\ub85c \ud63c\ud569\ud558\uc9c0 \uc54a\uace0 \ud568\uaed8 \uc81c\uc2dc\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">X \ud558\ub124\uc2a4\uc5d0 \ub300\ud55c \ub17c\ud3c9\uc740 \ub450 \ubc88\uc9f8\ub85c \uc720\uc6a9\ud55c \uc810\uc744 \uc9c0\uc801\ud569\ub2c8\ub2e4. \uc989, \ucf54\ub529 \uacb0\uacfc\ub294 \ub2e8\uc21c\ud788 \ubaa8\ub378 \ub808\uc774\ube14\uc5d0\ub9cc \uad6d\ud55c\ub41c \uac83\uc774 \uc544\ub2c8\ub77c \uc804\uccb4 \uc2dc\uc2a4\ud15c\uc5d0 \uc18d\ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \ub450 \uac8c\uc2dc\ubb3c \ubaa8\ub450 \uc124\ubb38\uc870\uc0ac \ub370\uc774\ud130\ub85c \ucde8\uae09\ub418\uc5b4\uc11c\ub294 \uc548 \ub429\ub2c8\ub2e4. \uc774 \uac8c\uc2dc\ubb3c\ub4e4\uc744 \ud65c\uc6a9\ud558\uc5ec \uc790\uc2e0\uc758 \uc2e4\ud5d8\uc5d0\uc11c \ub2e4\ub8f0 \uc9c8\ubb38\ub4e4\u2014\uac1c\uc785 \ud69f\uc218, \ucc28\uc774 \ud06c\uae30, \ud14c\uc2a4\ud2b8 \ud488\uc9c8, \uc798\ubabb\ub41c \uac00\uc815\uc73c\ub85c\ubd80\ud130\uc758 \ud68c\ubcf5 \ub4f1\u2014\uc744 \ud30c\uc545\ud558\uc2ed\uc2dc\uc624.<\/p>\n\n\n\n<h2 id=\"globalgpt\" class=\"wp-block-heading\">Codex \ubc0f Claude \ucf54\ub4dc\ub97c GlobalGPT\ub85c \ud655\uc7a5\ud558\uae30<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT\ub294 <a href=\"https:\/\/www.glbgpt.com\/hub\/best-all-in-one-ai-tools-and-platforms-11-options-compared\/\">\ub2e4\uc911 \ubaa8\ub378, \ub2e4\uc911 \ubaa8\ub2ec \uc791\uc5c5 \uacf5\uac04<\/a>, \ub124\uc774\ud2f0\ube0c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc5d0\uc774\uc804\ud2b8\ub97c \ub300\uccb4\ud558\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uc774 \ub3c4\uad6c\uc758 \uc2e4\uc9c8\uc801\uc778 \uc5ed\ud560\uc740 \uae30\uc874 \ud638\uc2a4\ud2b8 \uae30\ub2a5\uc744 \ud655\uc7a5\ud558\ub294 \ub370 \uc788\uc2b5\ub2c8\ub2e4. \uc989, Codex\ub098 Claude Code\uac00 \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc811\uadfc, \uc178 \uba85\ub839\uc5b4, \ud14c\uc2a4\ud2b8 \ubc0f \uc2b9\uc778 \uc5c5\ubb34\ub97c \uacc4\uc18d \ub2f4\ub2f9\ud558\ub294 \ub3d9\uc548, \uc81c2\uc758 \uc758\uacac \uc218\ub834, \uacc4\ud68d \uac80\ud1a0, \ubb38\uc11c \uac80\ud1a0 \ub610\ub294 \ud2b9\uc218\ud55c \ucd9c\ub825 \ucc98\ub9ac\ub97c \uc704\ud574 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ub2e4\ub978 \uc5d0\uc774\uc804\ud2b8 \ubaa8\ub378\uc744 \ud65c\uc6a9\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT\ub294 \ub2e4\uc74c\uc744 \uc704\ud55c \uacf5\uc2dd CLI \uac00\uc774\ub4dc\ub97c \ubc1c\ud589\ud569\ub2c8\ub2e4. <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-globalgpt-cli-in-codex\/\">\ucf54\ub371\uc2a4<\/a> \uadf8\ub9ac\uace0 <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-globalgpt-cli-in-claude-code\/\">\ud074\ub85c\ub4dc \ucf54\ub4dc<\/a>, \uadf8\ub9ac\uace0 Cursor\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\uc785\ub2c8\ub2e4. \uc548\uc804\ud55c T5 \ud1b5\ud569 \ud14c\uc2a4\ud2b8\uc5d0\uc11c CLI\ub294 \ub450 \ube44\uad50 \ub300\uc0c1 \ud658\uacbd \ubaa8\ub450\uc5d0\uc11c \ub3d9\uc77c\ud55c \uc815\uc9c0\ub41c \uc791\uc5c5\uc744 \uc644\ub8cc\ud588\uc2b5\ub2c8\ub2e4. \ub610\ud55c Codex\uc5d0\uc11c\ub294 \uc77d\uae30 \uc804\uc6a9 MCP \ubaa8\ub378 \ubaa9\ub85d \ud638\ucd9c\uc744 \uac80\uc99d\ud588\uc73c\uba70, GlobalGPT \uc2a4\ud0ac\uc744 \uc124\uce58, \ub85c\ub4dc \ubc0f \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4.<\/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 \ud1b5\ud569 \u00b7 \ucc44\uc810 \uc810\uc218\uc5d0\uc11c \uc81c\uc678\ub428<\/p><h3>\ub450 \uc6cc\ud06c\ud50c\ub85c\uc6b0 \ubaa8\ub450\uc5d0\uc11c CLI\uac00 \uac80\uc99d\ub418\uc5c8\uc73c\uba70, Codex\uc5d0\uc11c MCP\uc640 Skill\uc774 \uac80\uc99d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/h3><p class=\"s-sub\">\uc774\ub294 \ud1b5\ud569 \uacbd\ub85c\ub97c \uce21\uc815\ud558\ub294 \uac83\uc774\uc9c0, GlobalGPT\uac00 \ub450 \uac00\uc9c0 \uace0\uc720 \ucf54\ub529 \uc778\uc790 \uc911 \ud558\ub098\ub97c \ub300\uccb4\ud558\ub294\uc9c0 \uc5ec\ubd80\ub97c \uce21\uc815\ud558\ub294 \uac83\uc774 \uc544\ub2d9\ub2c8\ub2e4.<\/p><\/header><div class=\"s-body\"><table><thead><tr><th>\uacbd\ub85c<\/th><th>\ucf54\ub371\uc2a4 \ud658\uacbd<\/th><th>Claude \ub3d9\ub8cc \ub2ec\ub9ac\uae30 \ud589\uc0ac<\/th><\/tr><\/thead><tbody><tr><td>GlobalGPT CLI<\/td><td>gpt-5.6-sol \ubc0f gpt-5.6-luna\ub85c \uac80\uc99d\ub428<\/td><td>\ub3d9\uc77c\ud55c \ub3d9\uacb0\ub41c \uc791\uc5c5\uc73c\ub85c \uac80\uc99d\ub428<\/td><\/tr><tr><td>MCP<\/td><td>\uc0c1\ud638\uc791\uc6a9\uc774 \uac00\ub2a5\ud55c \uc77d\uae30 \uc804\uc6a9 \ubaa8\ub378 \ubaa9\ub85d\uc774 \uac80\uc99d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/td><td>\uc2e4\ud589 \uc911\uc5d0\ub294 \uc5f0\uacb0\ub418\uc9c0 \uc54a\uc74c<\/td><\/tr><tr><td>\uae30\uc220<\/td><td>\uc124\uce58, \ub85c\ub529 \ubc0f \ud14c\uc2a4\ud2b8 \uc644\ub8cc<\/td><td>\uc124\uce58\ub418\uc5c8\uc73c\ub098 \ud1b5\ud654 \uc911\ub2e8 \uc2dc\uc5d0\ub294 \uc0ac\uc6a9\ub418\uc9c0 \uc54a\uc74c<\/td><\/tr><tr><td>\ubb34\uc778 MCP<\/td><td>\uc2b9\uc778 \uc81c\ud55c \uc0ac\ud56d \ud655\uc778\ub428<\/td><td>\ud14c\uc2a4\ud2b8\ub418\uc9c0 \uc54a\uc74c<\/td><\/tr><\/tbody><\/table><details><summary>\ud1b5\ud569 \uad00\ub828 \uc99d\uac70 \uc804\uccb4 \ubcf4\uae30<\/summary><pre># GlobalGPT \ud1b5\ud569 \ud14c\uc2a4\ud2b8 \uc694\uc57d\n\n# # \ubc94\uc704\n\nT5\ub294 GlobalGPT \ud1b5\ud569\uc744 \uce21\uc815\ud558\uba70, \ub124\uc774\ud2f0\ube0c Codex \ucf54\ub529 \uc810\uc218\uc5d0\uc11c\ub294 \uc81c\uc678\ub429\ub2c8\ub2e4. Yukie\ub294 \uc0ac\uc6a9\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\n\n## \ubaa8\ub378 \uc7a0\uae08 \ubc0f \uc900\ube44 \uc0c1\ud0dc\n\n- \ubaa8\ub378 A: `gpt-5.6-sol`\n- \ubaa8\ub378 B: `gpt-5.6-luna`\n- \ub450 \ubaa8\ub378 \ubaa8\ub450 \ub77c\uc774\ube0c \ubaa8\ub378 \ubaa9\ub85d\uc5d0 \ud45c\uc2dc\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n- \ub450 \uacbd\ub7c9 \uc900\ube44\ub3c4 \ud504\ub85c\ube0c \ubaa8\ub450 \uc720\ud6a8\ud558\uace0 \uad6c\ubb38 \ubd84\uc11d \uac00\ub2a5\ud55c \ud14d\uc2a4\ud2b8\ub97c \ubc18\ud658\ud588\uc2b5\ub2c8\ub2e4.\n- \ubaa8\ub378\uc740 \uacf5\uc2dd T5A \ubc0f T5B \ucd9c\ub825 \ud638\ucd9c \uc804\uc5d0 \uc7a0\uae08 \ucc98\ub9ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n## \uacf5\uc2dd CLI \uacb0\uacfc\n\n| \uc791\uc5c5 | \ubaa8\ub378 | \uc0c1\ud0dc | \uc18c\uc694 \uc2dc\uac04 | \ud504\ub86c\ud504\ud2b8 \ud1a0\ud070 \uc218 | \uc644\uc131 \ud1a0\ud070 \uc218 | \ud544\uc218 \uc81c\ubaa9 \uc218 |\n|---|---|---|---:|---:|---:|---:|\n| T5A | gpt-5.6-sol | \uc720\ud6a8 | 27\ucd08 | 2,116 | 1,207 | 6\/6 |\n| T5B | gpt-5.6-luna | \uc720\ud6a8 | 14\ucd08 | 2,116 | 1,441 | 6\/6 |\n\n\ub450 \uacf5\uc2dd \ud638\ucd9c \ubaa8\ub450 `glbgpt exec`\ub97c \ud1b5\ud574 \ub3d9\uc77c\ud55c \uace0\uc815\ub41c \uc601\uc5b4 \uc81c\ud488 \uae30\ud68d \uacfc\uc81c\ub97c \uc0ac\uc6a9\ud588\uc73c\uba70, \uc601\uc5b4\ub85c\ub9cc \ud45c\uc2dc\ub418\ub294 \ucd9c\ub825\uc744 \ubc18\ud658\ud588\uace0, \uc5b4\ub5a0\ud55c \uc778\uc99d \uc815\ubcf4\ub3c4 \ub178\ucd9c\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ud488\uc9c8 \uc7ac\uc2e4\ud589\uc740 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\n\n## MCP \uacb0\uacfc\n\n- `codex mcp list` \uba85\ub839\uc5b4 \uc2e4\ud589 \uacb0\uacfc `globalgpt`\uac00 \ud65c\uc131\ud654\ub41c \uac83\uc73c\ub85c \ub098\ud0c0\ub0ac\uc2b5\ub2c8\ub2e4.\n- \ube44\uc0c1\ud638\uc791\uc6a9\ud615 Codex \uc138\uc158\uc5d0\uc11c `mcp__globalgpt__glbgpt_list_models`\ub97c \ud0d0\uc9c0\ud558\uace0 \ud638\ucd9c\uc744 \uc2dc\ub3c4\ud588\uc73c\ub098, \ubb34\uc778 MCP \uc2b9\uc778\uc774 \ubd88\uac00\ub2a5\ud558\uc5ec \ud638\ucd9c\uc774 \ucde8\uc18c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc548\uc804 \uc124\uc815\uc740 \uc644\ud654\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\n- \ud65c\uc131 \ub300\ud654\ud615 Codex \uc138\uc158\uc740 \ub3d9\uc77c\ud55c \uc77d\uae30 \uc804\uc6a9 GlobalGPT MCP \ub3c4\uad6c\ub97c \uc131\uacf5\uc801\uc73c\ub85c \ud638\ucd9c\ud558\uc5ec 9\uac1c\uc758 \ucc44\ud305 \ubaa8\ub378\uc744 \uc218\uc2e0\ud588\uc2b5\ub2c8\ub2e4.\n- \uacb0\uacfc: \ub300\ud654\ud615 MCP \uc561\uc138\uc2a4\ub294 \ud655\uc778\ub418\uc5c8\uc73c\uba70, \ubb34\uc778 \ube44\ub300\ud654\ud615 MCP \uc2e4\ud589\uc5d0\ub294 \uc5ec\uc804\ud788 \uc2b9\uc778 \uc81c\ud55c\uc774 \uc801\uc6a9\ub429\ub2c8\ub2e4.\n\n## \uc2a4\ud0ac \uacb0\uacfc\n\n- GlobalGPT \ubc0f GlobalGPT \ucf54\ub529 \uc2a4\ud0ac\uc740 \ubc88\ub4e4\ub41c CLI \uc2a4\ud0ac \ud328\ud0a4\uc9c0\uc5d0 \ub300\ud55c \ub9c1\ud06c\ub97c \ud1b5\ud574 Codex \uc2a4\ud0ac \ub514\ub809\ud130\ub9ac\uc5d0 \uc124\uce58\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n- GlobalGPT \uc2a4\ud0ac\uc744 \ub85c\ub4dc\ud558\uc5ec \uad6c\uc131 \uc138\uc158 \ud655\uc778, \ub77c\uc774\ube0c \ubaa8\ub378 \uc120\ud0dd, \uc900\ube44 \uc0c1\ud0dc, \uc2e0\uc6a9 \uc548\uc804 \uc635\uc158 \ubc0f \uc624\ub958 \ucc98\ub9ac\ub97c \uc218\ud589\ud588\uc2b5\ub2c8\ub2e4.\n- \uacb0\uacfc: \ud65c\uc131 Codex \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc5d0 \uc124\uce58 \ubc0f \uc2e4\ud589\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n## \uc81c\ud55c\uc801 \uacb0\ub860\n\n\uc774\ubc88 \uc2e4\ud589\uc744 \ud1b5\ud574 \uc815\uc0c1 \uc791\ub3d9\ud558\ub294 GlobalGPT CLI \ud638\ucd9c, Codex\uc5d0\uc11c \uc218\ud589\ub41c \ub300\ud654\ud615 GlobalGPT MCP \uc77d\uae30 \uc804\uc6a9 \ud638\ucd9c, \uadf8\ub9ac\uace0 \uc124\uce58 \ubc0f \uc0ac\uc6a9\ub41c GlobalGPT \uc2a4\ud0ac \uacbd\ub85c\uac00 \uac80\uc99d\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ub294 \ubaa8\ub4e0 \ubaa8\ub378, \ubbf8\ub514\uc5b4 \ub3c4\uad6c, \ud638\uc2a4\ud2b8, \uacc4\uc815 \ub610\ub294 \ubb34\uc778 MCP \uad6c\uc131\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc791\ub3d9\ud568\uc744 \uc785\uc99d\ud558\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4. \ub610\ud55c Yukie\ub97c \ud14c\uc2a4\ud2b8\ud558\uc9c0 \uc54a\uc73c\uba70, GlobalGPT\uac00 Codex \ub610\ub294 Claude Code\ub97c \ub300\uccb4\ud55c\ub2e4\ub294 \uc8fc\uc7a5\uc744 \ub4b7\ubc1b\uce68\ud558\uc9c0\ub3c4 \uc54a\uc2b5\ub2c8\ub2e4.\n<\/pre><\/details><p class=\"s-note\">\uac80\uc99d \ubc94\uc704: \ud2b9\uc815 CLI \ud638\ucd9c, \ub300\ud654\ud615 MCP \uc77d\uae30 1\ud68c, \uc124\uce58\/\uc0ac\uc6a9\ub41c \uc2a4\ud0ac \uacbd\ub85c 1\uac1c. \uc774\ub294 \ubaa8\ub4e0 \ubaa8\ub378, \ubbf8\ub514\uc5b4 \ub3c4\uad6c, \ud638\uc2a4\ud2b8 \ub610\ub294 \ubb34\uc778 \uad6c\uc131\uc744 \uc785\uc99d\ud558\ub294 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4.<\/p><\/div><\/article>\n\n\n\n<p class=\"wp-block-paragraph\">\uacbd\uacc4\uac00 \uc911\uc694\ud569\ub2c8\ub2e4. \ub3d9\ub8cc\uac00 \uc218\ud589\ud55c Claude \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub294 Claude \uce21 MCP\uac00 \uc544\ub2cc CLI \uacbd\ub85c\uac00 \ud655\uc778\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud574\ub2f9 \uc2a4\ud0ac\uc740 \uadf8\uacf3\uc5d0 \uc124\uce58\ub418\uc5b4 \uc788\uc5c8\uc9c0\ub9cc, \uc911\ub2e8\ub41c \ud1b5\ud654\uc5d0\ub294 \uc0ac\uc6a9\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ubb34\uc778 Codex MCP \uc2e4\ud589 \uc2dc\ub3c4\uc5d0\ub3c4 \uc5ec\uc804\ud788 \uc218\ub3d9 \uc2b9\uc778\uc774 \ud544\uc694\ud588\uc2b5\ub2c8\ub2e4. \ubaa8\ub378 \uac00\uc6a9\uc131\uacfc \ud06c\ub808\ub527\uc740 \ud604\uc7ac GlobalGPT \uc694\uae08\uc81c\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\ubbc0\ub85c, \uac1c\ubc1c\uc790\ub294 \ubaa8\ub4e0 \ubaa8\ub378\uc774 \ud3ec\ud568\ub418\uc5b4 \uc788\ub2e4\uace0 \uac00\uc815\ud558\uae30\ubcf4\ub2e4\ub294 \uc2e4\uc81c \uc81c\uacf5 \ubaa9\ub85d\uc744 \ud655\uc778\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT\ub294 \uc774\ubbf8\uc9c0, \ub3d9\uc601\uc0c1, \uc624\ub514\uc624 \ubc0f \uc548\ub0b4\ud615 \uc5d0\uc774\uc804\ud2b8 \uc6cc\ud06c\ud50c\ub85c\uc6b0\ub3c4 \ub2e4\ub8f9\ub2c8\ub2e4. Yukie\uc758 \u2018\uc2ac\ub77c\uc774\ub4dc\u2019, \u2018\ubb38\uc11c\u2019, \u2018\uc774\ubbf8\uc9c0\u2019 \ud56d\ubaa9\uc740 \ubcc4\uac1c\uc758 \ubc94\uc8fc\uc5d0 \uc18d\ud569\ub2c8\ub2e4. \uc774 \ud56d\ubaa9\ub4e4\uc740 \ucf54\ub529\uc774 \ud544\uc694 \uc5c6\ub294 \uc791\uc5c5\uc744 \uc704\ud574 \uad6c\uccb4\uc801\uc778 \ud15c\ud50c\ub9bf\uacfc \ub2e8\uacc4\ubcc4 \ube0c\ub77c\uc6b0\uc800 \uac00\uc774\ub4dc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub294 \ud504\ub808\uc820\ud14c\uc774\uc158\uc774\ub098 \uad6c\uc870\ud654\ub41c \ubb38\uc11c\ub97c \ub9cc\ub4e4\uae30 \uc704\ud574 \ucf54\ub529\uc6a9 CLI\ub97c \uc5ec\ub294 \uac83\ubcf4\ub2e4 \ub354 \uc26c\uc6b8 \uc218 \uc788\uc9c0\ub9cc, \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ud655\uc778, \ud14c\uc2a4\ud2b8 \uc2e4\ud589 \ub610\ub294 \ucf54\ub4dc \uac80\ud1a0\ub97c \ub300\uccb4\ud560 \uc218\ub294 \uc5c6\uc2b5\ub2c8\ub2e4.<\/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\">\ub2e4\ub978 \uc6cc\ud06c\ud50c\ub85c \ubc94\uc8fc<\/p><h3>\uc720\ud0a4\uc5d0\uac00 \uc8fc\ub3c4\ud55c \ube0c\ub77c\uc6b0\uc800 \uc5d0\uc774\uc804\ud2b8 \ud14c\uc2a4\ud2b8<\/h3><p class=\"s-sub\">\ud2b9\uc815 \uc791\uc5c5\uc5d0 \ud2b9\ud654\ub41c \uc6f9 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc5d0 \uc720\uc6a9\ud558\uc9c0\ub9cc, \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \ucf54\ub529 \uc5d0\uc774\uc804\ud2b8 \ub300\uccb4 \uc6a9\ub3c4\ub85c\ub294 \ud14c\uc2a4\ud2b8\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.<\/p><\/header><div class=\"s-body\"><table><thead><tr><th>\uc6cc\ud06c\ud50c\ub85c<\/th><th>\uae30\uc900 \ucda9\uc871<\/th><th>\uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c \uacb0\uacfc<\/th><\/tr><\/thead><tbody><tr><td>\uc2ac\ub77c\uc774\ub4dc<\/td><td>5\/6<\/td><td>5\uc7a5\uc758 \uc2ac\ub77c\uc774\ub4dc\ub85c \uad6c\uc131\ub41c \ud504\ub808\uc820\ud14c\uc774\uc158 \uc790\ub8cc\uac00 \uc0dd\uc131\ub418\uc5c8\uc73c\uba70, \ubc1c\ud45c\uc790 \ub178\ud2b8\ub294 \ud655\uc778\ud560 \uc218 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4.<\/td><\/tr><tr><td>\ubb38\uc11c<\/td><td>6\/6<\/td><td>\ub0b4\ubcf4\ub0b4\uae30 \uae30\ub2a5\uacfc \ubc84\uc804 \uc774\ub825\uc774 \ud3ec\ud568\ub41c \uccb4\uacc4\uc801\uc778 \uc5f0\uad6c \uac1c\uc694\uc11c.<\/td><\/tr><tr><td>\uc774\ubbf8\uc9c0 + \uc124\uba85<\/td><td>5\/6<\/td><td>\uac15\ub82c\ud55c \uc0ac\uac01\ud615 \uc774\ubbf8\uc9c0\uac00 \ud45c\uc2dc\ub418\uc5c8\uc73c\ub098, \ud544\uc218 \ucea1\uc158\uc774 \ub204\ub77d\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/td><\/tr><\/tbody><\/table><p class=\"s-note\">\ud0c0\ub2f9\ud55c \uacb0\ub860: \uba85\ud655\ud55c \uc9c4\uc785\uc810\uacfc \uc548\ub0b4\uac00 \uc81c\uacf5\ub418\ub294 \ub2e4\uc911 \ubaa8\ub4dc \uc6cc\ud06c\ud50c\ub85c\uc6b0. \uadfc\uac70\uac00 \ubd80\uc871\ud55c \uacb0\ub860: \ubb34\uc81c\ud55c \uc0ac\uc6a9, \uc815\ud655\ud55c \uac00\uaca9, \ub610\ub294 Codex\/Claude Code\uc758 \uc644\uc804\ud55c \ub300\uccb4.<\/p><\/div><\/article>\n\n\n\n<h2 id=\"which-one\" class=\"wp-block-heading\">\ub3c5\ub9bd \uac1c\ubc1c\uc790\ub294 \uc5b4\ub5a4 \ucf54\ub529 \ub3c4\uad6c\ub97c \uc120\ud0dd\ud574\uc57c \ud560\uae4c\uc694?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\ucf54\ub371\uc2a4 \uc120\ud0dd<\/strong> \ucef4\ud329\ud2b8\ud55c \uc720\uacc4 \uc2e4\ud589, \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ud45c\uba74\uc758 \uc870\ud569, \ub610\ub294 \uc124\uc815\uc5d0\uc11c \uc81c\uacf5\ub418\ub294 \uc2e4\ud589 \uc99d\uac70\uac00 \uc5ec\ub7ec\ubd84\uc758 \uc791\uc5c5 \ubc29\uc2dd\uc5d0 \ubd80\ud569\ud560 \ub54c\uc785\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>Claude \ucf54\ub4dc \uc120\ud0dd<\/strong> \ub300\ud654\ud615 \ud130\ubbf8\ub110 \ub8e8\ud504\uac00 \ubc1c\uc0dd\ud558\uac70\ub098, \uc0ac\uc6a9\uc790\uac00 \ud655\uc778\ud55c \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uae30\ub2a5, \ud639\uc740 \ub2f9\uc0ac\uc758 \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc5d0\uc11c \uad00\ucc30\ub41c \uac83\uacfc \uac19\uc740 \uad11\ubc94\uc704\ud55c \uac80\ud1a0 \ub3d9\uc791\uc774 \ub354 \uc911\uc694\ud574\uc9c8 \ub54c\uc785\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\uc775\uc219\ud558\uc9c0 \uc54a\uc740 \uc800\uc7a5\uc18c\uc5d0\ub294 \ub458 \uc911 \ud558\ub098\ub97c \uc0ac\uc6a9\ud558\uc138\uc694<\/strong> \uc77d\uae30 \uc804\uc6a9 \uc544\ud0a4\ud14d\ucc98 \ubc0f \uc704\ud5d8\uc131 \uac80\ud1a0\ub97c \uac70\uce5c \ud6c4\uc5d0\uc57c \ube44\ub85c\uc18c \uac00\ub2a5\ud588\uc2b5\ub2c8\ub2e4. \ub450 \ub3c4\uad6c \ubaa8\ub450 \ud574\ub2f9 \uc791\uc5c5\uc744 \uc798 \ucc98\ub9ac\ud588\uc2b5\ub2c8\ub2e4.<\/li>\n\n\n\n<li><strong>\ub450 \uac00\uc9c0\ub97c \ubaa8\ub450 \uc801\uc808\ud788 \ud65c\uc6a9\ud558\uc138\uc694<\/strong> \ub450 \ubc88\uc9f8 \uc5d0\uc774\uc804\ud2b8\uc758 \uac80\ud1a0\uac00 \ucd94\uac00 \uad6c\ub3c5 \ube44\uc6a9\uacfc \uc870\uc815 \ube44\uc6a9\uc744 \uac10\uc218\ud560 \ub9cc\ud55c \uac00\uce58\uac00 \uc788\uc744 \ub54c. \ub450 \ubc88\uc9f8 \ub3c4\uad6c\uac00 \uc791\uc5c5\uc744 \ubb34\uc791\uc815 \ubc18\ubcf5\ud558\uae30\ubcf4\ub2e4\ub294 diff\ub098 \uacc4\ud68d\uc744 \uac80\ud1a0\ud558\ub3c4\ub85d \uc694\uccad\ud558\uc2ed\uc2dc\uc624.<\/li>\n\n\n\n<li><strong>GlobalGPT \ucd94\uac00<\/strong> \ub2e4\uc911 \ubaa8\ub378 \ub77c\uc6b0\ud305\uc774\ub098 \ub2e4\uc911 \ubaa8\ub4dc \uc791\uc5c5\uc774 \ub204\ub77d\ub41c \uacc4\uce35\uc778 \uacbd\uc6b0. \ub124\uc774\ud2f0\ube0c \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc791\uc5c5\uc740 \ucf54\ub529 \ud638\uc2a4\ud2b8\uc5d0\uc11c \uc218\ud589\ud558\uc2ed\uc2dc\uc624.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">7\uc77c\uac04\uc758 \uc2dc\ud5d8 \uc6b4\uc601\uc740 \uc21c\uc704\ud45c\ubcf4\ub2e4 \ub354 \ub9ce\uc740 \uc815\ubcf4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc2e4\uc81c \uae30\ub2a5 \uc911(\ub2e8, \ud504\ub85c\ub355\uc158 \ud658\uacbd\uc740 \uc81c\uc678) \ud558\ub098\uc640 \ubc84\uadf8\ub97c \uac01\uac01 \ud558\ub098\uc529 \uace8\ub77c \uac80\ud1a0\ud574 \ubcf4\uc138\uc694. \ud504\ub86c\ud504\ud2b8\uc640 \uc131\uacf5 \uba85\ub839\uc5b4\ub97c \uace0\uc815\ud558\uc138\uc694. \uccab \ubc88\uc9f8 \uc720\ud6a8\ud55c diff, \ud1b5\uacfc\ub41c \ud14c\uc2a4\ud2b8, \uc18c\uc694 \uc2dc\uac04, \uc0ac\ub78c\uc758 \uac1c\uc785, \uc608\uc0c1\uce58 \ubabb\ud55c \ubc94\uc704, \uadf8\ub9ac\uace0 \ud574\ub2f9 \uc791\uc5c5\uc774 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ub9ac\uc18c\uc2a4\uc5d0 \ubbf8\uce5c \uc601\ud5a5\uc744 \uae30\ub85d\ud558\uc138\uc694. \uc2e4\uc218\ub97c \uac10\uc9c0\ud560 \uc218 \uc788\uace0 \uc6cc\ud06c\ud50c\ub85c\ub97c \uc9c0\uc18d\ud560 \uc218 \uc788\ub294 \uc81c\ud488\uc774 \ub354 \ub098\uc740 \uc81c\ud488\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 id=\"faq\" class=\"wp-block-heading\">Codex \ub300 Claude \ucf54\ub4dc FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Codex\uac00 Claude \ucf54\ub4dc\ubcf4\ub2e4 \ub354 \ub098\uc740\uac00\uc694?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc804\ubd80 \uadf8\ub7f0 \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \ub450 \ud504\ub85c\uc81d\ud2b8 \ubaa8\ub450 \uc800\ud76c \ud14c\uc2a4\ud2b8 \ud658\uacbd\uc5d0\uc11c \uc81c\uc2dc\ub41c \ub124 \uac00\uc9c0 \uacfc\uc81c\ub97c \ubaa8\ub450 \uc644\ub8cc\ud588\uc2b5\ub2c8\ub2e4. Claude Code\ub294 \uac80\ud1a0 \ubc94\uc704 \uba74\uc5d0\uc11c \uc55e\uc130\uace0, Codex\ub294 \uad6c\ud604 \ubc0f \ubc84\uadf8 \uc218\uc815 \ubd80\ubd84\uc5d0\uc11c \ub354 \uac04\uacb0\ud55c \ubaa8\uc2b5\uc744 \ubcf4\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub300\uc6a9\ub7c9 \uc800\uc7a5\uc18c\uc758 \uacbd\uc6b0 \uc5b4\ub290 \ucabd\uc774 \ub354 \uc88b\uc744\uae4c\uc694?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc800\ud76c\uc758 \uc791\uc740 \ub3c4\uad6c\ub85c\ub294 \uadf8 \uc9c8\ubb38\uc5d0 \ub2f5\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ubcc0\uacbd\uc744 \ud5c8\uc6a9\ud558\uae30 \uc804\uc5d0, \ubcf8\uc778\uc758 \uc800\uc7a5\uc18c\uc5d0\uc11c \uc77d\uae30 \uc804\uc6a9 \uc544\ud0a4\ud14d\ucc98 \uc791\uc5c5\uc73c\ub85c \ub450 \uac00\uc9c0\ub97c \ubaa8\ub450 \ud3c9\uac00\ud574 \ubcf4\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc5b4\ub5a4 \ucf54\ub529 \uc81c\uc81c\uac00 \uac10\ub3c5\uc774 \ub35c \ud544\uc694\ud55c\uac00\uc694?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub294 \uc791\uc5c5\uc758 \uba85\ud655\uc131, \ubaa8\ub378 \uc124\uc815, \uc800\uc7a5\uc18c \uc9c0\uce68, \uadf8\ub9ac\uace0 \uc6d0\ud558\ub294 \uc0c1\ud638\uc791\uc6a9 \ubc29\uc2dd\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9d1\ub2c8\ub2e4. \ud55c \ub808\ub527 \uc0ac\uc6a9\uc790\uac00 \uc11c\ub85c \ub2e4\ub978 \uac10\ub3c5 \ud328\ud134\uc744 \ubcf4\uace0\ud55c \ubc14 \uc788\uc9c0\ub9cc, \uadf8 \uac1c\uc778\uc758 \uacbd\ud5d8\uc740 \uc81c\ud488 \uc804\ubc18\uc5d0 \uc801\uc6a9\ub418\ub294 \uaddc\uce59\uc740 \uc544\ub2d9\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc5b4\ub290 \ucabd\uc774 \ub354 \uc800\ub834\ud560\uae4c\uc694?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc8fc\uc694 \uc18c\ube44\uc790 \ub4f1\uae09\uc740 \uc6d4 $20, $100, $200\uc73c\ub85c \uad6c\ubd84\ub418\uc9c0\ub9cc, \ud3ec\ud568\ub41c \uc6a9\ub7c9 \ubc0f \ud55c\ub3c4 \uc801\uc6a9 \ubc29\uc2dd\uc740 \uc11c\ub85c \ub2e4\ub985\ub2c8\ub2e4. \uc120\ud0dd\uc801 \ud06c\ub808\ub527\uacfc API \uacfc\uae08\uc740 \ubcc4\ub3c4\ub85c \ucc98\ub9ac\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Claude\uc640 Claude \ucf54\ub4dc \uacf5\uc720\ub294 \uc0ac\uc6a9 \ud55c\ub3c4\uac00 \uc801\uc6a9\ub418\ub098\uc694?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub124. Claude \ubc0f Claude Code\ub294 \uc5f0\uacb0\ub41c Pro \ub610\ub294 Max \uc694\uae08\uc81c\uc5d0\uc11c \uacf5\uc720 \uc138\uc158 \ubc0f \uc8fc\uac04 \ud55c\ub3c4\ub97c \uc801\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Codex\uc758 \ub85c\uceec \uc791\uc5c5\uacfc \ud074\ub77c\uc6b0\ub4dc \uc791\uc5c5\uc740 \uc81c\ud55c\uc744 \uacf5\uc720\ud558\ub098\uc694?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub85c\uceec \uba54\uc2dc\uc9c0\uc640 \ud074\ub77c\uc6b0\ub4dc \ucc44\ud305\uc740 5\uc2dc\uac04\uc758 \uc0ac\uc6a9 \ud55c\ub3c4\uac00 \ub3d9\uc77c\ud558\uac8c \uc801\uc6a9\ub418\uba70, \uc8fc\uac04 \ud55c\ub3c4\uac00 \uc801\uc6a9\ub420 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">GlobalGPT\uac00 Codex\ub098 Claude Code\ub97c \ub300\uccb4\ud560 \uc218 \uc788\ub098\uc694?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc544\ub2d9\ub2c8\ub2e4. \ucd94\uac00 \ubaa8\ub378, CLI, MCP, \uc2a4\ud0ac \ubc0f \ub2e4\uc911 \ubaa8\ub4dc \ub3c4\uad6c\ub97c \ud1b5\ud574 \ub450 \uc6cc\ud06c\ud50c\ub85c\uc6b0 \ubaa8\ub450\ub97c \ud655\uc7a5\ud560 \uc218\ub294 \uc788\uc9c0\ub9cc, \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac \uc811\uadfc \uad8c\ud55c\uacfc \ucf54\ub529 \uc5d0\uc774\uc804\ud2b8\uc758 \ub3d9\uc791\uc740 \ud638\uc2a4\ud2b8 \uce21\uc5d0 \uadf8\ub300\ub85c \uc720\uc9c0\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub450 \uc81c\ud488 \ubaa8\ub450\uc5d0\uc11c GlobalGPT\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub098\uc694?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">GlobalGPT\ub294 \ub450 \uac00\uc9c0 \ubaa8\ub450\uc5d0 \ub300\ud55c \uacf5\uc2dd CLI \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ub2f9\uc0ac\ub294 \ub450 \ud658\uacbd \ubaa8\ub450\uc5d0\uc11c CLI \uc0ac\uc6a9\uc744 \uac80\uc99d\ud588\uc73c\uba70, Codex\uc5d0\uc11c MCP \ubc0f \uc2a4\ud0ac \uc0ac\uc6a9\uc744 \ud655\uc778\ud588\uc2b5\ub2c8\ub2e4. \ub2e8, \ubb34\uc778 MCP\uc758 \uacbd\uc6b0 \uc2b9\uc778 \uc81c\ud55c\uc774 \uc801\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\uac00\uaca9, \uc694\uae08\uc81c \uaddc\uc815, \uc5f0\ub3d9 \uae30\ub2a5 \ubc0f \ucd9c\ucc98 \uc815\ubcf4\ub294 2026\ub144 7\uc6d4\uc5d0 \ud655\uc778\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc81c\ud488 \uc138\ubd80 \uc815\ubcf4\ub294 \ubcc0\uacbd\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/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\">GlobalGPT \uc5f4\uae30<\/a> \uae30\uc874 \ucf54\ub529 \uc6cc\ud06c\ud50c\ub85c\uc6b0\uc5d0 \ub2e4\uc911 \ubaa8\ub378 \ubc0f \ub2e4\uc911 \ubaa8\ub2ec \ub808\uc774\uc5b4\ub97c \ucd94\uac00\ud558\uace0 \uc2f6\ub2e4\uba74.<\/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\/kr\/wp-json\/wp\/v2\/posts\/17342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.glbgpt.com\/kr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.glbgpt.com\/kr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/kr\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/kr\/wp-json\/wp\/v2\/comments?post=17342"}],"version-history":[{"count":2,"href":"https:\/\/wp.glbgpt.com\/kr\/wp-json\/wp\/v2\/posts\/17342\/revisions"}],"predecessor-version":[{"id":17393,"href":"https:\/\/wp.glbgpt.com\/kr\/wp-json\/wp\/v2\/posts\/17342\/revisions\/17393"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/kr\/wp-json\/wp\/v2\/media\/17361"}],"wp:attachment":[{"href":"https:\/\/wp.glbgpt.com\/kr\/wp-json\/wp\/v2\/media?parent=17342"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/kr\/wp-json\/wp\/v2\/categories?post=17342"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/kr\/wp-json\/wp\/v2\/tags?post=17342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}