Farm 项目调试方法论:Root Cause Tracing 根因回溯实战指南
前端构建构建工具开发工具【免费下载链接】farmExtremely fast Vite-compatible web build tool written in Rust项目地址https://gitcode.com/gh_mirrors/fa/farm点击查看免费下载导读在调试复杂构建工具如 Farm 这种以 Rust 为核心、Node.js 为宿主的多语言项目时Bug 往往不在它表现出来的位置而是深藏在调用链的底层——在错误的目录执行了git init、在错误路径创建了文件、用错误路径打开了数据库。本文基于仓库内 .agents/skills/systematic-debugging/root-cause-tracing.md 系统讲解「根因回溯」Root Cause Tracing方法从错误出现的表象出发沿调用链逆向往上追溯直到找到最初的触发源头并在源头修复而非在症状处打补丁。读完你将掌握一套可复制的五步回溯流程、堆栈插桩取证技巧、污染测试二分定位脚本以及多层级防御的落地模式并看到这套方法在 Farm 仓库真实调试记录中的具体应用。一、为什么需要根因回溯Bug 经常在调用栈的深处显现例如在错误的目录里执行了git init、在错误的位置创建了文件、用错误的路径打开了数据库。人的第一反应往往是在错误出现的地方修补它——但这只是在治疗症状。核心原则沿着调用链逆向往回追溯直到找到最初的触发源头然后在源头修复。「在症状处修复」意味着同一个根因还可能经由其他代码路径再次触发问题会以不同的表象反复出现。与之相对的根因回溯要求你回答一个更本质的问题这个错误值到底是从哪里来的这一原则也是 Farm 仓库中 systematic-debugging 技能 的基石。该技能明文规定了「铁律」未完成根因调查之前禁止提出任何修复方案NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST并把「只修症状」定义为失败。二、何时该用根因回溯并非所有问题都需要完整回溯。以下决策图给出了适用条件digraph when_to_use { Bug appears deep in stack? [shapediamond]; Can trace backwards? [shapediamond]; Fix at symptom point [shapebox]; Trace to original trigger [shapebox]; BETTER: Also add defense-in-depth [shapebox]; Bug appears deep in stack? - Can trace backwards? [labelyes]; Can trace backwards? - Trace to original trigger [labelyes]; Can trace backwards? - Fix at symptom point [labelno - dead end]; Trace to original trigger - BETTER: Also add defense-in-depth; }适用场景错误发生在执行链条深处而不是入口点堆栈追踪显示了一条很长的调用链不清楚无效数据最初从何而来需要找出到底是哪个测试 / 哪段代码触发了问题。用 Farm 仓库里的真实案例印证在 docs/experiences/emotion-deadlock-and-test-fixes.md 记录的 emotion 示例构建挂起调查中表象是examples/emotion间歇性构建卡死但根因藏在两层之下——wasmer 全局互斥锁与 cranelift 的 rayon 嵌套调度饿死。该文档的第一条经验教训就是「当某处挂起时先收集堆栈macOSsample、Linuxgdb/perf不要猜测。」这正是根因回溯「先观察、再追溯」的仓库级实践。三、五步回溯流程文档给出了完整的回溯步骤下面逐条展开并补充实操细节。第 1 步观察症状先准确记录错误表象本身不要急着判断它是不是根因Error: git init failed in ~/project/packages/core注意这条错误只告诉你git init失败了并没有告诉你它为什么会在~/project/packages/core执行。Farm 的 E2E 基础设施同样强调这一点e2e/farm-runner.mjs 中监听浏览器console.error与pageerror事件把「控制台报错」当作测试失败信号但 docs/experiences/rust-plugin-worker-e2e-url-mismatch.md 特别警告不要只信response.ok的 200 状态——预览服务器可能对缺失的 worker URL 返回index.html兜底请求返回 200 但内容错误。观察症状时必须连「症状的内容」一起观察而不只是「有没有报错」。第 2 步寻找直接原因问哪段代码直接导致了这个问题await execFileAsync(git, [init], { cwd: projectDir });这一层的价值在于它把「现象」与「第一段责任代码」锚定在一起为后续向上追溯提供起点。第 3 步追问「是谁调用了我」找到直接原因后逐层向上问这段代码是被谁调用的WorktreeManager.createSessionWorktree(projectDir, sessionId) → called by Session.initializeWorkspace() → called by Session.create() → called by test at Project.create()每向上一步就把「错误值」的传递链延长一环。这一步的关键是保持怀疑不要假设调用者传进来的参数一定是合法的。第 4 步继续向上追溯检查传递的值传递进来的值到底是什么projectDir 空字符串空字符串作为cwd会被解析为process.cwd()也就是说git init实际跑在了源码目录里空字符串作为cwd时的语义回退到当前进程工作目录是很多「错误位置写文件 / 建仓库」类 Bug 的共同陷阱。这一点在 Windows 排查文档 docs/experiences/windows-exit-code-0xc0000005-troubleshooting.md 中也有呼应路径字符串在 Windows 上可能包含\、其他平台是/未归一化的路径字符串参与哈希后等价路径会产出不同的入口名——路径值本身的不确定性正是需要向上追溯的典型信号。第 5 步找到最初的触发器空字符串是从哪里来的const context setupCoreTest(); // Returns { tempDir: } Project.create(name, context.tempDir); // Accessed before beforeEach!真相浮出水面顶层变量初始化的时序问题——测试在beforeEach执行之前就访问了context.tempDir此时它还是初始化占位值。根因不是git init的实现而是测试代码的初始化时序。四、手动追溯失败时添加堆栈插桩当调用链太长、无法凭肉眼手动追溯时文档建议主动添加插桩instrumentation。核心手法是在可疑操作之前打印调用栈// Before the problematic operation async function gitInit(directory: string) { const stack new Error().stack; console.error(DEBUG git init:, { directory, cwd: process.cwd(), nodeEnv: process.env.NODE_ENV, stack, }); await execFileAsync(git, [init], { cwd: directory }); }关键点测试里用console.error()而不要用 logger——logger 可能被测试框架静默吞掉。然后运行测试并抓取插桩输出npm test 21 | grep DEBUG git init分析堆栈时重点看三样东西找出测试文件名找到触发该调用的具体行号识别模式是不是同一个测试是不是同一个参数Farm 仓库的 E2E 运行器 e2e/farm-runner.mjs 展示了同类「插桩式」取证思路的工程化形态它在page.on(console)中为每条日志附带url:line:column定位信息把「错误发生在哪一行的哪个文件」直接打进失败消息Browser console error: ... (url:line:column)同时用requestfailed事件记录每个失败请求的 URL 与错误文本。这些都属于在组件边界收集证据的做法与系统化调试技能中「先插桩取证、再分析定位」的 Phase 1 要求一致。五、定位「污染测试」find-polluter.sh 二分脚本当某样东西文件、目录、状态在测试期间出现却不知道是哪个测试制造了它时文档提供了本目录下的二分定位脚本 .agents/skills/systematic-debugging/find-polluter.sh。它的典型用法是./find-polluter.sh .git src/**/*.test.ts即检查的目标是.git目录是否有测试在错误位置创建了 Git 仓库测试文件模式是src/**/*.test.ts。从脚本源码看其定位逻辑是逐个串行执行测试并即时检查污染标志通过find . -path $TEST_PATTERN | sort收集全部测试文件并统计总数依次对每个测试文件执行npm test $TEST_FILE每个测试运行后检查POLLUTION_CHECK如.git是否存在若存在立即输出 FOUND POLLUTER!并打印ls -la细节与继续调查建议npm test file、cat file若所有测试跑完仍未出现污染则输出✅ No polluter found - all tests clean!。脚本还处理了一种特殊情况如果跑某个测试前污染已经存在说明是前序测试制造的则跳过该测试并给出⚠️ Pollution already exists提示。这种「逐测试隔离 即时状态检查」的做法本质上就是根因回溯在测试污染场景下的机械化把「哪个调用者传了坏值」变成「哪个测试先落地了坏状态」。值得说明的是该脚本通过npm test $TEST_FILE串行执行测试适用于中小规模测试集在 Farm 这样拥有数百个示例与 E2E 用例的大型仓库中还可以结合 e2e/process-cleanup.mjs 的「陈旧进程清理」机制默认清理超过 5 分钟的上轮测试遗留进程可用FARM_E2E_STALE_PROCESS_SECONDS调整阈值保证每轮二分测试的隔离性避免上一轮残留的 dev-server、worker 或 Playwright Chromium 进程干扰污染判断。六、实战案例空 projectDir 导致源码目录被建 Git 仓库文档给出了一个完整的五层追溯实例这里完整保留并结构化呈现。症状packages/core/源码目录里出现了.git追溯链git init在process.cwd()下执行 ← 传入的cwd参数为空字符串WorktreeManager收到了空的 projectDirSession.create()把空字符串传了下去测试在beforeEach之前访问了context.tempDirsetupCoreTest()初始返回{ tempDir: }根因顶层变量初始化时访问了尚未就绪的空值修复把tempDir改成 getter若在beforeEach之前被访问则直接抛错——把「时序错误」从静默的空值变成显式的失败。六层之外的第四层纵深防御Defense-in-Depth文档强调找到根因并修复之后还额外加了四层防御让该 Bug 在结构上变得不可能复现第 1 层Project.create()校验目录非空且存在第 2 层WorkspaceManager校验 projectDir 非空第 3 层NODE_ENV守卫——测试环境下拒绝在 tmpdir 之外执行git init第 4 层git init前的堆栈日志插桩。这四层正是 .agents/skills/systematic-debugging/defense-in-depth.md 的完整模式入口校验Entry Point→ 业务逻辑校验Business Logic→ 环境守卫Environment Guards→ 调试插桩Debug Instrumentation。该文档给出的可复制实现如下// Layer 1: 入口点校验——在 API 边界拒绝明显非法的输入 function createProject(name: string, workingDirectory: string) { if (!workingDirectory || workingDirectory.trim() ) { throw new Error(workingDirectory cannot be empty); } if (!existsSync(workingDirectory)) { throw new Error(workingDirectory does not exist: ${workingDirectory}); } if (!statSync(workingDirectory).isDirectory()) { throw new Error(workingDirectory is not a directory: ${workingDirectory}); } // ... proceed }// Layer 3: 环境守卫——在特定上下文阻止危险操作 async function gitInit(directory: string) { // In tests, refuse git init outside temp directories if (process.env.NODE_ENV test) { const normalized normalize(resolve(directory)); const tmpDir normalize(resolve(tmpdir())); if (!normalized.startsWith(tmpDir)) { throw new Error( Refusing git init outside temp dir during tests: ${directory} ); } } // ... proceed }防御文档还给出了一个关键结论这四层缺一不可。实测中不同代码路径绕过了入口校验、Mock 绕过了业务逻辑检查、不同平台的边缘情况需要环境守卫兜底、而调试日志能识别结构性滥用。所以「别只在一个校验点收手要在每一层都加上检查」。Farm 仓库自己的故障记录反复印证了「多层级防御」的必要性在 docs/experiences/windows-exit-code-0xc0000005-troubleshooting.md 中rust-plugins/worker的 0xC0000005 崩溃根因是 DLL 卸载FreeLibrary与宿主 rayon 线程 TLS 析构的时序竞争最终采用GetModuleHandleExAGET_MODULE_HANDLE_EX_FLAG_PIN永久钉住 DLL随后又叠加了build_end()/update_finished()延迟编译的架构改进——根因修复 多层加固的组合拳同一文档还特别告诫「Build completed 不代表成功退出码必须为 0」这正是「不要把症状日志里的成功字样当作根因进程退出码」的反面教材在 emotion 死锁案例中曾尝试「加一把全局锁」来消除挂起但挂起依旧——文档据此总结「加锁后死锁消失」往往是只修症状如果锁在而挂起仍在根因通常是调度器饥饿而非数据竞争此时应改为「把可疑工作移出当前调度器」。七、关键原则永远不要只修症状文档用一张决策图总结了整个方法论digraph principle { Found immediate cause [shapeellipse]; Can trace one level up? [shapediamond]; Trace backwards [shapebox]; Is this the source? [shapediamond]; Fix at source [shapebox]; Add validation at each layer [shapebox]; Bug impossible [shapedoublecircle]; NEVER fix just the symptom [shapeoctagon, stylefilled, fillcolorred, fontcolorwhite]; Found immediate cause - Can trace one level up?; Can trace one level up? - Trace backwards [labelyes]; Can trace one level up? - NEVER fix just the symptom [labelno]; Trace backwards - Is this the source?; Is this the source? - Trace backwards [labelno - keeps going]; Is this the source? - Fix at source [labelyes]; Fix at source - Add validation at each layer; Add validation at each layer - Bug impossible; }永远不要在错误出现的地方直接修复。回溯找到最初的触发器在源头修复再为每一层加上校验让 Bug 在结构上变得不可能——而不是「这次碰巧没再犯」。这与系统化调试技能的四阶段框架SKILL.md完全咬合Phase 1 根因调查读错误、复现、查变更、组件边界取证、追踪数据流→ Phase 2 模式分析找相似工作代码对比差异→ Phase 3 假设与最小验证单变量、一次只改一件事→ Phase 4 实现先写失败测试、单一修复、验证、失败 3 次以上重新审视架构。根因回溯正是其中「Phase 1 追踪数据流」的完整展开。八、堆栈插桩与取证技巧速查文档总结了四条可立即套用的经验测试里用console.error()而非 loggerlogger 可能被测试框架抑制console.error直接进标准错误流在危险操作之前打日志记录「将要做什么」而不是「失败之后」——失败后的日志往往已经丢了上下文包含充分的上下文目录、cwd、环境变量、时间戳一个都不能少用new Error().stack抓完整调用链它是运行时最廉价可靠的调用链快照。对应到 Farm 的工程实践e2e/farm-runner.mjs 在启动 dev-server 时注入FARM_DEFAULT_SERVER_PORT/FARM_DEFAULT_HMR_PORT并实时解析日志中的 URLe2e/process-cleanup.mjs 在每轮 E2E 前后扫描并清理超过 5 分钟的陈旧测试进程Windows 清理进程树Unix 清理进程组。这些「日志 环境变量 进程状态」的证据采集都是让下一次根因回溯有据可查的基础设施。九、实战影响与验证方式文档记录了 2025-10-03 的一次调试会话成果通过 5 层追溯找到根因在源头修复getter 校验叠加 4 层防御1847 个测试全部通过零污染。验证「修复是否真正生效」不能只看一次运行。Windows 排查文档给出的稳定性检查方法是重复运行 10 次以上并以失败率而非单次结果为判据Farm 的示例验证脚本则支持精确圈定范围# 只构建并验证一个示例根因修复后先收窄复现范围 node scripts/test-examples.mjs --skip-build-js-plugins --example rust-plugin-worker # 从某个示例构建到列表末尾回归验证 node scripts/test-examples.mjs --skip-build-js-plugins --from rust-plugin-wasm关于这两个脚本的参数语义--example、--from/--start-from、--skip-build-js-plugins及其环境变量别名与优先级详见 docs/experiences/example-testing-guide.md。其排查要点同样遵循本文原则先区分「示例自身的问题」与「编排/依赖的问题」不要轻易把编排失败归咎于目标示例——这正是不把症状当根因的另一处落地。结语根因回溯不是一个「高级技巧」而是一条纪律错误在哪里出现不等于错误源自哪里。从症状出发逐层向上追问「谁传了坏值」「坏值从哪来」直到找到最初的触发器在源头修复并为每一层数据通路加上校验与插桩——这是让 Bug 从「被修好一次」变成「结构上不可能再犯」的唯一可靠路径。无论是 Rust 插件在 Windows 上的崩溃、SWC wasm 转换的构建挂起还是测试污染源码目录Farm 仓库自身的调试记录都反复验证了这一点先取证再追溯最后在源头动手。赞分享前端构建构建工具开发工具【免费下载链接】farmExtremely fast Vite-compatible web build tool written in Rust项目地址https://gitcode.com/gh_mirrors/fa/farm点击查看免费下载相关推荐OpenRig 系统化调试沿调用链回溯根因的 root-cause-tracing 实战指南OpenRig 系统化调试沿调用链回溯根因的 root cause tracing 实战指南 导读 本指南以 OpenRig 仓库中 root cause t人工智能AI Agent多智能体Agent 编排代码智能体CLISuperpowers 系统化调试中的根因回溯法root-cause-tracing 技巧全解析Superpowers 系统化调试中的根因回溯法root cause tracing 技巧全解析 本文聚焦 Superpowers 仓库 systematicAI 技能AI 插件开发工具pstack-claude 调试原则 Fix Root Causes从修症状到修根因的实战方法论pstack claude 调试原则 Fix Root Causes从修症状到修根因的实战方法论 导读本文以 pstack claude 仓库中 p人工智能AI 技能AI 插件开发工具上一篇Optimism OP Stack Monorepo 开发导航面向 AI Agent 与开发者的仓库协作指南下一篇IntelliJ Platform PolySymbols 集成案例研究GDScript、JS/TS/HTML/CSS、Vue 与 Angular 的架构取舍与实现解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

