1:"$Sreact.fragment" 2:I[56271,["2545","static/chunks/c16f53c3-391a1f5a73546b11.js","2619","static/chunks/2619-eccd988d1e161df3.js","3353","static/chunks/3353-35c19838f8cf7b3b.js","7177","static/chunks/app/layout-cb4429a7e3e88a9f.js"],"ThemeProviders"] 3:I[41402,["2545","static/chunks/c16f53c3-391a1f5a73546b11.js","2619","static/chunks/2619-eccd988d1e161df3.js","3353","static/chunks/3353-35c19838f8cf7b3b.js","7177","static/chunks/app/layout-cb4429a7e3e88a9f.js"],""] 4:I[91367,["2545","static/chunks/c16f53c3-391a1f5a73546b11.js","2619","static/chunks/2619-eccd988d1e161df3.js","3353","static/chunks/3353-35c19838f8cf7b3b.js","7177","static/chunks/app/layout-cb4429a7e3e88a9f.js"],"KBarSearchProvider"] 5:I[52619,["2619","static/chunks/2619-eccd988d1e161df3.js","1356","static/chunks/1356-354ecf51aaaf5203.js","6909","static/chunks/app/blog/%5B...slug%5D/page-d416e20a09ba8ecb.js"],""] 6:I[51350,["2545","static/chunks/c16f53c3-391a1f5a73546b11.js","2619","static/chunks/2619-eccd988d1e161df3.js","3353","static/chunks/3353-35c19838f8cf7b3b.js","7177","static/chunks/app/layout-cb4429a7e3e88a9f.js"],"KBarButton"] 10:I[57150,[],""] :HL["/_next/static/css/29ff447a95e95257.css","style"] :HL["/_next/static/css/77af622156c5e021.css","style"] :HL["/_next/static/css/ddf3d904beac0ed7.css","style"] 0:{"P":null,"b":"FUTryh0Sm2lrVLTvF5oMH","p":"","c":["","blog","mpt-pr-1291-contribution-review"],"i":false,"f":[[["",{"children":["blog",{"children":[["slug","mpt-pr-1291-contribution-review","c"],{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/29ff447a95e95257.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/77af622156c5e021.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"zh-cn","className":"scroll-smooth","suppressHydrationWarning":true,"children":[["$","link",null,{"rel":"apple-touch-icon","sizes":"76x76","href":"/static/favicons/apple-touch-icon.png"}],["$","link",null,{"rel":"icon","type":"image/png","sizes":"32x32","href":"/static/favicons/favicon-32x32.png"}],["$","link",null,{"rel":"icon","type":"image/png","sizes":"16x16","href":"/static/favicons/favicon-16x16.png"}],["$","link",null,{"rel":"manifest","href":"/static/favicons/site.webmanifest"}],["$","link",null,{"rel":"mask-icon","href":"/static/favicons/safari-pinned-tab.svg","color":"#5bbad5"}],["$","meta",null,{"name":"msapplication-TileColor","content":"#4f46e5"}],["$","meta",null,{"name":"theme-color","media":"(prefers-color-scheme: light)","content":"#ffffff"}],["$","meta",null,{"name":"theme-color","media":"(prefers-color-scheme: dark)","content":"#0f172a"}],["$","link",null,{"rel":"alternate","type":"application/rss+xml","href":"/feed.xml"}],["$","body",null,{"className":"bg-white pl-[calc(100vw-100%)] text-black antialiased dark:bg-gray-950 dark:text-white","children":["$","$L2",null,{"children":[["$undefined","$undefined","$undefined",["$","$L3",null,{"async":true,"defer":true,"src":"https://analytics.umami.is/script.js"}],"$undefined","$undefined"],["$","section",null,{"className":"mx-auto max-w-3xl px-4 sm:px-6 xl:max-w-5xl xl:px-0","children":[["$","$L4",null,{"kbarConfig":{"searchDocumentsPath":"/search.json"},"children":[["$","header",null,{"className":"flex items-center w-full bg-white dark:bg-gray-950 justify-between py-10","children":[["$","$L5",null,{"className":"break-words","href":"/","aria-label":"TechLog","children":["$","div",null,{"className":"flex items-center justify-between","children":[["$","div",null,{"className":"mr-3","children":["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","xmlnsXlink":"http://www.w3.org/1999/xlink","width":53.87,"height":43.61,"viewBox":"344.564 330.278 111.737 91.218","children":[["$","defs",null,{"children":[["$","linearGradient",null,{"id":"logo_svg__b","x1":420.97,"x2":420.97,"y1":331.28,"y2":418.5,"gradientUnits":"userSpaceOnUse","children":[["$","stop",null,{"offset":"0%","style":{"stopColor":"#06b6d4","stopOpacity":1}}],["$","stop",null,{"offset":"100%","style":{"stopColor":"#67e8f9","stopOpacity":1}}]]}],["$","linearGradient",null,{"id":"logo_svg__d","x1":377.89,"x2":377.89,"y1":331.28,"y2":418.5,"gradientUnits":"userSpaceOnUse","children":[["$","stop",null,{"offset":"0%","style":{"stopColor":"#06b6d4","stopOpacity":1}}],["$","stop",null,{"offset":"100%","style":{"stopColor":"#67e8f9","stopOpacity":1}}]]}],["$","path",null,{"id":"logo_svg__a","d":"M453.3 331.28v28.57l-64.66 58.65v-30.08z"}],["$","path",null,{"id":"logo_svg__c","d":"M410.23 331.28v28.57l-64.67 58.65v-30.08z"}]]}],["$","use",null,{"xlinkHref":"#logo_svg__a","fill":"url(#logo_svg__b)"}],["$","use",null,{"xlinkHref":"#logo_svg__c","fill":"url(#logo_svg__d)"}]]}]}],["$","div",null,{"className":"hidden h-6 text-2xl font-semibold sm:block","children":"TechLog"}]]}]}],["$","div",null,{"className":"flex items-center space-x-4 leading-5 sm:-mr-6 sm:space-x-6","children":[["$","div",null,{"className":"no-scrollbar hidden max-w-40 items-center gap-x-4 overflow-x-auto sm:flex md:max-w-72 lg:max-w-96","children":[["$","$L5","博客",{"className":"hover:text-primary-500 dark:hover:text-primary-400 m-1 font-medium text-gray-900 dark:text-gray-100","href":"/blog.html","children":"博客"}],["$","$L5","标签",{"className":"hover:text-primary-500 dark:hover:text-primary-400 m-1 font-medium text-gray-900 dark:text-gray-100","href":"/tags.html","children":"标签"}],["$","$L5","项目",{"className":"hover:text-primary-500 dark:hover:text-primary-400 m-1 font-medium text-gray-900 dark:text-gray-100","href":"/projects.html","children":"项目"}],["$","$L5","关于",{"className":"hover:text-primary-500 dark:hover:text-primary-400 m-1 font-medium text-gray-900 dark:text-gray-100","href":"/about.html","children":"关于"}]]}],["$","$L6",null,{"aria-label":"Search","children":"$L7"}],"$L8","$L9"]}]]}],"$La"]}],"$Lb"]}]]}]}]]}]]}],{"children":["blog","$Lc",{"children":[["slug","mpt-pr-1291-contribution-review","c"],"$Ld",{"children":["__PAGE__","$Le",{},null,false]},null,false]},null,false]},null,false],"$Lf",false]],"m":"$undefined","G":["$10",[]],"s":false,"S":true} 11:I[49217,["2545","static/chunks/c16f53c3-391a1f5a73546b11.js","2619","static/chunks/2619-eccd988d1e161df3.js","3353","static/chunks/3353-35c19838f8cf7b3b.js","7177","static/chunks/app/layout-cb4429a7e3e88a9f.js"],"default"] 12:I[394,["2545","static/chunks/c16f53c3-391a1f5a73546b11.js","2619","static/chunks/2619-eccd988d1e161df3.js","3353","static/chunks/3353-35c19838f8cf7b3b.js","7177","static/chunks/app/layout-cb4429a7e3e88a9f.js"],"default"] 13:I[9766,[],""] 14:I[98924,[],""] 16:I[24431,[],"OutletBoundary"] 18:I[15278,[],"AsyncMetadataOutlet"] 1a:I[24431,[],"ViewportBoundary"] 1c:I[24431,[],"MetadataBoundary"] 1d:"$Sreact.suspense" 7:["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","fill":"none","viewBox":"0 0 24 24","strokeWidth":1.5,"stroke":"currentColor","className":"hover:text-primary-500 dark:hover:text-primary-400 h-6 w-6 text-gray-900 dark:text-gray-100","children":["$","path",null,{"strokeLinecap":"round","strokeLinejoin":"round","d":"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z"}]}] 8:["$","$L11",null,{}] 9:["$","$L12",null,{}] a:["$","main",null,{"className":"mb-auto","children":["$","$L13",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L14",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","div",null,{"className":"flex flex-col items-start justify-start md:mt-24 md:flex-row md:items-center md:justify-center md:space-x-6","children":[["$","div",null,{"className":"space-x-2 pt-6 pb-8 md:space-y-5","children":["$","h1",null,{"className":"text-6xl leading-9 font-extrabold tracking-tight text-gray-900 md:border-r-2 md:px-6 md:text-8xl md:leading-14 dark:text-gray-100","children":"404"}]}],["$","div",null,{"className":"max-w-md","children":[["$","p",null,{"className":"mb-4 text-xl leading-normal font-bold md:text-2xl","children":"Sorry we couldn't find this page."}],["$","p",null,{"className":"mb-8","children":"But dont worry, you can find plenty of other things on our homepage."}],["$","$L5",null,{"className":"focus:shadow-outline-blue inline rounded-lg border border-transparent bg-blue-600 px-4 py-2 text-sm leading-5 font-medium text-white shadow-xs transition-colors duration-150 hover:bg-blue-700 focus:outline-hidden dark:hover:bg-blue-500","href":"/","children":"Back to homepage"}]]}]]}],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}] b:["$","footer",null,{"children":["$","div",null,{"className":"mt-16 flex flex-col items-center","children":[["$","div",null,{"className":"mb-3 flex space-x-4","children":[["$","a",null,{"className":"text-sm text-gray-500 transition hover:text-gray-600","target":"_blank","rel":"noopener noreferrer","href":"mailto:birenwenmou@qq.com","children":[["$","span",null,{"className":"sr-only","children":"mail"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","viewBox":"0 0 20 20","className":"hover:text-primary-500 dark:hover:text-primary-400 fill-current text-gray-700 dark:text-gray-200 h-6 w-6","children":[["$","title",null,{"children":"Mail"}],["$","path",null,{"d":"M2.003 5.884L10 9.882l7.997-3.998A2 2 0 0016 4H4a2 2 0 00-1.997 1.884z"}],["$","path",null,{"d":"M18 8.118l-8 4-8-4V14a2 2 0 002 2h12a2 2 0 002-2V8.118z"}]]}]]}],["$","a",null,{"className":"text-sm text-gray-500 transition hover:text-gray-600","target":"_blank","rel":"noopener noreferrer","href":"https://github.com/joker1point","children":[["$","span",null,{"className":"sr-only","children":"github"}],["$","svg",null,{"xmlns":"http://www.w3.org/2000/svg","viewBox":"0 0 24 24","className":"hover:text-primary-500 dark:hover:text-primary-400 fill-current text-gray-700 dark:text-gray-200 h-6 w-6","children":[["$","title",null,{"children":"GitHub"}],["$","path",null,{"d":"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"}]]}]]}],null,null,null,null,null,null,null,null,null]}],["$","div",null,{"className":"mb-2 flex space-x-2 text-sm text-gray-500 dark:text-gray-400","children":[["$","div",null,{"children":"眠月"}],["$","div",null,{"children":" • "}],["$","div",null,{"children":"© 2026"}],["$","div",null,{"children":" • "}],["$","$L5",null,{"className":"break-words","href":"/","children":"TechLog"}]]}],["$","div",null,{"className":"mb-8 text-sm text-gray-500 dark:text-gray-400","children":["$","a",null,{"className":"break-words","target":"_blank","rel":"noopener noreferrer","href":"https://github.com/joker1point","children":"GitHub"}]}]]}]}] c:["$","$1","c",{"children":[null,["$","$L13",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L14",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}] d:["$","$1","c",{"children":[null,["$","$L13",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L14",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}] e:["$","$1","c",{"children":["$L15",[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/ddf3d904beac0ed7.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","$L16",null,{"children":["$L17",["$","$L18",null,{"promise":"$@19"}]]}]]}] f:["$","$1","h",{"children":[null,[["$","$L1a",null,{"children":"$L1b"}],null],["$","$L1c",null,{"children":["$","div",null,{"hidden":true,"children":["$","$1d",null,{"fallback":null,"children":"$L1e"}]}]}]]}] 1f:I[62088,["2619","static/chunks/2619-eccd988d1e161df3.js","1356","static/chunks/1356-354ecf51aaaf5203.js","6909","static/chunks/app/blog/%5B...slug%5D/page-d416e20a09ba8ecb.js"],"default"] 20:I[81356,["2619","static/chunks/2619-eccd988d1e161df3.js","1356","static/chunks/1356-354ecf51aaaf5203.js","6909","static/chunks/app/blog/%5B...slug%5D/page-d416e20a09ba8ecb.js"],"Image"] 15:[["$","script",null,{"type":"application/ld+json","dangerouslySetInnerHTML":{"__html":"{\"@context\":\"https://schema.org\",\"@type\":\"BlogPosting\",\"headline\":\"给 119k star 项目提 PR:8 小时从评论到合并的完整复盘\",\"datePublished\":\"2026-09-15T00:00:00.000Z\",\"dateModified\":\"2026-09-15T00:00:00.000Z\",\"description\":\"一次向 MoneyPrinterTurbo(119k+ star)提交 OpenAI 兼容文生图素材源并被合并的完整复盘:占坑式沟通拿到约束、用数据回应\\\"改动过大\\\"的顾虑、测试证据链决定合并速度,以及维护者在后续 PR 中指出的付费 API 容错设计缺陷。\",\"image\":\"/static/images/twitter-card.png\",\"url\":\"https://techlog-18328.app.workbuddy.host/blog/mpt-pr-1291-contribution-review\",\"author\":[{\"@type\":\"Person\",\"name\":\"眠月\"}]}"}}],["$","section",null,{"className":"mx-auto max-w-3xl px-4 sm:px-6 xl:max-w-5xl xl:px-0","children":[["$","$L1f",null,{}],["$","article",null,{"children":["$","div",null,{"className":"xl:divide-y xl:divide-gray-200 xl:dark:divide-gray-700","children":[["$","header",null,{"className":"pt-6 xl:pb-6","children":["$","div",null,{"className":"space-y-1 text-center","children":[["$","dl",null,{"className":"space-y-10","children":[["$","div",null,{"children":[["$","dt",null,{"className":"sr-only","children":"Published on"}],["$","dd",null,{"className":"text-base leading-6 font-medium text-gray-500 dark:text-gray-400","children":["$","time",null,{"dateTime":"2026-09-15T00:00:00.000Z","children":"2026年9月15日星期二"}]}]]}],["$","div",null,{"children":[["$","dt",null,{"className":"sr-only","children":"Word count"}],["$","dd",null,{"className":"text-sm text-gray-400 dark:text-gray-500","children":["2,639"," 字"," · 阅读约 10 分钟"]}]]}]]}],["$","div",null,{"children":["$","h1",null,{"className":"text-3xl leading-9 font-extrabold tracking-tight text-gray-900 sm:text-4xl sm:leading-10 md:text-5xl md:leading-14 dark:text-gray-100","children":"给 119k star 项目提 PR:8 小时从评论到合并的完整复盘"}]}]]}]}],["$","div",null,{"className":"grid-rows-[auto_1fr] divide-y divide-gray-200 pb-8 xl:grid xl:grid-cols-4 xl:gap-x-6 xl:divide-y-0 dark:divide-gray-700","children":[["$","dl",null,{"className":"pt-6 pb-10 xl:border-b xl:border-gray-200 xl:pt-11 xl:dark:border-gray-700","children":[["$","dt",null,{"className":"sr-only","children":"Authors"}],["$","dd",null,{"children":["$","ul",null,{"className":"flex flex-wrap justify-center gap-4 sm:space-x-12 xl:block xl:space-y-8 xl:space-x-0","children":[["$","li","眠月",{"className":"flex items-center space-x-2","children":[["$","$L20",null,{"src":"/static/images/avatar.png","width":38,"height":38,"alt":"avatar","className":"h-10 w-10 rounded-full"}],["$","dl",null,{"className":"text-sm leading-5 font-medium whitespace-nowrap","children":[["$","dt",null,{"className":"sr-only","children":"Name"}],["$","dd",null,{"className":"text-gray-900 dark:text-gray-100","children":"眠月"}],["$","dt",null,{"className":"sr-only","children":"Twitter"}],["$","dd",null,{"children":""}]]}]]}]]}]}]]}],["$","div",null,{"className":"divide-y divide-gray-200 xl:col-span-3 xl:row-span-2 xl:pb-0 dark:divide-gray-700","children":[["$","div",null,{"className":"prose dark:prose-invert max-w-none pt-10 pb-8","children":[["$","blockquote",null,{"children":["$","p",null,{"children":["日期:2026-09-01 | 结果:",["$","strong",null,{"children":"PR 已合并"}],"(merge commit ",["$","code",null,{"children":"131160f"}],") feat/openai-image-material-source → harry0703/MoneyPrinterTurbo main"]}]}],["$","h2",null,{"className":"content-header","id":"一项目概述","children":[["$","a",null,{"className":"break-words","href":"#一项目概述","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"一、项目概述"]}],"$L21","$L22","$L23","$L24","$L25","$L26","$L27","$L28","$L29","$L2a","$L2b","$L2c","$L2d","$L2e","$L2f","$L30","$L31","$L32","$L33","$L34","$L35","$L36","$L37","$L38","$L39","$L3a","$L3b","$L3c","$L3d","$L3e","$L3f","$L40","$L41","$L42","$L43","$L44","$L45","$L46","$L47","$L48","$L49","$L4a","$L4b","$L4c","$L4d","$L4e","$L4f"]}],"$L50","$L51"]}],"$L52"]}]]}]}]]}]] 53:I[16991,["2619","static/chunks/2619-eccd988d1e161df3.js","1356","static/chunks/1356-354ecf51aaaf5203.js","6909","static/chunks/app/blog/%5B...slug%5D/page-d416e20a09ba8ecb.js"],"default"] 54:I[50528,["2619","static/chunks/2619-eccd988d1e161df3.js","1356","static/chunks/1356-354ecf51aaaf5203.js","6909","static/chunks/app/blog/%5B...slug%5D/page-d416e20a09ba8ecb.js"],"default"] 21:["$","p",null,{"children":["为开源项目 MoneyPrinterTurbo(119k+ star、18k+ fork 的 AI 短视频生成器)新增 ",["$","strong",null,{"children":["OpenAI 兼容文生图素材源(",["$","code",null,{"children":"openai_image"}],")"]}],":通过任意 OpenAI 兼容 ",["$","code",null,{"children":"/v1/images/generations"}]," 端点(本地 ComfyUI/SD 网关或云端中转),按脚本关键词逐张生成图片并渲染为带放大效果的视频片段。"]}] 22:["$","p",null,{"children":[["$","strong",null,{"children":"最终数据"}],":21 文件,+1400/−40 行,仅约 40 行触及既有代码;23 个单测;859 全量测试通过;4 次真实端点 e2e;从 Issue 评论到合并耗时约 8 小时。"]}] 23:["$","h2",null,{"className":"content-header","id":"二成功经验","children":[["$","a",null,{"className":"break-words","href":"#二成功经验","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"二、成功经验"]}] 24:["$","h3",null,{"className":"content-header","id":"1-占坑式沟通先对齐再动手","children":[["$","a",null,{"className":"break-words","href":"#1-占坑式沟通先对齐再动手","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"1. 占坑式沟通——先对齐再动手"]}] 25:["$","ul",null,{"children":[["$","li",null,{"children":["在 Issue #1274 下先评论征求维护者意见,",["$","strong",null,{"children":"未写一行代码前"}],"就拿到关键约束:\"愿意接收 PR,但历史同类 PR 改动范围过大难以合并,需完整测试验证后再提交\""]}],["$","li",null,{"children":"这条约束直接决定了后续所有技术决策的基调(diff 聚焦、测试先行)"}]]}] 26:["$","h3",null,{"className":"content-header","id":"2-用数据回应改动过大顾虑","children":[["$","a",null,{"className":"break-words","href":"#2-用数据回应改动过大顾虑","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"2. 用数据回应\"改动过大\"顾虑"]}] 27:["$","ul",null,{"children":[["$","li",null,{"children":["提交前对比仓库",["$","strong",null,{"children":"已合并"}],"的同类 PR:WaveSpeed +1219 行、Seedance +2096 行,本 PR +1400(一半是测试)"]}],["$","li",null,{"children":["关键洞察:维护者说的\"范围过大\"真实含义是",["$","strong",null,{"children":"侵入性"}],"(重写管线),不是行数。本 PR 95% 纯新增,仅 40 行触及既有代码且不改变现有 provider 行为"]}]]}] 28:["$","h3",null,{"className":"content-header","id":"3-测试证据链决定合并速度","children":[["$","a",null,{"className":"break-words","href":"#3-测试证据链决定合并速度","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"3. 测试证据链决定合并速度"]}] 29:["$","ul",null,{"children":[["$","li",null,{"children":["维护者 review 第一轮就说\"我们在本地跑完了全量测试,并通过本地兼容端点验证了图片生成、落盘和 FFmpeg 渲染链路\"——",["$","strong",null,{"children":"他复现了我们的验证路径"}],",这正是快速通过的原因"]}],["$","li",null,{"children":"证据链构成:23 单测(覆盖计费安全/重试/边界)+ 859 全量 + ruff + 4 次真实 e2e(含降级路径)+ local 源回归 + WebUI 浏览器测试"}]]}] 2a:["$","h3",null,{"className":"content-header","id":"4-review-响应逐条修复--一次到位","children":[["$","a",null,{"className":"break-words","href":"#4-review-响应逐条修复--一次到位","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"4. Review 响应:逐条修复 + 一次到位"]}] 2b:["$","p",null,{"children":"维护者 4 条意见全部是真问题,一次 commit 修复完毕:"}] 2c:["$","div",null,{"className":"w-full overflow-x-auto","children":["$","table",null,{"children":[["$","thead",null,{"children":["$","tr",null,{"children":[["$","th",null,{"children":"意见"}],["$","th",null,{"children":"修复"}]]}]}],["$","tbody",null,{"children":[["$","tr",null,{"children":[["$","td",null,{"children":"尺寸直传 1080x1920 被官方 API 400"}],["$","td",null,{"children":["新增 ",["$","code",null,{"children":"openai_image_size"}],",按画幅默认 1024x1536/1536x1024/1024x1024"]}]]}],["$","tr",null,{"children":[["$","td",null,{"children":"POST 超时重试可能重复扣费(原本 WaveSpeed 有相关实现,pr 前看漏了)"}],["$","td",null,{"children":"读超时/连接中断视为\"未确认\"不重试;仅 ConnectTimeout(确定未送达)重试"}]]}],["$","tr",null,{"children":[["$","td",null,{"children":"本地网关不需要 API Key"}],["$","td",null,{"children":"key 允许为空,为空不发 Authorization 头"}]]}],["$","tr",null,{"children":[["$","td",null,{"children":"文生视频未实现不要关 #1274"}],["$","td",null,{"children":"PR 描述 Closes → Partially addresses"}]]}]]}]]}]}] 2d:["$","h3",null,{"className":"content-header","id":"5-技术设计上的克制","children":[["$","a",null,{"className":"break-words","href":"#5-技术设计上的克制","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"5. 技术设计上的克制"]}] 2e:["$","ul",null,{"children":[["$","li",null,{"children":["拒绝\"接 LLM 把关键词改写成英文提示词\"(效果好但引入依赖+成本+范围蔓延),改为轻量的 ",["$","code",null,{"children":"openai_image_prompt_template"}]," 配置(",["$","code",null,{"children":"{term}"}]," 占位符,+23 行)"]}],["$","li",null,{"children":["图片转视频逻辑复用而非重写:从 ",["$","code",null,{"children":"preprocess_video"}]," 抽取 ",["$","code",null,{"children":"render_image_zoom_video()"}]," 共用函数"]}],["$","li",null,{"children":["先用 ",["$","code",null,{"children":"--video-source local"}]," 手动验证管线可行性,再产品化为 provider"]}]]}] 2f:["$","h3",null,{"className":"content-header","id":"6-后续-pr-1296遗留边界闭环200-伪装内容","children":[["$","a",null,{"className":"break-words","href":"#6-后续-pr-1296遗留边界闭环200-伪装内容","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"6. 后续 PR #1296:遗留边界闭环(200 伪装内容)"]}] 30:["$","ul",null,{"children":[["$","li",null,{"children":"主 PR 合并时主动在描述中披露了遗留边界,随后开 Issue #1295 + 修复 PR #1296(+48/−1,2 个新单测)当天合并"}],["$","li",null,{"children":[["$","strong",null,{"children":"从一次性贡献者 → 持续贡献者"}],":8 小时内两个 PR 合并,第二个 PR 从 issue 到合并仅数小时(信任窗口红利)"]}]]}] 31:["$","h3",null,{"className":"content-header","id":"7-最有价值的一课维护者在-1296-上的深化commit-428dd4e","children":[["$","a",null,{"className":"break-words","href":"#7-最有价值的一课维护者在-1296-上的深化commit-428dd4e","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"7. 最有价值的一课:维护者在 #1296 上的深化(commit ",["$","code",null,{"children":"428dd4e"}],")"]}] 32:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"我们的缺陷"}],":修复时 ",["$","code",null,{"children":"except Exception"}]," 一把抓——解码失败和落盘失败都走\"跳过关键词\"。若失败原因是本地环境(磁盘满/权限),循环会为每个关键词继续付费生成→落盘失败→再付费,",["$","strong",null,{"children":"所有付费图片全部丢失"}]]}],["$","li",null,{"children":[["$","strong",null,{"children":"维护者的修复"}],":新建 ",["$","code",null,{"children":"_OpenAIImageDecodeError"}]," 只归入解码失败(远端的错→跳过合理);",["$","code",null,{"children":"image.save"}]," 刻意留在保护区外(本地的错→异常上抛,任务立即止损)"]}],["$","li",null,{"children":[["$","strong",null,{"children":"通用教训(付费 API 容错设计的第二层分类学)"}],":",["$","ul",null,{"children":[["$","li",null,{"children":["第一层(#1291 review 学到):按",["$","strong",null,{"children":"确认状态"}],"分类重试——未确认不重试防重复扣费"]}],["$","li",null,{"children":["第二层(#1296 深化学到):按",["$","strong",null,{"children":"错误归属方"}],"分类降级——远端的错跳过继续,本地的错立即止损"]}],["$","li",null,{"children":[["$","code",null,{"children":"except Exception"}]," 是粒度不足的反面教材:测试能过,但语义边界模糊,付费场景下就是\"烧钱循环\"和\"止损\"的区别"]}]]}]]}],["$","li",null,{"children":"面试可讲:被维护者指出的不是 bug 而是设计粒度,说明这类系统的错误处理需要\"失败语义建模\"思维"}]]}] 33:["$","h3",null,{"className":"content-header","id":"8-事实修正计费安全先例的归属防止面试翻车","children":[["$","a",null,{"className":"break-words","href":"#8-事实修正计费安全先例的归属防止面试翻车","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"8. 事实修正:计费安全先例的归属(防止面试翻车)"]}] 34:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"\"未确认不重发\"不是我们的原创"}],":WaveSpeed 源的贡献者 ichengzeyi 在 ",["$","code",null,{"children":"9a739da"}],"(2026-08-21,早我们十天)已用 ",["$","code",null,{"children":"WaveSpeedUnconfirmedTaskError"}]," 完整实现,且选择最保守的\"abort 整个任务\""]}],["$","li",null,{"children":[["$","strong",null,{"children":"我们的真实增量"}],"(被 review 指出后做的差异化,非照抄):",["$","ul",null,{"children":[["$","li",null,{"children":"按连接阶段细分超时:ConnectTimeout(确定未送达)可安全重试,读超时(未确认)不重试——WaveSpeed 不做此区分"}],["$","li",null,{"children":"降级粒度:跳过关键词继续 vs WaveSpeed 的 abort 全任务。计费论证:不同关键词是独立计费任务,跳过不构成重复扣费"}]]}]]}],["$","li",null,{"children":[["$","strong",null,{"children":"我们的教训"}],":v1 漏复用了同文件里现成的模式(只学了 WaveSpeed 的按需生成流程,漏了提交策略)——",["$","strong",null,{"children":"读参考实现要学到错误处理语义层,不是只抄流程"}]]}],["$","li",null,{"children":[["$","strong",null,{"children":"一个我们比先例松的点"}],":提交 5xx 我们退避重试、WaveSpeed 视为未确认 abort(维护者未 flag,属可辩论边界)"]}],["$","li",null,{"children":[["$","strong",null,{"children":"面试正确姿势"}],":讲\"知道先例、漏过先例、被指出后消化并做出有理由的偏离\",不讲\"首次系统化\"(代码可查证,夸大会翻车)"]}]]}] 35:["$","h2",null,{"className":"content-header","id":"三踩坑记录与解决方案","children":[["$","a",null,{"className":"break-words","href":"#三踩坑记录与解决方案","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"三、踩坑记录与解决方案"]}] 36:["$","h3",null,{"className":"content-header","id":"1-streamlit-text_area-必须-ctrlenter-提交","children":[["$","a",null,{"className":"break-words","href":"#1-streamlit-text_area-必须-ctrlenter-提交","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"1. Streamlit text_area 必须 Ctrl+Enter 提交"]}] 37:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"现象"}],":WebUI 填完\"视频关键词\"点击生成,任务失败在\"生成关键词\"阶段——关键词输入框值为空,系统转而调用 LLM 生成,撞上额度问题"]}],["$","li",null,{"children":[["$","strong",null,{"children":"根因"}],":Streamlit 的 ",["$","code",null,{"children":"st.text_area"}]," 输入后需 ",["$","strong",null,{"children":"Ctrl+Enter"}]," 提交(普通 Enter 只是换行),页面上的 \"Press Ctrl+Enter to apply\" 是唯一提示"]}],["$","li",null,{"children":[["$","strong",null,{"children":"解决"}],":浏览器测试工具用 ",["$","code",null,{"children":"submit: true"}],"(Enter)无效,改 ",["$","code",null,{"children":"press_key(\"Control+Enter\")"}]," 成功"]}],["$","li",null,{"children":[["$","strong",null,{"children":"教训"}],":自动化测试 WebUI 表单时,凡 text_area 都要显式 Ctrl+Enter;用户侧文档/占位符文案最好提示这一点"]}]]}] 38:["$","h3",null,{"className":"content-header","id":"2-github_token-环境变量劫持-gh-认证","children":[["$","a",null,{"className":"break-words","href":"#2-github_token-环境变量劫持-gh-认证","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"2. GITHUB_TOKEN 环境变量劫持 gh 认证"]}] 39:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"现象"}],":",["$","code",null,{"children":"gh auth login"}]," 走不下去,提示 \"The value of the GITHUB_TOKEN environment variable is being used for authentication\""]}],["$","li",null,{"children":[["$","strong",null,{"children":"根因"}],":环境变量里残留一个",["$","strong",null,{"children":"失效的"}]," GITHUB_TOKEN,gh 优先级是环境变量 > keyring 存储"]}],["$","li",null,{"children":[["$","strong",null,{"children":"解决"}],":"]}]]}] 3a:["$","$L53",null,{"className":"language-js","children":["$","code",null,{"className":"language-js code-highlight","children":[["$","span",null,{"className":"code-line","children":[["$","span",null,{"className":"token maybe-class-name","children":"Remove"}],["$","span",null,{"className":"token operator","children":"-"}],["$","span",null,{"className":"token maybe-class-name","children":"Item"}]," ",["$","span",null,{"className":"token maybe-class-name","children":"Env"}],["$","span",null,{"className":"token operator","children":":"}],"\\",["$","span",null,{"className":"token constant","children":"GITHUB_TOKEN"}]," ",["$","span",null,{"className":"token operator","children":"-"}],["$","span",null,{"className":"token maybe-class-name","children":"ErrorAction"}]," ",["$","span",null,{"className":"token maybe-class-name","children":"SilentlyContinue"}],"\n"]}],["$","span",null,{"className":"code-line","children":[["$","span",null,{"className":"token punctuation","children":"["}],["$","span",null,{"className":"token maybe-class-name","children":"Environment"}],["$","span",null,{"className":"token punctuation","children":"]"}],["$","span",null,{"className":"token operator","children":":"}],["$","span",null,{"className":"token operator","children":":"}],["$","span",null,{"className":"token function","children":["$","span",null,{"className":"token maybe-class-name","children":"SetEnvironmentVariable"}]}],["$","span",null,{"className":"token punctuation","children":"("}],["$","span",null,{"className":"token string","children":"\"GITHUB_TOKEN\""}],["$","span",null,{"className":"token punctuation","children":","}]," $",["$","span",null,{"className":"token keyword nil null","children":"null"}],["$","span",null,{"className":"token punctuation","children":","}]," ",["$","span",null,{"className":"token string","children":"\"User\""}],["$","span",null,{"className":"token punctuation","children":")"}],"\n"]}],["$","span",null,{"className":"code-line","children":[["$","span",null,{"className":"token punctuation","children":"["}],["$","span",null,{"className":"token maybe-class-name","children":"Environment"}],["$","span",null,{"className":"token punctuation","children":"]"}],["$","span",null,{"className":"token operator","children":":"}],["$","span",null,{"className":"token operator","children":":"}],["$","span",null,{"className":"token function","children":["$","span",null,{"className":"token maybe-class-name","children":"SetEnvironmentVariable"}]}],["$","span",null,{"className":"token punctuation","children":"("}],["$","span",null,{"className":"token string","children":"\"GITHUB_TOKEN\""}],["$","span",null,{"className":"token punctuation","children":","}]," $",["$","span",null,{"className":"token keyword nil null","children":"null"}],["$","span",null,{"className":"token punctuation","children":","}]," ",["$","span",null,{"className":"token string","children":"\"Machine\""}],["$","span",null,{"className":"token punctuation","children":")"}],"\n"]}],["$","span",null,{"className":"code-line","children":["gh auth login # 之后 gh auth setup",["$","span",null,{"className":"token operator","children":"-"}],"git 配置 git 凭证\n"]}]]}]}] 3b:["$","ul",null,{"children":["$","li",null,{"children":[["$","strong",null,{"children":"教训"}],":gh 排障第一步永远是 ",["$","code",null,{"children":"gh auth status"}]," + 检查 ",["$","code",null,{"children":"$$env:GITHUB_TOKEN"}]]}]}] 3c:["$","h3",null,{"className":"content-header","id":"3-agnes-文生图端点间歇性-503队列满","children":[["$","a",null,{"className":"break-words","href":"#3-agnes-文生图端点间歇性-503队列满","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"3. Agnes 文生图端点间歇性 503(队列满)"]}] 3d:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"现象"}],":同一天可用性约 60~70%,请求随机返回 503 queue full"]}],["$","li",null,{"children":[["$","strong",null,{"children":"应对"}],":这反而成为宝贵的测试素材——真实覆盖了 503 退避重试后恢复、重试耗尽跳过关键词后任务仍正常出片两条降级路径"]}],["$","li",null,{"children":[["$","strong",null,{"children":"教训"}],":不稳定上游不是测试的敌人,是降级路径的免费验收;已在模型调用表.md 标注该端点状态"]}]]}] 3e:["$","h3",null,{"className":"content-header","id":"4-千问兼容端点免费额度耗尽","children":[["$","a",null,{"className":"break-words","href":"#4-千问兼容端点免费额度耗尽","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"4. 千问兼容端点免费额度耗尽"]}] 3f:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"现象"}],":403 ",["$","code",null,{"children":"AllocationQuota.FreeTierOnly"}],",\"仅免费模式\"开关下无法再生成文案/关键词"]}],["$","li",null,{"children":[["$","strong",null,{"children":"教训"}],":长开发日要预留额度或提前关掉免费模式限制;直接手填文案+关键词可绕过(CLI 的 ",["$","code",null,{"children":"--video-script"}]," + ",["$","code",null,{"children":"--video-terms"}],")"]}]]}] 40:["$","h3",null,{"className":"content-header","id":"5-windows-下-python-嵌套引号命令","children":[["$","a",null,{"className":"break-words","href":"#5-windows-下-python-嵌套引号命令","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"5. Windows 下 Python 嵌套引号命令"]}] 41:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"现象"}],":RunCommand 执行 ",["$","code",null,{"children":"python -c \"...\""}]," 内含引号的临时脚本反复语法错误"]}],["$","li",null,{"children":[["$","strong",null,{"children":"解决"}],":改为写临时 .py 文件执行,或用 PowerShell 的单引号包裹 + ",["$","code",null,{"children":"''"}]," 转义"]}],["$","li",null,{"children":[["$","strong",null,{"children":"教训"}],":复杂 Python 代码一律落盘为文件,不要塞 ",["$","code",null,{"children":"-c"}]]}]]}] 42:["$","h3",null,{"className":"content-header","id":"6-edit-工具字符串匹配失败行尾空白","children":[["$","a",null,{"className":"break-words","href":"#6-edit-工具字符串匹配失败行尾空白","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"6. Edit 工具字符串匹配失败(行尾空白)"]}] 43:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"现象"}],":",["$","code",null,{"children":"Edit"}]," 报 \"String to replace not found\",明明代码看起来一样"]}],["$","li",null,{"children":[["$","strong",null,{"children":"根因"}],":目标文件行尾有不可见空白差异"]}],["$","li",null,{"children":[["$","strong",null,{"children":"解决"}],":拆成更小的替换单元;先 Read 精确区域再复制原文"]}],["$","li",null,{"children":[["$","strong",null,{"children":"教训"}],":Edit 前先 Read 目标行,绝不凭记忆构造 old_string"]}]]}] 44:["$","h3",null,{"className":"content-header","id":"7-测试用-temporarydirectory-的作用域陷阱","children":[["$","a",null,{"className":"break-words","href":"#7-测试用-temporarydirectory-的作用域陷阱","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"7. 测试用 TemporaryDirectory 的作用域陷阱"]}] 45:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"现象"}],":3 个单测失败——断言文件存在时文件已消失"]}],["$","li",null,{"children":[["$","strong",null,{"children":"根因"}],":",["$","code",null,{"children":"with TemporaryDirectory()"}]," 块结束后目录被删除,而断言写在了 with 块外(或 mock 的回调延迟到块外才落盘)"]}],["$","li",null,{"children":[["$","strong",null,{"children":"解决"}],":改用 ",["$","code",null,{"children":"tempfile.mkdtemp()"}]," + ",["$","code",null,{"children":"self.addCleanup(shutil.rmtree, ...)"}]]}],["$","li",null,{"children":[["$","strong",null,{"children":"教训"}],":测试夹具的生命周期要覆盖全部断言点"]}]]}] 46:["$","h3",null,{"className":"content-header","id":"8-测试隔离本地-configtoml-泄漏进单测","children":[["$","a",null,{"className":"break-words","href":"#8-测试隔离本地-configtoml-泄漏进单测","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"8. 测试隔离:本地 config.toml 泄漏进单测"]}] 47:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"现象"}],":新增 prompt_template 用例后,其他用例在开发者本机跑失败、CI 跑过"]}],["$","li",null,{"children":[["$","strong",null,{"children":"根因"}],":",["$","code",null,{"children":"config.app"}]," 是动态 dict,本地 config.toml 里配了 ",["$","code",null,{"children":"openai_image_prompt_template"}],",污染了\"默认行为\"用例"]}],["$","li",null,{"children":[["$","strong",null,{"children":"解决"}],":setUp 显式 ",["$","code",null,{"children":"config.app.pop(\"openai_image_prompt_template\", None)"}],"(后同加 ",["$","code",null,{"children":"openai_image_size"}],")"]}],["$","li",null,{"children":[["$","strong",null,{"children":"教训"}],":项目配置是全局可变的,每个用例都要在 setUp 里清洗相关键"]}]]}] 48:["$","h3",null,{"className":"content-header","id":"9-首次贡献者-fork-pr-的-ci-不自动跑","children":[["$","a",null,{"className":"break-words","href":"#9-首次贡献者-fork-pr-的-ci-不自动跑","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"9. 首次贡献者 fork PR 的 CI 不自动跑"]}] 49:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"现象"}],":",["$","code",null,{"children":"gh pr checks"}]," 显示 no checks reported"]}],["$","li",null,{"children":[["$","strong",null,{"children":"根因"}],":GitHub 默认策略,fork PR 的 workflow 需维护者点 \"Approve and run\""]}],["$","li",null,{"children":[["$","strong",null,{"children":"应对"}],":不慌,这不是失败;本地已跑过等价命令(pytest + ruff),CI 只是复验"]}]]}] 4a:["$","h2",null,{"className":"content-header","id":"四可复用流程资产","children":[["$","a",null,{"className":"break-words","href":"#四可复用流程资产","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"四、可复用流程资产"]}] 4b:["$","ul",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"SPEC 文档先行"}],"(",["$","code",null,{"children":"SPEC-openai-image-provider.md"}],"):问题边界、不做什么、成功标准、验证策略全部落纸,review 响应时直接对照"]}],["$","li",null,{"children":[["$","strong",null,{"children":"问题边界模板"}],":核心问题一句话 + 不在范围内的问题 2~3 条(防蔓延)+ 可量化成功标准 + 约束条件"]}],["$","li",null,{"children":[["$","strong",null,{"children":"提交前 checklist"}],":配置文件 key 审计(重复/冲突/泄漏)→ i18n 12 语言 key 一致性 → 代码↔配置↔文案三方拼写一致 → ruff → 全量 pytest → e2e"]}],["$","li",null,{"children":[["$","strong",null,{"children":"e2e 命令模板"}],":",["$","code",null,{"children":"--stop-at materials"}]," 省钱的分阶段调试;",["$","code",null,{"children":"--video-source local"}]," 回归被重构路径"]}]]}] 4c:["$","h2",null,{"className":"content-header","id":"五面试叙事素材","children":[["$","a",null,{"className":"break-words","href":"#五面试叙事素材","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"五、面试叙事素材"]}] 4d:["$","ol",null,{"children":[["$","li",null,{"children":[["$","strong",null,{"children":"完整链路"}],":Issue 识别(高价值、无碰撞)→ 占坑沟通拿约束 → 小步实现 → 数据回应规模顾虑 → 快速 review 响应 → 合并"]}],["$","li",null,{"children":[["$","strong",null,{"children":"计费安全设计"}],":按需生成(累计时长达标即停)、未确认不重试(防重复扣费)、下载失败重试原 URL 不重新生成"]}],["$","li",null,{"children":[["$","strong",null,{"children":"工程判断力"}],":区分\"行数大\"与\"侵入性大\";拒绝 LLM 提示词改写的范围蔓延诱惑;先 local 手动验证再产品化"]}],["$","li",null,{"children":[["$","strong",null,{"children":"量化结果"}],":+1400/−40、23 单测、859 全量、8 小时从评论到合并、上游 119k star 项目主线代码"]}]]}] 4e:["$","h2",null,{"className":"content-header","id":"六遗留事项","children":[["$","a",null,{"className":"break-words","href":"#六遗留事项","aria-hidden":"true","tabIndex":"-1","children":["$","span",null,{"className":"content-header-link","children":["$","svg",null,{"className":"h-5 linkicon w-5","fill":"currentColor","viewBox":"0 0 20 20","xmlns":"http://www.w3.org/2000/svg","children":[["$","path",null,{"d":"M12.232 4.232a2.5 2.5 0 0 1 3.536 3.536l-1.225 1.224a.75.75 0 0 0 1.061 1.06l1.224-1.224a4 4 0 0 0-5.656-5.656l-3 3a4 4 0 0 0 .225 5.865.75.75 0 0 0 .977-1.138 2.5 2.5 0 0 1-.142-3.667l3-3Z"}],["$","path",null,{"d":"M11.603 7.963a.75.75 0 0 0-.977 1.138 2.5 2.5 0 0 1 .142 3.667l-3 3a2.5 2.5 0 0 1-3.536-3.536l1.225-1.224a.75.75 0 0 0-1.061-1.06l-1.224 1.224a4 4 0 1 0 5.656 5.656l3-3a4 4 0 0 0-.225-5.865Z"}]]}]}]}],"六、遗留事项"]}] 4f:["$","ul",null,{"children":[["$","li",null,{"children":"#1274 剩余部分(本地文生视频/图生视频)未实现,PR 标注为部分解决"}],["$","li",null,{"children":"Agnes 端点 503 状态已标注在模型调用表.md"}],["$","li",null,{"children":"8501 端口 WebUI 测试服务如仍在运行需手动停止"}],["$","li",null,{"children":"Fork(joker1point/MoneyPrinterTurbo)建议保留,供后续贡献"}]]}] 50:["$","div",null,{"className":"pt-6 pb-6 text-sm text-gray-700 dark:text-gray-300","children":[["$","a",null,{"className":"break-words","target":"_blank","rel":"nofollow","href":"https://mobile.twitter.com/search?q=https%3A%2F%2Ftechlog-18328.app.workbuddy.host%2Fblog%2Fmpt-pr-1291-contribution-review","children":"Discuss on Twitter"}]," • ",["$","a",null,{"className":"break-words","target":"_blank","rel":"noopener noreferrer","href":"https://github.com/joker1point/techlog/blob/main/data/blog/mpt-pr-1291-contribution-review.mdx","children":"View on GitHub"}]]}] 51:["$","div",null,{"className":"pt-6 pb-6 text-center text-gray-700 dark:text-gray-300","id":"comment","children":["$","$L54",null,{"slug":"mpt-pr-1291-contribution-review"}]}] 52:["$","footer",null,{"children":[["$","div",null,{"className":"divide-gray-200 text-sm leading-5 font-medium xl:col-start-1 xl:row-start-2 xl:divide-y dark:divide-gray-700","children":[["$","div",null,{"className":"py-4 xl:py-8","children":[["$","h2",null,{"className":"text-xs tracking-wide text-gray-500 uppercase dark:text-gray-400","children":"Tags"}],["$","div",null,{"className":"flex flex-wrap","children":[["$","$L5","open-source",{"className":"text-primary-500 hover:text-primary-600 dark:hover:text-primary-400 mr-3 text-sm font-medium uppercase","href":"/tags/open-source.html","children":"open-source"}],["$","$L5","agent",{"className":"text-primary-500 hover:text-primary-600 dark:hover:text-primary-400 mr-3 text-sm font-medium uppercase","href":"/tags/agent.html","children":"agent"}],["$","$L5","python",{"className":"text-primary-500 hover:text-primary-600 dark:hover:text-primary-400 mr-3 text-sm font-medium uppercase","href":"/tags/python.html","children":"python"}],["$","$L5","engineering",{"className":"text-primary-500 hover:text-primary-600 dark:hover:text-primary-400 mr-3 text-sm font-medium uppercase","href":"/tags/engineering.html","children":"engineering"}],["$","$L5","pr",{"className":"text-primary-500 hover:text-primary-600 dark:hover:text-primary-400 mr-3 text-sm font-medium uppercase","href":"/tags/pr.html","children":"pr"}]]}]]}],["$","div",null,{"className":"flex justify-between py-4 xl:block xl:space-y-8 xl:py-8","children":[["$","div",null,{"children":[["$","h2",null,{"className":"text-xs tracking-wide text-gray-500 uppercase dark:text-gray-400","children":"Previous Article"}],["$","div",null,{"className":"text-primary-500 hover:text-primary-600 dark:hover:text-primary-400","children":["$","$L5",null,{"className":"break-words","href":"/blog/rag-vs-agent-retrieval-decision-framework.html","children":"RAG 还必要吗:从 130 条技术评论里提炼出的选型决策框架"}]}]]}],["$","div",null,{"children":[["$","h2",null,{"className":"text-xs tracking-wide text-gray-500 uppercase dark:text-gray-400","children":"Next Article"}],["$","div",null,{"className":"text-primary-500 hover:text-primary-600 dark:hover:text-primary-400","children":["$","$L5",null,{"className":"break-words","href":"/blog/mpt-open-source-contribution-analysis.html","children":"如何给一个陌生开源项目做架构分析,并找到能合进去的贡献点"}]}]]}]]}]]}],["$","div",null,{"className":"pt-4 xl:pt-8","children":["$","$L5",null,{"className":"text-primary-500 hover:text-primary-600 dark:hover:text-primary-400","href":"/blog.html","aria-label":"Back to the blog","children":"← Back to the blog"}]}]]}] 1b:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] 17:null 19:{"metadata":[["$","title","0",{"children":"给 119k star 项目提 PR:8 小时从评论到合并的完整复盘 | TechLog"}],["$","meta","1",{"name":"description","content":"一次向 MoneyPrinterTurbo(119k+ star)提交 OpenAI 兼容文生图素材源并被合并的完整复盘:占坑式沟通拿到约束、用数据回应\"改动过大\"的顾虑、测试证据链决定合并速度,以及维护者在后续 PR 中指出的付费 API 容错设计缺陷。"}],["$","meta","2",{"name":"robots","content":"index, follow"}],["$","meta","3",{"name":"googlebot","content":"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1"}],["$","link","4",{"rel":"canonical","href":"https://techlog-18328.app.workbuddy.host/blog/mpt-pr-1291-contribution-review"}],["$","link","5",{"rel":"alternate","type":"application/rss+xml","href":"https://techlog-18328.app.workbuddy.host/feed.xml"}],["$","meta","6",{"property":"og:title","content":"给 119k star 项目提 PR:8 小时从评论到合并的完整复盘"}],["$","meta","7",{"property":"og:description","content":"一次向 MoneyPrinterTurbo(119k+ star)提交 OpenAI 兼容文生图素材源并被合并的完整复盘:占坑式沟通拿到约束、用数据回应\"改动过大\"的顾虑、测试证据链决定合并速度,以及维护者在后续 PR 中指出的付费 API 容错设计缺陷。"}],["$","meta","8",{"property":"og:url","content":"https://techlog-18328.app.workbuddy.host/blog/mpt-pr-1291-contribution-review"}],["$","meta","9",{"property":"og:site_name","content":"TechLog"}],["$","meta","10",{"property":"og:locale","content":"en_US"}],["$","meta","11",{"property":"og:image","content":"https://techlog-18328.app.workbuddy.host/static/images/twitter-card.png"}],["$","meta","12",{"property":"og:type","content":"article"}],["$","meta","13",{"property":"article:published_time","content":"2026-09-15T00:00:00.000Z"}],["$","meta","14",{"property":"article:modified_time","content":"2026-09-15T00:00:00.000Z"}],["$","meta","15",{"property":"article:author","content":"眠月"}],["$","meta","16",{"name":"twitter:card","content":"summary_large_image"}],["$","meta","17",{"name":"twitter:title","content":"给 119k star 项目提 PR:8 小时从评论到合并的完整复盘"}],["$","meta","18",{"name":"twitter:description","content":"一次向 MoneyPrinterTurbo(119k+ star)提交 OpenAI 兼容文生图素材源并被合并的完整复盘:占坑式沟通拿到约束、用数据回应\"改动过大\"的顾虑、测试证据链决定合并速度,以及维护者在后续 PR 中指出的付费 API 容错设计缺陷。"}],["$","meta","19",{"name":"twitter:image","content":"https://techlog-18328.app.workbuddy.host/static/images/twitter-card.png"}]],"error":null,"digest":"$undefined"} 1e:"$19:metadata"