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","2806","static/chunks/app/tags/page-716f271631f278af.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"] 12:I[57150,[],""] :HL["/_next/static/css/29ff447a95e95257.css","style"] :HL["/_next/static/css/77af622156c5e021.css","style"] 0:{"P":null,"b":"FUTryh0Sm2lrVLTvF5oMH","p":"","c":["","tags","engineering","page","3"],"i":false,"f":[[["",{"children":["tags",{"children":[["tag","engineering","d"],{"children":["page",{"children":[["page","3","d"],{"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":["tags","$Lc",{"children":[["tag","engineering","d"],"$Ld",{"children":["page","$Le",{"children":[["page","3","d"],"$Lf",{"children":["__PAGE__","$L10",{},null,false]},null,false]},null,false]},null,false]},null,false]},null,false],"$L11",false]],"m":"$undefined","G":["$12",[]],"s":false,"S":true} 13: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"] 14: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"] 15:I[9766,[],""] 16:I[98924,[],""] 18:I[24431,[],"OutletBoundary"] 1a:I[15278,[],"AsyncMetadataOutlet"] 1c:I[24431,[],"ViewportBoundary"] 1e:I[24431,[],"MetadataBoundary"] 1f:"$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:["$","$L13",null,{}] 9:["$","$L14",null,{}] a:["$","main",null,{"className":"mb-auto","children":["$","$L15",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L16",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,["$","$L15",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L16",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}] d:["$","$1","c",{"children":[null,["$","$L15",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L16",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}] e:["$","$1","c",{"children":[null,["$","$L15",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L16",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}] f:["$","$1","c",{"children":[null,["$","$L15",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L16",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}] 10:["$","$1","c",{"children":["$L17",null,["$","$L18",null,{"children":["$L19",["$","$L1a",null,{"promise":"$@1b"}]]}]]}] 11:["$","$1","h",{"children":[null,[["$","$L1c",null,{"children":"$L1d"}],null],["$","$L1e",null,{"children":["$","div",null,{"hidden":true,"children":["$","$1f",null,{"fallback":null,"children":"$L20"}]}]}]]}] 21:I[97979,["2619","static/chunks/2619-eccd988d1e161df3.js","6775","static/chunks/6775-3fc538fd0daf2399.js","1929","static/chunks/app/tags/%5Btag%5D/page/%5Bpage%5D/page-f41c4dd79595bb47.js"],"default"] 17:["$","$L21",null,{"posts":[{"title":"在 AI 时代,聚焦一线从业","date":"2026-06-05T00:00:00.000Z","tags":["ai","opinion","engineering","mindset"],"draft":false,"featured":true,"summary":"在 AI 时代,信息数量的增量远大于信息质量的增量。永远聚焦一线从业,坚持实操上手,最小 MVP,避免无效输入。","type":"Blog","readingTime":{"text":"1 min read","minutes":0.22,"time":13200,"words":44},"wordCount":44,"slug":"focus-on-firstline-practice","path":"blog/focus-on-firstline-practice","filePath":"blog/focus-on-firstline-practice.mdx","toc":[],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"在 AI 时代,聚焦一线从业","datePublished":"2026-06-05T00:00:00.000Z","dateModified":"2026-06-05T00:00:00.000Z","description":"在 AI 时代,信息数量的增量远大于信息质量的增量。永远聚焦一线从业,坚持实操上手,最小 MVP,避免无效输入。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/focus-on-firstline-practice"}},{"title":"把 22 篇项目文档蒸馏成一个可进化的全局技能","date":"2026-09-15T00:00:00.000Z","tags":["agent","skill","engineering","knowledge-management"],"draft":false,"summary":"将 22 篇原始复盘文档蒸馏为全局技能 dev-lessons:按领域分文件(LLM 应用、前后端异步、数据库迁移、上游复用、部署环境、协作测试),每条经验附场景标签与溯源字段,并内置进化协议(同问题复现三次升级为元原则、元原则超 15 条强制合并)。","type":"Blog","readingTime":{"text":"3 min read","minutes":2.165,"time":129900,"words":433},"wordCount":433,"slug":"dev-lessons-skill-distillation","path":"blog/dev-lessons-skill-distillation","filePath":"blog/dev-lessons-skill-distillation.mdx","toc":[],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"把 22 篇项目文档蒸馏成一个可进化的全局技能","datePublished":"2026-09-15T00:00:00.000Z","dateModified":"2026-09-15T00:00:00.000Z","description":"将 22 篇原始复盘文档蒸馏为全局技能 dev-lessons:按领域分文件(LLM 应用、前后端异步、数据库迁移、上游复用、部署环境、协作测试),每条经验附场景标签与溯源字段,并内置进化协议(同问题复现三次升级为元原则、元原则超 15 条强制合并)。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/dev-lessons-skill-distillation"}},{"title":"给 119k star 项目提 PR:8 小时从评论到合并的完整复盘","date":"2026-09-15T00:00:00.000Z","tags":["open-source","agent","python","engineering","pr"],"draft":false,"summary":"一次向 MoneyPrinterTurbo(119k+ star)提交 OpenAI 兼容文生图素材源并被合并的完整复盘:占坑式沟通拿到约束、用数据回应\"改动过大\"的顾虑、测试证据链决定合并速度,以及维护者在后续 PR 中指出的付费 API 容错设计缺陷。","type":"Blog","readingTime":{"text":"14 min read","minutes":13.555,"time":813300,"words":2711},"wordCount":2711,"slug":"mpt-pr-1291-contribution-review","path":"blog/mpt-pr-1291-contribution-review","filePath":"blog/mpt-pr-1291-contribution-review.mdx","toc":[{"value":"一、项目概述","url":"#一项目概述","depth":2},{"value":"二、成功经验","url":"#二成功经验","depth":2},{"value":"1. 占坑式沟通——先对齐再动手","url":"#1-占坑式沟通先对齐再动手","depth":3},{"value":"2. 用数据回应\"改动过大\"顾虑","url":"#2-用数据回应改动过大顾虑","depth":3},{"value":"3. 测试证据链决定合并速度","url":"#3-测试证据链决定合并速度","depth":3},{"value":"4. Review 响应:逐条修复 + 一次到位","url":"#4-review-响应逐条修复--一次到位","depth":3},{"value":"5. 技术设计上的克制","url":"#5-技术设计上的克制","depth":3},{"value":"6. 后续 PR #1296:遗留边界闭环(200 伪装内容)","url":"#6-后续-pr-1296遗留边界闭环200-伪装内容","depth":3},{"value":"7. 最有价值的一课:维护者在 #1296 上的深化(commit 428dd4e)","url":"#7-最有价值的一课维护者在-1296-上的深化commit-428dd4e","depth":3},{"value":"8. 事实修正:计费安全先例的归属(防止面试翻车)","url":"#8-事实修正计费安全先例的归属防止面试翻车","depth":3},{"value":"三、踩坑记录与解决方案","url":"#三踩坑记录与解决方案","depth":2},{"value":"1. Streamlit text_area 必须 Ctrl+Enter 提交","url":"#1-streamlit-text_area-必须-ctrlenter-提交","depth":3},{"value":"2. GITHUB_TOKEN 环境变量劫持 gh 认证","url":"#2-github_token-环境变量劫持-gh-认证","depth":3},{"value":"3. Agnes 文生图端点间歇性 503(队列满)","url":"#3-agnes-文生图端点间歇性-503队列满","depth":3},{"value":"4. 千问兼容端点免费额度耗尽","url":"#4-千问兼容端点免费额度耗尽","depth":3},{"value":"5. Windows 下 Python 嵌套引号命令","url":"#5-windows-下-python-嵌套引号命令","depth":3},{"value":"6. Edit 工具字符串匹配失败(行尾空白)","url":"#6-edit-工具字符串匹配失败行尾空白","depth":3},{"value":"7. 测试用 TemporaryDirectory 的作用域陷阱","url":"#7-测试用-temporarydirectory-的作用域陷阱","depth":3},{"value":"8. 测试隔离:本地 config.toml 泄漏进单测","url":"#8-测试隔离本地-configtoml-泄漏进单测","depth":3},{"value":"9. 首次贡献者 fork PR 的 CI 不自动跑","url":"#9-首次贡献者-fork-pr-的-ci-不自动跑","depth":3},{"value":"四、可复用流程资产","url":"#四可复用流程资产","depth":2},{"value":"五、面试叙事素材","url":"#五面试叙事素材","depth":2},{"value":"六、遗留事项","url":"#六遗留事项","depth":2}],"structuredData":{"@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"}},{"title":"如何沉淀 Agent 每次的踩坑经验","date":"2026-09-06T00:00:00.000Z","tags":["agent","dev-lessons","engineering","methodology","knowledge-management"],"draft":false,"summary":"把\"记住教训\"从 agent 的自觉变成基础设施:三层漏斗体系——规则强制捕获(项目级原始档)→ 定期蒸馏(全局技能)→ 协议化进化(活性维护)。","type":"Blog","readingTime":{"text":"5 min read","minutes":4.685,"time":281100,"words":937},"wordCount":937,"slug":"agent-lessons-precipitation","path":"blog/agent-lessons-precipitation","filePath":"blog/agent-lessons-precipitation.mdx","toc":[{"value":"如何沉淀 Agent 每次的踩坑经验","url":"#如何沉淀-agent-每次的踩坑经验","depth":2},{"value":"阶段一:规则驱动,强制捕获(源头)","url":"#阶段一规则驱动强制捕获源头","depth":2},{"value":"阶段二:蒸馏整合,跨项目复用","url":"#阶段二蒸馏整合跨项目复用","depth":2},{"value":"阶段三:进化协议,防止腐烂","url":"#阶段三进化协议防止腐烂","depth":2},{"value":"资产结构","url":"#资产结构","depth":2},{"value":"这套体系的本质","url":"#这套体系的本质","depth":2}],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"如何沉淀 Agent 每次的踩坑经验","datePublished":"2026-09-06T00:00:00.000Z","dateModified":"2026-09-06T00:00:00.000Z","description":"把\"记住教训\"从 agent 的自觉变成基础设施:三层漏斗体系——规则强制捕获(项目级原始档)→ 定期蒸馏(全局技能)→ 协议化进化(活性维护)。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/agent-lessons-precipitation"}},{"title":"我是如何保证 Agent Skill 多而不乱的?","date":"2026-09-06T00:00:00.000Z","tags":["agent","skill","governance","engineering","methodology"],"draft":false,"summary":"700+ Skill 库的四层治理体系:L1 排序层(选得对)、L2 存储管理层(管得住)、L3 分区保护层(改不坏)、L4 自进化层(不腐烂),叠加快慢双路径检索。","type":"Blog","readingTime":{"text":"16 min read","minutes":15.28,"time":916800,"words":3056},"wordCount":3056,"slug":"agent-skill-governance","path":"blog/agent-skill-governance","filePath":"blog/agent-skill-governance.mdx","toc":[{"value":"1. 问题定义","url":"#1-问题定义","depth":2},{"value":"2. 总体架构","url":"#2-总体架构","depth":2},{"value":"3. L1 排序层:多指标综合排序","url":"#3-l1-排序层多指标综合排序","depth":2},{"value":"3.1 为什么必须多指标","url":"#31-为什么必须多指标","depth":3},{"value":"3.2 指标定义","url":"#32-指标定义","depth":3},{"value":"3.3 综合分公式","url":"#33-综合分公式","depth":3},{"value":"3.4 排序结果的用途","url":"#34-排序结果的用途","depth":3},{"value":"4. L2 存储管理层:skills-manager 统一管理","url":"#4-l2-存储管理层skills-manager-统一管理","depth":2},{"value":"4.1 核心原则","url":"#41-核心原则","depth":3},{"value":"4.2 架构","url":"#42-架构","depth":3},{"value":"4.3 元数据模型(DB schema 扩展)","url":"#43-元数据模型db-schema-扩展","depth":3},{"value":"4.4 分类体系","url":"#44-分类体系","depth":3},{"value":"5. L3 分区保护层:可修改区 / 不可修改区","url":"#5-l3-分区保护层可修改区--不可修改区","depth":2},{"value":"5.1 设计动机","url":"#51-设计动机","depth":3},{"value":"5.2 分区定义","url":"#52-分区定义","depth":3},{"value":"5.3 分区规则","url":"#53-分区规则","depth":3},{"value":"5.4 分层的信息学依据","url":"#54-分层的信息学依据","depth":3},{"value":"6. L4 自进化层:使用中持续迭代","url":"#6-l4-自进化层使用中持续迭代","depth":2},{"value":"6.1 进化闭环","url":"#61-进化闭环","depth":3},{"value":"6.2 进化的三类信号","url":"#62-进化的三类信号","depth":3},{"value":"6.3 防退化约束","url":"#63-防退化约束","depth":3},{"value":"7. 检索架构:快慢双路径","url":"#7-检索架构快慢双路径","depth":2},{"value":"7.1 快路径(默认)","url":"#71-快路径默认","depth":3},{"value":"7.2 慢路径(子 agent 兜底检索)","url":"#72-慢路径子-agent-兜底检索","depth":3},{"value":"8. 度量与验收","url":"#8-度量与验收","depth":2},{"value":"9. 设计要点回顾","url":"#9-设计要点回顾","depth":2},{"value":"10. 与现有组件的映射","url":"#10-与现有组件的映射","depth":2}],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"我是如何保证 Agent Skill 多而不乱的?","datePublished":"2026-09-06T00:00:00.000Z","dateModified":"2026-09-06T00:00:00.000Z","description":"700+ Skill 库的四层治理体系:L1 排序层(选得对)、L2 存储管理层(管得住)、L3 分区保护层(改不坏)、L4 自进化层(不腐烂),叠加快慢双路径检索。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/agent-skill-governance"}},{"title":"成本治理:付费 API 的计费安全与双重试状态机设计","date":"2026-09-06T00:00:00.000Z","tags":["engineering","api","cost","retry","billing","architecture"],"draft":false,"summary":"以 OpenAI 文生图 API 为例,解析生成请求与图片下载为什么必须是两个独立重试状态机:关键差异在计费语义——一个是未确认态可能重复扣费,一个是已付费的幂等免费操作。","type":"Blog","readingTime":{"text":"3 min read","minutes":2.94,"time":176400,"words":588},"wordCount":588,"slug":"billing-safety-retry-state-machine","path":"blog/billing-safety-retry-state-machine","filePath":"blog/billing-safety-retry-state-machine.mdx","toc":[{"value":"成本治理:付费 API 的计费安全与双重试状态机设计","url":"#成本治理付费-api-的计费安全与双重试状态机设计","depth":2},{"value":"状态机一:生成请求(_request_openai_image,L1290)","url":"#状态机一生成请求_request_openai_imagel1290","depth":2},{"value":"状态机二:图片下载(_openai_image_download_bytes,L1202)","url":"#状态机二图片下载_openai_image_download_bytesl1202","depth":2},{"value":"为什么必须是两个状态机","url":"#为什么必须是两个状态机","depth":2},{"value":"总结","url":"#总结","depth":2}],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"成本治理:付费 API 的计费安全与双重试状态机设计","datePublished":"2026-09-06T00:00:00.000Z","dateModified":"2026-09-06T00:00:00.000Z","description":"以 OpenAI 文生图 API 为例,解析生成请求与图片下载为什么必须是两个独立重试状态机:关键差异在计费语义——一个是未确认态可能重复扣费,一个是已付费的幂等免费操作。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/billing-safety-retry-state-machine"}},{"title":"如何快速接手一个项目并构建深度项目认知","date":"2026-09-06T00:00:00.000Z","tags":["onboarding","engineering","architecture","methodology","agent"],"draft":false,"summary":"接手陌生项目的四阶段方法论:宏观定向(1-2小时)→ 架构建模(半天)→ 运行验证(半天)→ 持续深化。12 个可执行步骤,配合 agent 技能栈实现认知加速。","type":"Blog","readingTime":{"text":"4 min read","minutes":3.055,"time":183300,"words":611},"wordCount":611,"slug":"onboarding-project-deep-understanding","path":"blog/onboarding-project-deep-understanding","filePath":"blog/onboarding-project-deep-understanding.mdx","toc":[{"value":"如何快速接手一个项目并构建深度项目认知","url":"#如何快速接手一个项目并构建深度项目认知","depth":2},{"value":"阶段一:宏观定向(1-2 小时)","url":"#阶段一宏观定向1-2-小时","depth":2},{"value":"阶段二:架构建模(半天)","url":"#阶段二架构建模半天","depth":2},{"value":"阶段三:运行验证(半天)","url":"#阶段三运行验证半天","depth":2},{"value":"阶段四:持续深化","url":"#阶段四持续深化","depth":2},{"value":"关键原则","url":"#关键原则","depth":2},{"value":"技能栈覆盖","url":"#技能栈覆盖","depth":2}],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"如何快速接手一个项目并构建深度项目认知","datePublished":"2026-09-06T00:00:00.000Z","dateModified":"2026-09-06T00:00:00.000Z","description":"接手陌生项目的四阶段方法论:宏观定向(1-2小时)→ 架构建模(半天)→ 运行验证(半天)→ 持续深化。12 个可执行步骤,配合 agent 技能栈实现认知加速。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/onboarding-project-deep-understanding"}},{"title":"从参考项目移植功能的标准流程","date":"2026-06-20T00:00:00.000Z","tags":["engineering","open-source","python","fastapi","streamlit","workflow","opinion"],"draft":false,"summary":"将参考项目(如 NextChat、web-tools)的功能移植到当前项目的标准流程:从分析参考项目、确认集成范围、数据模型迁移、后端实现、前端实现、端到端验证到提 PR,覆盖 Python/FastAPI + Streamlit 技术栈的完整实践。","type":"Blog","readingTime":{"text":"10 min read","minutes":9.045,"time":542700,"words":1809},"wordCount":1809,"slug":"port-feature-from-reference","path":"blog/port-feature-from-reference","filePath":"blog/port-feature-from-reference.mdx","toc":[{"value":"从参考项目移植功能的标准流程","url":"#从参考项目移植功能的标准流程","depth":2},{"value":"为什么需要标准流程?","url":"#为什么需要标准流程","depth":3},{"value":"标准流程:7 步法","url":"#标准流程7-步法","depth":2},{"value":"步骤 1:分析参考项目","url":"#步骤-1分析参考项目","depth":2},{"value":"步骤 2:确认集成范围(关键!)","url":"#步骤-2确认集成范围关键","depth":2},{"value":"步骤 3:数据模型 + 迁移设计","url":"#步骤-3数据模型--迁移设计","depth":2},{"value":"3.1 新增模型","url":"#31-新增模型","depth":3},{"value":"3.2 迁移脚本","url":"#32-迁移脚本","depth":3},{"value":"3.3 复合索引","url":"#33-复合索引","depth":3},{"value":"步骤 4:后端实现(分层)","url":"#步骤-4后端实现分层","depth":2},{"value":"4.1 Service 层(backend/services/xxx.py)","url":"#41-service-层backendservicesxxxpy","depth":3},{"value":"4.2 Schema 层(schemas.py)","url":"#42-schema-层schemaspy","depth":3},{"value":"4.3 Endpoint 层(main.py)","url":"#43-endpoint-层mainpy","depth":3},{"value":"4.4 启动钩子","url":"#44-启动钩子","depth":3},{"value":"步骤 5:前端实现","url":"#步骤-5前端实现","depth":2},{"value":"5.1 API 客户端(api_client.py)","url":"#51-api-客户端api_clientpy","depth":3},{"value":"5.2 页面实现(app.py)","url":"#52-页面实现apppy","depth":3},{"value":"5.3 UI 交互","url":"#53-ui-交互","depth":3},{"value":"步骤 6:端到端验证","url":"#步骤-6端到端验证","depth":2},{"value":"步骤 7:提 PR","url":"#步骤-7提-pr","depth":2},{"value":"7.1 提交前安全检查","url":"#71-提交前安全检查","depth":3},{"value":"7.2 分支与提交","url":"#72-分支与提交","depth":3},{"value":"7.3 推送与创建 PR","url":"#73-推送与创建-pr","depth":3},{"value":"常见踩坑速查","url":"#常见踩坑速查","depth":2},{"value":"移植决策原则","url":"#移植决策原则","depth":2},{"value":"结语","url":"#结语","depth":2}],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"从参考项目移植功能的标准流程","datePublished":"2026-06-20T00:00:00.000Z","dateModified":"2026-06-20T00:00:00.000Z","description":"将参考项目(如 NextChat、web-tools)的功能移植到当前项目的标准流程:从分析参考项目、确认集成范围、数据模型迁移、后端实现、前端实现、端到端验证到提 PR,覆盖 Python/FastAPI + Streamlit 技术栈的完整实践。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/port-feature-from-reference"}},{"title":"从程序员到初级架构师的思考路径","date":"2026-06-18T00:00:00.000Z","tags":["architecture","engineering","career","opinion","mindset"],"draft":false,"summary":"编程语言只是实现模块功能的方式,而模块功能是整体架构的一部分。理解架构的本质——它是什么、影响了什么、为什么这样设计、遇到了哪些场景和问题——再思考用什么工具解决这些实际问题。当测试通过、功能正常、日志正常,你就已经是一位初级架构师了。","type":"Blog","readingTime":{"text":"6 min read","minutes":5.475,"time":328500,"words":1095},"wordCount":1095,"slug":"from-developer-to-junior-architect","path":"blog/from-developer-to-junior-architect","filePath":"blog/from-developer-to-junior-architect.mdx","toc":[{"value":"从程序员到初级架构师的思考路径","url":"#从程序员到初级架构师的思考路径","depth":2},{"value":"理解架构的本质","url":"#理解架构的本质","depth":3},{"value":"从理解到实践","url":"#从理解到实践","depth":3},{"value":"初级架构师的标准","url":"#初级架构师的标准","depth":3},{"value":"底层设计:为系统膨胀预留空间","url":"#底层设计为系统膨胀预留空间","depth":3}],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"从程序员到初级架构师的思考路径","datePublished":"2026-06-18T00:00:00.000Z","dateModified":"2026-06-18T00:00:00.000Z","description":"编程语言只是实现模块功能的方式,而模块功能是整体架构的一部分。理解架构的本质——它是什么、影响了什么、为什么这样设计、遇到了哪些场景和问题——再思考用什么工具解决这些实际问题。当测试通过、功能正常、日志正常,你就已经是一位初级架构师了。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/from-developer-to-junior-architect"}},{"title":"我建站如何确保数据安全","date":"2026-06-14T00:00:00.000Z","tags":["security","devops","engineering","cloudflare","api","opinion"],"draft":false,"summary":"从独立开发者视角,系统梳理建站全链路数据安全实践:Cloudflare 隧道架构、开发阶段单测与静态扫描、API 六维防护、渗透测试验证、灰度发布与回滚、二阶安全兜底。","type":"Blog","readingTime":{"text":"5 min read","minutes":4.62,"time":277200,"words":924},"wordCount":924,"slug":"building-site-data-security","path":"blog/building-site-data-security","filePath":"blog/building-site-data-security.mdx","toc":[{"value":"我建站如何确保数据安全","url":"#我建站如何确保数据安全","depth":3},{"value":"开发阶段把好第一关","url":"#开发阶段把好第一关","depth":4},{"value":"API 是防护重点","url":"#api-是防护重点","depth":4},{"value":"测试与渗透验证","url":"#测试与渗透验证","depth":4},{"value":"发布与线上不掉链子","url":"#发布与线上不掉链子","depth":4},{"value":"二阶安全补足短板","url":"#二阶安全补足短板","depth":4}],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"我建站如何确保数据安全","datePublished":"2026-06-14T00:00:00.000Z","dateModified":"2026-06-14T00:00:00.000Z","description":"从独立开发者视角,系统梳理建站全链路数据安全实践:Cloudflare 隧道架构、开发阶段单测与静态扫描、API 六维防护、渗透测试验证、灰度发布与回滚、二阶安全兜底。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/building-site-data-security"}},{"title":"Anthropic官方手册:打造AI原生创业公司的核心要点","date":"2026-06-06T00:00:00.000Z","tags":["ai","startup","anthropic","product","engineering","opinion"],"draft":false,"summary":"解读Anthropic官方手册,系统阐述如何从第一天起将AI深度融入验证、构建、运营与积累等各环节,打造真正的AI原生创业公司。","type":"Blog","readingTime":{"text":"4 min read","minutes":3.42,"time":205200,"words":684},"wordCount":684,"slug":"anthropic-ai-native-startup","path":"blog/anthropic-ai-native-startup","filePath":"blog/anthropic-ai-native-startup.mdx","toc":[{"value":"Anthropic官方手册:打造AI原生创业公司的核心要点","url":"#anthropic官方手册打造ai原生创业公司的核心要点","depth":2},{"value":"1. 核心主旨","url":"#1-核心主旨","depth":3},{"value":"2. 关键要点","url":"#2-关键要点","depth":3},{"value":"3. 结论/建议","url":"#3-结论建议","depth":3}],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"Anthropic官方手册:打造AI原生创业公司的核心要点","datePublished":"2026-06-06T00:00:00.000Z","dateModified":"2026-06-06T00:00:00.000Z","description":"解读Anthropic官方手册,系统阐述如何从第一天起将AI深度融入验证、构建、运营与积累等各环节,打造真正的AI原生创业公司。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/anthropic-ai-native-startup"}},{"title":"RAG 链路全解析:从文档入库到混合记忆的实战架构","date":"2026-06-04T00:00:00.000Z","tags":["rag","ai","llm","embedding","chromadb","nodejs","architecture","engineering"],"draft":false,"summary":"详述 RAG(检索增强生成)的完整技术链路,包括文档入库、向量化、召回重排、Prompt 拼接,以及基于 Node.js + ChromaDB + SQLite 的三层混合记忆进阶方案。","type":"Blog","readingTime":{"text":"15 min read","minutes":14.405,"time":864300,"words":2881},"wordCount":2881,"slug":"rag-pipeline-architecture","path":"blog/rag-pipeline-architecture","filePath":"blog/rag-pipeline-architecture.mdx","toc":[{"value":"引言:为什么需要重新思考 RAG?","url":"#引言为什么需要重新思考-rag","depth":2},{"value":"第一部分:基础 RAG 链路回顾","url":"#第一部分基础-rag-链路回顾","depth":2},{"value":"第二部分:三层混合记忆架构","url":"#第二部分三层混合记忆架构","depth":2},{"value":"架构全景图","url":"#架构全景图","depth":3},{"value":"第一层:全量留存(底片层)","url":"#第一层全量留存底片层","depth":3},{"value":"第二层:滚动摘要(摘要层)","url":"#第二层滚动摘要摘要层","depth":3},{"value":"第三层:RAG 记忆(向量层)","url":"#第三层rag-记忆向量层","depth":3},{"value":"第三部分:混合检索策略(三路召回 + RRF)","url":"#第三部分混合检索策略三路召回--rrf","depth":2},{"value":"三路召回通道","url":"#三路召回通道","depth":3},{"value":"RRF 融合排序算法","url":"#rrf-融合排序算法","depth":3},{"value":"第四部分:动态状态引擎(三层 Prompt 叠加)","url":"#第四部分动态状态引擎三层-prompt-叠加","depth":2},{"value":"三层结构详解","url":"#三层结构详解","depth":3},{"value":"情绪状态引擎的实现","url":"#情绪状态引擎的实现","depth":3},{"value":"第五部分:完整技术栈","url":"#第五部分完整技术栈","depth":2},{"value":"后端核心","url":"#后端核心","depth":3},{"value":"AI 与检索层","url":"#ai-与检索层","depth":3},{"value":"数据加密","url":"#数据加密","depth":3},{"value":"第六部分:优化建议与展望","url":"#第六部分优化建议与展望","depth":2},{"value":"1. 向量库的可扩展性","url":"#1-向量库的可扩展性","depth":3},{"value":"2. 重排序层(Reranker)的引入","url":"#2-重排序层reranker的引入","depth":3},{"value":"3. SQLite 性能优化","url":"#3-sqlite-性能优化","depth":3},{"value":"4. 异步写入队列","url":"#4-异步写入队列","depth":3},{"value":"结语","url":"#结语","depth":2}],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"RAG 链路全解析:从文档入库到混合记忆的实战架构","datePublished":"2026-06-04T00:00:00.000Z","dateModified":"2026-06-04T00:00:00.000Z","description":"详述 RAG(检索增强生成)的完整技术链路,包括文档入库、向量化、召回重排、Prompt 拼接,以及基于 Node.js + ChromaDB + SQLite 的三层混合记忆进阶方案。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/rag-pipeline-architecture"}},{"title":"前端工程化:从 Webpack 到 Turbopack 的迁移指南","date":"2026-06-01T00:00:00.000Z","tags":["webpack","turbopack","build-tools","engineering"],"draft":false,"summary":"Next.js 15 默认使用 Turbopack,本文对比 Webpack 和 Turbopack,提供完整的迁移策略和性能数据。","type":"Blog","readingTime":{"text":"3 min read","minutes":2.67,"time":160200,"words":534},"wordCount":534,"slug":"webpack-to-turbopack","path":"blog/webpack-to-turbopack","filePath":"blog/webpack-to-turbopack.mdx","toc":[{"value":"为什么选择 Turbopack?","url":"#为什么选择-turbopack","depth":2},{"value":"迁移步骤","url":"#迁移步骤","depth":2},{"value":"第一步:升级 Next.js","url":"#第一步升级-nextjs","depth":3},{"value":"第二步:启用 Turbopack","url":"#第二步启用-turbopack","depth":3},{"value":"第三步:处理不兼容的配置","url":"#第三步处理不兼容的配置","depth":3},{"value":"第四步:插件迁移","url":"#第四步插件迁移","depth":3},{"value":"CSS 处理演进","url":"#css-处理演进","depth":2},{"value":"渐进式迁移策略","url":"#渐进式迁移策略","depth":2},{"value":"常见问题","url":"#常见问题","depth":2},{"value":"SVG 导入","url":"#svg-导入","depth":3},{"value":"环境变量","url":"#环境变量","depth":3},{"value":"性能对比实测","url":"#性能对比实测","depth":2}],"structuredData":{"@context":"https://schema.org","@type":"BlogPosting","headline":"前端工程化:从 Webpack 到 Turbopack 的迁移指南","datePublished":"2026-06-01T00:00:00.000Z","dateModified":"2026-06-01T00:00:00.000Z","description":"Next.js 15 默认使用 Turbopack,本文对比 Webpack 和 Turbopack,提供完整的迁移策略和性能数据。","image":"/static/images/twitter-card.png","url":"https://techlog-18328.app.workbuddy.host/blog/webpack-to-turbopack"}}],"initialDisplayPosts":["$17:props:posts:10","$17:props:posts:11","$17:props:posts:12"],"pagination":{"currentPage":3,"totalPages":3},"title":"Engineering"}] 1d:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]] 19:null 1b:{"metadata":[["$","title","0",{"children":"TechLog"}],["$","meta","1",{"name":"description","content":"AI Agent 工程化实践复盘:架构设计、容错与可靠性、上下文工程与成本治理。"}],["$","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/tags/engineering/page/3"}],["$","link","5",{"rel":"alternate","type":"application/rss+xml","href":"https://techlog-18328.app.workbuddy.host/feed.xml"}],["$","meta","6",{"property":"og:title","content":"TechLog"}],["$","meta","7",{"property":"og:description","content":"AI Agent 工程化实践复盘:架构设计、容错与可靠性、上下文工程与成本治理。"}],["$","meta","8",{"property":"og:url","content":"https://techlog-18328.app.workbuddy.host/tags/engineering/page/3"}],["$","meta","9",{"property":"og:site_name","content":"TechLog"}],["$","meta","10",{"property":"og:locale","content":"zh_CN"}],["$","meta","11",{"property":"og:image","content":"https://techlog-18328.app.workbuddy.host/static/images/twitter-card.png"}],["$","meta","12",{"property":"og:type","content":"website"}],["$","meta","13",{"name":"twitter:card","content":"summary_large_image"}],["$","meta","14",{"name":"twitter:title","content":"TechLog"}],["$","meta","15",{"name":"twitter:description","content":"AI Agent 工程化实践复盘:架构设计、容错与可靠性、上下文工程与成本治理。"}],["$","meta","16",{"name":"twitter:image","content":"https://techlog-18328.app.workbuddy.host/static/images/twitter-card.png"}]],"error":null,"digest":"$undefined"} 20:"$1b:metadata"