GitHub Actions Toolkit 制品(Artifact)FAQ 实战指南:非法字符校验、ZIP 压缩策略、版本兼容与保留期

GitHub Actions Toolkit 制品(Artifact)FAQ 实战指南:非法字符校验、ZIP 压缩策略、版本兼容与保留期

CI/CD开发工具 【免费下载链接】toolkit The GitHub ToolKit for developing GitHub Actions. 项目地址: https://gitcode.com/gh_mirrors/to/toolkit 点击查看 免费下载 导读 本文以 GitHub Actions Toolkit 中 actions/artifact 包的官方 FAQ 文档(仓…

2026/10/13 5:33:59 阅读更多 →
多模态Agent架构重构:多模态理解、Harness与MCP工具调用的工程实践

多模态Agent架构重构:多模态理解、Harness与MCP工具调用的工程实践

做Agent开发这两年,我一直有个很深的感受:真正卡住进度的往往不是模型能力,而是模型周围那一圈"胶水代码"。最近我重构了一个多模态Agent项目的整体架构,把输入侧、执行侧、工具侧分别做了改造,收获最大的三…

2026/10/13 6:18:57 阅读更多 →
PoWFaucet 模块钩子体系(MODULE_HOOKS)深度解析:会话生命周期中的模块协作机制

PoWFaucet 模块钩子体系(MODULE_HOOKS)深度解析:会话生命周期中的模块协作机制

区块链后端前端 【免费下载链接】PoWFaucet Modularized faucet for EVM chains with different protection methods (Captcha, Mining, IP, Mainnet Balance, Gitcoin Passport and more) 项目地址: https://gitcode.com/gh_mirrors/po/PoWFaucet 点击查看 免费下载…

2026/10/13 6:17:37 阅读更多 →

最新新闻

学习 Python 基础语法与工程环境操作流程

学习 Python 基础语法与工程环境操作流程

前言一、基础概念虚拟环境:可以理解成每个项目专属的「Python 独立工具箱」。每个项目单独一套 Python 解释器和第三方安装包,项目之间互不干扰,不会出现 A 项目装的包覆盖 B 项目依赖的情况,删掉环境文件夹就能一键重置&#xff…

2026/10/13 6:59:55 阅读更多 →
陈,读懂生理药理实验多用仪

陈,读懂生理药理实验多用仪

生理药理刺激多用仪属于多功能综合性实验设备,依托数字集成电路对振荡频率分频处理,输出多种标准频率与时间信号。设备可输出前沿陡直、平顶稳定的标准矩形刺激波,波宽与输出电压连续可调,支持单次、双次、定时、连续等多种刺激输…

2026/10/13 6:59:55 阅读更多 →
MCP基本使用

MCP基本使用

MCP版本用日期定义,最早的正式版本2024-11-05,截止当前最新的是2026-07-28(这一版协议有根本性改动,Python SDK需要使用 v2)。下面的概念是针对 2024-11-05 版的,2026-07-28 变成无状态协议了,下…

2026/10/13 6:59:55 阅读更多 →
企业微信 AI 客服答不准怎么办?兜底话术与置信度阈值

企业微信 AI 客服答不准怎么办?兜底话术与置信度阈值

客户问的是一款产品的偏门参数,AI 一本正经地答错了。这种错比不回复更伤:客户按错信息做了决定,回头算在品牌头上。答不准通常不是模型变笨,而是两件事没配好——该兜底的时候它硬答,该收进知识库的问题它够不着。## …

2026/10/13 6:59:55 阅读更多 →
恶意代码概述

恶意代码概述

1. 计算机病毒(Virus)核心特点:必须依附文件,需要人为触发,不能自己网上传播 原理:寄生在正常文件里(exe / 文档)。必须用户手动打开这个带毒文件,病毒才会激活&#xff…

2026/10/13 6:59:55 阅读更多 →
恶意代码检测毕设实战:PE特征提取与机器学习模型训练

恶意代码检测毕设实战:PE特征提取与机器学习模型训练

简介:这份资源是一套基于机器学习的恶意代码检测项目源码,面向计算机、人工智能、通信工程、自动化等专业的在校学生与教师,也适合作为毕设、课程设计或项目立项演示的参考。项目围绕恶意代码的特征提取、向量化与模型训练展开,涵…

2026/10/13 6:58:55 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →