硅基俊宁.
SYNTHESIS WITH SOURCES

知识 Wiki。

根据公开原文整理并审核的归纳;引用仍回到原始资料。归纳不代表本人原话或新增经历。

查看工程资料 ↗

FlyOS

覆盖 2/2 份来源 · 模型归纳

两篇文章都围绕 FlyOS 的术语与指标口径展开,但各自处理的对象不同:一篇处理内存指标 RSS 与 Physical Footprint 的统计边界,另一篇处理 Profile 一词在不同工程对象上的含义。共同的方法论是先把术语补全到具体对象与口径,再比较数字或做判断;两篇都明确反对脱离上下文使用裸词或单一数字下结论。

查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
真正的问题在于:我们把两个统计口径不同的指标,当成了同一个“内存占用”。这也是我想单独写清 RSS 的原因。
查看原文:Profile 到底是什么意思:先分清用户资料、构建方案与交付策略
更准确的说法是:Profile 没有唯一的技术含义。它表示某个对象在一组维度上的完整描述。对象不同,中文意思也不同。
查看原文:Profile 到底是什么意思:先分清用户资料、构建方案与交付策略
技术文档如果只写一个裸的 Profile,通常不是读者不懂,而是作者省略了最重要的前缀。

在内存评测上,该文给出的取舍是:RSS 适合在同一口径下观察趋势并按 Browser、Renderer、GPU、Utility 等进程角色拆解,但 Chromium 多进程会共享库、共享内存与 file-backed page,跨进程直接相加可能重复计数,因此 RSS 汇总不等于应用独占的物理内存。macOS 上判断整个应用给系统的内存压力应以进程树 Physical Footprint 为主,RSS 作为辅助;判断泄漏则需继续进入 heap、allocation、对象生命周期与 GC 证据。

查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
它适合观察同一口径下的趋势和拆解 Browser、Renderer、GPU、Utility 等进程角色,但在 Chromium 多进程架构里,把各进程 RSS 直接相加可能重复计算共享页,所以它不等于应用独占的真实物理内存,更不能单凭一次上涨就判定内存泄漏。
查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
问题在于,不同进程可以映射同一份共享库、共享内存或 file-backed page。对单个进程看,这些页面确实属于它的 resident set;但如果把多个进程的 RSS 直接相加,同一批物理页就可能在多个进程名下重复出现。
查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
footprint 在接收多个进程时,会把多重映射的对象去重,并把共享部分单独记账。因此,RSS 汇总和 Physical Footprint 出现明显差异,本身并不是异常。
查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
RSS 不是“假数据”,Physical Footprint 也不是 RSS 的修正版。它们是从不同层面观察内存的两把尺子。

该文对 RSS 比较设定了前置条件:指标定义只能同类相比,进程范围、workload、生命周期阶段、构建产物与采样窗口都必须一致,否则数字相减会误导。文中据此说明没有把历史报告中的 1.53–1.67 GB RSS 直接当作“大幅下降”的证据,因为历史数据的进程树、页面负载与采样口径并不完全一致;当前数据首先是一条可复现基线。

查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
这也解释了为什么这份 baseline 没有拿历史报告中的 1.53–1.67 GB RSS 直接宣称“大幅下降”:历史数据的进程树、页面负载和采样口径并不完全一致。当前这组数据首先是一条可复现的基线,只有后续版本在同机、同 workload、同范围、同窗口下复测,才形成有效比较。
查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
我现在会把 RSS 对比当成一个有前置条件的实验,而不是把两个数字直接相减。
查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
内存泄漏会推高 RSS,但 RSS 上涨还有很多正常原因:

Profile 一文的核心区分是所有者、生命周期与用途:Distribution Profile 由产品与发行工程团队在开发、构建或发版时维护,描述要交付的产品身份、目标平台、Runway 与 Extension 选择、更新策略及可选 Lean delivery 约束,不随用户走;Build Profile 是构建档位方案;Browser User Profile 与 User Settings 随用户日常使用变化。文中还区分 Profile 与 lock:Profile 是人工维护的期望声明,flyos-lock.yaml 由工具根据 Profile 与实际解析结果生成,记录精确使用内容,修改 Profile 后需重新解析刷新 lock。

查看原文:Profile 到底是什么意思:先分清用户资料、构建方案与交付策略
Profile 由 Distribution 编写,表达“我想交付什么”;lock 由工具根据 Profile 和实际解析结果生成,记录“这次精确使用了什么”。前者是声明,后者是可复现证据。
查看原文:Profile 到底是什么意思:先分清用户资料、构建方案与交付策略
Distribution Profile 产品与发行工程团队 开发、构建或发版时 否 Build Profile 构建工程团队 执行某种构建时 否 Browser User Profile 浏览器用户 日常使用中 是 User Settings 应用用户 日常使用中 通常是
查看原文:Profile 到底是什么意思:先分清用户资料、构建方案与交付策略
Build Kit 读取这份 Profile,再结合 lock、已经安装的 package、Chromium checkout 和目标平台 toolchain,完成后续构建与打包。
查看原文:Profile 到底是什么意思:先分清用户资料、构建方案与交付策略
Lean Profile 也不是第四种全新的 Profile。在当前 FlyOS contract 里,lean 是 Distribution Profile 中可选的一组交付约束,例如只保留指定的 Chromium locale,或者明确排除某类 Runtime payload。

两篇都强调口径一致后才可比较,但现有资料未说明 FlyOS 是否已把“同机、同 workload、同进程范围、同采样窗口”的复测流程固化为常规机制,也未说明 Distribution Profile 变更后 lock 刷新与构建验证之间的具体校验方式;这些可作为后续继续探讨的问题。

查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
只有后续版本在同机、同 workload、同范围、同窗口下复测,才形成有效比较。
查看原文:Profile 到底是什么意思:先分清用户资料、构建方案与交付策略
修改 Profile 后需要重新解析和刷新 lock,而不是手工把两份文件改到“看起来一致”。

Hybrid Search

覆盖 2/2 份来源 · 模型归纳

关于中文检索,两文都反对把 PostgreSQL FTS 的 language 从 english 改成 simple 当作解决方案,并都主张 Hybrid Search 而非单一向量检索。GBrain 一文给出实测依据:同一 Brain 下“Revision 是什么”“Workspace Revision 是什么”“工作区版本是什么”均为零命中,而含英文领域词的完整中文 Prompt 命中 3 条,说明问题在中文自然问句而非完全不支持中文;simple 只取消英文停用词与 stemming,不提供中文分词。AI Native 一文则从技术分层角度说明 BM25 擅长精确标识符、Vector Search 擅长同义表达,二者不可互相替代。差异在于前者给出三阶段修复路线与迁移步骤,后者给出按问题类型选择检索器的决策树。

查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
simple 的主要作用是取消英文停用词和 stemming,不会自动把: text 工作区修订是不可变资产集合快照 切成: text 工作区 / 修订 / 不可变 / 资产 / 集合 / 快照
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
这个结果说明它不是“完全不支持中文”。索引里恰好存在的完整中文词可以命中,英文领域词也很稳定;真正不可靠的是中文自然问句。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
它们不理解抽象语义,却非常擅长精确对象:函数名、错误码、配置项、订单号、API 名称和领域术语。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
但语义相似不等于业务上正确。Vector Search 可能把相似概念混在一起,也可能让精确的类名和错误码沉到后面。它增加了一种召回能力,没有取代关键词检索。

两文都强调 Query Rewrite 应优先采用确定性、可解释的版本,而非一开始就引入 LLM Planner。GBrain 一文主张别名来自项目的 CONTEXT.md 和受治理 Glossary,生成原始、精确、别名三条 Query 分别检索后合并去重;AI Native 一文同样建议先从受治理的 Glossary 生成确定性映射,先查改写结果、零命中再回退原始 Query,并明确只有任务复杂度值得支付规划成本时才进入 Agentic Retrieval。共同点是可测试与可重复,差异在于 GBrain 一文把 Query Rewrite 列为三阶段修复中成本最低、应最先做的一步,AI Native 一文则把它嵌入 Gateway 的 Rewrite/Plan 环节并配合 Intent 路由。

查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
别名不应该每次调用 LLM 临时生成,而应该来自项目的 CONTEXT.md 和受治理 Glossary,这样结果可解释、可重复。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
第一阶段不必立刻引入昂贵的 LLM Query Planner,可以先从受治理的 Glossary 生成确定性映射
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
当复杂 Query 占比上升,再增加 Multi-query、Subquery Planning 和 Source Routing。只有任务复杂度值得支付规划成本时,才进入 Agentic Retrieval。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
第一阶段:Query Rewrite 这是成本最低、应该最先做的一步。

两文都把权限与 Scope 放在检索之前生效,而非在答案阶段过滤。AI Native 一文列出过滤需覆盖 tenant、workspace、source、revision、principal、confidentiality 与 content status,并指出安全边界应在 Candidate Retrieval 前收紧,否则 Agentic Retrieval 会放大跨项目污染与越权风险;GBrain 一文则从评测角度强调 Scope Leakage 指标,警告全局 Brain 未绑定 Workspace 和 Source 时,高召回率可能意味着更严重的跨项目污染。两者共同把 Scope 视为检索正确性的一部分,差异在于前者给出 Gateway 统一收口的架构手段,后者给出可观测的评测指标。

查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
先检索全部内容、再在答案阶段隐藏结果,是危险设计。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
Planner 可以决定怎么搜,不能决定自己有权看什么。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
一个全局 Brain 如果没有绑定 Workspace 和 Source,再高的召回率也可能意味着更严重的跨项目污染。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
不要在没有 Workspace / Source Scope 的情况下把多个项目全部塞进默认 Brain。

两文都把“没有答案”视为正常结果而非故障,并主张用分层评测替代对最终回答的观感判断。AI Native 一文要求系统在缺证据时返回 no_evidence,评测集须包含知识库无答案、只有过期版本有答案、当前用户无权访问、两个正式 Source 冲突等反向样本,并把评测拆为 Retrieval、Ranking、Generation 与 Agent 四层;GBrain 一文则准备带期望 Citation 的评测数据,观察 Recall@5、MRR@5、Zero-hit Rate、Citation Precision、P95 Latency 与 Scope Leakage。两者共同点是先保证候选召回再谈排序与生成,差异在于前者给出四层评测框架与 no-evidence Accuracy 等指标,后者给出具体 JSON 评测样例与迁移验证流程。

查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
知识库缺少证据时,系统应该返回 no_evidence,而不是用模型常识补一段看似合理的答案。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
Reranker 只能重排已有候选。正确文档没有进入 Top 50,后面的模型再强也救不回来。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
至少观察下面几个指标: 指标 关注的问题 --- --- Recall@5 正确文档是否进入前 5 MRR@5 正确文档排得是否足够靠前 Zero-hit Rate 中文问句是否仍频繁零召回 Citation Precision 引用是否真的支撑回答 P95 Latency Hybrid Search 增加了多少延迟 Scope Leakage 是否检索到其他 Workspace 的知识
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
Retrieval Eval:正确 Evidence 是否进入候选集? Ranking Eval:正确 Evidence 是否排到足够靠前? Generation Eval:回答是否被 Evidence 支撑? Agent Eval:行动是否遵守 Scope、Permission 与事实?

两文都提到中文检索可能需要额外的中文分词能力,但都未给出在本地 PGLite 为主的 MVP 下完成中文 FTS 的实测结论:GBrain 一文把本地 Tantivy 中文 BM25 与云端 pg_jieba/zhparser 列为后续路线,并称其增加部署运维复杂度;AI Native 一文则把中文 BM25 Side Index 放在按问题增加结构索引的阶段。在现有资料下,尚不清楚这两条路线在真实中文问句上的召回差异,以及 Multilingual Embedding 加 RRF 是否已足以覆盖精确中文术语检索。

查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
如果后续评测证明 Embedding 仍不能满足精确中文术语检索,再给应用侧增加中文 Side Index: text GBrain Vector Search + GBrain Keyword Search + 本地 Tantivy 中文 BM25 → RRF Fusion
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
另一条路线是在云端 PostgreSQL 使用 pg_jieba 或 zhparser,但它增加了数据库扩展和部署运维复杂度,不适合当前以本地 PGLite 为主的 MVP。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
中文检索应通过真实 Query Eval 判断是先做 Rewrite、Multilingual Embedding,还是增加中文 BM25 Side Index。

CDP

覆盖 3/3 份来源 · 模型归纳

关于引用(@eN)的生命周期,agent-browser 一文给出了较具体的规则:仍然存在的 DOM 元素可在后续快照和同一文档更新中保留引用,页面或 iframe 导航、元素替换会影响有效性,没有对应 DOM 节点的虚拟无障碍节点其引用只适用于当前快照。BrowserOS 一文把同类问题列为 Browser Capability 层应维护的约束之一,包括导航前后元素引用何时失效、Frame 和弹窗如何归属、Screenshot 与 DOM Snapshot 是否来自同一时刻。AX Tree 一文则从观察范围角度补充:getFullAXTree() 的 full 不等于自动解决所有跨进程 iframe,虚拟列表的总行数与行索引不能代表未挂载行的内容。三者都承认引用不是业务身份,agent-browser 明确说引用不是商品 ID、订单号或跨页面永久地址,BrowserOS 则把稳定身份与失效时机作为长期积累的工程问题。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
当前官方文档的规则是:仍然存在的 DOM 元素可以在后续快照和同一文档更新中保留引用;页面或 iframe 导航、元素替换会影响引用有效性。没有对应 DOM 节点的虚拟无障碍节点,其引用只适用于当前快照。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
- Page、Tab、Window 的稳定身份; - 导航前后元素引用何时失效; - Frame 和弹窗如何归属; - Screenshot、DOM Snapshot 与当前页面是否来自同一时刻;
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
getFullAXTree() 的 full 也不等于自动解决所有跨进程 iframe,跨 frame 支持仍需由具体执行器单独验证。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
引用省去了为每一步重新编写 selector 的工作,但它不是商品 ID、订单号,也不是跨页面永久有效的地址。

三篇材料对“动作成功不等于任务成功”的论证路径不同。agent-browser 一文用查库存任务说明:snapshot -i 偏向可引用的操作目标,“有货”这类普通结果文字可能被排除,因此检查业务结果时需要保留正文、状态或表格内容;并列出搜索后进入结果页、同一页面更新库存、列表重排或复用节点、出现多个同名按钮等变化下执行循环应检查什么。AX Tree 一文把“结果可验证”列为采用前的四个条件之一,不满足时应保留受阻或未验证状态,不以调用成功替代业务结果。BrowserOS 一文则从静态源码的证明力划界:源码能证明组件和调用关系存在,但不能仅凭静态源码证明每个网站、每个模型、每个任务都能可靠完成,任务成功率仍需基于真实任务集、Provider 和环境做运行时评测。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
snapshot -i 偏向可引用的操作目标,“有货”这样的普通结果文字可能被排除;某些标题和表格单元格能够留下,也不保证所需字段完整。找动作目标时可以压缩观察,检查业务结果时则需要保留相关正文、状态或表格内容,不能把“交互快照里没出现”理解为“页面没有”。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
结果可验证 参数与业务结果能否通过 AX 再次确认? 保留受阻或未验证状态,不以调用成功替代业务结果
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
这里存在一个重要边界:BrowserOS 源码能证明这些组件和调用关系存在,但不能仅凭静态源码证明每个网站、每个模型、每个任务都能可靠完成。任务成功率仍然需要基于真实任务集、Provider 和环境做运行时评测。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
列表重排或复用节点 核对该控件所属的业务记录,不能只看引用是否仍可解析

在“是否 fork Chromium”这一架构取舍上,BrowserOS 一文给出了明确的适用条件划分:若产品主要是总结、翻译、问答、读取当前 Tab、在 Extension 权限内填表和导航、快速验证价值,Extension 加 Local Server 通常成本更低;只有当需要浏览器级私有 API、原生管理 Sidecar Runtime、控制 New Tab、Importer、Profile、进程和产品身份、内置固定关键 Extension、拥有安装包签名与更新渠道时,fork 的收益才足以覆盖维护成本。该文同时指出 fork 的代价是长期维护 Patch Stack、解决上游冲突、承担跨平台编译和安全更新压力。agent-browser 一文从另一侧给出类似的分流建议:若流程长期固定、定位条件清晰、主要目标是回归测试,可以继续使用现有自动化测试工具,不必为了引入 Agent 而改写成熟流程。AX Tree 一文则补充了语义不足时的处理选项:修复页面语义,或明确采用其他观察方式,或保持 AX-only 并报告受阻。

查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
那么 Extension + Local Server 通常是成本更低的选择。先验证用户是否真的需要 Agent 完成这些任务,再决定是否接管浏览器底座。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
代价也很明显:一旦 fork Chromium,就要长期维护 Patch Stack、解决上游冲突、承担跨平台编译和安全更新压力。fork 不是“更高级”的默认答案,它只是用更高的维护成本换取更深的产品控制权。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
若流程长期固定、定位条件清晰、主要目标是回归测试,也可以继续使用现有自动化测试工具,不必为了引入 Agent 而改写成熟流程。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
缺少必要语义时,可以明确转入混合观察,也可以保持 AX-only 并报告受阻;两者都需要如实记录实验条件。

三篇材料都强调版本与实现路径的对应关系,反对把一套工具的原理直接套到另一套上。agent-browser 一文明确其核验对象是 2026 年 11 月 1 日的上游 0.41.1 版本与官方文档,默认讨论 Chrome / CDP 路径,并提醒固定在旧版本的系统需分别核对实现;它还区分了本站另一篇 AX Tree 文章核验的 @mastra/agent-browser 0.4.1 与 agent-browser 0.19.0 组合,那条路径通过 Playwright ariaSnapshot() 生成工具快照,而 0.41.1 的 Chrome 原生路径直接读取 CDP AX Tree,工具名和命令相似不能代替对依赖版本及真实调用链的检查。BrowserOS 一文把源码快照固定在 5ddb0f2d0 commit,理由是后续会继续变化,固定 commit 能让目录、代码和发布流程保持可复查。AX Tree 一文则声明讨论通用机制和设计判断,示意不对应任何具体产品的已交付状态,源码阅读坐标沿用原稿,本次整理不构成新的运行时验收。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
本站只用 Accessibility Tree,浏览器 Agent 能走多远?核验的是 @mastra/agent-browser 0.4.1 与 agent-browser 0.19.0 的组合,那条路径通过 Playwright ariaSnapshot() 生成工具快照。本文核验的上游 0.41.1 Chrome 原生路径直接读取 CDP AX Tree。工具名和命令相似,不能代替对依赖版本及真实调用链的检查。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
本文以 BrowserOS 仓库的 5ddb0f2d0 commit 为源码快照。BrowserOS 后续会继续变化,固定 commit 能让文中的目录、代码和发布流程保持可复查。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
本文讨论通用机制和设计判断;示意不对应任何具体产品的已交付状态。源码阅读坐标沿用原稿,本次整理不构成新的运行时验收。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
本文按 2026 年 11 月 1 日核验的上游 0.41.1 版本与官方文档解释,默认讨论 Chrome / CDP 路径。已有系统若固定在旧版本,需要分别核对实现,不能把新版原理直接套到旧适配器上。

现有材料留下一个可继续探讨的问题:当语义观察不足以表达目标时,混合观察的边界应如何界定并如实记录。AX Tree 一文提出可以明确转入混合观察,也可以保持 AX-only 并报告受阻,并要求如实记录实验条件;agent-browser 一文提到页面若把搜索按钮暴露成没有名称的图形,单靠语义观察可能无法确定用途,需要补充截图、上下文或其他受控读取,同时说明是否将截图作为模型输入、怎样结合语义结果仍由调用方决定。BrowserOS 一文则把 Screenshot、DOM Snapshot 与当前页面是否来自同一时刻列为 Browser Capability 层应维护的约束。这些材料没有给出统一的判定标准,也未提供混合观察下的对照评测结果。

查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
缺少必要语义时,可以明确转入混合观察,也可以保持 AX-only 并报告受阻;两者都需要如实记录实验条件。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
若它只是一块没有名称的图形,单靠这份语义观察可能无法确定用途,需要补充截图、上下文或其他受控读取。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
截图能帮助判断图标、布局和视觉遮挡;是否将它作为模型输入、怎样结合语义结果,仍由调用方决定。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
- Screenshot、DOM Snapshot 与当前页面是否来自同一时刻;

UI Design

覆盖 2/2 份来源 · 模型归纳

两篇文章都把“实现成本下降”当作前提,但落点不同:一篇把稀缺能力定位为问题选择、方案取舍、边界判断与结果验收,并称之为 Taste;另一篇把同一类判断具体化为设计语言的生成过程,强调风格首先是一套删减规则。共同点是都反对把“高级、简洁、科技感”这类形容词直接交给 Agent,因为结果会收敛到可互换的套路;差异在于前者给出五类判断(问题选择、目标与层级、取舍、边界、完成标准)的框架,后者给出从景区意象到 token 语义、布局节奏与反例清单的落地路径。

查看原文:Taste Is All You Need
当 AI 把实现和生成的成本迅速压低,真正稀缺的能力开始转向问题选择、方案取舍、边界判断与结果验收。
查看原文:Taste Is All You Need
我现在用五类选择理解 Taste: 判断 要回答的问题 --- --- 问题选择 这是一个真实问题,还是一个热闹概念? 目标与层级 用户第一眼应该看见什么,完成什么? 取舍 哪些能力、装饰和表达应该被删除? 边界 稳定性、性能、可访问性和业务约束在哪里? 完成标准 什么证据足以证明它可以交付,什么仍然只是 Demo?
查看原文:青山湖设计风格的诞生记
这段过程让我确认了一件事:设计风格首先是一套删减规则。 如果一套风格只告诉 Agent“可以用什么”,它很快就会把所有特征同时用上。真正能提高输出稳定性的,是同时写清楚“最多用多少”“只能用在哪里”“什么情况下不要用”。
查看原文:青山湖设计风格的诞生记
AI 很擅长生成看起来完成度很高的界面,但如果提示词只有“高级、简洁、科技感”,结果通常会收敛到几种熟悉套路:高饱和蓝紫渐变、纯黑科技背景、玻璃卡片层层嵌套、发光描边和胶囊按钮。

青山湖风格的成型过程显示了一条明确的架构取舍链:先以真实景区元素作为母题,把湖面、雾带、水杉、浮萍、远山、晨光分别映射到主操作色、画布与材质、成功与在线状态、少量点缀、信息层级与稀缺高光;再把颜色从零散 hex 收敛为 Seed → Map → Semantic → Alias 的 token 架构,使语义稳定优先于具体色值。关键工程取舍出现在灵动卡的玻璃质感上:系统 material 与窗口采样路径曾触发崩溃,最终改为纯 SwiftUI 内部绘制柔焦层,保留“雾”的视觉职责而放弃高风险实现。这说明设计语言不能绕过工程约束,可迁移的中间层比理想效果更重要。

查看原文:青山湖设计风格的诞生记
青山湖设计风格的核心,不是把界面染成绿色,而是把青山湖的自然层次翻译成数字产品的职责分工:雾白负责空间与材质,湖水青负责操作,水杉绿负责状态,青山灰蓝负责信息层级,晨光金只负责极少量高光。
查看原文:青山湖设计风格的诞生记
经过几轮实战后,青山湖不再是一组零散的 hex,而是逐渐形成了 Seed → Map → Semantic → Alias 的 token 架构。
查看原文:青山湖设计风格的诞生记
最后采用的是纯 SwiftUI 内部绘制: - 大面积雾白柔焦带; - 左上角雾白 soft blur; - 右下角很淡的湖水青 blur; - 所有效果裁剪在卡片内部; - 不使用 NSVisualEffectView; - 不使用 .behindWindow 或 .underWindowBackground。
查看原文:Taste Is All You Need
这也是 Taste:知道哪个体验必须保留,哪个实现可以妥协,并让审美服从稳定性、性能和可读性。

两篇文章对“跨端迁移”的界定一致但侧重不同:青山湖一文强调只在一个产品里成立的规则只能叫项目风格,迁移到小界 Web 工作台后,平台从 SwiftUI 变为 React、Umi、styled-components 和 Tailwind,并吸收正文 14px、工具栏控件 32–36px、prefers-reduced-motion、WebP 等 Web 约束,最终抽象为更通用的 Jiangnan Landscape Glass Dashboard;Taste 一文则把迁移表述为共享 semantic vocabulary 而非复制界面,并逐平台列出必须服从的系统边界(macOS 的窗口缩放与 Reduced Transparency、iOS 的 Safe Area 与 Dynamic Type、Android 的 Material 3 roles 与 48dp target、React Native 的双端无障碍差异、Web dashboard 的键盘 focus、Landing Page 的 LCP)。两者共同反对“把两边都染成青绿色”式的迁移。

查看原文:青山湖设计风格的诞生记
只在一个产品里成立的规则,还只能叫项目风格。 后来我把这套语言迁移到“小界”的 Web 工作台。平台从 SwiftUI 变成 React、Umi、styled-components 和 Tailwind,产品形态也从 macOS menu bar 工具变成 AI 控制台,但核心映射依然成立
查看原文:青山湖设计风格的诞生记
迁移过程中,设计体系又吸收了 Web 产品的新约束:正文默认 14px、工具栏控件 32–36px、桌面优先但窄屏不溢出、动效支持 prefers-reduced-motion,以及资源统一使用 WebP。
查看原文:Taste Is All You Need
把两边都染成青绿色没有迁移价值。跨端复用的是同一套判断:低噪声画布、清晰的信息层级、克制的状态色、不过度装饰的 glass surface,以及让内容始终压过背景的优先级。
查看原文:Taste Is All You Need
这次抽取没有把同一套界面复制到六个平台。共享的是一套 semantic vocabulary:canvas、surface、text、primary action、focus、success、warning、error,以及明确的 anti-pattern;各平台仍然遵守自己的交互模型和验收方式

关于适用条件,青山湖一文给出了较明确的边界判断:值得用于 AI 控制台、桌面效率工具、settings、数据 dashboard、menu bar 与 floating panel;可以再等的是强营销 landing page、娱乐化社区和需要极强情绪刺激的消费产品;并提醒每次迁移至少检查语义 token、信息密度、组件形态和 anti-pattern 四层,只换颜色不算迁移完成。反模式清单同样具体:不贴景区照片、不把所有组件改成青绿色、不处处 glassmorphism、不用大面积留白制造高级感、不靠再套卡片解决层级、不为系统材质效果牺牲稳定性。Taste 一文则补充了不可替代的边界:涉及安全、合规、数据正确性和复杂系统边界时,Taste 不能替代专业知识、工程验证和责任机制。

查看原文:青山湖设计风格的诞生记
值得上:AI 控制台、桌面效率工具、settings、数据 dashboard、menu bar 与 floating panel。这些场景需要稳定、清透、低噪声,又不能完全失去品牌辨识度。 可以再等:强营销 landing page、娱乐化社区、需要极强情绪刺激的消费产品。
查看原文:青山湖设计风格的诞生记
重点关注:不要让 Agent 把设计系统退化成 palette。每次迁移至少检查四层:语义 token、信息密度、组件形态和 anti-pattern。只换颜色,不算迁移完成。
查看原文:青山湖设计风格的诞生记
它的反模式同样明确: - 不是贴一张青山湖照片; - 不是把所有组件改成青绿色; - 不是处处 glassmorphism; - 不是用大面积留白制造“高级感”; - 不是遇到层级问题就再套一张卡片; - 不是牺牲稳定性去追求系统材质效果。
查看原文:Taste Is All You Need
不能替代: 涉及安全、合规、数据正确性和复杂系统边界时,Taste 不能替代专业知识、工程验证和责任机制。好判断必须建立在真实约束上。

两篇文章都把“沉淀为可执行规则”视为闭环终点,但沉淀载体不同:青山湖一文落到 DESIGN.md 与项目级 AGENTS.md,使审美从一次性聊天上下文变成下一次会话仍生效的工程资产;Taste 一文则把 Reference、Diverge、Select、Constrain、Verify、Remember 串成循环,并强调只保存“最终用了什么”不够,还要记住拒绝过什么——为什么不再用大面积金色、为什么不恢复高风险系统材质、为什么数据页面不铺云雾。后者还提出三层生产链:Design Language Atlas 负责扩大参考与比较能力,Qingshan Lake Design Skill 负责把母题蒸馏成 token 与 anti-pattern,better-imagegen 负责按资产类型稳定交付,例如封面先用图片模型生成无文字底图,再用 HTML/CSS 确定性排版标题并转 WebP。

查看原文:青山湖设计风格的诞生记
当这些规则被写进 DESIGN.md 和项目级 AGENTS.md,审美才从一次性的聊天上下文,变成可以在下一次会话继续生效的工程资产。
查看原文:Taste Is All You Need
Remember:记住拒绝过什么 只保存“最终用了什么”还不够。很多一致性来自对失败经验的记忆:为什么不再用大面积金色,为什么不恢复高风险系统材质,为什么数据页面不铺云雾,为什么不做纯黑科技风。
查看原文:Taste Is All You Need
比如本文封面先由图片模型生成无文字的青山湖氛围底图,再用 HTML/CSS 确定性排版标题,最后转成 WebP 并记录生成 metadata。模型负责打开视觉可能性,工程流程负责保证文字、尺寸和交付结果没有靠运气。
查看原文:Taste Is All You Need
这三层刚好对应 Taste 的三个动作:先扩大看过的世界,再把选择写成约束,最后把约束变成稳定产物。

现有材料中,青山湖风格被描述为“不是所有产品都应该用”,并列出值得上、可以再等与重点关注三类场景,但未给出判断某产品是否落入“可以再等”的可操作标准;同时,两篇文章都强调规则要能被 Agent 读取和验收,却未说明当语义 token、信息密度、组件形态与 anti-pattern 四层检查出现冲突时如何排序。此外,Taste 一文提到 AI 可降低探索与对照成本,但明确不把最终选择外包给模型,这一分工在多人协作或团队复用场景下如何界定责任,材料中尚未展开。

查看原文:青山湖设计风格的诞生记
我的判断框架 青山湖风格值得继续用,但不是所有产品都应该用。
查看原文:Taste Is All You Need
AI 能不能帮助人提升 Taste? 可以,但不要把最终选择也外包给模型。
查看原文:Taste Is All You Need
它不证明 Taste 可以被 AI 自动拥有;它证明的是另一件更务实的事:人的判断可以被外化成 Agent 能读取、实现和验收的约束。

Evaluation

覆盖 2/2 份来源 · 模型归纳

两篇文章都把“Agent 声称完成”视为一条待验证的 Claim,而不是事实,并要求回到权威系统重新读取状态。差异在于落点:Evidence 一文把 Claim 绑定、Provenance、Scope & Time、Integrity 作为材料成为 Evidence 的四道门,强调证明力相对于 Claim 存在;Runtime/Harness 一文把同一问题放进运行控制链,用 Claim Verifier 与 Acceptance Contract 把“完成”变成可执行验收。两者共同反对用 Agent 自述、Tool 返回“请求已提交”或完整 Trace 直接充当业务完成证明。

查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
同一条事实对不同 Claim 的证明力完全不同。Evidence 的证明力始终相对于 Claim而存在。
查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
Trace: Agent 调用了 deploy(),接口返回 accepted Claim: 新版本已经在生产环境生效 前者不能直接证明后者。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
“任务已完成”只是一条 Claim,不是事实。 真正的验证应该回到权威系统重新读取状态。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
这使“完成”从自然语言变成可执行的 Acceptance Contract。

两文都明确区分 Trace、Artifact、Evidence 与 Evaluation,但分工表述不同。Evidence 一文按“证明方向”切分:Trace 回答系统记录到什么过程,Artifact 只证明有交付物,Evaluation 是依据规则作出的判断,Evidence 是从中挑出的、与 Claim 有关的最小事实集合。Runtime/Harness 一文按运行对象切分:Memory 跨 Run 保留经验,State 表示当前执行位置,Trace 记录事件,Evidence 支撑 Claim,Eval 按预设标准评分。共同点是都不允许把聊天记录、完整 Trace 或模型分数直接塞进 Evidence。

查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
Artifact 存在,只能证明有交付物;它不能自动证明交付物正确。
查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
Evidence 是事实材料,Evaluation 是依据规则作出的判断。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
聊天记录可以参与恢复,但它不是完整 State;Trace 可以帮助调查,但它不自动构成 Evidence;Evidence 能证明一次交付,却不能替代跨版本的 Eval。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
Evidence 是从 Trace、Artifact 和权威状态中挑出的、足以支撑 Claim 的最小集合。

Runtime/Harness 一文把恢复能力分级,并明确大多数生产系统应先做到 L3,而非一开始追求 L4。其安全恢复循环要求读取 Checkpoint 后校验 Contract Version 与 Workspace Revision、检查上一个副作用是否已生效、用 Idempotency Key 决定复用还是重试。与之配套的工程边界是:Provider Session ID 只作外部引用,内部 runId 是事实主键;所有真实动作经过 Tool Gateway,重试只作用于已声明幂等的边界;Run State 属于系统而非某次进程。

查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
大多数生产系统应该先做到 L3,不必一开始追求 L4。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
读取 Checkpoint ↓ 校验 Contract Version 与 Workspace Revision ↓ 检查上一个 Side Effect 是否已经生效 ↓ 用 Idempotency Key 决定复用结果还是重试
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
内部 runId 是事实主键,Provider Session ID 只是 ExternalRunRef。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
重试只能作用于已声明幂等的边界。否则“失败后自动重试”可能变成重复扣款、重复发信或重复发布。

两文都强调 Evidence 应可复查、可反驳、可重算,但未给出跨系统冲突证据的裁决规则:当两条有效 Evidence 相互冲突,或 Evidence 支持 Claim 但覆盖范围不足时,由谁依据哪条 Policy 判定 Claim 通过、失败或保持不确定,仍需在具体业务中定义。另一个可继续探讨的问题是:Evidence 的过期、撤销与重新验证如何与 Run State 的 Contract Version 绑定,使历史 Verification Result 在 Source Revision 更新后仍可复现。

查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
- Evidence 本身有效,但与 Claim 无关; - 两条有效 Evidence 相互冲突; - Evidence 支持 Claim,但覆盖范围不足;
查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
8. 出现冲突、过期或撤销后,旧结论能否重新计算?
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
换句话说,Checkpoint 不只是保存 JSON,还要知道它由哪一版代码解释。

Windows

覆盖 4/4 份来源 · 模型归纳

四篇材料都把 Windows 相关工程问题拆成“身份/坐标”与“执行/交付”两层。安装包命名一文把文件名视为 OS、CPU、ABI、package format 与 release channel 的坐标,并强调 win32 是 Windows 平台/API 家族的历史名称,x64 才回答 CPU 架构;PE 一文把 .exe 视为由 Header、Section Table 与多块 section 组成的容器,区分磁盘 raw offset 与内存 RVA;Omaha 一文把更新拆成客户端、协议与服务端三类对象;启动参数一文把参数按 Production、Internal Diagnosis、Automation/Eval 三套 Profile 管理。共同点是拒绝把单一标签或单一开关当成完整结论。

查看原文:darwin-arm64、win32-x64、linux-x64 到底是什么:一篇讲清安装包命名
OS、CPU 和 ABI 决定“能不能跑”,package format 决定“怎么装”,channel 决定“拿哪条版本线”。
查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
因此,磁盘 offset 变化不一定是错误;非资源 section 的 RVA、大小或内容变化,则必须高度警惕。
查看原文:Omaha 到底是什么:一篇讲清 Chromium 自动更新的客户端、协议与服务端
这也解释了为什么 Chromium 文档里会出现“Chromium Updater 轮询 Omaha Server”这种句子:前者是本机执行者,后者是云端决策者。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
这里有一个很重要的责任边界:浏览器启动参数只能调整 Chromium 接受的那部分 Runtime 行为。

在 PE 资源编辑场景,材料给出的核心取舍是 fail-closed:兼容层只在同时满足“存在资源 section、.rsrc 之后除 .reloc 只多一个 .bun、写入后 image 虚拟大小不变、所有非资源 section 的名称/RVA/大小/属性/内容不变、重新解析后目标 VERSIONINFO 字段一致”时才启用。实现上刻意不把 PointerToRawData 设为不变量,因为 .rsrc 增长可让后续 section 在磁盘上顺延;但虚拟布局与 payload 内容必须锁住。遇到未知 .custom section 或资源增长导致虚拟布局移动时,构建直接失败且不覆盖原文件。

查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
这次实现采用 fail-closed 策略。只有同时满足以下条件,兼容路径才会启用: 1. PE 中存在资源 section。 2. .rsrc 之后除了 .reloc,只多出一个 .bun。 3. 写入新资源后,整个 image 的虚拟大小不变。 4. 所有非资源 section 的名称、RVA、virtual size、raw size、attributes 和二进制内容不变。 5. 重新解析输出文件后,所有目标 VERSIONINFO 字段与预期值一致。
查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
这里刻意没有把 PointerToRawData 设为不变量。.rsrc 增长时,后续 section 在磁盘文件中的位置可以移动;只要 PE Header 正确反映新位置,Loader 仍能读取它。兼容层需要锁住的是虚拟布局与 payload 内容。
查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
原始 resedit 解析这份文件时会抛出错误: text After Resource section, sections except for relocation are not supported
查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
如果目标 executable 需要 Authenticode,顺序也必须固定: 签名后的 PE 再被修改,原签名就不再对应当前文件内容。

安装包命名与 PE 修改都涉及“同一架构标签不等于可互换”的边界,但关注点不同。命名一文指出 x64、amd64、x86_64 在普通选包中通常指向同一指令集家族,arm64 与 aarch64 同理,但不同 OS、ABI 下的二进制不能互换,macOS arm64 Mach-O 不能直接当 Linux arm64 ELF 使用;它还强调“架构兼容”只是必要条件,native addon、plugin、driver 与最低系统版本都要对齐。PE 一文则把兼容性落到文件内部布局:Bun 的 .bun section 位于 .rsrc 与 .reloc 之后,触发 resedit 底层“资源 section 之后只接受 relocation”的保守假设,因此需要结构快照与逐项比对,而不是删除检查。

查看原文:darwin-arm64、win32-x64、linux-x64 到底是什么:一篇讲清安装包命名
不过,“同属 AArch64”仍不等于二进制可以跨 OS 直接运行。一个 macOS arm64 Mach-O executable 不能因为 CPU 相同,就直接当作 Linux arm64 ELF executable 使用。OS API、object format、ABI 与 system library 仍然不同。
查看原文:darwin-arm64、win32-x64、linux-x64 到底是什么:一篇讲清安装包命名
所以“架构兼容”只是必要条件,不是充分条件。发行工程真正要验证的是整条 artifact:可执行文件、动态库、native addon、插件、安装器和更新器都必须对齐。
查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
这条异常来自 resedit 底层 PE library 的保守假设:资源 section 之后只接受 relocation,并不表示 Bun executable 已损坏。
查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
这个处理范围很窄:放行的是已经识别并验证过的 Bun 布局,不是把任意 PE 都交给宽松解析器。

Omaha 与启动参数两篇都强调“责任边界”和“不能只调通一个环节”。Omaha 把更新链路拆成 Update Check、Download、Ping-Back,并指出服务端响应只给 noupdate 或 pipeline,不直接塞安装包;下载成功只证明 bytes 到达,还要校验大小与 hash、处理 CRX3、执行 installer,且 CUP、CRX3、Authenticode 各自保护不同对象,不能互相替代。启动参数一文则把浏览器进程拆成 Browser、Renderer、GPU、Extension Service Worker、Native Host 与 Automation Controller,指出启动参数只能调整 Chromium 接受的那部分 Runtime 行为,本地模型显存不足或 Native Host 泄漏不能靠给所有 Renderer 加大堆上限来“治疗”。两者都反对用一个 JSON 或一串 flags 包办整条链路。

查看原文:Omaha 到底是什么:一篇讲清 Chromium 自动更新的客户端、协议与服务端
服务端不会把安装包塞进 Update Check 的 JSON response。它先回答 noupdate 或 ok;当有新版本时,再提供 nextversion 与一组按优先级排列的 pipeline。
查看原文:Omaha 到底是什么:一篇讲清 Chromium 自动更新的客户端、协议与服务端
下载成功只能证明一串 bytes 到了本地;Chromium Updater 还要校验大小与 hash,处理 CRX3,执行 installer,并根据 user/system scope 处理权限、进程和安装状态。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
本地模型显存不足、Native Host 内存泄漏、Extension 事件丢失,不能靠给所有 Renderer 加大堆上限来统一“治疗”。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
它不会在启动时立刻分配 4 GB,也不会自动降低 RSS,更不会修复对象长期存活、跨进程重复缓存或 Native Runtime 泄漏。

启动参数一文对 Sandbox、Remote Debugging 与 User Data Directory 给出成对约束:Production、灰度与真实账号验收禁止 --no-sandbox;Remote Debugging 不得接到用户日常 Profile,每个并行 Run 使用唯一目录,Harness 优先用 Pipe,必须用 Port 时由 Runner 分配回收而非固定 9222;从 Chrome 136 起,--remote-debugging-port 与 --remote-debugging-pipe 在默认 Chrome User Data Directory 上不再生效,必须同时指定非默认目录。验收清单要求 Start Menu、Desktop、Taskbar 快捷方式 Arguments 为空,chrome://version 中 Browser Process 不含 --no-sandbox、--disable-gpu、Remote Debugging 或证书绕过参数,并用 CIM 只筛选没有 --type= 的主进程做自动检查。

查看原文:Windows 下 AI 浏览器的最佳启动参数配置
从 Chrome 136 开始,--remote-debugging-port 和 --remote-debugging-pipe 在默认 Chrome User Data Directory 上不再生效,必须同时指定非默认目录。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
- 不把 Remote Debugging 接到用户日常 Profile; - 每个并行 Run 使用唯一目录,不共享同一个 C:\Temp\profile; - Harness 优先使用 Pipe;必须用 Port 时,让 Runner 分配和回收,不固定写死 9222;
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
- [ ] Start Menu、Desktop、Taskbar shortcut 的 Arguments 都为空; - [ ] 首次启动和重启后没有 unsupported command-line flag 警告; - [ ] chrome://version 中 Browser Process 没有 --no-sandbox、--disable-gpu、Remote Debugging 或证书绕过参数;
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
子进程会带 Chromium 自己生成的 --type= 等参数,因此只筛选没有 --type= 的主进程

现有材料留下几个可继续探讨的问题:PE 兼容层在真实 Bun artifact 上通过结构检查后,材料明确说仍不能把 macOS 上的结构检查描述成 Windows 原生验收,正式发布还需在 Windows 上启动 executable、回读 File Properties 或 PowerShell VersionInfo,并在 metadata 修改之后完成 Authenticode 签名;那么跨平台构建链中由哪一层承担这项原生验收、失败时如何阻断发布,材料未给出完整答案。Omaha 方面,Protocol 4.0 公开文档截至 2026 年 8 月 25 日仍标注为 draft,材料建议实现时固定到所用 Chromium commit,但旧客户端兼容与 key rotation 的具体验收方式仍待细化。启动参数方面,材料要求每次 Chromium baseline 升级后重跑 GPU、Sandbox、Profile、Automation 与 Memory Regression,但未说明这些回归在何种设备矩阵上执行才算充分。

查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
真实 artifact 验证完成后,仍不能把 macOS 上的结构检查描述成 Windows 原生验收。正式发布还需要在 Windows 上启动 executable、回读 File Properties 或 PowerShell VersionInfo,并在 metadata 修改之后完成 Authenticode 签名。
查看原文:Omaha 到底是什么:一篇讲清 Chromium 自动更新的客户端、协议与服务端
截至 2026 年 8 月 25 日,这份公开文档仍标注为 draft;真正实现时应固定到所使用的 Chromium commit,而不是假设 main 永远不变。
查看原文:Omaha 到底是什么:一篇讲清 Chromium 自动更新的客户端、协议与服务端
CUP public key 必须在构建期进入客户端 trust root,服务端必须正确保管对应 private key,还要为旧客户端设计 key rotation 与历史 key 兼容。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
- [ ] 每次 Chromium baseline 升级后重新跑 GPU、Sandbox、Profile、Automation 与 Memory Regression。

Performance

覆盖 3/3 份来源 · 模型归纳

三篇材料分别处理本地 Agent 数据刷新、内存指标口径和聊天界面背景动画,但共同的方法是把“是否值得做一次工作”从执行细节中抽出来单独定义。Owlet 把刷新拆成请求合并、按 UI surface 分层计算、发布前值级短路三层;FlyOS 把内存判断拆成进程角色 RSS、进程树 Physical Footprint 与 heap 证据链;云雾层则把视觉约束拆成不参与布局、不拦截交互、只动 transform 与 opacity。三者都不是追求单次操作更快,而是减少无效工作或无效呈现。

查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
这轮改动之后,我更确定一件事:本地 Agent 工具的性能优化,重点不是把某一次 query 跑快,而是把刷新语义、数据计算和 UI 发布拆开管理。
查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
FlyOS 性能治理真正需要的,不是寻找一个万能数字,而是把进程结构、系统压力、运行时分配和用户体验连成一条证据链。
查看原文:让云雾动起来:聊天界面的分层氛围动画
这件事看起来是视觉微调,实际很像前端工程里的控制问题:动画有了不代表体验变好了。

Owlet 的刷新架构有一个明确取舍:用单个长期持有的 auto-refresh Task 加 pendingAutoRefresh 标记实现 trailing-edge 合并,而不是每次事件取消旧任务重新等待。这样刷新期间到达的最后一次变化不会被 isRefreshing 丢掉,代价是需要维护一个状态机并处理刷新后再次检查标记。与之配套的是 AnalyticsReloadScope 把 surface 与 board 查询分开,菜单栏等轻量消费者只加载今日 Token 和近 7 日日聚合,仪表盘才承担完整查询。

查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
这相当于一个 trailing-edge coalescer。它允许短时间内的事件合并,又保证「刷新期间发生的最后一次变化」不会消失。对本地日志同步来说,这比无限取消的 debounce 更符合数据正确性。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
此前这些 UI surface 共用一份 analytics reload,打开菜单栏也可能触发全套 dashboard 查询。优化后把 snapshot 分成两类:
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
当用户点开菜单栏时,先从已经落到本地 SQLite 的数据快速加载 surface snapshot,再在后台走 adapter 增量同步。用户看到的是立刻可用的旧但可信数据;同步完成后再应用新结果。

Owlet 的第三层约束是发布语义:查询完成不等于应该发布状态。BoardAnalyticsSnapshot 实现 Equatable,在主线程发布前做值级短路,只有字段真正变化才写回 @Published。配合活跃时每 3 秒检查、空闲时 30 秒兜底、文件观察事件立即合并的节奏,系统把“数据库读到结果”和“UI 需要看到新状态”分开。作者也明确没有给出提速百分比,而是把验证分为行为正确性、数据正确性和 Instruments 运行时证据三层。

查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
这一步很朴素,但它把“数据库读到一个结果”与“UI 需要看到一次新状态”明确区分开了。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
检测到活跃 Agent:每 3 秒检查并按需同步 没有活跃 Agent:30 秒才做一次兜底刷新 文件观察事件:立即合并到下一次刷新
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
这里有一个容易犯的错:没有 trace 就先宣布“快了 X%”。这次我没有编造一个漂亮数字,而是把验证拆成三个层次:

macOS

覆盖 10/10 份来源 · 模型归纳

在 macOS 桌面浮层类界面中,多个来源都把稳定性问题归因于 AppKit 窗口层级、透明 NSPanel、系统材质与持久化策略的叠加,而不是 SwiftUI 视图本身。Argos 灵动卡的排查记录显示,作者最终把窗口层级暴露为设置项:默认使用最稳的普通窗口,浮动与桌面组件风格作为可选项;透明圆角需要同时处理 SwiftUI 视图与 AppKit hosting/container 两层;系统 material 先暂缓,改用 SwiftUI blur、半透明 tint 与渐变 stroke 模拟雾白玻璃。青山湖设计风格的复盘也提到,灵动卡曾因 NSVisualEffectView、系统 material 和 behind-window sampling 触发打开即崩,后来降级为普通浅色 panel,再改为纯 SwiftUI 内部绘制,以保留“雾”的视觉语义而不恢复高风险采样链路。

查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
最后我把层级选择暴露到了设置里:默认用最稳的普通窗口,用户可以自己切到浮动或桌面组件风格。这个决策不够“产品洁癖”,但足够工程务实。
查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
这就是为什么透明 panel 要同时处理两层: 层 要处理什么 ------ SwiftUI view clipShape、背景、边框、视觉层次 AppKit hosting/container clear background、cornerRadius、continuous corner、masksToBounds
查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
原因很简单:灵动卡本身已经是一个透明 NSPanel,再叠系统 material 和特殊 window level,变量太多。为了排查和发布稳定性,先减少系统合成路径。
查看原文:青山湖设计风格的诞生记
灵动卡需要接近 macOS 桌面小组件的玻璃质感。最直接的实现是 NSVisualEffectView、系统 material 和 behind-window sampling,但这条路径曾经触发打开即崩。为了稳定性,我们一度把它降级成普通的浅色 panel,结果功能稳定了,气质也一起消失了。

持久化打开状态在桌面浮层里同时是体验设计与故障恢复设计。Argos 的记录指出,持久化并默认打开能保证用户下次启动仍看到卡片,但如果“打开灵动卡”本身会崩,自动恢复就会把应用变成“打开即崩”,用户没有机会进入设置关闭它;作者最终选择恢复持久化与默认打开,但把默认 window level 降到普通窗口,并把高层级选择放进设置。同一篇记录还列出“本机不崩、用户机崩”的可能差异来源,包括芯片/显卡路径、系统小版本、Stage Manager 与桌面组件状态、多屏与刘海屏、辅助显示工具以及历史保存的窗口设置,因此判断重点应放在“哪些系统路径只有对方会走到”。

查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
但从事故恢复看,持久化会放大问题:如果“打开灵动卡”本身会崩,那么应用每次启动自动恢复灵动卡,就会变成“打开应用即崩”,用户连进设置关闭它的机会都没有。
查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
最后我选择恢复持久化和默认打开,但把默认 window level 降到普通窗口,并把高层级选择放到设置里。这不是绝对安全,但比“默认走最高风险路径”合理得多。
查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
所以这类 bug 不能只问“为什么我不复现”。更有效的问题是:哪些系统路径只有对方会走到?哪些设置会让用户每次启动都自动进入危险路径?

Owlet 的性能优化把“刷新”拆成三层控制:合并请求、按 UI surface 拆分 analytics、在发布前做值级短路。刷新合并采用单个长期持有的 auto-refresh Task 加 pendingAutoRefresh 标记,形成 trailing-edge coalescer,保证刷新期间发生的最后一次变化不会丢失;analytics 分为 surface、board、all 三种 scope,菜单栏、灵动岛、灵动卡只取今日 Token 与近 7 日日聚合,仪表盘才需要项目、模型、小时趋势等完整数据;snapshot 实现 Equatable 并在主线程发布前比较,避免无变化数据重新赋值 @Published 而触发 SwiftUI 重绘。节奏上,检测到活跃 Agent 时每 3 秒检查,没有活跃 Agent 时 30 秒兜底,文件观察事件立即合并到下一次刷新。

查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
这相当于一个 trailing-edge coalescer。它允许短时间内的事件合并,又保证「刷新期间发生的最后一次变化」不会消失。对本地日志同步来说,这比无限取消的 debounce 更符合数据正确性。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
此前这些 UI surface 共用一份 analytics reload,打开菜单栏也可能触发全套 dashboard 查询。优化后把 snapshot 分成两类:
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
这一步很朴素,但它把“数据库读到一个结果”与“UI 需要看到一次新状态”明确区分开了。特别是 3 秒一次的活动探测中,绝大多数轮次的活跃会话并没有变化;这时只要不写回 activeSession,就不会无端唤醒整棵视图树。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
检测到活跃 Agent:每 3 秒检查并按需同步 没有活跃 Agent:30 秒才做一次兜底刷新 文件观察事件:立即合并到下一次刷新

粒子特效与内存指标两篇复盘共享同一种取舍方法:先明确元素或指标回答什么问题,再决定保留什么。彩纸特效中,作者保留语义最清晰的矩形彩纸、圆形亮片、菱形与十字星芒,删掉彩带、爆点和大面积 bloom,理由是彩带作为连续曲线一条不自然就非常显眼,爆点会把语义带向烟花,大面积光晕在真实桌面背景上会显脏;同时强调“不够满”应先看分布而不是先加数量,自然感来自整体 motion field 而非逐粒子随机。FlyOS 的 RSS 复盘则指出 RSS 与 Physical Footprint 是两把尺子:RSS 适合拆解 Browser、Renderer、GPU、Utility 等进程角色和同口径趋势,但多进程相加可能重复计算共享页,不能替代系统压力口径;RSS 上涨只是调查信号,要推进到泄漏结论还需 heap snapshot、allocation profile、GC 后基线与进程生命周期证据。两者的共同点是拒绝“更多/更大/更高就是更好”,差异在于一个处理视觉语义层级,一个处理统计口径边界。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
最后我判断:在这个产品场景里,彩带收益不够高。Argos 是一个 macOS 工具,不是游戏结算页。彩带一旦做不好,负收益很明显。所以最终删掉。 这个决策很重要:粒子系统不是越复杂越高级,删掉不稳定元素也是工程能力。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
也就是说,random 只是 variation,不是 composition。
查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
这也是为什么 FlyOS 同时采集两条线: bash 拆解进程角色,并得到每个进程的 RSS ps -axo pid=,ppid=,rss=,%cpu=,command= 对同一组 PID 做 macOS Physical Footprint 统计 footprint -j result.json -f bytes --noCategories footprint 在接收多个进程时,会把多重映射的对象去重,并把共享部分单独记账。因此,RSS 汇总和 Physical Footprint 出现明显差异,本身并不是异常。
查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
因此,“跑一次后 RSS 比之前高”最多是一个调查信号,不是泄漏结论。更可靠的链路应该是:先固定 workload 和进程范围复现趋势,再用 heap snapshot、allocation profile、对象数量、GC 后基线和进程生命周期去定位原因。

现有材料中,Argos 灵动卡的窗口层级默认值与持久化策略是在崩溃排查后调整的,但资料没有记录调整后在不同系统版本、多屏、刘海屏与辅助显示工具组合下的验证结果;青山湖设计风格复盘提到灵动卡曾降级为普通浅色 panel 再改为纯 SwiftUI 绘制,也没有给出该方案与系统 material 方案在真实设备上的稳定性对比数据。此外,Owlet 的刷新 scope 拆分与 3 秒/30 秒双档节奏,文中只描述了验证应分行为正确性、数据正确性与运行时证据三层,未给出 Instruments 观测的具体数值结果,因此这些优化在长期常驻场景下的实际收益仍可继续用同口径采样来确认。

查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
如果你确实要做桌面小组件式 surface,可以上玻璃质感,但默认路径要克制。我的建议是:默认普通层级 + 安全 blur + 可选高级层级。等收集到足够多真实设备反馈后,再决定要不要把更像系统小组件的层级设为默认。
查看原文:青山湖设计风格的诞生记
最后采用的是纯 SwiftUI 内部绘制: - 大面积雾白柔焦带; - 左上角雾白 soft blur; - 右下角很淡的湖水青 blur; - 所有效果裁剪在卡片内部; - 不使用 NSVisualEffectView; - 不使用 .behindWindow 或 .underWindowBackground。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
我会怎样验证这类优化 这里有一个容易犯的错:没有 trace 就先宣布“快了 X%”。这次我没有编造一个漂亮数字,而是把验证拆成三个层次: 1. 行为正确性:并发事件不会丢最后一次更新;手动刷新与自动刷新不会并发重入。 2. 数据正确性:没有 delta 时不改 analytics;有 delta 时会重新读取对应 scope。 3. 运行时证据:用 Instruments 观察主线程占用、SwiftUI update 原因,以及菜单栏打开和仪表盘切换时的 SQLite 查询量。

GitHub

覆盖 2/2 份来源 · 模型归纳

两篇材料都围绕 GitHub 使用中的具体工程问题展开,但关注点不同:一篇讲用 Probot 框架构建 GitHub App 实现 NPM 自动发布,另一篇讲 git push 或访问 GitHub 时出现 443 连接失败的排查顺序。前者涉及应用身份、权限与发布流程,后者涉及 DNS、代理、网络出口与 Git 配置的逐层定位,二者没有共同的因果或版本关系。

查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
GitHub Apps 可以被直接安装到组织或者用户账号上,并且可以赋予它们访问指定仓库的权限。它们带有内置的 webhook 和狭窄的特定权限。
查看原文:「已解决」Failed to connect to github.com port 443
按“DNS 解析 → 本机代理 → 网络出口 → Git 配置”的顺序排查。hosts 只应作为明确、临时且可回滚的诊断手段,不是长期方案。

两篇材料都强调避免把易变的外部信息固化为长期配置。Probot 方案把 NPM Token 放在 .env 中经 process.env 读取,并提醒不要在日志中打印环境变量;对公开安装的 GitHub App,作者选择在回调中校验仓库全名是否以指定组织或用户开头,而不是仅依赖应用注册类型。443 排查文章则明确反对从第三方网站抄 IP 后长期写 hosts,主张优先修复代理配置、DNS 和受控网络出口,并把 hosts 限定为明确、临时且可回滚的诊断手段。

查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
NPM Token 是不能被别人看到的,为了达到这个目的,首先项目需要设置为私有的,然后将 Token 放到 .env 中,通过 process.env.NPM_AUTH_TOKEN 获取。另外谨记不要在日志中打印环境变量。
查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
如果把 GitHub App 发布为 public 的,那么任何仓库都可以安装该应用,这不是我们想要的结果。解决办法有两个,一是将应用注册为 private 类型的,二是在监听回调中判断是否是允许的组织或者用户。我选择的是第二种方案
查看原文:「已解决」Failed to connect to github.com port 443
避免采用:从第三方网站抄 IP 后长期写 hosts。它可能短暂恢复访问,却会在下一次基础设施变更时再次失效。
查看原文:「已解决」Failed to connect to github.com port 443
公司网络下应优先使用合规的网络出口或咨询网络管理员,不要把公共 IP 固化进 hosts。

两篇材料在“先定位再处理”的方法上有共同点,但对象不同。Probot 文章先区分 release 与 push 两类触发场景,再分别设计发布流程,并说明 lerna 因一次可能发布多个仓库而无法沿用单包发布流程。443 文章则先区分浏览器与 Git 是否同样失败:浏览器能打开而 Git 失败时重点检查 Git 代理配置,两者都失败时更可能是 DNS、代理客户端或网络出口问题;在 HTTPS 策略不稳定且已配置 SSH key 时,可把远程地址切到 SSH。

查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
lerna 管理版本由于是一次可能发布多个仓库,所以无法使用上面提到的发布流程。
查看原文:「已解决」Failed to connect to github.com port 443
如果浏览器能打开而 Git 失败,重点检查 Git 的代理配置;如果两者都失败,则更可能是 DNS、代理客户端或网络出口的问题。
查看原文:「已解决」Failed to connect to github.com port 443
HTTPS 网络策略不稳定、且账户已配置 SSH key 时,可以将远程地址切到 SSH
查看原文:「已解决」Failed to connect to github.com port 443
ssh -T git@github.com 这不会绕过网络限制,但能避免 HTTPS 凭据与代理配置的额外变量。

现有材料没有说明 Probot 发布机器人在 release 与 push 两条路径上的失败重试、并发发布冲突或 Token 轮换如何处理,也没有说明 443 排查中 SSH 方案在何种网络策略下会被阻断。这些问题在现有资料下仍可继续探讨,但材料本身未给出结论。

查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
if (result.type === 'none') { app.log.error( You can't publish duplicate version ${result.package}@${result.version}, ); }
查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
await execSh( cd ${cloneTempDir} && npm install && npm run build && ./node_modules/.bin/lerna publish from-git --yes --no-verify-access, );
查看原文:「已解决」Failed to connect to github.com port 443
这不会绕过网络限制,但能避免 HTTPS 凭据与代理配置的额外变量。

独立开发

覆盖 2/2 份来源 · 模型归纳

两篇文章都把 TaleFrame 的服务端收敛为一个部署在 Vercel 的 Next.js 项目,管理员页面与 API 共享输入校验、内容模型和发布逻辑;持久化拆成 Neon Postgres 与 Vercel Blob 两类,客户端保持原生 Kotlin 与 Jetpack Compose。架构实录进一步说明,Neon 是独立数据库服务,即使通过 Vercel 集成创建,数据表与 SQL 操作仍在 Neon Console 完成,数据库与 Blob 凭证只存在服务端,不下发给 Android。这一组合的取舍是保留客户端选择权:App 通过 HTTPS 读取目录、正文与图片,将来增加其他客户端可复用内容接口,但各端交互仍需分别实现。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
TaleFrame 的服务端采用一个 Next.js 项目。管理员页面与 API 放在一起,共享输入校验、内容模型和发布逻辑。部署时也只有一个服务端项目需要处理。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
Neon 是独立的数据库服务。即使通过 Vercel 的集成入口创建或连接数据库,数据管理仍由 Neon 承担。Vercel 的存储文档也区分了 Blob 等产品与外部数据库集成。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
服务端通过环境变量取得连接信息,在处理请求时访问 Neon;数据库凭证和 Blob 写入凭证不会下发给 Android。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
这样的组合保留了客户端选择权。App 通过 HTTPS 读取目录、正文与图片,服务端使用 Next.js 不会把 Android 变成跨端应用。将来增加其他客户端,可以复用内容接口;各端交互仍然需要分别实现。

发布协议把编辑态与读者可见态分开:保存草稿只更新 chapters.body,读者继续读取上一份发布版本;点击发布后计算正文 SHA-256,按“章节 ID + 哈希”去重写入 chapter_versions,生成 releases 快照,并在同一事务内切换 books.published_release、递增全局目录版本。客户端用 ETag 条件请求目录,未变返回 304,变化时校验后原子替换本地目录;正文下载后核对哈希再进入缓存,缓存键包含正文版本。两篇都指出,这套机制更新的是内容而非 APK,首次无缓存时需要联网。

查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
发布逻辑读取该书已保存的章节,计算每章正文的 SHA-256。新的正文版本写入 chapter_versions;同一章节、相同哈希已经存在时,不重复插入。 随后创建发布快照,把书目信息与章节引用保存到 releases,更新 books.published_release,并递增目录版本。相关更新在同一数据库事务中提交。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
正文版本按“章节 ID 与内容哈希”去重。只修改一章时,其余章节可以复用已有正文版本;发布快照保存引用,无需每次复制整本正文。当前保留最近五次发布,回退通过切换已发布快照完成,也不会覆盖编辑中的草稿。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
目录接口使用 ETag。App 带着上一次的标记请求,如果目录未变,服务端返回 304;如果发生变化,客户端先解析和校验新目录,再替换本地文件。解析失败或网络中断时,保留上一份可用目录。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
正文下载后会核对 SHA-256,通过后才进入缓存。缓存键包含正文版本,同一章节被修订后不会误读旧文件。当前缓存上限为 100 MB,按最近读取情况淘汰旧内容;这个数值是本项目的选择,不是阅读 App 的通用标准。

现有资料留下几个可继续探讨的问题:全量目录不分页、无增量补丁,书库扩大后目录响应体与解析耗时是否会成为瓶颈;共享缓存 60 秒窗口与客户端 100 MiB 缓存预算在真实地区网络下的表现如何;若引入读者账号、付费章节或跨设备进度,身份与授权模型应如何重新设计,而不是把单管理员机制直接扩展;漫剧所需的视频存储、转码与分发成本,无法用小说正文的 22.83 MB 测量推断。

查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
当前目录包含所有已发布小说及其章节引用,不是仅含书名的轻量首页,也没有目录分页和增量补丁接口。这降低了首版实现复杂度,但书库继续扩大时,需要测量目录响应体与解析耗时,不能只关心正文占用。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
重点关注的变化,是全量目录变大、数据库回源压力、真实地区网络可用性,以及付费内容或视频进入产品。这些变化会影响现有边界:目录可能需要拆分,正文分发可能需要调整,漫剧则需要重新测量视频存储与播放成本。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
这仍然是单管理员后台。读者账号、会员权限、支付、跨设备阅读进度尚未实现。需要这些能力时,应重新设计身份与授权模型,不能把管理员密码机制直接扩展成面向所有读者的账号系统。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
这也是 TaleFrame 暂时保留 Coming Soon 的原因。漫剧会增加视频存储、转码、播放与分发问题,小说正文的成本测量无法替视频业务作判断。

Animation

覆盖 2/2 份来源 · 模型归纳

两篇文章都把动画当作需要约束的系统而非装饰:彩纸特效强调粒子出生位置、生命周期、运动方向、密度分布与视觉层级要服务同一动势,云雾层则要求不影响交互、不挤压布局、永远在内容下方且动画成本可控。前者用 emitter 的 origin、spread、angle、rate、burst count 等参数控制第一眼动势,后者用绝对定位、pointer-events: none、z-index 分层和只动 transform 与 opacity 来保证氛围层不抢内容。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
好看的关键不是“粒子越多越好”,而是让粒子的出生位置、生命周期、运动方向、密度分布、视觉层级服务同一个动势。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
Emitter 是粒子系统里的发射器。它决定粒子从哪里出生。
查看原文:让云雾动起来:聊天界面的分层氛围动画
所以云雾层需要满足四个约束: 约束 实现选择 --- --- 不影响交互 pointer-events: none 不挤压内容布局 position: absolute,不放进正常 flow 永远在内容下方 雾层 z-index: 0,内容容器 z-index: 1 动画成本可控 只动 transform 和 opacity
查看原文:让云雾动起来:聊天界面的分层氛围动画
这里我刻意只用了 transform 和 opacity。它们通常可以由 compositor 处理,不会每一帧触发布局计算。

两篇文章对“加效果”的取舍方向一致但具体手段不同:彩纸特效通过删除连续元素来稳定语义,彩带因曲线难自然、起点集中、交叉尴尬而被删,爆点因太像烟花、不符合 macOS 工具气质而被删,大面积 bloom 因污染背景和文字而被删;云雾层则不是删层,而是把覆盖范围从 inset: -16% 收束到 inset: 5%,并降低极亮区域覆盖面积,让输入框和欢迎气泡成为稳定焦点。前者是元素级删减,后者是范围与对比度级收束。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
Streamers / 彩带 否 方向、曲线、交叉都很难调,容易显脏 Burst / 爆点 否 在这个场景里太像烟花,不符合 macOS 工具气质 Heavy bloom / 大光晕 否 容易污染画面,让文字和桌面背景变糊
查看原文:粒子系统实践:从一版难看的彩纸特效说起
最后我判断:在这个产品场景里,彩带收益不够高。Argos 是一个 macOS 工具,不是游戏结算页。彩带一旦做不好,负收益很明显。所以最终删掉。
查看原文:让云雾动起来:聊天界面的分层氛围动画
/ 调整后:云团收进安全区,边缘交给页面底色 / inset: 5%; opacity: 0.82;
查看原文:让云雾动起来:聊天界面的分层氛围动画
这也是我这次最有价值的判断:背景动画的优化,大多数时候不是“做得更多”,而是“让它少出现一点”。

两篇文章都区分“数量”与“分布/层级”这两个维度。彩纸特效指出用户觉得“不够满”时,只加 count 会让空处仍空、挤处更挤,因此同时提高粒子数量并扩大覆盖区域;云雾层则用两层方向相反的 radial-gradient 和 6 秒、8 秒的 alternate 动画制造深度,而不是继续增加颜色或动画。两者共同点是先调分布与层级,再调随机或数量参数。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
这次最终我同时做了两件事: 1. 提高粒子数量:彩纸、亮片、星芒都增加。 2. 扩大覆盖区域:横向更接近全屏,纵向从中下区域扩到中上/中下区域。 这才让画面变“满”。如果只加 count,不改 distribution,只会更乱。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
random 只是 variation,不是 composition。
查看原文:让云雾动起来:聊天界面的分层氛围动画
真正起作用的不是某一个色值,而是三层关系: 1. 形状不规则:每个 gradient 的大小和位置不同,避免出现一眼可识别的圆形光斑。 2. 透明边界足够长:色彩在 76% 到 82% 之间才消失,云团会更像在空气里扩散。 3. 两层方向相反:一层从左下缓慢移动到右上,另一层反向移动,页面才有轻微的深度感。
查看原文:让云雾动起来:聊天界面的分层氛围动画
调参时优先收束可见范围和对比度,而不是继续增加颜色或动画。

两篇文章都给出了适用条件而非通用结论。彩纸特效认为粒子系统适合低频、正向、阶段性的反馈,不适合高频反馈、错误提示、信息密集页面或用户正在专注输入阅读的场景;云雾层认为环境层值得用在空状态、Agent 对话页、工作台欢迎页这类内容稀疏但需要建立产品情绪的界面,数据密集的列表、表格和监控台可以再等。两者都把“不打断用户工作流”和“内容可读性优先”作为边界。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
适合用的场景: 1. 用户完成一个阶段性目标。 2. 系统需要表达奖励。 3. 状态变化低频且重要。 4. 动画不会打断用户工作流。 不适合用的场景: 1. 高频反馈。 2. 错误提示。 3. 信息密集页面。 4. 用户正在专注输入或阅读。
查看原文:让云雾动起来:聊天界面的分层氛围动画
- 值得上:空状态、Agent 对话页、工作台欢迎页这类内容稀疏但需要建立产品情绪的界面。用低对比、慢节奏的环境层补足空间。 - 可以再等:数据密集的列表、表格和监控台。那里信息密度已经够高,背景动画多半只会制造噪声。
查看原文:让云雾动起来:聊天界面的分层氛围动画
此外,生产页面还应该补一条 prefers-reduced-motion,让用户可以在系统层面关闭或静止这类环境动画。审美不能覆盖可访问性偏好。

两篇文章都提到性能与可访问性,但给出的验证方式不同:彩纸特效用 Canvas 单层绘制替代大量 SwiftUI View,并让每个粒子根据 elapsed 计算局部时间;云雾层建议检查任意一帧层级、连续看 10 秒是否烦、性能面板是否有持续压力,并补 prefers-reduced-motion。现有资料没有说明这些验证在低性能设备上的具体结果,也没有说明 Canvas 方案与 transform/opacity 方案在真实设备上的帧率对比,这些可以作为后续继续探讨的问题。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
粒子系统本质上是每帧根据时间计算位置,然后画出来。Canvas 更贴近这个模型。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
elapsed 是整个系统的时钟。每个粒子根据 elapsed - delay 算自己的局部时间,再算 position、rotation、opacity。
查看原文:让云雾动起来:聊天界面的分层氛围动画
1. 停在任意时刻都成立:截取动画中的任意一帧,内容层级都清楚,不能依赖某个刚好干净的瞬间。 2. 连续看 10 秒不烦:如果能明确察觉云团在左右移动,节奏已经太强;正确的感觉应该是视线离开后才意识到页面在呼吸。 3. 性能面板没有持续压力:确认动画只涉及合成友好的属性,并在低性能设备上观察掉帧和 GPU 占用。

前端开发

覆盖 2/2 份来源 · 模型归纳

Remotion 复刻方案存在明确的适用边界与工程约束:速度公式 interval = 0.2 / clamp(load/5, 1, 20) 被照搬为每张 sprite 停留秒数,再乘以 fps 换算成视频帧数;无缝循环要求 durationInFrames 是一个完整动画周期(framesPerSprite × 5)的整数倍,否则 GIF 首尾不齐。当 load 随帧动态变化时,framesPerSprite 每帧改变会使除法结果非单调,导致 sprite 跳帧,严格做法是对速度做相位累积而非简单除法。作者据此判断:做匀速 demo 可偷懒用除法,严肃动态动画需老实累积;若目标是常驻菜单栏读真实 CPU 的原生进程,应使用 Swift 或 Tauri/Electron,Remotion 只负责产出动画资产。

查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
无缝循环的坑:GIF 要循环不跳帧,durationInFrames 必须是「一个完整动画周期」的整数倍,也就是 framesPerSprite 5 的倍数。
查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
当速度随帧动态变化时,Math.floor(frame / framesPerSprite) 里的 framesPerSprite 每帧都在变,除法结果不再单调递增,sprite 会跳帧。严格正确的做法是对速度做相位累积(把每帧的换帧增量累加起来),而不是简单除法。
查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
做匀速 demo 可以偷懒用除法,做严肃动态动画就得老实累积。
查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
你要的是一个常驻 macOS 菜单栏、读真实 CPU 的原生小猫——那 Remotion 不是答案,老老实实用 Swift(RunCat 本体)或 Tauri/Electron。Remotion 造的是动画资产,不是系统进程。

关于 AI 辅助工作流,作者把 Claude Code 的价值分为三层:脚手架层省时间(起项目、配 Composition、连 public/ 资源、写渲染脚本),翻译层省脑子(把 Swift 的命令式 index++ 翻译成 Remotion 的声明式取模),调试层省试错(无缝循环帧数对齐、动态变速相位累积等坑的修法)。同时作者强调判断框架仍须自己掌握,否则 AI 给出的代码既无法 review 也无法调试。这属于作者对工具定位的明确表述,而非对个人经历的推断。

查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
脚手架层(省时间):起项目、配 Composition、连 public/ 资源、写渲染脚本,这些样板活它一把梭。
查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
翻译层(省脑子):把 RunCat 那句 Swift 的命令式 index++ 翻译成 Remotion 的声明式取模,这种「换范式重写」是 AI 的强项——你给它源码逻辑,它给你目标框架的地道实现。
查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
但「取模换帧」的原理、「相位累积」的坑、无缝循环的数学——这些判断你得心里有数,否则 AI 给的代码你既 review 不了也调不动。这也印证了我一直的观点:AI 拉满执行力,判断框架还得是自己的。

现有材料中,2020 年中总结提到新公司入职两个月、独立负责两个 umijs 中台项目,并称后续会继续输出跨平台技术分享;Remotion 一文则写于 2026 年,作者自述从前端转 Agent 开发。两份材料之间缺少中间记录,无法据此判断技术重心是否发生转移,也无法确认 umijs 业务开发经验与后续 Remotion/Agent 实践之间是否存在延续关系。若要讨论其技术路径的演变,需要更多本人明确记录的材料。

查看原文:2020 年中总结
新公司入职有两个月了,独立负责了两个不大的中台项目,技术栈是基于 umijs 的
查看原文:2020 年中总结
后期我也会继续输出跨平台相关的技术分享。
查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
作为一个从前端转 Agent 开发的人,我一直好奇:这种逐帧 sprite 动画,能不能用现代 React 工具链声明式地复刻出来?

npm

覆盖 2/2 份来源 · 模型归纳

两篇材料都围绕 npm 包的构建与发布展开,但切入点不同:一篇以 rollup 为工具,说明如何为 React Native 组件库生成 UMD、CommonJS 与 ES module 三种产物,并通过 package.json 的 browser、main、module、types 字段分别指向对应输出;另一篇以 Probot 框架构建 GitHub App,在 release.released 事件触发时拉取仓库代码、读取 package.json 的 version 并执行 npm publish。前者关注产物格式与打包边界,后者关注发布时机与权限控制。

查看原文:使用 rollup 打包 React Native 插件并发布
"main": "dist/cjs/index.js", "module": "dist/es/index.js", "browser": "dist/umd/index.js", "types": "dist/es/index.d.ts"
查看原文:使用 rollup 打包 React Native 插件并发布
export default [ // browser-friendly UMD build { input: "./src/index.ts", // 输出 output: { file: pkg.browser, // 文件 format: 'umd', // 格式 name: 'refined-components', // 生成包名称,代表你的 iife/umd 包 }, },
查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
我们实现的具体逻辑是,当 Probot app 监听到 release.released 事件时,处理发布前的操作。重要的是我们需要根据 package.json 中的 version 字段匹配出 tag
查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
const downloadDefaultBranch = ${repo.full_name}${context.payload.release.tag_name};

rollup 一文还给出了 tree-shaking 相关的产物组织方式:当组件库较大时,为支持 tree-shaking 不能把所有文件打入单一文件,rollup-plugin-multi-input 可将产物输出到各自文件,且因产物是多文件,输出需用 dir 属性指定文件夹。TypeScript 支持方面使用 rollup-plugin-typescript2,并提示若用了 rollup-plugin-node-resolve 则必须将 typescript 插件放在其前面;UMD 构建中通过 globals 映射 react 与 react-native,并在 external 中声明这两个模块。

查看原文:使用 rollup 打包 React Native 插件并发布
组件库比较大时,我们可能需要让我们的库支持 tree-shaking。那么你就不能将所有的文件都打入到一个文件中。rollup-plugin-multi-input 便是一个将打包产物输出到各自的文件中的插件。
查看原文:使用 rollup 打包 React Native 插件并发布
注意:因为产物是多文件,所以需要用 dir 属性指定文件夹。
查看原文:使用 rollup 打包 React Native 插件并发布
// 如果用了 rollup-plugin-node-resolve, 则必须将它放在 typescript 插件前面
查看原文:使用 rollup 打包 React Native 插件并发布
globals: { 'react': 'React', 'react-native': 'reactNative' },

Probot 一文对发布安全与适用范围给出了具体约束:NPM Token 不应被他人看到,项目需设为私有并把 Token 放入 .env 通过 process.env.NPM_AUTH_TOKEN 获取,且不要在日志中打印环境变量;若把 GitHub App 发布为 public,任何仓库都可安装,作者选择在监听回调中用 isTuya 校验仓库 full_name 是否以 youngjuning 或 tuya 开头,而非注册为 private 类型。针对 lerna 多包发布,作者另设流程:监听 push 事件,判断是否为主分支且提交信息以 chore(release): publish 开头,用 simple-git clone 项目,将 //registry.npmjs.org/:_authToken=${process.env.NPM_AUTH_TOKEN} 写入 .npmrc,再执行 lerna publish from-git。

查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
NPM Token 是不能被别人看到的,为了达到这个目的,首先项目需要设置为私有的,然后将 Token 放到 .env 中,通过 process.env.NPM_AUTH_TOKEN 获取。另外谨记不要在日志中打印环境变量。
查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
如果把 GitHub App 发布为 public 的,那么任何仓库都可以安装该应用,这不是我们想要的结果。解决办法有两个,一是将应用注册为 private 类型的,二是在监听回调中判断是否是允许的组织或者用户。我选择的是第二种方案
查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
1. 判断 push 分支是否是主分支且提交信息包含 chore(release): publish 2. 因为是 lerna publish,所以需要使用 simple-git 这个库 clone 项目。 3. 由于 lerna publish 不支持 token,我们采用将 //registry.npmjs.org/:_authToken=${process.env.NPM_AUTH_TOKEN} 写入 .npmrc 的方式完成带 token 的发布。
查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
await execSh( cd ${cloneTempDir} && npm install && npm run build && ./node_modules/.bin/lerna publish from-git --yes --no-verify-access, );

两篇材料都给出了可操作的配置与流程,但仍有可继续探讨之处:rollup 一文的多文件输出示例中 output 的 dir 写为 './src',与文中“产物输出到各自文件”的 dist 示意不一致,实际应如何配置目录值得核对;Probot 一文以提交信息前缀 chore(release): publish 作为 lerna 发布触发条件,这种基于字符串匹配的触发方式在提交信息格式变化时的稳健性,以及 isTuya 校验对仓库命名约定的依赖,都是现有资料未展开的问题。

查看原文:使用 rollup 打包 React Native 插件并发布
output: [ { dir: './src', format: 'cjs', exports: 'auto' }, { dir: './src', format: 'es' } ],
查看原文:使用 rollup 打包 React Native 插件并发布
src - A.ts - B.ts - index.ts - dist - A.js - B.js - index.js
查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
context.payload.head_commit.message.indexOf('chore(release): publish') === 0
查看原文:基于 Probot 实现 GitHub NPM 发布机器人🤖
const isTuya = context = { const { full_name } = context.payload.repository; return full_name.startsWith('youngjuning') full_name.startsWith('tuya'); };

VS Code

覆盖 3/3 份来源 · 模型归纳

yarn.lock 预览插件对自定义编辑器类型做了明确取舍:文章区分自定义文本编辑器、自定义编辑器和自定义只读编辑器,指出 yarn.lock 属于 VS Code 标准文档模型,因此选用最简单的自定义文本编辑器,只需基于 CustomTextEditorProvider 实现 resolveCustomTextEditor,无需自行提供文档模型与保存备份逻辑。注册时通过 package.json 的 contributes.customEditors 声明 viewType、selector 与 priority,再用 registerCustomEditorProvider 绑定 Provider,这构成该插件可运行的最小架构边界。

查看原文:如何开发一款 VS Code yarn.lock 预览插件
其实答案显而易见,yarn.lock 文件属于 VS Code 标准文档模型,我们选用最简单的自定义文本编辑器即可。
查看原文:如何开发一款 VS Code yarn.lock 预览插件
而 vscode.CustomTextEditorProvider 这个接口只有一个方法 resolveCustomTexEditor。所以原理上我们只需要实现 resolveCustomTexEditor 这个方法即可。
查看原文:如何开发一款 VS Code yarn.lock 预览插件
"viewType": "yarn-lock-preview.yarnLock", "displayName": "Preview yarn.lock", "selector": [ { "filenamePattern": "yarn.lock" } ], "priority": "option"

打包环节两篇文章都指向同一约束:vsce 默认按编译拷贝方式打包,会把 node_modules 与开发配置文件一并带入,导致安装包文件数膨胀。掘金一下文章记录安装 lodash 后打包出现 1060 个文件、644.72KB,并说明加载大量小文件比加载单个大文件慢,因此推荐用 esbuild 捆绑,同时用 .vscodeignore 排除无关文件。yarn.lock 预览插件文章则提到沿用前文的 esbuild 配置以减小体积、加快调试,并把重复工作沉淀为脚手架。这些是工程方案陈述,不构成对运行效果或作者贡献的额外证明。

查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
This extension consists of 1060 files, out of which 1049 are JavaScript files. For performance reasons, you should bundle your extension
查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
加载 100 个小文件要比加载一个大文件慢得多。这就是我们推荐捆绑的原因。
查看原文:如何开发一款 VS Code yarn.lock 预览插件
在 从零开发一款基于 webview 的 vscode 扩展 中我们讲述了使用 esbuild 打包可以减小打包产物的体积以及加快调试速度。

现有材料留下一个可继续探讨的问题:两篇文章都提到把重复配置沉淀为脚手架或工具包,但未说明这些封装在后续版本中的维护状态与适用范围。掘金一下文章称后续会提供多个技术的 vscode webview 开发脚手架,yarn.lock 预览插件文章称已沉淀 yarn create @luozhu/vscode-extension;这些表述属于文章方案与计划,不能据此推断作者当前仍在维护或已覆盖全部场景。

查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
虽然本文的例子是基于 umijs 开发 webview 的内容,但是其他技术原理是一样的,紫升在后续也会提供多个技术的 vscode webview 开发脚手架。
查看原文:如何开发一款 VS Code yarn.lock 预览插件
本着重复的工作都可以用脚本代替的原则,我 vscode 插件开发的最佳实践沉淀为了一个脚手架,执行 yarn create @luozhu/vscode-extension 即可快速开始开发 vscode 扩展。

Vibe Coding

覆盖 2/2 份来源 · 模型归纳

两篇文章都把 AI 降低实现成本后的瓶颈指向“选择与约束”,但落点不同:一篇把 Taste 定义为问题选择、目标层级、取舍、边界与完成标准五类判断,并强调它带责任;另一篇把设计风格的形成描述为从景区意象蒸馏出语义职责,再用删减规则收紧 Agent 的输出。共同点是都反对把 AI 生成能力等同于产品判断,都主张把个人直觉写成可执行、可验证的规则。

查看原文:Taste Is All You Need
我现在用五类选择理解 Taste: 判断 要回答的问题 --- --- 问题选择 这是一个真实问题,还是一个热闹概念? 目标与层级 用户第一眼应该看见什么,完成什么? 取舍 哪些能力、装饰和表达应该被删除? 边界 稳定性、性能、可访问性和业务约束在哪里? 完成标准 什么证据足以证明它可以交付,什么仍然只是 Demo?
查看原文:青山湖设计风格的诞生记
这段过程让我确认了一件事:设计风格首先是一套删减规则。 如果一套风格只告诉 Agent“可以用什么”,它很快就会把所有特征同时用上。真正能提高输出稳定性的,是同时写清楚“最多用多少”“只能用在哪里”“什么情况下不要用”。
查看原文:Taste Is All You Need
这段过程让我确认:设计风格首先是一套删减规则。 如果只告诉 AI“可以用什么”,它会很积极地把所有特征一起用上。输出真正开始稳定,是因为规则同时写清了“最多用多少”“只能用在哪里”“什么情况下不要用”。

在“雾白”这一视觉语义上,两篇文章给出了同一取舍的不同侧重:设计风格复盘强调它从颜色升级为设计体系的基础设施,必须服从稳定性、性能和可读性;Taste 一文则把它放进“哪个体验必须保留、哪个实现可以妥协”的判断框架。两者都记录了放弃 NSVisualEffectView 与窗口采样、改用纯 SwiftUI 内部绘制柔焦层的做法,但都没有把它表述为唯一正确方案。

查看原文:青山湖设计风格的诞生记
最后采用的是纯 SwiftUI 内部绘制: - 大面积雾白柔焦带; - 左上角雾白 soft blur; - 右下角很淡的湖水青 blur; - 所有效果裁剪在卡片内部; - 不使用 NSVisualEffectView; - 不使用 .behindWindow 或 .underWindowBackground。
查看原文:青山湖设计风格的诞生记
这也是我现在判断视觉方案的一个原则:设计语言不能绕过工程约束,好的设计 token 应该能在安全实现与理想效果之间找到可迁移的中间层。
查看原文:Taste Is All You Need
后来为了让灵动卡接近系统组件的玻璃质感,我们尝试过 macOS material 和窗口采样,特定组合会带来稳定性风险。最后我没有放弃“雾”,也没有为了视觉效果继续赌系统边界,而是改用纯 SwiftUI 绘制柔焦层:保留雾白的视觉职责,换掉高风险实现。

跨端迁移被两篇文章共同当作检验设计语言是否成立的环节,但判断标准一致:复用的是语义词汇与判断,而不是同一套界面。青山湖一文列出从 SwiftUI 到 React、Umi、styled-components 和 Tailwind 后新增的 Web 约束;Taste 一文则用表格区分 macOS、iOS、Android、React Native、Web dashboard 与 Landing Page 各自必须服从的系统边界。两者都明确反对把迁移简化为换色。

查看原文:青山湖设计风格的诞生记
迁移过程中,设计体系又吸收了 Web 产品的新约束:正文默认 14px、工具栏控件 32–36px、桌面优先但窄屏不溢出、动效支持 prefers-reduced-motion,以及资源统一使用 WebP。
查看原文:Taste Is All You Need
这次抽取没有把同一套界面复制到六个平台。共享的是一套 semantic vocabulary:canvas、surface、text、primary action、focus、success、warning、error,以及明确的 anti-pattern;各平台仍然遵守自己的交互模型和验收方式:
查看原文:青山湖设计风格的诞生记
重点关注:不要让 Agent 把设计系统退化成 palette。每次迁移至少检查四层:语义 token、信息密度、组件形态和 anti-pattern。只换颜色,不算迁移完成。

两篇文章都划定了适用边界而非普适宣称。青山湖一文明确列出值得上、可以再等与需要重点关注的场景,并强调这套风格的优势是克制;Taste 一文则说明 Taste 不能替代安全、合规、数据正确性和复杂系统边界方面的专业知识与工程验证。两者都把“何时不该用”写进判断框架,而不是只记录成功案例。

查看原文:青山湖设计风格的诞生记
值得上:AI 控制台、桌面效率工具、settings、数据 dashboard、menu bar 与 floating panel。这些场景需要稳定、清透、低噪声,又不能完全失去品牌辨识度。 可以再等:强营销 landing page、娱乐化社区、需要极强情绪刺激的消费产品。青山湖的优势是克制,不适合强行承担所有视觉目标。
查看原文:Taste Is All You Need
不能替代: 涉及安全、合规、数据正确性和复杂系统边界时,Taste 不能替代专业知识、工程验证和责任机制。好判断必须建立在真实约束上。

现有材料记录了把判断写成 DESIGN.md、Skill 与验收清单的做法,也记录了跨端迁移时新增的平台约束,但没有给出这些规则在后续会话中实际被 Agent 遵守或违反的验证数据。在只有作者自述与项目文档的情况下,如何判断一套约束真正降低了输出漂移,而不是仅把偏好换了一种表述,仍可继续探讨。

查看原文:Taste Is All You Need
它不证明 Taste 可以被 AI 自动拥有;它证明的是另一件更务实的事:人的判断可以被外化成 Agent 能读取、实现和验收的约束。
查看原文:青山湖设计风格的诞生记
当这些规则被写进 DESIGN.md 和项目级 AGENTS.md,审美才从一次性的聊天上下文,变成可以在下一次会话继续生效的工程资产。

职业规划

覆盖 2/2 份来源 · 模型归纳

两篇规划都把“执行之后如何被约束和验证”放在核心位置,但组织方式不同。三年规划把授权边界、风险分级审批、评估回放列为独立能力线,并强调模型可调整执行策略、权限与审计须由独立于模型决策的治理机制约束;成长路线图则在 L3 列安全与约束、L4 列 Sandbox 与可观测性、L5 列 Human-in-the-loop、L6 列 Eval 与轨迹记录,把治理分散到各层能力点中。共同点是都要求权限、隔离、评测与轨迹记录进入工程基础设施,而非上线前附加检查。

查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
我准备明确区分两类职责:执行策略可以由模型调整;权限、预算、审批和审计由独立于模型决策的治理机制约束。“独立”首先是信任与职责边界,可以先在现有运行时里实现,不意味着新建一套控制平台。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
把 E2E Eval、Trace、Replay、故障恢复和权限治理作为工程基础设施,而不是上线前的附加检查。一个任务即使完成了,如果过程中执行了未经授权的敏感操作,也不应被评价为成功。
查看原文:Agentic System Engineer 成长路线图与学习指南
- 安全与约束:输入过滤、输出审查、权限控制、沙箱隔离。Agent 的自主性越高,安全风险越大。
查看原文:Agentic System Engineer 成长路线图与学习指南
- 可靠性:Agent 的自主性意味着错误可能被放大,需要有完善的熔断、降级机制。

两份材料对“从原型到生产”的路径有相近的层次划分,但验收口径不同。成长路线图按 L1 到 L7 逐层给出学习主题与行动项,例如 L4 关注 Runtime、状态机、Sandbox、Checkpoint 与可观测性,L5 关注 Browser Agent、Grounding、RAG、多 Agent 与 Human-in-the-loop,产出物是原型、生产级系统和可自进化系统。三年规划则按三个年度阶段推进,第一阶段要求结构化执行提案、动作前授权检查、预算与终止条件、可回放轨迹,并明确“一个端通过不代表跨端能力完成”。前者偏能力地图与学习节奏,后者偏可核验的交付证据与风险边界。

查看原文:Agentic System Engineer 成长路线图与学习指南
- Agent Runtime:Agent 的执行引擎。需要了解 LangChain、Mastra、AutoGen 等框架的 Runtime 设计。
查看原文:Agentic System Engineer 成长路线图与学习指南
- Checkpoint / Durable Execution:执行状态持久化,支持故障恢复。Temporal、Durable Objects 等技术。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
从一类有代表性的任务开始,沿用现有工具、运行时和存储,补齐四项能力:结构化执行提案、动作发生前的授权检查、预算与终止条件、可供回放和评估的执行轨迹。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
浏览器或某一移动端可以先落地,但不能把单端成功等同于跨环境完成。

关于“模型自主规划”与“确定性流程”的取舍,两份材料都主张按结果比较而非预先站队。三年规划明确 Planner、Executor 或多 Agent 图只是可比较的实现选项,规则明确、重复性高或需严格保证顺序的任务仍适合确定性 Workflow,选择依据是成功率、风险、延迟和成本;若动态规划没有收益就保留固定流程。成长路线图在 L3 把 Planning、ReAct、任务分解列为重点突破层,在 L4 又要求用状态机或 DAG 编排执行流程,体现“认知层交给模型、运行层用确定性结构承载”的分工。

查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
对于规则明确、重复性高或需要严格保证顺序的任务,确定性 Workflow 仍然有价值;选择依据应当是成功率、风险、延迟和成本的对照结果。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
如果动态规划没有带来收益,就保留固定流程;如果新增治理机制只增加确认次数而没有改善控制效果,就缩小范围、修正规则。
查看原文:Agentic System Engineer 成长路线图与学习指南
- 工作流 / 状态机:用状态机或 DAG 编排 Agent 的执行流程。如 LangGraph、Temporal 等。
查看原文:Agentic System Engineer 成长路线图与学习指南
- Planning:Agent 如何拆解任务、制定计划。关键概念包括 Task Decomposition(任务分解)、Hierarchical Planning(层次规划)、ReAct(推理+行动循环)。

两份规划都强调产品判断与真实用户价值,但落点不同。三年规划把职业身份定为 AI Systems & Product Engineering,主张先识别问题再选择技术,补强 Product Discovery、用户研究、Human-AI Interaction 与端到端交付,并以任务完成率、重复使用、审批等待、无必要打断和风险漏拦评估体验。成长路线图把产品理解、领域建模、沟通表达、文档写作、业务落地列为横向业务素养,并在 L7 提出结合业务场景推动 Agent 落地。共同点是技术深度与产品判断需并行,差异在于前者把产品责任写成阶段验收材料,后者把业务素养写成贯穿各层的横向维度。

查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
技术深度决定能实现什么,产品判断决定什么值得实现。它们结合起来,才构成我想长期积累的职业壁垒。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
以任务完成率、重复使用、审批等待、无必要打断和风险漏拦评估体验。
查看原文:Agentic System Engineer 成长路线图与学习指南
- 产品理解:理解 Agent 产品的用户场景和价值主张。
查看原文:Agentic System Engineer 成长路线图与学习指南
- 业务落地:从 POC 到生产环境,推动 Agent 在真实业务中产生价值。

两份材料都提出用评测、轨迹和回放检验 Agent 行为,但尚未给出可比较的量化基线。三年规划明确在没有统计基线前不承诺具体耗时收益,并要求越权用例必须阻断、有限测试零漏拦不等于实际环境绝对安全;成长路线图则把 Eval 数据集、轨迹记录和 Skill Library 列为 L6 行动项。可继续探讨的是:在跨 Browser、Android、iPhone、Computer 四类环境时,如何用同一套任务集与风险指标比较固定流程、模型动态规划和混合方案,以及公开材料在脱敏与合成数据条件下能支持多大范围的结论。

查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
固定流程、模型动态规划和混合方案使用同一任务与口径比较。没有统计基线之前,不承诺“耗时从 90 秒降到 40 秒”之类的结果;有数据后才设阶段目标,并同时注明样本、环境和风险指标。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
评测中的越权用例必须阻断;有限测试零漏拦不等于实际环境绝对安全。
查看原文:Agentic System Engineer 成长路线图与学习指南
10 学习 Eval 体系:成功率、任务完成率、轨迹质量 为自己的 Agent 设计 10-20 个测试用例,建立自动化评估 Eval 数据集 + 评估脚本
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
工作中的经验可以帮助形成判断,但内部代码、运行数据和客户案例不能自动变成公开作品;无法获得公开授权的部分,用独立实现与合成场景表达,并注明验证范围。

客户体验治理办公 AI 产品

覆盖 1/1 份来源 · 模型归纳

公开记录将该项目定位为面向客户体验治理办公场景的垂类 AI Work 产品,产品形态参考 ACCIO Work。记录确认俊宁主导该项目;对 ACCIO Work 的类比仅表达产品定位,不能据此认定已实现相同功能或完成交付。

查看原文:客户体验治理办公 AI 产品
将一款 AI Work 产品定位于客户体验治理办公场景,产品形态参考 ACCIO Work。
查看原文:客户体验治理办公 AI 产品
2026-10-31 本人明确的产品定位,本文为脱敏归纳。2026-11-01 本人确认项目主导身份。项目起始日期、具体执行职责、实施进度和成果尚未说明;类比仅表达产品定位。

该记录未说明项目起始日期、具体执行职责、实施进度和成果。归纳只能确认已记录的定位与主导身份,不能据此给出上线时间、完成状态或效果指标;未记录成果也不能被解释为项目没有成果。

查看原文:客户体验治理办公 AI 产品
项目起始日期、具体执行职责、实施进度和成果尚未说明;类比仅表达产品定位。

掘金

覆盖 5/5 份来源 · 模型归纳

该快照文档声明,vscode 插件第一版采用内置 UI,因体验欠佳且内置 UI 不够灵活,作者在调研后决定用 webview 重构;工程上以脚手架生成 TypeScript 扩展,并通过 package.json 的 activationEvents、contributes.commands 与 extension.ts 中的 registerCommand 三处配合注册命令。

查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
在团队降本提效的基建中,紫升开发了一款 vscode 插件,第一版我使用的是 vscode 内置 UI,虽说也能用,但是用户体验欠佳。由于 vscode 内置 UI 不够灵活,一番调研后我决定使用 webview 重构。
查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
激活事件是在 package.json 中的 activationEvents 字段声明的一个 JSON 数组对象。为了注册 helloWorld 这个命令,第一步就是注册激活事件,激活事件类型有很多,注册命令的激活事件是 onCommand:
查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
// 入口命令已经在 package.json 文件中定义好了,现在调用 registerCommand 方法 // registerCommand 中的参数必须与 package.json 中的 command 保持一致

该快照文档声明,打包体积问题通过 esbuild 捆绑与 .vscodeignore 忽略无关文件解决:vsce 默认把 dependencies 中的包整体打入安装包,使用 esbuild 将代码合并进 out/extension.js 并忽略 node_modules 后安装包体积明显减小;同时 webview 内容由 umi 构建,用 HTML=none umi build 省去 index.html,并以 yarn workspace 管理扩展与 web 两个子项目。

查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
vscode 默认的打包方式就是简单的编译拷贝,通过忽略文件减小体积也是杯水车薪。而且 vscode 扩展的规模往往增长很快。它们是在多个源文件中编写的,并依赖于 npm 的模块。分解和重用是开发的最佳实践,但在安装和运行扩展时,它们是有代价的。加载 100 个小文件要比加载一个大文件慢得多。这就是我们推荐捆绑的原因。
查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
我们使用 esbuild 打包后会将使用到的代码都打包进 out/extension.js,但是 vsce 的打包机制是不管你有没有用到都会把 dependencies 中的包打进安装包中,所以我们需要将 _node_modules_ 忽略掉。
查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
由于我们封装了 getUmiContent 方法,umi build 生成的 index.html 就没有用了,我们可以使用 HTML=none umi build 命令在打包的时候不生成 index.html 文件。
查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
由于我们的项目是 vscode 扩展和 web 项目混合的项目。为了方便管理脚本和依赖,我们引入了 yarn workspace 来管理项目。

该快照文档声明,webview 与插件之间只能通过 postMessage 事件通信:webview 侧用 acquireVsCodeApi 获取受限 API 发送消息,插件侧用 onDidReceiveMessage 接收;由于 webview 本身没有 host、ajax 请求都会跨域,获取文章列表的请求被交给 vscode 侧执行再回传数据。

查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
webview 反向传递信息给插件的原理也是一样的,只不过由于 webview 的上下文限制,我们只能通过 acquireVsCodeApi 函数获取阉割版的 VS Code API 对象,这个阉割的对象上有一个 postMessage 函数可以供我们发送事件用。注意 acquireVsCodeApi 个会话中只能调用一次,重复调用会报错。
查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
在 VSCode WebView插件(扩展)开发实战 一文中我终于知道了 vscode webview 内部是不允许发送 ajax 请求,所有 ajax 请求都是跨域的,因为 webview 本身是没有 host 的。
查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
webview 的脚本能做到任何普通网页脚本能做到的事情,但是 webview 运行在自己的上下文中,脚本是不能访问 VS Code API 的。我们需要借助 postMessage 这种事件的方式传递信息。

该快照文档声明,组件库采用 Lerna 多包架构:组件级解耦、独立版本、单独发布与按需引用,并用 yarn workspaces 实现依赖提升;图标包借助 react-native-iconfont-cli 从 Iconfont 链接生成组件,避免 ttf 字体每次更新都要重新打包发布 APP 且不支持多色的问题。

查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
基于 Lerna 的多包管理架构的优点在于: - 组件级别解耦,独立版本控制,每个组件都有版本记录可追溯 - 组件单独发布,支持灰度、版本回滚以及平滑升降级 - 按需引用,用户安装具体某个组件包,无需配置即可实现按需加载的效果。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
使用 ttf 字体有一个弊端,就是每次更新图标,都要相应的更新 ttf 文件,然后再次打包发布 APP。而且 ttf 不支持多种色彩的图标,导致所有图标都是单色。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
这里紫升没有自己写脚本,而是使用了一款叫 react-native-iconfont-cli 的工具,fwh1990 大佬针对以上痛点用纯 Javascript 实现 iconfont 到 React 组件的转换操作,不需要依赖 ttf 字体文件,不需要手动下载图标到本地。

两篇工程文章都强调规范化提交与代码规范工具链:vscode 插件文章用 @luozhu/create-commitlint 与 lint-staged、yorkie 配置 pre-commit 钩子;组件库文章同样用 yorkie 替代 husky 并配置 commit-msg 与 pre-commit,且两者都提到用自建 eslint/prettier 配置包约束项目。差异在于组件库文章还涉及 lerna 版本管理与 CHANGELOG 生成,而插件文章侧重打包与 webview 集成。

查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
约定式提交我使用的是渐进式脚手架 @luozhu/create-commitlint,在项目中执行 npx @luozhu/create-commitlint 即可使项目符合规范化提交的配置。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
注意:husky 高版本用法不向后兼容,我在这个 commit 中用尤大的 yorkie 代替了 husky。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
当配置 conventionalCommits 为 true 后,lerna 版本将使用 Conventional Commits Specification 来确定版本升级并 生成 CHANGELOG.md 文件。

现有资料中,组件库文章提到按需加载方案目前只是通过函数导出 babel-plugin-import 配置、并非真正的插件,作者表示未来会定制 vant-react-native 自己的按需加载 babel 插件;该计划是否落地、以及 esbuild 打包与 umi mfsu 等优化在后续版本中的实际效果,资料未给出可验证的结论。

查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
还有可以优化的地方吗?机智的你可能又发现我只是通过函数导出了一个配置而已,并不是真正的插件,所以未来我会定制一个 vant-react-native 自己的按需加载 babel 插件。
查看原文:掘金一下 | 从零开发一款基于 webview 的 vscode 扩展
另外目前 umijs 的 mfsu 不支持 writeToDisk 方法,如果后续支持了可以使用 mfsu 优化调试速度。

算法

覆盖 2/2 份来源 · 模型归纳

二分查找类文章把适用条件限定在有序数组上,并给出标准循环写法:left=0、right=arr.length-1,中点用 left + Math.floor((right - left) / 2) 计算,相等返回 mid,中间值偏小则 left=mid+1,偏大则 right=mid-1,循环结束返回 -1。该文还列出测试覆盖原则:存在、不存在、边界与异常输入,并给出开头、末尾、空数组等用例。

查看原文:二分查找与左右边界
初始化左右指针 left=0 和 right=arr.length-1。 2. 循环计算中间索引值 mid=left + Math.floor((right - left) / 2) 3. 比较中间元素与目标值: - 相等 → 返回 mid。 - 中间值较小 → 目标在右半区,更新 left = mid + 1。 - 中间值较大 → 目标在左半区,更新 right = mid - 1。
查看原文:二分查找与左右边界
前提条件 - 数组必须有序:升序或降序排列(默认为升序)。 - 时间复杂度:O(log n),每次排除一半元素,效率远超线性查找(O(n))。
查看原文:二分查找与左右边界
测试原则: - 覆盖所有分支:存在、不存在、边界、异常输入。 - 使用有序数组:确保输入的数组已排序。

三数之和文章把 nSum 系列的核心概括为排序加双指针:先从小到大排序,固定一个数 nums[i],再用 left 与 right 从两端控制两数之和的大小,和偏小则 left++,偏大则 right--。去重规则分三层:nums[i] 大于 0 时结束循环;nums[i] 等于 nums[i-1] 时跳过;sum 为 0 时若 nums[left] 等于 nums[left+1] 则 left++,若 nums[right] 等于 nums[right-1] 则 right--。该文标注时间复杂度为 O(n^2)。

查看原文:三数之和:排序与双指针
nSum 系列问题的核心思路就是排序+双指针。 先给数组从小到大排序,然后双指针 left 和 right 分别在数组开头和结尾,这样就可以控制 nums[left] 和 nums[right] 这个两数之和的大小: 如果你想让它俩的和大一些,就让 left++,如果你想让它俩的和小一些,就让 right--。
查看原文:三数之和:排序与双指针
如果 nums[i] 大于 0,则三数之和必然无法等于 0,结束循环 - 如果 nums[i] == nums[i - 1],则说明该数字重复,会导致结果重复,所以应该跳过。
查看原文:三数之和:排序与双指针
当 sum == 0 时,nums[left] == nums[left + 1] 则会导致结果重复,应该跳过,left++ - 当 sum == 0 时,nums[right] == nums[right - 1] 则会导致结果重复,应该跳过,right-- - 时间负责度:O(n^2),n 为数组长度

现有材料只给出算法说明、示例与代码片段,未记录这些实现是否在真实项目中运行、是否经过完整测试套件验证,也未说明作者对两种解法的个人偏好或后续修改动机。二分查找文中提到“修正说明中的中点括号及术语错误后保留”,但未给出修改前后对照,因此无法据此判断具体变更内容。

查看原文:二分查找与左右边界
有实现、边界变体和测试示例;修正说明中的中点括号及术语错误后保留。
查看原文:三数之和:排序与双指针
有完整思路、去重规则、示例和可运行代码,保留原解法署名。

RAG

覆盖 6/6 份来源 · 模型归纳

多篇材料共同把 RAG 拆成“事实源—索引—检索—证据—生成”的分层链路,而不是一条从向量检索升级到图谱再到 Wiki 的替代路线。差异在于对“编译层”的定位:有的文章把 LLM Wiki 视为知识治理层,检索算法只是其下层实现;有的文章把编译式 RAG 定义为构建阶段产出可版本化中间表示、查询时优先读取产物并回查原文。两者都强调原始 Source 不可被改写、索引可重建,但前者更偏系统治理,后者更强调构建期成本前移与编译正确性风险。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
它们分别描述的是检索方式、数据结构、工程系统和知识治理方法,不能简单排成一条替代关系。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
编译式 RAG,是把不可直接高效消费的 Raw Sources,在构建阶段加工成面向后续任务的、可检查、可版本化、可增量更新的知识中间表示;查询时优先读取这些编译产物,必要时回到原文核验。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
LLM Wiki 可以理解为“知识治理层”,GBrain 可以作为它的知识运行时。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
编译式 RAG 的核心不是提前写摘要,而是让知识产物进入版本、校验和重建闭环;查询时对关键 Claim 仍需回查原文。

在检索实现上,各来源一致认为关键词检索与向量检索解决不同问题:FTS/BM25 擅长类名、错误码、配置项等精确标识符,Vector Search 处理同义表达与自然语言问法,因此工程上常见 Hybrid Search 加 Metadata Filter 与 Rerank。区别在于起步顺序:有文章主张第一版先用 FTS/BM25 验证精确检索,再按评测结果加入 Embedding;也有文章把 Hybrid 作为团队知识的默认候选,仅在数据量极小且 BM25 已达标时暂缓。两者都以评测指标而非功能列表作为升级依据。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
BM25 不理解“意思”,但它对代码和技术术语非常实用。搜索 Workspace Revision 时,BM25 往往比纯向量相似度更可靠,因为向量模型可能把一些语义相近但并不包含这个精确标识符的文本排得很前。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
第一版建议从 FTS/BM25 开始,因为它快、便宜、结果可解释。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
先并行扩大 Recall,再用 Reranker 提升 Precision。不要直接拿两个分数相加,BM25 Score 与 Vector Similarity 往往不在同一标度上。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
Hybrid Search 团队文档、代码说明、中文问答 数据量极小且 BM25 已达标 两套索引与 Fusion 调参

关于图谱能力,来源普遍把它限定为关系型问题的专用索引而非默认底座:GraphRAG 适合依赖链、影响分析、多跳路径与全局主题,代价是实体消歧、关系方向、时间有效性与增量更新等维护成本。代码结构分析被单独区分出来,用 Tree-sitter 等提取 File、Function、Class、Dependency 生成可重建的 Code Graph,与把源码切 Chunk 做向量检索有本质区别。共同约束是图输出不能成为第二份事实源,代码仍以 Git Revision 为准。

查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
GraphRAG 解决的是“沿什么关系找到答案”,不是“图里的结论天然可信”。每一跳仍要锚定带版本的 Source Span。
查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
Understand Anything 的输出也不应该被理解为第二份代码事实源。代码仍然以 Git Revision 为准,Graph 是可重建 Projection。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
没有真实的关系查询,就不该为了架构图好看而上 GraphRAG。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
如果团队不能维护这些约束,GraphRAG 会把“检索偶尔漏片段”变成“图谱稳定地提供错误关系”。

多个来源把 Evidence、Citation、Revision 与 Permission 视为知识系统区别于普通检索的关键约束:Evidence 是能支撑具体 Claim 的可定位片段,Citation 需包含来源地址与版本,Revision 决定某条知识在哪个时间与工作区有效,权限过滤应发生在召回之前而非答案阶段。由此派生的工程要求包括:索引可删除重建、无证据时返回 no_evidence 而非用模型常识补答、执行结果须经审核才能写入正式知识。

查看原文:GBrain 从入门到精通:构建可引用的本地知识层
这里最容易犯的错误是把“索引”当成事实源。索引只是派生数据,应该可以从已验证的原始输入重新构建;真正的事实源应该保留自己的版本和摘要。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
先检索全部内容、再在答案阶段隐藏结果,是危险设计。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
知识库缺少证据时,系统应该返回 no_evidence,而不是用模型常识补一段看似合理的答案。
查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
否则一次错误推理或偶发现象写进团队 Wiki,之后所有 Agent 都会把它当成事实。

在组件组合与实施顺序上,有文章给出明确的分阶段路线:先以 GBrain 作为知识底座跑通查询闭环,再补云端共享与审核发布,只有当实时原始文件检索或代码影响分析成为真实瓶颈时才接入 Sirchmunk 与 Understand Anything,并由宿主系统做意图路由、合并结果并保留各自 Citation。另一条路线则按问题形状选择:默认 Hybrid RAG,关系问题加 GraphRAG,团队反复综合稳定知识时再加编译层。两者共同点是反对一次性接入全部组件,差异在于前者以组件为单位排序,后者以知识表示形态为单位排序。

查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
先建立一个稳定知识底座,再用真实任务证明是否需要实时搜索器和代码图谱;不要为了“看起来完整”一次性维护三套基础设施。
查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
只有经过验证和审核的稳定结论,才进入 GBrain 的正式页面。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
当团队反复综合同一批稳定知识,并希望结果能够积累、审阅和复用时,增加编译层:把原始资料加工成结构化 Wiki、Procedure、Decision 和 Conflict 页面,但原始 Source 仍然是事实源。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
GBrain、Sirchmunk、Understand Anything 可以各自擅长不同问题,但不应该让 Codex 或 Qoder 自己决定调用哪一个。应该由 Host 做意图路由

现有材料对若干边界仍未给出可验证结论:编译产物在增量更新时如何界定受影响页面与重算范围,语义冲突在何种条件下必须转人工审核而非由模型裁定,以及 Hybrid、Graph 与编译层共存时统一的 Evidence 去重与版本对齐如何实现。此外,各来源给出的评测门槛(如 Recall@5 阈值)均声明服务于具体项目,是否可迁移到其他知识规模与语言分布,资料中尚无依据。

查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
结构检查可以自动执行;涉及业务语义的冲突,应该进入人工审核,而不是让模型自行决定哪一方是真相。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
增量更新:一条政策发布新版本后,哪些社区摘要和关系要重算?
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
这两个数字服务于当前项目,不是行业标准。

Design System

覆盖 2/2 份来源 · 模型归纳

两篇文章都把“青山湖”描述为从真实产品中逐步长出的设计语言,而非一套现成配色表。其核心做法是把景区意象蒸馏为界面职责:雾白承担空间与材质,湖水青承担主操作,水杉绿承担成功与状态,青山灰蓝承担信息层级,晨光金只作极少量高光。两文都强调“蒸馏”而非“复刻”,即不把景观照片或旅游海报式视觉搬进产品,而是把自然层次映射为语义关系。

查看原文:青山湖设计风格的诞生记
青山湖设计风格的核心,不是把界面染成绿色,而是把青山湖的自然层次翻译成数字产品的职责分工:雾白负责空间与材质,湖水青负责操作,水杉绿负责状态,青山灰蓝负责信息层级,晨光金只负责极少量高光。
查看原文:青山湖设计风格的诞生记
这里最重要的动作是“蒸馏”,不是“复刻”。 我不需要在每个页面放一张水上森林背景,也不想把产品做成旅游宣传页。我需要的是把自然景观里的层次关系,映射成界面里的语义关系。
查看原文:Taste Is All You Need
湖面变成主操作的湖水青,水杉变成成功和运行状态,远山承担次级信息,雾白负责空间和层次,晨光金只留在极少量高光里。母题也同时定义了禁区:不做赛博霓虹,不让金色主导 surface,不用重阴影堆层级,不为了“可爱”牺牲信息效率。

两文共同把设计风格定义为“删减规则”,而不仅是允许清单。青山湖的约束以比例、位置和禁用条件表达:浮萍绿控制在5%以内,晨光金只做边缘光,常规圆角6–12px,动效只服务状态变化,卡片不能嵌套卡片。两文都指出,只告诉Agent“可以用什么”会导致所有特征被同时用上,因此必须同时写清“最多用多少”“只能用在哪里”“什么情况下不要用”。

查看原文:青山湖设计风格的诞生记
如果一套风格只告诉 Agent“可以用什么”,它很快就会把所有特征同时用上。真正能提高输出稳定性的,是同时写清楚“最多用多少”“只能用在哪里”“什么情况下不要用”。
查看原文:Taste Is All You Need
这段过程让我确认:设计风格首先是一套删减规则。 如果只告诉 AI“可以用什么”,它会很积极地把所有特征一起用上。输出真正开始稳定,是因为规则同时写清了“最多用多少”“只能用在哪里”“什么情况下不要用”。
查看原文:青山湖设计风格的诞生记
因此后来规范里出现了很多带比例和边界的表达:浮萍绿控制在 5% 以内,晨光金只做边缘光,常规圆角控制在 6–12px,动效只服务状态变化,卡片不能继续嵌套卡片。

雾白玻璃质感的实现体现了一个明确的架构取舍:保留“雾”的视觉语义,但不恢复高风险的系统采样链路。两文都记录了曾尝试NSVisualEffectView、系统material和behind-window sampling时触发崩溃,随后改为纯SwiftUI内部绘制柔焦层,所有效果裁剪在卡片内部,不使用NSVisualEffectView、.behindWindow或.underWindowBackground。这一取舍把“雾白”从颜色升级为设计体系的基础设施,同时服从稳定性、性能和可读性。

查看原文:青山湖设计风格的诞生记
最后采用的是纯 SwiftUI 内部绘制: - 大面积雾白柔焦带; - 左上角雾白 soft blur; - 右下角很淡的湖水青 blur; - 所有效果裁剪在卡片内部; - 不使用 NSVisualEffectView; - 不使用 .behindWindow 或 .underWindowBackground。
查看原文:Taste Is All You Need
后来为了让灵动卡接近系统组件的玻璃质感,我们尝试过 macOS material 和窗口采样,特定组合会带来稳定性风险。最后我没有放弃“雾”,也没有为了视觉效果继续赌系统边界,而是改用纯 SwiftUI 绘制柔焦层:保留雾白的视觉职责,换掉高风险实现。
查看原文:青山湖设计风格的诞生记
这也是我现在判断视觉方案的一个原则:设计语言不能绕过工程约束,好的设计 token 应该能在安全实现与理想效果之间找到可迁移的中间层。

两文对青山湖的迁移范围描述不同。诞生记聚焦从Argos的macOS界面迁移到“小界”的Web工作台,技术栈从SwiftUI变为React、Umi、styled-components和Tailwind,并吸收Web约束如正文默认14px、工具栏控件32–36px、prefers-reduced-motion和WebP资源。Taste一文则把同一套语义词汇抽取为公开的Qingshan Lake Design Skill,覆盖macOS、iPhone/iPad、Android、React Native、Web dashboard和Landing Page,并强调各平台仍须服从自身交互模型与验收方式。两者共同点是:迁移复用的是语义职责与判断,而非把界面染成青绿色。

查看原文:青山湖设计风格的诞生记
后来我把这套语言迁移到“小界”的 Web 工作台。平台从 SwiftUI 变成 React、Umi、styled-components 和 Tailwind,产品形态也从 macOS menu bar 工具变成 AI 控制台,但核心映射依然成立
查看原文:青山湖设计风格的诞生记
迁移过程中,设计体系又吸收了 Web 产品的新约束:正文默认 14px、工具栏控件 32–36px、桌面优先但窄屏不溢出、动效支持 prefers-reduced-motion,以及资源统一使用 WebP。
查看原文:Taste Is All You Need
这次抽取没有把同一套界面复制到六个平台。共享的是一套 semantic vocabulary:canvas、surface、text、primary action、focus、success、warning、error,以及明确的 anti-pattern;各平台仍然遵守自己的交互模型和验收方式
查看原文:Taste Is All You Need
把两边都染成青绿色没有迁移价值。跨端复用的是同一套判断:低噪声画布、清晰的信息层级、克制的状态色、不过度装饰的 glass surface,以及让内容始终压过背景的优先级。

两文都给出青山湖风格的适用边界:适合AI控制台、桌面效率工具、settings、数据dashboard、menu bar与floating panel等需要稳定、清透、低噪声又不能失去品牌辨识度的场景;不适合强营销landing page、娱乐化社区或需要极强情绪刺激的消费产品。诞生记还提出迁移验收至少检查四层:语义token、信息密度、组件形态和anti-pattern,只换颜色不算迁移完成。

查看原文:青山湖设计风格的诞生记
值得上:AI 控制台、桌面效率工具、settings、数据 dashboard、menu bar 与 floating panel。这些场景需要稳定、清透、低噪声,又不能完全失去品牌辨识度。 可以再等:强营销 landing page、娱乐化社区、需要极强情绪刺激的消费产品。青山湖的优势是克制,不适合强行承担所有视觉目标。
查看原文:青山湖设计风格的诞生记
重点关注:不要让 Agent 把设计系统退化成 palette。每次迁移至少检查四层:语义 token、信息密度、组件形态和 anti-pattern。只换颜色,不算迁移完成。
查看原文:Taste Is All You Need
到了这个工作台,这套判断必须适应专业产品的密度。聊天入口可以有缓慢移动的云雾,进入任务和报告后,装饰必须后退。正文、筛选器、状态、日志和结果证据要更紧凑;loading、empty、error 和 success 继续使用同一套自然语义,但不能因为“青山湖”降低扫描效率。

现有材料记录了青山湖从Argos到小界、再到跨端Design Skill的迁移,但两文对“迁移完成”的验收标准描述侧重不同:诞生记强调四层检查,Taste一文强调各平台服从自身交互模型与验收方式。在资料范围内,尚可继续探讨的是:当同一套语义词汇进入六个平台后,如何用统一证据判断某次迁移确实保留了职责分工,而不只是换了颜色或组件外观。

查看原文:青山湖设计风格的诞生记
每次迁移至少检查四层:语义 token、信息密度、组件形态和 anti-pattern。只换颜色,不算迁移完成。
查看原文:Taste Is All You Need
共享的是一套 semantic vocabulary:canvas、surface、text、primary action、focus、success、warning、error,以及明确的 anti-pattern;各平台仍然遵守自己的交互模型和验收方式

Product Engineering

覆盖 2/2 份来源 · 模型归纳

职业规划文章把职业身份、技术判断与实践成果明确拆成三件事:身份是“想成为谁”,技术判断是“选择研究什么”,实践成果是“用什么证明判断与能力”,并强调三者相关但不能互相替代。其身份定位为 AI Systems & Product Engineering 的 IC 专家路径,Staff 被表述为希望承担的问题范围而非当前头衔。

查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
这篇文章是一次阶段性自我校准。我会明确区分三个容易混淆的东西:职业身份是我想成为谁,技术判断是我选择研究什么,实践成果是我用什么证明判断与能力。三者相关,但不能互相替代。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
Staff 是未来希望承担的问题范围,而不是今天已经拥有的头衔。我更倾向于 Individual Contributor(IC)的专家路径:可以影响技术战略、协调复杂工作,却不以正式带团队和人员管理作为身份的必要条件。

在技术研究上,文章把 Agentic Computing 定位为待验证的 Technology Thesis,而非已证实的行业结论。其核心架构取舍是:任务分解、工具选择与协作方式可由模型按任务生成,但权限、预算、审批与审计须由独立于模型决策的治理机制约束;模型不能修改自身权限,也不能在被拒后换工具、拆金额或委派其他 Agent 绕过同一限制。

查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
这不是已经被证实的行业结论,而是值得持续验证的 Technology Thesis(技术战略判断)。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
我准备明确区分两类职责:执行策略可以由模型调整;权限、预算、审批和审计由独立于模型决策的治理机制约束。“独立”首先是信任与职责边界,可以先在现有运行时里实现,不意味着新建一套控制平台。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
模型不能修改自己的权限,也不能在调用被拒后换工具、拆金额或委派给另一个 Agent 绕过同一限制。

审批机制按风险与授权范围触发,而非机械插入每一步:已有权限内、非敏感的只读分析可自动进行;写生产、动钱、对外发送和访问敏感数据则依影响范围、可逆性、数据等级与既有授权判断是否升级,且只读查询也可能导出敏感信息,不能直接等同低风险。文中“超过 500 元退款须人工审批”的示例被明确标注为说明边界的假设,不是已实施的业务机制。

查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
审批不应机械地插入每一步。已有权限范围内、非敏感的只读分析可以自动进行;写生产、动钱、对外发送和访问敏感数据,应根据影响范围、可逆性、数据等级与既有授权判断是否升级。只读查询也可能导出敏感信息,不能直接等同于低风险。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
这是说明边界的假设示例,不是本人已经实施的业务机制。

现有资料下可继续探讨:职业规划中的三阶段验收依赖真实用户反馈与生产授权,但文章同时说明拿不到真实生产授权时可用隔离试点替代并明确其不能证明生产验收;隔离试点与生产验收之间的证据差距应如何界定,以及跨端能力“一个端通过不代表跨端完成”的判定标准如何量化,均未在材料中给出具体口径。

查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
若拿不到真实生产授权,就用隔离试点验证,并明确它不能证明生产验收。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
能力覆盖 Browser、Android、iPhone、Computer 四类环境的边界设计,实测从当前有设备与授权的一端开始;一个端通过不代表跨端能力完成。

Node.js

覆盖 7/7 份来源 · 模型归纳

在 Node.js 工程中,版本约束被反复当作可复现的工程边界,而不是安装开关。engines 冲突应先区分 warning 与 hard failure:npm 在 engine-strict 为 false 时通常只警告,Yarn Classic 可用 --ignore-engines 单次绕过,pnpm 同样受 engine-strict 配置影响;但涉及 native addon、Node API、OpenSSL、ESM/CJS 加载方式或构建工具时,忽略只会延后问题。更稳妥的顺序是先用 nvm、fnm 或 Volta 切到项目声明的 Node LTS,再确认上游包是否支持当前 Node 并重新生成 lockfile,自有包则补齐准确的 engines 范围与 CI 矩阵。

查看原文:Node.js 的 incompatible engine:该忽略,还是该修依赖?
安装依赖时看到 incompatible engine,不代表项目一定跑不起来;它表示某个包声明了经过验证的 Node.js 版本范围,而当前运行时不在这个范围内。它可能只是历史包写得过窄,也可能是在提醒你 API、ABI 或构建链已不兼容。
查看原文:Node.js 的 incompatible engine:该忽略,还是该修依赖?
Yarn Classic 可以单次忽略: bash yarn install --ignore-engines 或写入本机配置: bash yarn config set ignore-engines true npm 的 engine-strict 为 false 时通常只警告;pnpm 则同样受 engine-strict 配置影响。
查看原文:Node.js 的 incompatible engine:该忽略,还是该修依赖?
涉及 native addon、Node API、OpenSSL、ESM/CJS 加载方式或构建工具时,版本不匹配经常会在安装后才爆炸。此时 --ignore-engines 只会延后问题,不能解决问题。
查看原文:Node.js 的 incompatible engine:该忽略,还是该修依赖?
必须修复:CI、线上或含原生模块的项目出现 engine 冲突。运行时版本应是可复现的工程约束。

OpenSSL 3 引发的 error:0308010C 与 engines 冲突属于不同层面的兼容问题,但处理原则一致:先定位根因,再区分救急与长期修复。该错误常出现在旧前端项目切到 Node.js 17 或更高版本之后,堆栈包含 webpack/lib/util/createHash、ERR_OSSL_EVP_UNSUPPORTED 且发生在 dev 或 build 初期时,基本可判定为旧版 Webpack 4 与 Node.js 17+ 的组合问题。--openssl-legacy-provider 只能临时恢复构建,长期应升级 Webpack、React Scripts 或框架脚手架及其 plugin、loader,或用 .nvmrc、Volta、CI 固定兼容的 Node LTS;若错误发生在运行时加密、签名或 TLS 逻辑中,则不能简单套用 legacy provider。

查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
error:0308010C:digital envelope routines::unsupported 常出现在把旧前端项目切到 Node.js 17 或更高版本之后。它看起来像业务代码报错,实际是构建工具请求了 OpenSSL 3 默认不再支持的旧算法。
查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
如果堆栈里包含 webpack/lib/util/createHash、ERR_OSSL_EVP_UNSUPPORTED,且故障发生在 dev 或 build 初期,基本就是这个问题。常见组合是旧版 Webpack 4 与 Node.js 17+。
查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
如果错误发生在运行时的加密、签名或 TLS 逻辑中,而不是构建阶段,不能简单套用 legacy provider。应先确认算法、证书或上游 SDK 是否需要迁移,否则可能降低安全性。
查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
--openssl-legacy-provider 只能救急。长期方案是升级 Webpack/相关 loader,或把项目固定在兼容的 Node LTS;不要把这个环境变量当作永久配置。

Fumadocs 选型与 Sidecar 架构都涉及 Node.js 与另一运行时的协作,但取舍方向不同。Fumadocs 方案把文档站做成独立 Next.js 项目,通过 output: 'export' 静态导出,再由 Egg.js 的 egg-static 托管 client/out 目录,使静态文件与 Midway API 共用同一端口;本地开发则用 concurrently 同时跑 Midway 与 Fumadocs dev server,Home controller 在本地无 client/out/ 时重定向到 :3000。Sidecar 方案则让原生 Core 保留权限、生命周期与核心数据,Node Agent Host 只承载 Codex/Qoder SDK、ACP、MCP Adapter 等 Node 生态能力,通过版本化 IPC 传递受限 capability profile。前者以静态托管换取部署简单,后者以多进程复杂度换取故障隔离与权限边界。

查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
静态导出 + egg-static 托管 Next.js 支持 output: 'export',构建后输出纯静态文件
查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
也就是说,GET / 返回文档站首页,GET /api/skills 走 Midway 控制器——静态文件和 API 共用同一个端口,完全无感。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
边车提供了第三条路:原生 Core 保留控制权,Node Agent Host 只承载 Node 生态中不可替代的部分。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
3. Core 给任务生成受限 capability profile,再通过版本化 IPC 发给 Sidecar。 4. Sidecar 调用 Provider SDK,并把 token、tool call、progress 和 error 作为有序事件流返回。

Sidecar 的适用条件被明确限定:必须复用另一种语言或运行时的成熟 SDK、任务容易崩溃或泄漏内存、能力涉及 Shell 与网络等高风险边界、希望 Agent Runtime 可单独重启而不影响 UI 和核心数据时值得用;只是几个纯函数、无法定义稳定协议、团队无力维护打包签名与崩溃恢复、或拆出去后仍给 Sidecar 全部文件网络凭据和数据库权限时则不值得。进程隔离不等于安全沙箱,Tauri capability 主要约束 Webview 到原生 Core,不会自动沙箱已启动的 Node Sidecar,因此需要把原生 Core 设计为 Permission Broker,由它审批高风险工具调用,Sidecar 不能自己给自己授权。

查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
值得用: - 必须复用另一种语言或运行时的成熟 SDK。 - 任务容易崩溃、泄漏内存或需要单独限流。 - 能力涉及 Shell、网络、第三方插件等较高风险边界。 - 希望 Agent Runtime 可单独重启,而不影响 UI 和核心数据。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
最后一种尤其常见:付出了多进程复杂度,却没有获得真实边界。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
Tauri capability 主要约束 Webview → 原生 Core,不会自动沙箱已经启动的原生插件或 Node Sidecar。把平台 ACL 当成完整安全方案,是一个危险的边界误判。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
因此我会把原生 Core 设计为 Permission Broker: - Frontend 不能直接启动 Sidecar,只能提交声明式 Intent。 - Sidecar 只接收完成当前任务所需的最小输入,不接收完整配置和全部 Secret。

Bearer Token 的工程边界在于“谁持有,谁就能使用”,因此安全性高度依赖 HTTPS、短有效期、最小权限、安全存储和严格验证。Bearer 是 HTTP 层的 Token 呈现方式,Access Token 是授权凭证,JWT 是编码格式,OAuth 2.0 是授权框架,四者不在同一层;Bearer Token 可以是 JWT,也可以是需通过 Introspection 或内部查询确认状态的 Opaque Token,而 JWT 也可能是 ID Token 等非 Access Token。Node.js 实现中应把 JWKS 地址来自配置或可信 Issuer Metadata,不能读取 Token Header 里的任意 jku,并校验签名、iss、aud、exp、scope 与 Token 类型;只做 Base64 Decode 没有安全意义。

查看原文:Bearer Token Authentication 到底是什么:从 Authorization Header 到安全验证
这也是 Bearer Token 最重要的工程边界:它很好用,但安全性高度依赖 HTTPS、短有效期、最小权限、安全存储和严格验证。
查看原文:Bearer Token Authentication 到底是什么:从 Authorization Header 到安全验证
Bearer Token 可以是 JWT,也可以是一段不可读的随机字符串。后者通常称为 Opaque Token,Resource Server 需要通过 Token Introspection 或内部查询确认它的状态。
查看原文:Bearer Token Authentication 到底是什么:从 Authorization Header 到安全验证
JWKS 地址必须来自配置或可信的 Issuer Metadata,不能读取 Token Header 里的任意 jku 后直接请求。Token Header 属于攻击者可控输入。
查看原文:Bearer Token Authentication 到底是什么:从 Authorization Header 到安全验证
只执行 Base64 Decode 没有任何安全意义。Decode 只能读取 Claims,不能证明 Claims 没被修改。

现有资料中,Fumadocs 的版本对齐表标注“截至写作时”,并提到 fumadocs-mdx 对 Next.js 16 有 optional peer dep、安装时加 --legacy-peer-deps;Sidecar 文章描述了 starting 到 stopped 的状态机与握手失败、崩溃重试、熔断等治理问题,但未给出具体实现。这些约束在后续版本或实际项目中是否仍然成立、状态机如何落地,资料本身没有答案,可作为继续验证的方向。

查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
Fumadocs 各包的 peer dependency 比较严格,截至写作时
查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
fumadocs-mdx 对 Next.js 16 有 optional peer dep,安装时加 --legacy-peer-deps 即可,不影响 Next.js 15 运行。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
主应用需要回答:握手失败怎么办?任务执行中 Sidecar 崩溃是否重试?取消后怎样确保子进程和工具进程都被清理?升级时协议不兼容如何阻止启动?连续崩溃是否进入熔断?

React

覆盖 2/2 份来源 · 模型归纳

两篇材料都围绕 React 应用中的具体交互或渲染问题展开,但关注点不同:一篇处理 Chat Composer 中 Enter 键在 IME 组合态下的语义冲突,另一篇处理组件重复渲染与 bailout 机制。前者把问题定位在输入边界的事件时序,后者把优化目标定位为减少真实 DOM 渲染频率与 VirtualDOM 比对频率。两者都强调不能只看表面行为,而要理解底层机制:IME 场景要看 composition 与 keyboard 事件顺序,性能场景要看 props、lanes 与 bailout 条件。

查看原文:修复中文输入法按回车误发送:React Chat Composer 的 IME 事件陷阱
一句话总结 Chat Composer 不能把所有 Enter 都视为提交。发送前至少要同时检查 KeyboardEvent.isComposing、IME 的兼容值 keyCode === 229,并处理部分 WebKit 环境中 compositionend 早于提交用 keydown 到达的时序差异。
查看原文:React 性能优化实践
React 组件性能优化的核心是减少渲染真实 DOM 节点的频率,减少 VirtualDOM 比对的频率。

IME 修复方案的核心取舍是:不能只依赖单一信号。文章指出,只判断 isComposing 能覆盖大多数标准事件顺序,但 WebKit 在 macOS 上可能出现 compositionend 先于 keydown 到达,导致 isComposing 为 false;keyCode === 229 可作为窄范围兼容信号,但仍不是完整答案。最终采用三层 guard:组件内 composingRef、nativeEvent.isComposing 与 keyCode 229、以及 compositionend 后约 80ms 的保护窗口。该窗口被明确描述为事件时序缓冲而非协议常量,只保护刚结束组合后紧随的 Enter。

查看原文:修复中文输入法按回车误发送:React Chat Composer 的 IME 事件陷阱
但 WebKit 在 macOS 上长期存在另一种时序: text compositionend keydown Enter (isComposing: false) keyup Enter 对业务代码来说,收到 keydown 时 composition 已经结束,isComposing 自然变成 false。
查看原文:修复中文输入法按回车误发送:React Chat Composer 的 IME 事件陷阱
因此,IME guard 中使用 keyCode === 229 不是把所有键盘逻辑退回旧 API,而是把它作为一个窄范围的兼容信号
查看原文:修复中文输入法按回车误发送:React Chat Composer 的 IME 事件陷阱
这里的 80ms 不是协议常量,而是一个很窄的事件时序缓冲。它只保护 composition 刚结束后紧随而来的 Enter,不会改变用户完成输入后再次按 Enter 发送的习惯。

性能优化文章给出的两条法则是动静分离与缓存:把变化部分与不变部分分离,对复杂计算和昂贵组件使用 useMemo、useCallback、useSelector 等 memo 化手段。案例中,App 状态更新会牵连 Count 与 Random 更新,Profiler 显示 Random 的更新原因是父组件渲染;将 Count 及其状态封装后,count 更新只影响 Count。进一步用 props.children 传递 Random,则依赖 React bailout 机制:当 oldProps === newProps 且当前 fiber 没有与本次调度一致的更新时,可复用 fiber 并跳过子树渲染。

查看原文:React 性能优化实践
优化法则 - 法则一:动静分离,将变的部分与不变的部分分离。 - 法则二:缓存,复杂计算和有昂贵消耗的组件 memo 化,比如 React 的 useMemo、useCallback,Redux 的 useSelector。
查看原文:React 性能优化实践
我们可以看到这里边除了 Count 是因为 count 更新之外,其他组件的更新都是被无辜牵连的。根据法则一,我们可以尝试将 Count 组件和它依赖的状态封装起来。
查看原文:React 性能优化实践
要触发 bailout 函数,需要同时满足以下条件: 1. oldProps === newProps 并且 Context 没有改变 2. !includesSomeLane(renderLanes, updateLanes) 当前 fiber 上是否存在更新,如果存在那么更新的优先级是否和本次整棵 Fiber 树调度的优先级一致?

两篇文章对“边界”的处理方式不同。IME 文章主张把键盘处理放在 Composer 输入边界,而不是在 sendMessage() 里事后猜测,理由是输入组件最接近真实 DOM event、能拿到 composition 信息,并且 preventDefault() 可阻止后续 submit handler;它还提出事件消费优先级:IME composition 优先于 suggestion/mention/command popover、编辑器局部行为、产品快捷键和全局快捷键。性能文章则把优化边界放在组件结构与渲染调度上,通过封装状态、props.children 和 bailout 条件控制哪些 fiber 需要 render。前者关注事件语义的先后,后者关注渲染工作的复用与跳过。

查看原文:修复中文输入法按回车误发送:React Chat Composer 的 IME 事件陷阱
关键是把处理放在 Composer 输入边界,而不是 sendMessage() 里事后猜测
查看原文:修复中文输入法按回车误发送:React Chat Composer 的 IME 事件陷阱
→ suggestion / mention / command popover → editor-local behavior → product shortcut → global shortcut 越靠前的输入状态,越应该先消费事件。
查看原文:React 性能优化实践
bailout 函数逻辑大致是:尽量复用 fiber,不进行 render。fiber 复用,判断 fiber 的子树是否有 work。有,返回 child,继续遍历子树。无,返回 null,跳过子树。

IME 文章的测试建议强调验收重点是事件语义而非文字是否出现:至少覆盖中文与日文候选打开时按 Enter 不发送、composition 完成后再次按 Enter 发送一次、普通英文 Enter 发送、Shift+Enter 换行、composition 中 Shift+Enter 交给输入法、连续快速确认候选不丢字不重复发送,以及 Agent 运行时的 queue/steer 策略不被 IME 改写。文章还提醒不要只相信 JSDOM,因为 IME 与 WebView 差异发生在浏览器事件层,至少需要 macOS Safari/WKWebView、Chrome 以及 Windows 中文输入法的真机测试。

查看原文:修复中文输入法按回车误发送:React Chat Composer 的 IME 事件陷阱
这个 Bug 的验收重点是事件语义,而不是文字最终有没有出现在 textarea。
查看原文:修复中文输入法按回车误发送:React Chat Composer 的 IME 事件陷阱
自动化测试可以构造 compositionStart、keyDown、compositionEnd 序列,但不要只相信 JSDOM。IME 与 WebView 的差异发生在浏览器事件层,至少还需要一轮 macOS Safari / WKWebView、Chrome,以及 Windows 中文输入法的真机测试。

现有材料中,IME 文章提到 assistant-ui 的 ComposerPrimitive.Input 通常已包含基础 isComposing 判断,但宿主应用仍可能需要为特定桌面 WebView、输入法和系统版本补充 guard;文章没有给出这些具体 WebView 与系统版本组合的完整清单,也没有说明 80ms 保护窗口在不同设备上的实测分布。性能文章展示了 bailout 条件与 props.children 案例,但未讨论在 Context 值变化、lane 优先级交错或并发渲染下,这些优化法则的适用边界如何变化。这些问题可在现有资料基础上继续验证。

查看原文:修复中文输入法按回车误发送:React Chat Composer 的 IME 事件陷阱
这类 headless primitive 通常已经包含基础的 isComposing 判断,但宿主应用仍可能需要为特定桌面 WebView、输入法和系统版本补充 guard。
查看原文:React 性能优化实践
该案例中我们引入了 Context,当 context 的 value 改变时,

GBrain

覆盖 3/3 份来源 · 模型归纳

三篇材料都把 GBrain 定位为知识运行时而非事实源:它把 Source 解析为 Page、Chunk、Embedding/FTS 与 Edge,再以 Evidence 和 Citation 交给 Agent。作者反复强调索引是派生数据、应可从已验证的原始输入重建,因此数据库、FTS 索引和向量索引都不能充当第二事实源。

查看原文:GBrain 从入门到精通:构建可引用的本地知识层
这里最容易犯的错误是把“索引”当成事实源。索引只是派生数据,应该可以从已验证的原始输入重新构建;真正的事实源应该保留自己的版本和摘要。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
如果把“进入索引”直接理解成“成为资产”,GBrain 数据库就会悄悄变成第二事实源。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
GBrain database、FTS index、Vector index 都应该是可重建的派生实现。跨云端和本地同步时,同步版本化 Knowledge Asset,不要粗暴复制数据库文件。

在治理边界上,材料把 GBrain 与应用侧职责分开:GBrain 负责知识怎么被找到和组织,应用侧负责 Workspace、Revision、Permission、Approval 与 Audit。Raw Knowledge 被索引后只是可检索的 Page/Chunk,只有经过归属、校验、审核和发布才成为 Knowledge Asset Version,再由 Workspace Revision 固定为不可变快照。

查看原文:GBrain 从入门到精通:构建可引用的本地知识层
GBrain 负责“知识怎么被找到和组织”,应用侧负责“谁能使用这些知识、作用于哪个 Workspace、最终执行是否成功”。两者不能混成一个边界。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
一篇语雀文档被同步进 GBrain 后,可以被搜索、切块、建立向量和关系,但它依然可能过期、互相冲突、没有明确 Owner,甚至只是一场会议里的临时观点。它是 Raw Knowledge,不是已经发布的 Knowledge Asset。
查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
GBrain 是知识引擎,不应该自动成为业务系统的权限和发布中心。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
一句话定义 Workspace Revision 是面向 Workspace 发布的不可变资产集合快照。

三篇材料对检索方式的取舍一致指向 Hybrid:关键词检索守住函数名、错误码、配置项等精确术语,向量检索补足同义与自然语言表达,再用 RRF 融合并叠加 Metadata/Permission 过滤。中文场景的实测显示,PGLite 默认 english 配置下完整英文领域词可命中,但中文自然问句可能零召回;把 FTS language 改成 simple 只改变停用词与 stemming 规则,并不提供中文分词。

查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
simple 的主要作用是取消英文停用词和 stemming,不会自动把: text 工作区修订是不可变资产集合快照 切成: text 工作区 / 修订 / 不可变 / 资产 / 集合 / 快照
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
这个结果说明它不是“完全不支持中文”。索引里恰好存在的完整中文词可以命中,英文领域词也很稳定;真正不可靠的是中文自然问句。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
它们不真正理解语义,所以中文自然语言问题可能需要更好的分词、Query Rewrite 或 Vector Search。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
Keyword Search 守住精确术语,Vector Search 补足中文和同义表达,再通过 RRF 合并两个排序列表。

三项目组合文章与 GBrain 单项目文章在实施顺序上口径一致:先以 GBrain 作为知识底座跑通闭环,再按真实瓶颈接入其他组件。组合文章把 Sirchmunk 定位为不预建索引的实时原始数据探索、Understand Anything 定位为基于 Tree-sitter 的代码结构图,并主张由宿主系统做意图路由,Provider 只看到统一 Context 契约;GBrain 文章同样反对把三个工具都暴露给 Provider。

查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
Sirchmunk 的价值不在于又实现了一套 Vector RAG,而是它选择了另一条路径:直接面对 Raw Data 做 Indexless Agentic Search。
查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
它使用 Tree-sitter 和多 Agent Pipeline 提取 File、Function、Class、Dependency 等节点与关系,生成可交互 Knowledge Graph,并提供 Architecture Layer、Domain Flow、Diff Impact、Guided Tour 等视图。
查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
Agent 不需要知道三套引擎的数据库、进程和权限模型,只需要调用宿主系统暴露的 knowledge.search、workspace.search 和 code.graph_query。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
GBrain、Sirchmunk、Understand Anything 可以各自擅长不同问题,但不应该让 Codex 或 Qoder 自己决定调用哪一个。应该由 Host 做意图路由

工程落地层面,材料给出的 MVP 约束是:Bun 与固定版本 GBrain 打进桌面应用,本地用 PGLite 保存 brain,每个 Agent Turn 前最多检索 5 条,超时约 8 秒自动降级,每条结果生成 gbrain:// Citation。作者把“GBrain 增强 Agent 但不成为执行单点故障”作为原则,并要求系统允许命中、依据不足、不可用三种结果,禁止无 Citation 的关键结论伪装成团队事实。

查看原文:GBrain 从入门到精通:构建可引用的本地知识层
- 每个 Agent Turn 开始前最多检索 5 条知识。 - 结果通过只读上下文注入 Codex 或 Qoder。 - 检索超时约 8 秒时自动降级。 - 每条结果生成 gbrain:// Citation。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
这是一个很重要的工程原则:GBrain 增强 Agent,但不应该成为 Agent 执行的单点故障。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
最危险的状态是“没有命中,但模型假装命中了”。因此 Prompt 和 Adapter 都应该要求:没有 Citation 的关键结论不得伪装成团队事实。

AI Coding

覆盖 3/3 份来源 · 模型归纳

三篇文章都把 AI 编程的瓶颈从“模型能力”转向“上下文与工作区边界”。Git worktree 一文指出,AI 编程真正改变的是同一时间能推进的事情变多,最容易出问题的不是模型能力而是工作目录,切分支会覆盖未提交改动,多 clone 又会让依赖与仓库状态难以辨认。Codex 一文把问题表述为“把正确的信息送到正确的阶段”,避免无关文件、文档、日志和历史决策进入当前上下文。LLM Wiki 一文则指出,静态 Reference 在知识规模变大、变化变快后会失效,资料越多 Agent 每次加载的 Context 越大,真正需要的内容反而更难命中。三者共同点是:不靠让 Agent“更小心”,而靠外部结构约束输入范围。

查看原文:Git worktree:AI 时代的并行开发工作台
这时最容易出问题的不是模型能力,而是工作目录。切分支会覆盖未提交改动;为了并行而多 clone 几份,又会把依赖、构建产物和仓库状态弄得难以辨认。
查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
真正起作用的,是把正确的信息送到正确的阶段,尽量不让无关的文件、文档、日志和历史决策进入当前上下文。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
如果继续扩充静态 Reference,Skill 会逐渐变成一个难以维护的资料压缩包。知识更新需要修改 Skill,Skill 发布又和知识变更绑定;资料越多,Agent 每次加载的 Context 越大,真正需要的内容反而更难命中。

三者在“隔离什么”上分工不同。worktree 隔离的是文件系统与 Git 工作区:每个 checkout 有自己的分支、文件和未提交改动,但共享提交历史与对象数据库,且明确不是权限隔离,端口、全局缓存、Docker、数据库仍可能冲突。Session 隔离的是对话上下文:代码和 Git 工作区不会因换 Session 消失,但对话里的决策不会自动继承,需要一份短 handoff。LLM Wiki 隔离的是事实源与知识产物:Raw Sources 不可被 AI 改写,Wiki 是可重建的中间层,删除 Wiki 应能从 Raw Sources 重新编译。三者都强调边界落在可复现的记录上,而非依赖 Agent 自觉。

查看原文:Git worktree:AI 时代的并行开发工作台
它们仍共享同一个仓库的 Git 对象库,不能把它当成权限隔离。
查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
新 Session 的价值,就是把上下文重置成一个更干净的工作面。代码和 Git 工作区不会因为换 Session 消失,但对话里的决策不会自动继承,所以需要一份短 handoff。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
Wiki 是可重建的知识产物。删除 Wiki 后,系统应该能够从 Raw Sources 重新编译;删除 Raw Sources 后,只剩 Wiki 就失去了可信根基。
查看原文:Git worktree:AI 时代的并行开发工作台
端口、全局缓存、Docker 容器、数据库和远端环境依然可能冲突。

三篇都给出了“值得上/可以再等”的适用条件,且条件高度一致地指向任务复杂度与复用率。worktree 值得上:同时处理发布、修复、审查或多个 Agent 任务,不想为切分支 stash 半成品,需要从干净 commit 产出可追溯制品;可以再等:仓库小、任务严格串行、几乎没有未提交改动。Codex 组合值得上:中大型代码库、常查版本敏感文档、任务跨探索实现验证多阶段、长 Session 出现重复解释和日志污染;可以简单一点:小型仓库、单文件修改、一次对话可完成。LLM Wiki 值得上:同类任务反复发生、知识分散且持续变化、错误口径直接影响设计或生产代码;可以再等:资料规模小、规则稳定、任务复用率低。

查看原文:Git worktree:AI 时代的并行开发工作台
值得上:你同时处理发布、修复、审查或多个 Agent 任务;你不想为了切分支 stash 半成品;你需要从一个干净 commit 产出可追溯制品。
查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
值得上 - 中大型代码库,文件和调用关系比较复杂。 - 经常需要查 React、Umi、Midway 等版本敏感的文档。 - 任务经常经历探索、实现、验证多个阶段。 - 长 Session 里经常出现重复解释和日志污染。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
值得上:同一类任务反复发生,知识分散且持续变化,错误口径会直接影响设计或生产代码。 - 可以再等:资料规模小、规则稳定、任务复用率低,几份静态 Reference 已经能够清楚覆盖。

三篇都强调“工具越多不一定越好”的反直觉边界。Codex 一文明确 MCP 不是装得越多越省,每个 MCP 都可能增加工具定义、调用、返回结果和额外错误重试信息,应按职责选择:查外部文档用 Context7,理解代码结构用 Serena,查精确字符串用 rg,改代码跑测试用 Codex 原生工具;若只改一个 CSS 属性却同时开多个 MCP,成本可能高于收益。worktree 一文提醒不要把 worktree 当成“多开几个目录”就结束,而要给每个目录一个任务边界、一个分支和一份验证证据。LLM Wiki 一文则警告不要把 LLM Wiki 当成更复杂的 RAG 或万能知识平台。

查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
如果一个任务只需要改一个 CSS 属性,同时打开多个文档和代码 MCP,成本可能比收益更高。
查看原文:Git worktree:AI 时代的并行开发工作台
不要把 worktree 当成“多开几个目录”就结束了。给每个目录一个任务边界、一个分支和一份验证证据,才是它在 AI 时代真正放大交付能力的方式。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
不要把 LLM Wiki 当成更复杂的 RAG,也不要把它当成新的万能知识平台。

三篇都提到“人工审核”作为关键闸门,但未说明审核成本如何随规模变化。LLM Wiki 要求涉及业务语义的冲突进入人工审核,而不是让模型自行决定哪一方是真相;Codex 一文把拆 Session 描述为手动判断,标准是当前上下文是否还服务同一目标;worktree 一文要求 Agent 完成后报告 commit、验证命令和残留风险。在现有资料下,可继续探讨的是:当并行任务、Session 与 Wiki 页面同时增长时,人工审核与 handoff 的负担是否会抵消隔离带来的收益,以及哪些检查可以安全自动化。

查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
结构检查可以自动执行;涉及业务语义的冲突,应该进入人工审核,而不是让模型自行决定哪一方是真相。
查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
合理拆 Session 是手动做的。判断标准不是“聊了多少轮”,而是当前上下文是否还服务同一个目标。
查看原文:Git worktree:AI 时代的并行开发工作台
Agent 完成后报告 commit、验证命令和残留风险,而不是只说“改好了”。

Evidence

覆盖 3/3 份来源 · 模型归纳

关于 Evidence 与相邻概念的边界,第一篇与第三篇的划分高度一致,但侧重点不同。第一篇逐项区分 Source、Citation、Context、Trace、Artifact、Evaluation,指出 Source 表达信息来自哪里,Citation 只解决“去哪里看”,Trace 回答“系统记录到什么过程”,Artifact 存在只证明有交付物,Evaluation 是依据规则作出的判断而非事实材料。第三篇在领域对象层面给出同样的分离:Trace、日志、截图和测试输出只能算 Evidence Candidate,只有绑定具体 Claim 并说明来源、范围和验证方式后才成为可用于验收的 Evidence;Evaluation 消费 Artifact、Claim 和 Evidence 后给出 Verdict。第二篇则从知识层角度补充 Citation 的角色,把 Citation 定义为 Evidence 的可回溯地址,并强调 Evidence 不等于 Agent 的自述或无来源摘要。三篇的共同结论是:可验证性来自 Claim 绑定与来源定位,而不是来自材料数量或界面上的“已连接”状态。

查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
Citation 是 Claim 指向 Source 或 Evidence 的定位关系。它解决“去哪里看”,不自动解决“这段内容是否真的支撑结论”。
查看原文:Agent 系统的一级领域对象:从 Task、Run 到 Evidence
Trace、日志、截图和测试输出只能算 Evidence Candidate。只有当它被绑定到具体 Claim,并说明来源、范围和验证方式后,才成为可以用于验收的 Evidence。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
Citation 是 Evidence 的可回溯地址。

在“何时应把 Evidence 升级为一级对象”这一问题上,第一篇与第三篇给出了互补的判据。第一篇列出触发条件:同一条 Evidence 被多个 Claim、Run 或 Evaluator 引用;需要独立权限与脱敏;会过期、撤销、被替代或重新验证;需要审计“当时为什么通过”;需要比较不同 Agent 或版本采用的证据;需要第三方复查或生成 Acceptance Receipt;业务不能接受 Agent 用自己的输出证明自己。第三篇则用五个通用问题判断一级领域对象:是否有稳定 ID 可被 API、权限和审计独立引用;是否有独立生命周期;是否承载业务规则或状态转换;是否被多个模块共同使用;更换 Model、Runtime 或 Framework 后是否仍然存在。两者共同指向同一取舍:简单聊天机器人可把 Citation 与 Evidence Span 放在 Message Metadata 中,不必一开始建设复杂平台;只有当跨引用、审计、过期与第三方复查成为真实需求时,才值得付出独立建模的成本。

查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
当出现下面任意几种需求时,Evidence 应升级为一级领域对象: - 同一条 Evidence 会被多个 Claim、Run 或 Evaluator 引用; - Evidence 需要独立权限与脱敏; - Evidence 会过期、撤销、被替代或重新验证;
查看原文:Agent 系统的一级领域对象:从 Task、Run 到 Evidence
1. 它是否拥有稳定 ID,能被 API、权限和审计记录独立引用? 2. 它是否有独立生命周期,而不是伴随一次函数调用即消失? 3. 它是否承载业务规则或状态转换? 4. 它是否会被多个模块共同使用,而不属于某个框架的内部实现? 5. 更换 Model、Runtime 或 Agent Framework 后,它是否仍然存在?
查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
简单聊天机器人可以把 Citation 和 Evidence Span 放在 Message Metadata 中,不必一开始建设复杂平台。

第二篇在 GBrain 的工程语境中给出了 Evidence 的落地约束:检索结果不应直接拼接给模型,而应统一包装为带 content、source、citation、revision、score、retrievedAt 的结构;索引只是派生数据,应可从已验证的原始输入重建,事实源保留自己的版本和摘要;应用侧不允许拿旧 Revision 的索引结果冒充当前 Workspace 的知识,检索必须与 Session Pin、Workspace 和 Permission Scope 对齐。该文还提出拒答与降级策略:命中可靠 Evidence 则基于证据回答,命中不足则明确说明依据不足,GBrain 不可用则降级执行并记录诊断信息,并强调“没有命中,但模型假装命中了”是最危险的状态。这些约束与第一篇“Evidence 必须可定位、可回溯、有 Scope 与 Revision”的要求方向一致,但第二篇的表述属于 GBrain 接入实践中的工程建议,而非对 Evidence 领域模型的独立论证。

查看原文:GBrain 从入门到精通:构建可引用的本地知识层
不要把原始搜索结果直接拼接给模型。建议统一成: json { "content": "Overlay 不修改基础 Revision……", "source": "example-workspace-spec", "citation": "gbrain://default/example-workspace-spec", "revision": "workspace-revision-digest", "score": 0.99, "retrievedAt": "2026-07-22T12:00:00Z" }
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
应用侧不允许拿旧 Revision 的索引结果冒充当前 Workspace 的知识。知识检索必须和当前 Session Pin、Workspace 和 Permission Scope 对齐。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
最危险的状态是“没有命中,但模型假装命中了”。因此 Prompt 和 Adapter 都应该要求:没有 Citation 的关键结论不得伪装成团队事实。

现有材料留下一个可继续探讨的问题:第一篇主张高风险 Claim 应由独立 Verifier 从权威系统重新读取状态,并反对让 Agent 用自己的输出证明自己;第二篇则描述了 Execution Evidence 经 Knowledge Draft、Citation/Conflict Check、Review Gate 后发布为知识的闭环。两者都要求审核环节,但资料未说明在 GBrain 这类知识运行时中,Execution Evidence 进入知识层时由谁承担 Verifier 角色、依据哪条 Policy 判定,以及当检索到的 Evidence 与执行产生的 Evidence 冲突时如何取舍。此外,第一篇的字段模型与第三篇的十二对象关系模型都属作者推导的参考模型,资料未提供其在真实生产系统中的验证结果。

查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
让 Agent 自己证明自己 Agent 输出“工具调用成功”只能算自述。高风险 Claim 应由独立 Verifier 从权威系统重新读取状态。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
正确的闭环是: text Execution Evidence → Knowledge Draft → Citation / Conflict Check → Review Gate → Published Knowledge
查看原文:Agent 系统的一级领域对象:从 Task、Run 到 Evidence
这也意味着,十二个对象是一套用于架构决策的参考模型,不是对任何单一 SDK 或协议的重新命名。

AI

覆盖 2/2 份来源 · 模型归纳

两篇文章都把 AI 带来的变化定位在瓶颈转移而非能力替代:一篇认为生成候选变便宜后,问题选择、方案取舍、边界判断与结果验收成为更稀缺的能力,并把这一组带责任的判断称为 Taste;另一篇则把 Agent 工程能力拆成从通用工程基础到专家影响力的七层路径,强调层层递进。共同点是都不把 AI 视为自动替代判断或工程素养,差异在于前者聚焦产品与设计决策的验收标准,后者聚焦工程师能力地图与学习顺序。

查看原文:Taste Is All You Need
AI 没有让工程能力失去价值,它改变了瓶颈的位置:生成候选越来越便宜,定义问题、比较方案、拒绝噪声、验证结果和沉淀标准变得更重要;我把这组带责任的判断称为 Taste。
查看原文:Taste Is All You Need
当 AI 把实现和生成的成本迅速压低,真正稀缺的能力开始转向问题选择、方案取舍、边界判断与结果验收。
查看原文:Agentic System Engineer 成长路线图与学习指南
这张图的核心路径是:LLM 理解 → Agent 核心 → Runtime / Infra → Grounding & Execution → Evolution → 战略影响力。七个层级层层递进,每个层级下面都有具体的能力点。
查看原文:Agentic System Engineer 成长路线图与学习指南
作为全栈开发者,最大的优势是工程基础扎实、理解系统全貌。最大的挑战是从"确定性编程"转向"概率性系统"的思维转变。

在 Taste 一文的具体案例中,约束不是抽象审美,而是可执行规则:青山湖风格被写成颜色语义角色、圆角范围、间距节奏、动效性能与可访问性边界以及 anti-pattern,并进入 DESIGN.md 与 Design Language Atlas。Owlet 遇到系统材质崩溃风险时,选择用纯 SwiftUI 绘制柔焦层保留“雾”的视觉职责,而不是继续赌系统边界。这说明取舍的优先级被明确为审美服从稳定性、性能和可读性。

查看原文:Taste Is All You Need
最后我没有放弃“雾”,也没有为了视觉效果继续赌系统边界,而是改用纯 SwiftUI 绘制柔焦层:保留雾白的视觉职责,换掉高风险实现。
查看原文:Taste Is All You Need
青山湖于是从一句审美偏好,变成一套可执行约束:颜色有 semantic roles,圆角有范围,间距有节奏,动效有性能与可访问性边界,组件有 anti-pattern。
查看原文:Taste Is All You Need
这也是 Taste:知道哪个体验必须保留,哪个实现可以妥协,并让审美服从稳定性、性能和可读性。
查看原文:Taste Is All You Need
与其写“保持高级感”,不如写“湖水青是唯一主操作色;浮萍绿控制在极小面积;不要卡片嵌套卡片”。

两篇文章对“可复用资产”的落点不同。Taste 一文把个人直觉外化为 Agent 可读取、实现和验收的约束,并强调跨端复用的是 semantic vocabulary 与判断而非同一套界面,各平台仍服从自身交互模型与验收方式。Agent 路线图则把可复用性放在 Skill Library、Eval 数据集、执行轨迹与反馈闭环上,目标是让系统持续改进。前者关注设计判断的约束化,后者关注工程系统的评测与进化机制,二者都要求把隐性经验写成可检查的规则,但验收对象分别是产品体验与 Agent 任务表现。

查看原文:Taste Is All You Need
它不证明 Taste 可以被 AI 自动拥有;它证明的是另一件更务实的事:人的判断可以被外化成 Agent 能读取、实现和验收的约束。
查看原文:Taste Is All You Need
这次抽取没有把同一套界面复制到六个平台。共享的是一套 semantic vocabulary:canvas、surface、text、primary action、focus、success、warning、error,以及明确的 anti-pattern;各平台仍然遵守自己的交互模型和验收方式
查看原文:Agentic System Engineer 成长路线图与学习指南
- Skill Library:Agent 学习的技能库,可复用的工具组合和策略模板。
查看原文:Agentic System Engineer 成长路线图与学习指南
- 反馈闭环:将执行结果反馈给 Agent,形成学习循环。成功/失败案例的积累。

Agent 路线图把实施顺序写得很具体:先补 L2 与 L3,产出具备 Planning、Memory、Tool Use 的 Agent 原型;再进入 L4 与 L5,用状态机、沙箱、可观测性、Browser Agent、RAG 与多 Agent 协同走向生产;之后才做 Eval、反馈闭环、Skill Library 与成本优化。文中还给出每天两小时的分配:理论 40 分钟、动手 60 分钟、复盘 20 分钟,并强调先跑起来再完美、一课一代码。这些是作者规划的学习安排,不是已完成成果的证明。

查看原文:Agentic System Engineer 成长路线图与学习指南
第一阶段(1-3 个月):夯实基础 重点:L2 + L3
查看原文:Agentic System Engineer 成长路线图与学习指南
产出物:一个具备 Planning + Memory + Tool Use 的 Agent 原型
查看原文:Agentic System Engineer 成长路线图与学习指南
理论学习 40 min 读文档、课程章节或论文,理解概念并记关键笔记 动手实践 60 min 写代码、跑示例、调 Prompt,必须产出可运行的代码 复盘整理 20 min 写学习日志、整理代码片段、画思维导图,沉淀为可复用知识
查看原文:Agentic System Engineer 成长路线图与学习指南
1. 先跑起来再完美:第一周就写出能运行的代码,不要花两周只读理论

Taste 一文还给出适用条件与边界:当 AI 已能快速产出候选而产品仍缺方向、辨识度或稳定完成标准时,值得优先补 Reference、选择规则、anti-pattern 与验收方式;涉及安全、合规、数据正确性和复杂系统边界时,Taste 不能替代专业知识、工程验证与责任机制。文章同时提醒不要只记录最终选择,还要记录删掉什么、为什么删、什么证据会推翻当前决定。这些是作者对判断框架适用范围的说明。

查看原文:Taste Is All You Need
- 值得投入: 当 AI 已经能快速产出候选,而产品仍然缺少方向、辨识度或稳定完成标准时,优先补 Reference、选择规则、anti-pattern 和验收方式。
查看原文:Taste Is All You Need
- 不能替代: 涉及安全、合规、数据正确性和复杂系统边界时,Taste 不能替代专业知识、工程验证和责任机制。好判断必须建立在真实约束上。
查看原文:Taste Is All You Need
- 重点关注: 不要只记录最终选择。把删掉什么、为什么删、什么证据会推翻当前决定一起沉淀,下一次协作才不会从零开始。
查看原文:Taste Is All You Need
这里不存在一个严格的因果公式:使用 AI 不会自动让所有人拥有相同执行力,生成速度提高也不必然导致产品同质化。

现有资料下仍可继续探讨:Taste 一文提出的跨端 Design Skill 与 Agent 路线图中的 Skill Library 都涉及把经验沉淀为可复用模板,但两者分别面向设计约束与 Agent 技能,资料未说明它们能否共用同一套验收机制;此外,路线图给出的 12 个月学习安排与每日两小时方案属于规划,资料未提供执行后的效果证据,如何判断阶段产出是否达标仍是开放问题。

查看原文:Taste Is All You Need
Qingshan Lake Design Skill 里除了 token,还有布局顺序、材质策略、状态合同、Reduced Motion、对比度检查和禁区。
查看原文:Agentic System Engineer 成长路线图与学习指南
- Skill Library:Agent 学习的技能库,可复用的工具组合和策略模板。
查看原文:Agentic System Engineer 成长路线图与学习指南
按这个节奏,12 个月后你会有一条清晰的成长轨迹:从"能写 Agent"到"能设计 Agent 系统"再到"能带团队做 Agent 落地"。每天 2 小时,关键是不中断。

漫画

覆盖 4/4 份来源 · 模型归纳

三篇“漫画拆解”类文章都把工具能力限定在可回查的静态证据上,而不把示意当作运行结果。ChatGPT App 一文明确分析对象为 macOS 上的特定版本与 build,检查日期为 2026 年 10 月 31 日,并声明这是一轮安装包静态分析,没有执行真实网页任务;agent-browser 一文按 2026 年 11 月 1 日核验的上游 0.41.1 版本与官方文档解释,并声明漫画中的书店、库存和命令输出均为教学示意;Zed 一文以两张真实截图为界面依据,但没有对截图中的仓库执行暂存、提交或寄存。共同点是区分“机制解释”与“已交付状态或执行记录”,差异在于证据类型:前者是安装包与源码,中者是固定版本源码与官方文档,后者是界面截图加固定版本源码。

查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
分析对象为 macOS 上的 ChatGPT 26.1023.51421,build 22530,检查日期为 2026 年 10 月 31 日。这是一轮安装包静态分析,没有执行真实网页任务,也不代表其他平台或历史版本采用相同实现。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
漫画中的书店、库存和命令输出均为教学示意,不是实际业务执行记录。
查看原文:漫画读懂 Zed Git 面板:Stage、Unstage 和 Stash
本文以两张真实截图为界面依据,配合教学示例解释操作;没有对截图中的仓库执行暂存、提交或寄存。

ChatGPT App 一文把“内置浏览器”拆成四层可回查结构:随应用分发的 Chromium、承载网页的宿主、管理生命周期的主进程,以及连接 Agent 的 CDP 通道。证据链上,Frameworks 下的 Codex Framework.framework 版本目录与 Info.plist 中的 ChromiumBaseVersion 一致,说明内核随应用分发而非使用系统 WKWebView;页面挂载配置包含 sandbox、nodeIntegration 关闭、contextIsolation 与 webSecurity 开启,并配有 browser-page-preload.js 作为受控桥接;Agent 路径是经会话路由找到页面 WebContents,再用 debugger 接口发送 CDP 命令。文章同时划出边界:依赖存在只能证明组件被打包,不能证明功能已启用;Owl 相关接口支持“运行时带有定制扩展”的判断,但具体修改了哪些上游源码仍不能确定。

查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
Frameworks 下存在 Codex Framework.framework,其中的版本目录为 156.0.8078.48;应用 Info.plist 中的 ChromiumBaseVersion 与它一致。
查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
{ sandbox: true, nodeIntegration: false, contextIsolation: true, webSecurity: true }
查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
Browser Use 后端经过会话路由,找到页面的 WebContents,再使用 Electron 的 debugger 接口发送 CDP 命令。
查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
这些证据支持“运行时带有定制扩展,并暴露了页面接管与转移接口”的判断。 但铭牌和接口没有交出完整施工图。

agent-browser 一文的核心取舍是把“观察”和“动作”做成可分离的两步,并强调动作成功不等于任务完成。snapshot 通过 Accessibility.getFullAXTree 取得节点信息,再组织角色、名称、状态和层级,生成 @e1 这类引用;引用绑定的是页面元素,不是商品 ID 或订单号,页面或 iframe 导航、元素替换会影响其有效性,导航后必须重新读取快照。文章还指出 -i 只保留交互元素,可能排除“有货”这类结果文字,因此检查业务结果时需保留正文或表格内容。架构上当前上游采用 client-daemon:Rust CLI 解析命令并与 Rust daemon 通信,daemon 直接使用 CDP 驱动默认 Chrome 路径,原生 daemon 运行时不需要 Node.js 或 Playwright。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
工具通过 Accessibility.getFullAXTree 取得节点信息,再组织角色、名称、状态和层级。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
引用省去了为每一步重新编写 selector 的工作,但它不是商品 ID、订单号,也不是跨页面永久有效的地址。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
snapshot -i 偏向可引用的操作目标,“有货”这样的普通结果文字可能被排除;某些标题和表格单元格能够留下,也不保证所需字段完整。找动作目标时可以压缩观察,检查业务结果时则需要保留相关正文、状态或表格内容,不能把“交互快照里没出现”理解为“页面没有”。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
Rust CLI 解析命令并与 Rust daemon 通信,daemon 直接使用 CDP 驱动默认 Chrome 路径。

Git 闯关记与 Zed 面板两文共享同一套 Stage/Unstage/Commit/Stash 语义,但载体不同:前者用工作桌、背包、档案塔、团队城堡的漫画讲通用 Git 流程,后者用 Zed 的 Staged & Unstaged 分组讲界面操作。两文都强调 Stage 保存的是操作当时的版本:暂存 A 后继续编辑成 B,暂存区仍记 A,同一文件可同时出现在两组,因此不能把两组数量简单相加当作文件总数。差异在边界提示:Git 文补充 Push 只更新远端引用及所需对象,未提交修改、仅暂存内容与 stash 条目不会随普通 Push 同步,并区分 fetch 与 pull、stash 与 worktree 两条支线;Zed 文则提醒 Commit Tracked 会自动暂存并提交 tracked 改动,Unstage All 后直接点它并不能排除刚取消的文件。

查看原文:Git 闯关记:从工作区到远端仓库的完整漫画
Stage 记下当时的版本 A,之后继续编辑成 B,暂存区仍保存 A。
查看原文:漫画读懂 Zed Git 面板:Stage、Unstage 和 Stash
同一文件名可能同时出现在两组,所以不能把两组数量简单相加,当作不同文件的总数。
查看原文:Git 闯关记:从工作区到远端仓库的完整漫画
未提交的工作区修改、仅暂存的内容、stash 条目,都不会随普通 Push 自动同步。
查看原文:漫画读懂 Zed Git 面板:Stage、Unstage 和 Stash
因此,Unstage All 之后直接点 Commit Tracked,并不能排除刚才取消的文件:Zed 又会自动暂存 tracked 改动后提交。

Git 闯关记在临时换任务处给出两条互斥支线而非顺序脚本:Stash 路径用 git stash push -u 收起半成品,普通 push 默认不收未跟踪文件,pop 成功应用后移除条目、冲突时保留条目,且普通 Pop 不保证恢复原来的 Stage 划分;Worktree 路径用 git worktree add -b 另开目录,两边各有工作区、index 和 HEAD,共享仓库对象与多数引用,原目录未提交修改不会自动出现在新目录,同一分支默认不能同时检出到两个 worktree。文章还区分三种状态:功能分支已推送、代码已合入主线、应用已发布并不相同;revert 通过新的反向提交记录撤销,restore 的默认来源取决于是否含 --staged,取消暂存与丢弃编辑不是同一操作。

查看原文:Git 闯关记:从工作区到远端仓库的完整漫画
普通 git stash push 默认不收未跟踪文件,-u 把它们一并收纳,忽略文件仍默认留着。
查看原文:Git 闯关记:从工作区到远端仓库的完整漫画
两边有各自的工作区、index 和 HEAD,共享仓库对象与多数引用;原目录的未提交修改不会自动出现在新目录里。
查看原文:Git 闯关记:从工作区到远端仓库的完整漫画
功能分支已推送、代码已合入主线、应用已发布,是三个不同状态。
查看原文:Git 闯关记:从工作区到远端仓库的完整漫画
restore 的默认来源取决于目标是否含 --staged,不要把“取消暂存”和“丢弃编辑”当成同一操作

现有资料留下几处可继续探讨但尚不能回答的问题。ChatGPT App 一文承认 Owl 定制接口的底层补丁范围、对应上游 Electron 版本与迁移限制仍不能从静态检查确定,且未运行真实任务,因此前后台表现是否一致、是否所有浏览器工具都走这条后端仍待验证。agent-browser 一文指出会话仍在运行、浏览器关闭后能恢复状态、两个账号完全隔离是三个不同要求,多个会话通过 --cdp 连接同一 Chrome 时不能仅靠会话名推断 Cookie 隔离;文章也未做速度、token 或费用的性能对照。Zed 一文截图未显示安装版本号,具体菜单以当前版本为准。

查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
具体修改了哪些 Chromium/Electron 源码、对应哪个上游 Electron 版本、迁移时有哪些限制,仍不能从这次检查中确定。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
会话仍在运行、浏览器关闭后能恢复状态、两个账号完全隔离,是三个不同要求。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
本文没有进行这样的性能对照,不据此给出降本或提速比例。
查看原文:漫画读懂 Zed Git 面板:Stage、Unstage 和 Stash
截图未显示安装版本号,具体菜单以当前版本为准。

小说站

覆盖 2/2 份来源 · 模型归纳

Pixel 文给出的具体工程约束集中在触发时机与架构成本上。ChapterCompleted 若用滚动比例判断,会因为正文下方推荐区占页面高度 15-25% 而失真,作者改为在正文末尾放哨兵元素并用 IntersectionObserver 监听。CAPI 方面,文章指出静态导出站没有运行中的 Node.js 服务,需改用 Vercel Route Handler、单独部署 Worker/Function 或使用官方 CAPI Gateway,且浏览器 Pixel 与 CAPI 同时上报需用 event_id 去重。这些是该文作者针对其站点架构的取舍,不是通用结论。

查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
实际问题:document.body.scrollHeight 包含正文下方的"YOU MIGHT ALSO LIKE"推荐区。这块区域通常占页面高度的 15-25%。
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
我的站点用 Next.js output: 'export' 静态导出,全站 HTML/CSS/JS 推 CDN,没有运行中的 Node.js 服务。CAPI 需要从服务端调用 Meta Graph API 回传事件,这意味着: - 方案 A:改用 Vercel 部署(支持 Next.js Route Handler),在 app/api/fb-event/route.ts 里回传 - 方案 B:单独部署 Cloudflare Worker 或 Vercel Function 作为中转 - 方案 C:Meta 官方 CAPI Gateway(零后端成本,但灵活性差)
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
另外 CAPI 和 Browser Pixel 同时上报同一事件时,需要用 event_id 去重——前端生成 UUID 写 Cookie,服务端从 Cookie 读同一个 ID 再回传,这套打通有额外工程量。
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
当前阶段流量不大、日耗不高,浏览器 Pixel 足够,CAPI 等 Events Manager 出现"信号丢失"警告再评估。

预算文还指出小说站变现的特殊性:收入不是点击即发生,而由平均阅读页数与页面 RPM 摊出,公式为单次访问价值 = 平均阅读页数 × 页面 RPM / 1000,利润 = 单次访问价值 − CPC。因此 Facebook 端 CPC 只是上半场,若站内阅读深度和 RPM 未稳定,为压低 CPC 去投低质量受众会导致用户快速离开、广告收入更差。该文同时提醒覆盖人数仅 939、展示 1019 的样本太小,不能据此判断放量能力。

查看原文:Facebook广告预算反推:一天100元想拿2000成效现实吗
单次访问价值 = 平均阅读页数 页面 RPM / 1000 利润 = 单次访问价值 - CPC 这意味着 Facebook 端的 CPC 只是上半场。真正决定能不能套利的,还有两个站内指标
查看原文:Facebook广告预算反推:一天100元想拿2000成效现实吗
如果站内阅读深度和 RPM 还没稳定,盲目追求低到不现实的 CPC,会让投放策略变形。比如为了便宜点击去投低质量受众,短期 CPC 降了,但用户进站 3 秒就走,最后广告收入更差。
查看原文:Facebook广告预算反推:一天100元想拿2000成效现实吗
在原始数据里还有一个信号:覆盖人数只有 939,展示 1019。这个量级太小了。 如果一个广告组一天只覆盖不到 1000 人,就算单次成本看起来不差,也不能直接判断它有放量能力。

现有两篇材料分别来自 Pixel 接入与预算反推两个角度,但都未给出同一站点在扩受众后 0.33 元成本能否稳定复现的实测结果,也未说明哨兵触发方案上线后 ChapterCompleted 事件量与广告优化目标之间的实际匹配情况。此外,Pixel 文提到 AEM 已改名为“广告组转化事件”且 8 槽限制放开,但未提供该变化的官方出处;预算文中的 0.33 元与 939 覆盖人数属于作者所述当时数据,其后续走势在材料中未知。

查看原文:Facebook广告预算反推:一天100元想拿2000成效现实吗
我的最终判断是:当前任务不是把 0.33 元硬压到 0.05 元,而是验证 0.33 元能否在更大受众池里稳定复现。 复现成功,再用预算换量;复现失败,再回头修素材、落地页和读者质量。
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
原因:Meta 在 2023 年左右悄悄把这套机制改名了,现在叫「广告组转化事件」,UI 路径在广告管理工具 → 广告组 → 广告组转化事件(不在事件管理工具里)。 原来的 8 槽限制也放开了,现在可以正常选任意自定义转化事件作为优化目标,不再有数量硬上限。
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
然后用 IntersectionObserver 监听这个元素进入视口: js const sentinel = document.getElementById('chapter-content-end')

版本与更新

覆盖 3/3 份来源 · 模型归纳

三份材料都把“更新框架接入”与“版本真正送达旧客户端”拆成不同结论。Sparkle 文档把最小更新链描述为旧 App 请求 appcast、比较 CFBundleVersion、下载制品、验证 EdDSA 签名、解包并验证 macOS 代码签名、启动 helper 替换并重启;WinSparkle 文档把客户端职责限定为检查 feed、展示更新、下载、验签和启动安装器,并明确它不替代构建与安装逻辑;Chrome 渠道文档则把验收拆成源码、制品、服务端和旧客户端多个门禁。共同点是:更新 URL 或检查按钮只是链路入口,不能单独证明发布完成。

查看原文:Sparkle 从入门到精通:macOS 应用自动更新的接入、发布与排障
真正可交付的自动更新远不止一个 UI:旧客户端要发现正确版本,下载最终制品,验证更新签名,启动 updater,通过 macOS 的代码签名与 Gatekeeper 检查,替换旧 App,重启后还要保持用户数据和应用身份不变。
查看原文:WinSparkle 从入门到精通:Windows 应用自动更新的接入、签名与发布
它适合已有安装器、希望自己掌握发布节奏的桌面应用;但它不会替你构建安装包、保管签名私钥,或证明一台旧 Windows 客户端真的升级成功。
查看原文:Chrome 发行渠道设计:Stable、Beta、Dev、Canary 如何并行安装与独立更新
多渠道设计真正完成,要分别验证源码、制品、服务端和旧客户端。下面这些状态不能合并成一句“已经发布”

Sparkle 与 WinSparkle 都采用 appcast 加 EdDSA 的更新信任链,但平台信任链不同。Sparkle 文档区分 Sparkle 更新信任链与 macOS 平台信任链:前者用私钥签最终 archive 字节并由旧 App 内公钥验证,后者依赖 Developer ID、Hardened Runtime、notarization、staple 与 Gatekeeper;两者保护对象不同,不能互相替代。WinSparkle 文档同样区分 EdDSA 与 Windows Authenticode,前者为更新文件字节签名,后者证明 PE 发布者身份,发行流程应同时验证。Chrome 文档进一步指出代码签名主体不必按渠道拆分,而更新信任可按渠道隔离。

查看原文:Sparkle 从入门到精通:macOS 应用自动更新的接入、发布与排障
它回答的是“下载到的字节是否由持有 private key 的发布方签出”,不是“macOS 是否允许其中的代码运行”。
查看原文:WinSparkle 从入门到精通:Windows 应用自动更新的接入、签名与发布
Windows Authenticode 则证明 PE 发布者身份,供 Windows 安装信任链检查。两者解决不同问题,发行流程应同时验证,不把一个成功当作另一个成功。
查看原文:Chrome 发行渠道设计:Stable、Beta、Dev、Canary 如何并行安装与独立更新
签名主体不一定要按渠道拆分。Stable 与 Preview 可以继续使用同一家公司的 Developer ID 或 Authenticode 证书,因为它们表达“谁发布了这个二进制”;CUP、CRX3、Sparkle feed key 等更新信任则可以按渠道隔离,因为它们约束“哪条更新链有权推进这个应用”。

发布顺序与回滚语义上,Sparkle 文档给出明确顺序:先冻结最终制品、生成签名与长度、上传 versioned artifact、从公开 URL 回读校验、上传 release notes 与 delta,最后激活 appcast 并回读;并指出已升级到更高内部版本的客户端不会因 appcast 重新指向旧版本而自动降级,二进制回滚不能替代数据回滚。WinSparkle 文档强调发布时必须从最终签名后的安装包字节计算真实长度和 EdDSA 签名,并列出下载后拒绝安装、安装器启动但版本不变等按层定位的故障。Chrome 文档则说明切换现有安装渠道时若目标渠道版本更低,默认不会立刻降级,可能要等待目标渠道追上或显式启用 rollback。

查看原文:Sparkle 从入门到精通:macOS 应用自动更新的接入、发布与排障
appcast 是发布开关。若先更新 feed,客户端可能立刻看到一个尚未上传、未完成 CDN 刷新或字节不一致的制品。artifact URL 应版本化且尽量 immutable;不要在相同 URL 上静默覆盖不同字节。
查看原文:Sparkle 从入门到精通:macOS 应用自动更新的接入、发布与排障
Sparkle 默认安装更高内部版本。已经升级到 101 的客户端不会因为 appcast 重新指向 100 就自动降级。
查看原文:WinSparkle 从入门到精通:Windows 应用自动更新的接入、签名与发布
示例中的长度和签名只是占位值。发布时必须从最终签名后的安装包字节计算真实长度和 EdDSA 签名。
查看原文:Chrome 发行渠道设计:Stable、Beta、Dev、Canary 如何并行安装与独立更新
它改变同一安装后续接收的版本;如果目标渠道版本更低,默认不会立刻降级,可能要等待目标渠道追上,或显式启用 rollback。

现有材料均为通用机制与设计判断,并明确示意不对应任何具体产品的已交付状态。因此,在具体项目中,旧客户端实际嵌入的 Sparkle 或 WinSparkle 版本、真实签名服务回传后的字节变化、以及多渠道并行安装的现场验收结果,仍需以各自项目的日志、feed 快照、制品哈希和安装结果来确认;这些材料本身不足以判断某个产品是否已经完成上述闭环。

查看原文:Sparkle 从入门到精通:macOS 应用自动更新的接入、发布与排障
本文讨论通用机制和设计判断;示意不对应任何具体产品的已交付状态。源码阅读坐标沿用原稿,本次整理不构成新的运行时验收。
查看原文:WinSparkle 从入门到精通:Windows 应用自动更新的接入、签名与发布
每个故障都要保留客户端日志、feed 快照、制品哈希和 Windows 原生安装结果。macOS 上的源码检查不能代替 Windows 安装和旧客户端升级证据。
查看原文:Chrome 发行渠道设计:Stable、Beta、Dev、Canary 如何并行安装与独立更新
最终验收至少要覆盖:两个应用同时出现在系统中;分别打开各自的 About 页面;进程、安装目录和 User Data Directory 不相同;Preview 更新不会改变 Stable 版本;卸载 Preview 后 Stable 仍能启动和更新。

Claude Code

覆盖 4/4 份来源 · 模型归纳

作者把面向 AI 的知识沉淀分成三种载体:CLAUDE.md/AGENTS.md 是每次会话自动加载的常驻规则,只放最高优先级、最稳定的约束;Claude Code skill 是命中触发词才按需加载的操作手册,可以写得详细;博客文章则承载“为什么这么做”的判断框架,面向人和 AI 公开检索。作者强调分层的关键在于成本结构不同:常驻内容每次会话都付上下文成本,按需内容只在触发时加载,因此常驻要极简、按需可详尽。

查看原文:我在给自己建一个 LLM wiki
CLAUDE.md 是常驻规则。 它每次都进上下文,所以只放最高优先级、最稳定的东西:比如"博客每篇至少 3 张插图""性能规则不能回退""发布流程怎么走"。它贵,所以要克制——不该把操作细节全塞进来。
查看原文:我在给自己建一个 LLM wiki
skill 是按需加载的操作手册。 它平时不占上下文,只有当任务命中触发词("做 mac 应用图标"、".icns")才被拉进来。这意味着 skill 可以写得很详细、很长,因为它不是常驻成本。
查看原文:我在给自己建一个 LLM wiki
博客是给人也给 AI 的深度页。 它存的是"为什么这么做"的判断,而不只是"怎么做"的步骤。
查看原文:我在给自己建一个 LLM wiki
- 只存结果不存判断 = 不可迁移。 "这次用了方案 A"没价值;"因为 X 约束所以选 A、代价是 Y"才能迁移到下一个场景。这也是为什么博客这层不可替代——它存的是判断框架。

在 Skill 的 token 优化上,作者给出的核心结论是结构分离优先于内容压缩:把同时服务 A2 与 A2.5 两个 phase 的 cover-allure-elements.md 按消费者拆分,A2.5 只加载 allure 规则与 pose 表,不再加载约 30KB 的 genre prompt 模板,每次插图生成少加载 27KB。作者把这种节省称为乘法效应,因为它在每次高频调用中都生效;而跨文件去重和模板压缩属于中低杠杆。作者同时给出适用条件:Skill 高频调用、单个 reference 超过 50KB、不同 phase 需求差异明显时才值得做,为“显得整洁”而拆分或压到极限则不值得。

查看原文:Claude Code Skill Token 优化实践:从 162KB 到 117KB
效果:每次插图生成任务(A2.5)比之前少加载 27KB。这是结构性节省,不是内容压缩——文件总量没变,但每次调用用到的更少了。
查看原文:Claude Code Skill Token 优化实践:从 162KB 到 117KB
内容压缩是锦上添花,结构分离才是关键。 文件从 162KB 压缩到 117KB,感觉很好。但真正节省大的是"A2.5 不再加载 genre playbook"那 27KB——它每次插图任务都生效,是乘法效应。
查看原文:Claude Code Skill Token 优化实践:从 162KB 到 117KB
- Skill 被高频调用(每次写章节、每次生图都触发) - 单个 reference 文件超过 50KB - 同一个文件被不同 phase 消费,但 phase 之间需要的内容有明显差异
查看原文:Claude Code Skill Token 优化实践:从 162KB 到 117KB
不值得做: - 为了"显得更整洁"而拆分(增加维护成本,收益低) - 把所有内容压到极限(模型需要足够的示例才能理解方法论,过度压缩反而降质量)

RunCat 复刻与 Owlet 两个项目都涉及菜单栏动画,但作者对工具边界的判断不同。RunCat 复刻用 Remotion 的纯函数帧模型,把命令式的 index++ 取模换帧改写为 Math.floor(frame / framesPerSprite) % 5,产物是渲染好的 GIF/视频资产;作者明确 Remotion 不是常驻菜单栏的原生进程,要真·菜单栏猫得靠 Swift 或 Tauri/Electron。Owlet 则是常驻 macOS menu-bar 应用,作者用 Claude Code 负责架构与系统边界判断、Codex 负责快速小范围实现,并强调 AI 没有替自己做项目取舍、命名和配色等关键决定。两者共同点是都把“判断框架”留给人、把执行力交给 AI。

查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
- 别用错工具:你要的是一个常驻 macOS 菜单栏、读真实 CPU 的原生小猫——那 Remotion 不是答案,老老实实用 Swift(RunCat 本体)或 Tauri/Electron。Remotion 造的是动画资产,不是系统进程。
查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
关键就那一行 Math.floor(frame / framesPerSprite) % CAT_FRAMES.length: - frame / framesPerSprite:当前帧对应到「第几个 sprite 周期」 - Math.floor(...):取整,同一张图在多个视频帧里保持不变 - % 5:跑完 5 张回到第 0 张——和 RunCat 那句 % frames.count 是同一个灵魂
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
这件事让我明确了一条分工:需要理解系统边界和做取舍的,找 Claude Code;需要快速验证一个想法的,找 Codex。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
整个过程中,AI 没有替我做任何一个真正重要的决定。 - 要不要做这个项目?我决定。 - 功能优先级怎么排?我决定。 - 命名 Owlet?我决定。 - 青山湖配色方向?我决定。 - 性能规则里哪些不能回退?我决定。

作者在多篇文章中反复强调同一类失败模式:模型会基于“我以为的状态”继续推进,而不是真实状态。在 LLM wiki 一文里,作者记录了一次提交推送的中间回显显示成功、实际未提交成功,之后以 git rev-parse、git status、git show 的真实输出为准,并把这条自我校验规则固化进沉淀。在 Remotion 复刻中,作者也指出无缝循环的帧数对齐、动态变速时的相位累积这类数学细节,Claude Code 不一定主动算对,需要自己盯住。这构成对 AI 辅助工作流的共同约束:执行可以外包,校验与判断不能。

查看原文:我在给自己建一个 LLM wiki
今天我在提交一个 skill 改动时,中间的工具输出显示"已提交、已推送",我就信了、往下走了。后来用 git rev-parse HEAD 和 git show 一核对——根本没提交成功,那几步是我基于未经核验的中间状态脑补出来的。
查看原文:我在给自己建一个 LLM wiki
我后来把这条也固化了:涉及提交推送,一律以 git rev-parse、git status、git show 的真实输出为准,绝不用中间回显下结论。这就是一条为 AI 写的"自我校验规则"。
查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
这个细节 Claude Code 不一定主动帮你算,得自己盯一下。
查看原文:用 Claude Code + Remotion 复刻 RunCat 奔跑的猫帧动画
但「取模换帧」的原理、「相位累积」的坑、无缝循环的数学——这些判断你得心里有数,否则 AI 给的代码你既 review 不了也调不动。

现有材料中,LLM wiki 的分层规则(常驻极简、按需详尽)与 Skill token 优化的 phase 拆分,都建立在作者自己的项目与调用频率上;这些阈值(如单个 reference 超过 50KB、高频调用)是否适用于其他规模或低频场景,资料未给出验证。另外,作者提到把性能规则写进 CLAUDE.md 和 AGENTS.md 作为底线,但两份文件如何同步、冲突时以谁为准,现有文本没有说明,可作为继续探讨的问题。

查看原文:Claude Code Skill Token 优化实践:从 162KB 到 117KB
- Skill 调用频率低(每月几次) - 所有 reference 文件都在 20KB 以下 - 文件内容高度内聚,没有明显的 phase 分离机会
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
这些规则都被写进了 CLAUDE.md 和 AGENTS.md,成为后续所有改动的底线。
查看原文:我在给自己建一个 LLM wiki
- 写太细放错层 = 变负担。 把一次性的操作细节塞进 CLAUDE.md,每次会话都要为它付上下文成本。分层很重要:常驻的极简、按需的详尽。

LLM Wiki

覆盖 4/4 份来源 · 模型归纳

四篇材料都把检索方式与知识治理分层看待,而不是排成从 RAG 到 GraphRAG 再到 LLM Wiki 的升级线。第一篇明确说这些概念“分别描述的是检索方式、数据结构、工程系统和知识治理方法,不能简单排成一条替代关系”;客服实战篇也强调三条路线“并不是一条从低级到高级的升级路线”,并把它们放回 Raw Source 到 Evidence 的同一链路。GBrain 篇把 GBrain 定位为知识运行时、LLM Wiki 为知识治理层;Skill 篇则把 Raw Sources、Wiki、Schema 三层视为事实、编译产物与执行规则的分工。共同点是:事实源、派生索引、证据与引用必须分层,差异在于各篇对“编译层”承担多少治理职责的侧重不同。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
它们分别描述的是检索方式、数据结构、工程系统和知识治理方法,不能简单排成一条替代关系。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
向量 RAG、GraphRAG 和编译式 RAG 并不是一条从低级到高级的升级路线。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
LLM Wiki 可以理解为“知识治理层”,GBrain 可以作为它的知识运行时。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
LLM Wiki 的三层架构 Andrej Karpathy 提出的 LLM Wiki pattern 把知识系统分成 Raw Sources、Wiki 和 Schema 三层。

在检索实现上,几篇材料给出的共同起点是 FTS/BM25 加 Evidence 与 Citation,而不是一开始就上完整图谱或编译层。FTS 篇把当前阶段定为“FTS/BM25 + Evidence 先解决本地、可解释、低依赖的知识接入”,并说明 GBrain MVP 先用 FTS 是因为本地部署简单、依赖少、可解释;GBrain 篇同样建议第一版从 FTS/BM25 开始,先保证命中精确领域词、返回 Source 和 Citation、按 Revision 过滤、无结果时明确返回空。客服实战篇则把 Hybrid Search 作为默认底座,用 BM25 守精确词、Vector 处理同义表达,并加 Metadata Filter 与 Rerank。差异在于:前两者把向量与图谱列为后续按评测结果升级的选项,后者把混合检索视为生产常态,图谱只在高价值关系子域启用。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
当前阶段 FTS/BM25 + Evidence 先解决本地、可解释、低依赖的知识接入
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
第一版建议从 FTS/BM25 开始,因为它快、便宜、结果可解释。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
默认先做 Hybrid RAG:Keyword / BM25 保精确词,Vector Search 处理自然语言表达,再加 Metadata Filter 与 Rerank。
查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
当前的 GBrain MVP 先使用 FTS,原因很务实:本地部署简单、依赖少、可解释,而且对项目里的英文领域术语已经有效。

关于图谱与编译层的适用条件,材料给出的判断依据是问题形状而非语料规模。FTS 篇认为当问题涉及“几个对象之间有什么关系”“这条结论依赖哪些事实”“修改某个事实会影响什么”时图结构更有价值,并明确不建议一开始就上完整 GraphRAG;客服实战篇进一步指出资料少但关系密集时 Graph 仍可能有价值,并列出实体消歧、关系方向、时间有效性、来源追踪、增量更新、权限裁剪六项维护难点,主张第一版只定义少量 Typed Edge。编译层方面,Skill 篇认为当知识规模变大、变化变快、同一知识点存在多版本甚至冲突、任务中校准的结论需要复用时,才应把静态 Reference 升级为 Wiki;客服实战篇则强调编译收益依赖复用,同一批资料只问一次时直接 RAG 通常更便宜。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
当用户问的是“几个对象之间有什么关系”“这条结论依赖哪些事实”“修改某个事实会影响什么”时,图结构就更有价值。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
关系变化比查询还快时,GraphRAG 的增量维护成本会吞掉收益。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
如果继续扩充静态 Reference,Skill 会逐渐变成一个难以维护的资料压缩包。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
同一批资料只问一次,直接 RAG 通常更便宜;团队每周都要重新综合同一套规则,提前编译才开始划算。

多篇材料反复强调同一条工程边界:索引与编译产物是派生数据,必须可从原始事实源重建,不能反过来充当事实源。GBrain 篇指出最容易犯的错误是把“索引”当成事实源,索引应能从已验证的原始输入重新构建;Skill 篇把“Wiki 不能替代事实源”列为硬门槛,删除 Wiki 后应能从 Raw Sources 重新编译;客服实战篇对编译产物提出四条线:Raw Sources 不可被编译器改写、每个 Claim 能追到 Source Span 与 Source Revision、编译产物可全部删除并重建、高风险 Procedure 进入 reviewed 前不能驱动自动执行。此外,权限过滤应早于召回,Citation 与 Revision 需进入查询协议,无足够证据时应明确拒答。

查看原文:GBrain 从入门到精通:构建可引用的本地知识层
这里最容易犯的错误是把“索引”当成事实源。索引只是派生数据,应该可以从已验证的原始输入重新构建;真正的事实源应该保留自己的版本和摘要。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
Wiki 是可重建的知识产物。删除 Wiki 后,系统应该能够从 Raw Sources 重新编译;删除 Raw Sources 后,只剩 Wiki 就失去了可信根基。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
1. Raw Sources 不可被编译器改写。 2. 每个 Claim 都能追到 Source Span 与 Source Revision。 3. 编译产物可以全部删除并重建。 4. 高风险 Procedure 在进入 reviewed 前不能驱动自动执行。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
知识编译不能绕过原始权限。Source、Wiki 页面和查询结果都要继承 Scope 与 Permission,过滤应该发生在召回和生成之前。

在落地顺序上,材料给出的路径大体一致:先建评测集与高价值事实源,再实现可解释检索与证据包装,最后按暴露出的瓶颈逐层加码。GBrain 篇的顺序是“先接入高价值事实源 → 先用 FTS/BM25 验证精确检索 → 补 Evidence 和 Citation → 再加入 Vector Search → 关系稳定后再建 Graph → 最后补权限、Revision、冲突和审核”;FTS 篇给出五阶段,从 FTS/BM25 到 Embedding、Hybrid、关系图,再到 Revision 与审核;客服实战篇则分 Phase 0 到 Phase 4,先做 30–50 个真实问题的评测集,Hybrid RAG 之后只为高价值关系建图,再从 10–20 个高频 Topic/Procedure 开始编译,最后让路由器组合三条路线。验证指标也不止于回答是否流畅,而包括命中率、证据准确率、引用覆盖率、额外延迟,以及知识库无答案时能否明确说不知道。

查看原文:GBrain 从入门到精通:构建可引用的本地知识层
→ 补 Evidence 和 Citation → 再加入 Vector Search → 关系稳定后再建 Graph → 最后补权限、Revision、冲突和审核
查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
第一阶段:FTS/BM25,确保精确术语能找到 第二阶段:Embedding,提升中文和语义召回 第三阶段:Hybrid Search,结合关键词与向量 第四阶段:对稳定实体建立关系图 第五阶段:补齐 Revision、权限、冲突和审核
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
Phase 0:先建评测集 从 30–50 个真实问题开始,标注必要 Evidence、允许版本、禁止答案和拒答条件。
查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
验证效果时,不要只看“回答听起来不错”。至少要测四件事:命中率、证据准确率、引用覆盖率、额外延迟。

排障

覆盖 4/4 份来源 · 模型归纳

四篇排障文章的共同做法是先定位根因再决定是否绕过:字体缩放问题要求先在真实大字号环境复现,再判断是固定高度裁切、缺少换行还是像素值写死;GitHub 443 问题要求按 DNS 解析、本机代理、网络出口、Git 配置逐层排查;OpenSSL 3 报错要求先确认堆栈是否包含 createHash 与 ERR_OSSL_EVP_UNSUPPORTED;engine 冲突要求先区分 warning 与 hard failure。绕过手段(allowFontScaling={false}、写死 hosts IP、--openssl-legacy-provider、--ignore-engines)都被定位为临时或最后手段,而非默认方案。

查看原文:React Native 字体缩放:别为了布局稳定一刀切关掉无障碍
这一步很重要:如果不在真实的大字体环境复现,给某个组件加 allowFontScaling={false} 往往只是碰巧掩盖了布局问题。
查看原文:「已解决」Failed to connect to github.com port 443
按“DNS 解析 → 本机代理 → 网络出口 → Git 配置”的顺序排查。hosts 只应作为明确、临时且可回滚的诊断手段,不是长期方案。
查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
如果堆栈里包含 webpack/lib/util/createHash、ERR_OSSL_EVP_UNSUPPORTED,且故障发生在 dev 或 build 初期,基本就是这个问题。
查看原文:Node.js 的 incompatible engine:该忽略,还是该修依赖?
遇到 package.json 的 engines 与本地 Node.js 版本不匹配时,先区分 warning 与 hard failure。

字体缩放与 engine 冲突两篇都强调“全局一刀切”的代价:前者指出全局设置 Text.defaultProps 与 TextInput.defaultProps 的 allowFontScaling=false 会覆盖正文、表单和错误提示,只适合内部大屏、受控硬件终端等封闭场景;后者指出团队项目不建议把忽略选项提交到仓库,因为它会掩盖其他开发机和 CI 的真实问题。两者的差异在替代方案:字体缩放推荐组件级 maxFontSizeMultiplier 与弹性布局,engine 冲突推荐用 nvm、fnm 或 Volta 切到项目声明的 Node LTS 并重新安装依赖。

查看原文:React Native 字体缩放:别为了布局稳定一刀切关掉无障碍
它只适合明确以固定字号为产品要求的封闭场景,例如内部大屏、受控硬件终端。普通 App 应把它视为最后手段,并在设计评审中确认无障碍取舍。
查看原文:Node.js 的 incompatible engine:该忽略,还是该修依赖?
团队项目不建议把忽略选项提交到仓库,因为它会掩盖其他开发机和 CI 的真实问题。
查看原文:React Native 字体缩放:别为了布局稳定一刀切关掉无障碍
maxFontSizeMultiplier 适合导航标题、列表副标题等空间受限区域;正文、表单说明和错误提示通常不应设置得过小。
查看原文:Node.js 的 incompatible engine:该忽略,还是该修依赖?
用 nvm, fnm 或 Volta 切到项目声明的 Node LTS,重新安装依赖。

GitHub 443 与 OpenSSL 3 两篇都给出“先区分故障位置”的判据:前者用浏览器与 git ls-remote 对比,判断问题在 Git 代理配置还是 DNS、代理客户端、网络出口;后者用堆栈是否出现在 dev 或 build 初期,区分构建工具兼容问题与运行时加密、签名、TLS 逻辑问题。两者都反对把临时手段固化:hosts 写死 IP 会在基础设施变更时再次失效,legacy provider 不应作为永久配置。

查看原文:「已解决」Failed to connect to github.com port 443
如果浏览器能打开而 Git 失败,重点检查 Git 的代理配置;如果两者都失败,则更可能是 DNS、代理客户端或网络出口的问题。
查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
如果错误发生在运行时的加密、签名或 TLS 逻辑中,而不是构建阶段,不能简单套用 legacy provider。应先确认算法、证书或上游 SDK 是否需要迁移,否则可能降低安全性。
查看原文:「已解决」Failed to connect to github.com port 443
避免采用:从第三方网站抄 IP 后长期写 hosts。它可能短暂恢复访问,却会在下一次基础设施变更时再次失效。

现有资料未说明这些排障判断框架的形成时间与后续是否调整:字体缩放文章发表于 2020 年,GitHub 443 与 engine 冲突文章发表于 2023 年,OpenSSL 3 文章发表于 2024 年,但发表日不等于判断发生日。另外,各篇给出的临时绕过方案是否在实际项目中设定过清理期限、是否纳入技术债跟踪,资料中没有记录,可继续探讨。

查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
也可以仅给某个 script 设置该变量;重点是把它视为短期兼容层,并记录清理期限。
查看原文:React Native 字体缩放:别为了布局稳定一刀切关掉无障碍
值得上:组件级 maxFontSizeMultiplier、弹性布局与真机大字号回归测试。

AI Infra

覆盖 17/17 份来源 · 模型归纳

这批材料反复把“Skill”从提示词集合提升为架构边界:Skill 决定 Agent 从哪里读上下文、能改什么、以什么证据判断交付完成。Claude Code Skill 的 token 优化把 reference 文件按“谁在哪个 phase 用”拆分,最重的单个文件从 162KB 降到 117KB,插图生成每次少加载 27KB;平台与发行版 Skill 的拆分则要求发行版只消费 registry 中已发布的精确 package,禁止 file:、link:、workspace:、本地 tarball 等捷径。两者共同点是:拆分依据不是内容多少,而是消费者与所有权不同。

查看原文:Claude Code Skill Token 优化实践:从 162KB 到 117KB
核心方法是把 reference 文件按"谁在哪个 phase 用"拆分,把同一个合规说明的三份副本压缩成一份,把 21 个 costume 模板压缩为 5 个 exemplar。结果:最重的单个 reference 文件从 162KB 降到 117KB,每次插图生成额外省 27KB 上下文。
查看原文:Claude Code Skill Token 优化实践:从 162KB 到 117KB
内容压缩是锦上添花,结构分离才是关键。 文件从 162KB 压缩到 117KB,感觉很好。但真正节省大的是"A2.5 不再加载 genre playbook"那 27KB——它每次插图任务都生效,是乘法效应。
查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
第一,发行版只消费 registry 中已发布的精确 package。禁止 file:、link:、workspace:、本地 tarball、sibling lookup 或跨仓 symlink。这样能强迫每次采用都经过版本、锁文件和干净安装。
查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
测试通过、package 已发布、产品已构建、签名完成、CDN 可读、更新通道已激活、旧客户端成功升级,分别是不同事实。

检索与知识治理材料共同强调 Source 与 Index 分离:索引是派生数据,应能从已验证的原始输入重建,不能变成第二事实源。GBrain 接入侧把对象区分为 Raw Knowledge、GBrain Page/Chunk、Knowledge Draft、Knowledge Asset Version 与 Workspace Revision,只有完成校验和发布的版本才能作为正式依据;中文检索也不是把 PostgreSQL FTS 从 english 改成 simple 就能获得分词能力,需要 Query Rewrite、Multilingual Embedding 与关键词检索协作。

查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
一篇语雀文档被同步进 GBrain 后,可以被搜索、切块、建立向量和关系,但它依然可能过期、互相冲突、没有明确 Owner,甚至只是一场会议里的临时观点。它是 Raw Knowledge,不是已经发布的 Knowledge Asset。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
如果把“进入索引”直接理解成“成为资产”,GBrain 数据库就会悄悄变成第二事实源。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
中文检索则需要 Query Rewrite、Multilingual Embedding 与关键词检索协作,单纯把 PostgreSQL FTS 从 english 改成 simple 并不会获得中文分词能力。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
这里最容易犯的错误是把“索引”当成事实源。索引只是派生数据,应该可以从已验证的原始输入重新构建;真正的事实源应该保留自己的版本和摘要。

Agent 运行时与交付控制面被反复分层。Runtime/Harness 材料把 Execution Environment、Model Runtime、Agent Runtime、Agent Harness 分开,并指出部署一个 Agent SDK 不等于拥有生产级 Runtime;Sidecar 材料则把 Tauri 原生 Core 设为权限与生命周期所有者,Node Sidecar 只承载 Codex/Qoder SDK、MCP 等异构能力,且明确进程隔离不等于安全沙箱,Tauri capability 不会自动约束已启动的 Node Sidecar。

查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
如果一个组件只负责 while 循环、调用模型和分发 Tool,它更接近 Agent Runtime。 - 如果它还拥有 Run ID、权限、审批、恢复、证据和评测,它已经是 Harness。 - 如果它只提供 Linux、Node.js、Python 和网络,那只是运行环境,不是 Agent Runtime。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
这也是为什么部署了一个 Agent SDK,并不等于拥有了生产级 Runtime。SDK 解决的是“怎样调用”,Harness 解决的是“这次调用在业务上是否受控、可信、可持续演进”。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
把 Node 放进独立进程,只解决了部分故障隔离:Sidecar 崩溃后可以单独拉起,内存泄漏不会直接污染原生 Core。但如果它继承了完整环境变量、用户目录和网络权限,它仍然能够读取不该读取的文件,或者绕过审批直接访问外部服务。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
Tauri capability 主要约束 Webview → 原生 Core,不会自动沙箱已经启动的原生插件或 Node Sidecar。把平台 ACL 当成完整安全方案,是一个危险的边界误判。

Evidence 在材料中被单独定义,与 Source、Citation、Trace、Artifact 区分:它是带有来源、定位、时间、范围和完整性信息,并明确支持或反驳某个 Claim 的可验证事实记录。没有 Claim 绑定的材料只是 Source、Record 或 Observation;Evidence 属于 Trust & Verification,而不是 Knowledge Plane 或 Observability。这一区分与知识库材料中“Evidence 应能定位回原始文档、文件、行号或 Chunk”的表述方向一致。

查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
Evidence 是带有来源、定位、时间、范围和完整性信息,并明确支持或反驳某个 Claim 的可验证事实记录。
查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
这条定义的锚点是“某个 Claim”。单独存在的事实,还没有获得证明方向。 没有 Claim 的 Evidence,只是 Source、Record 或 Observation。
查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
它也不属于 Observability。Trace 和 Log 记录过程,Evidence 从过程记录、交付物或权威系统中挑出与 Claim 有关的最小事实集合。
查看原文:GBrain 从入门到精通:构建可引用的本地知识层
Evidence 不等于 Agent 的自述,也不等于一段没有来源的摘要。它应该能定位回原始文档、文件、行号或 Chunk。

现有材料中,GBrain 的本地 PGLite 与团队 Postgres + pgvector 两种部署形态、Sirchmunk 的 FAST/DEEP/FILENAME_ONLY 模式、以及 Understand Anything 的 Code Graph 都只给出了能力描述,没有给出同一批问题上的对照评测数据。在什么数据规模、更新频率和查询类型下,三者组合的收益超过单一 GBrain 底座,仍缺少可复查的量化依据。

查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
它同时提供两种有吸引力的部署形态: 场景 引擎 ------ 个人、本地、零服务部署 PGLite 团队共享、大规模、多机器 Postgres + pgvector
查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
官方提供 FAST、DEEP 和 FILENAME_ONLY 等模式,也提供 MCP,适合直接挂到 Agent 上。
查看原文:GBrain、Sirchmunk、Understand Anything 怎么搭配:Agent 知识基础设施的三层实践
1. 正式知识优先查询 GBrain; 2. 问题涉及当前未提交内容时,查询 Sirchmunk; 3. 问题涉及调用链和 Diff Impact 时,查询 Understand Anything; 4. 多个结果由宿主系统合并,并保留各自 Citation; 5. 只有经过验证和审核的稳定结论,才进入 GBrain 的正式页面。

Argos

覆盖 2/2 份来源 · 模型归纳

两篇文章都围绕 Argos 的 macOS 界面实现展开,但约束来源不同:灵动卡面对的是 AppKit 窗口系统边界,彩纸特效面对的是粒子系统的语义与动势。灵动卡一文指出,问题不在业务逻辑,而在 AppKit window level、透明 panel、系统材质和启动持久化策略叠加后的边界行为;彩纸一文则把庆祝特效视为一个小型 particle system,强调好看的关键不是粒子数量,而是出生位置、生命周期、运动方向、密度分布和视觉层级服务同一个动势。两者共同点是:视觉上“像系统组件”或“像庆祝”并不等于实现上可以照搬系统路径,需要先控制变量、再谈效果。

查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
真正的问题不在业务逻辑,而在 AppKit window level、透明 panel、系统材质和启动持久化策略叠加后的边界行为。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
UI 里的庆祝特效,本质是一个小型 particle system。好看的关键不是“粒子越多越好”,而是让粒子的出生位置、生命周期、运动方向、密度分布、视觉层级服务同一个动势。

灵动卡的工程取舍集中在窗口层级与材质:默认使用最稳的普通窗口,把浮动和桌面组件风格作为设置项暴露给用户;透明圆角要同时处理 SwiftUI 的 clipShape 与 AppKit 的 hosting/container 背景、cornerRadius 和 masksToBounds;系统 material 暂缓,先用 SwiftUI 轻量 blur、半透明 tint、渐变 stroke 和局部 glow 模拟雾白玻璃。作者给出的理由是透明 NSPanel 再叠系统 material 和特殊 window level 变量太多,先减少系统合成路径。持久化则被描述为体验与事故恢复的放大器:最终恢复持久化和默认打开,但把默认 window level 降到普通窗口。

查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
最后我把层级选择暴露到了设置里:默认用最稳的普通窗口,用户可以自己切到浮动或桌面组件风格。这个决策不够“产品洁癖”,但足够工程务实。
查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
这就是为什么透明 panel 要同时处理两层: 层 要处理什么 ------ SwiftUI view clipShape、背景、边框、视觉层次 AppKit hosting/container clear background、cornerRadius、continuous corner、masksToBounds
查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
原因很简单:灵动卡本身已经是一个透明 NSPanel,再叠系统 material 和特殊 window level,变量太多。为了排查和发布稳定性,先减少系统合成路径。
查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
最后我选择恢复持久化和默认打开,但把默认 window level 降到普通窗口,并把高层级选择放到设置里。这不是绝对安全,但比“默认走最高风险路径”合理得多。

彩纸特效的取舍是删减而非堆叠:最终保留亮色矩形彩纸、圆形亮片、菱形闪光和少量十字星芒,删掉彩带、爆点和大面积 bloom。彩带被删是因为连续曲线难自然、容易抢画面;爆点被删是因为会把语义带向烟花爆炸,不符合 macOS 工具的克制调性;大面积 bloom 被删是因为会污染桌面背景和文字。实现上选择 SwiftUI Canvas 单层绘制而非大量 SwiftUI View,用 TimelineView 的 elapsed 作为系统时钟,每个粒子按 elapsed 减 delay 计算局部时间,再算位置、旋转和透明度。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
这其实是一个很典型的 UI 粒子系统取舍:不是把所有效果都加上,而是删到只剩能稳定表达语义的元素。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
最后我判断:在这个产品场景里,彩带收益不够高。Argos 是一个 macOS 工具,不是游戏结算页。彩带一旦做不好,负收益很明显。所以最终删掉。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
段位晋级当然是好事,但它不是游戏胜利。Argos 的整体调性是克制的 macOS 工具,所以 burst 被删掉是合理的。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
粒子系统本质上是每帧根据时间计算位置,然后画出来。Canvas 更贴近这个模型。

两篇文章都强调“默认路径要保守”,但保守的对象不同。灵动卡把视觉偏好从稳定默认值里拆出来:默认普通窗口层级,高风险层级交给高级用户选择,并认为持久化状态必须配合故障恢复路径,否则一个开关可能把用户锁死在崩溃循环里。彩纸特效则把语义从随机参数里拆出来:先定整体动势,再给每个粒子加小随机,认为 random 只是 variation 不是 composition;判断“不够满”时先看分布而不是先加数量。两者共享的工程态度是:先控制高风险变量,再逐步放开表现力。

查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
这个代码片段的重点不是 API 本身,而是思路:把“视觉偏好”从“稳定默认值”里拆出来。默认路径必须保守,高风险路径可以给高级用户选择。
查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
持久化状态要配合故障恢复路径,否则一个开关就可能把用户锁死在崩溃循环里。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
也就是说,random 只是 variation,不是 composition。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
一个实用判断:如果你觉得画面“不够满”,先看热力图,不要先加粒子。

现有资料下仍可继续探讨:灵动卡把默认层级降到普通窗口后,在真实多屏、Stage Manager 和桌面组件状态下是否仍会出现部分机器崩溃,文章只给出判断框架而未给出验证结果;彩纸特效删掉彩带和爆点后,在低频段位晋级场景之外是否还有适用空间,文章只列出适合与不适合的场景类型,未涉及具体阈值或用户测试数据。

查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
等收集到足够多真实设备反馈后,再决定要不要把更像系统小组件的层级设为默认。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
适合用的场景: 1. 用户完成一个阶段性目标。 2. 系统需要表达奖励。 3. 状态变化低频且重要。 4. 动画不会打断用户工作流。

UI Engineering

覆盖 2/2 份来源 · 模型归纳

两篇文章都把动画当作需要约束的系统而非装饰:彩纸特效强调先定语义与动势、再调随机参数,云雾层强调先收束可见范围与对比度、再谈颜色和曲线。共同点是都优先控制“出现多少”和“层级关系”,差异在于彩纸面向低频、正向的阶段性奖励反馈,云雾面向内容稀疏的空状态与欢迎页;前者允许粒子高饱和,后者要求低对比、慢节奏。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
一句话:先定语义,再定动势,最后才调随机参数。
查看原文:让云雾动起来:聊天界面的分层氛围动画
这也是我这次最有价值的判断:背景动画的优化,大多数时候不是“做得更多”,而是“让它少出现一点”。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
这里有一个设计边界:背景和主 UI 需要低饱和,粒子可以高饱和。如果整个界面都高饱和,会廉价;但庆祝粒子高饱和,是语义需要。
查看原文:让云雾动起来:聊天界面的分层氛围动画
值得上:空状态、Agent 对话页、工作台欢迎页这类内容稀疏但需要建立产品情绪的界面。用低对比、慢节奏的环境层补足空间。

彩纸特效的取舍集中在“删掉不稳定元素”:最终保留矩形彩纸、圆形亮片、菱形与十字星芒,删除彩带、爆点和大面积光晕。理由是彩带作为连续曲线,起点分布、控制点切线、左右活动区域和长度衰减必须同时成立,否则一条不自然就非常显眼;爆点会把语义带向烟花,光晕在 macOS 全屏 overlay 下容易污染桌面背景和文字。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
Streamers / 彩带 否 方向、曲线、交叉都很难调,容易显脏 Burst / 爆点 否 在这个场景里太像烟花,不符合 macOS 工具气质 Heavy bloom / 大光晕 否 容易污染画面,让文字和桌面背景变糊
查看原文:粒子系统实践:从一版难看的彩纸特效说起
彩纸是离散粒子,单个粒子不好看也不会毁掉整体。彩带是连续曲线,一条不自然就非常显眼。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
尤其在 macOS 上,全屏 overlay 下面是真实桌面和窗口。如果光晕太重,用户看到的是“脏”和“糊”,不是高级。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
这个结构其实很朴素,但稳定。 很多 UI 特效最后不是赢在复杂,而是赢在“每个元素都知道自己负责什么”。

云雾层把“不是内容而是环境”落实为四条工程约束:pointer-events: none 不影响交互、position: absolute 不挤压布局、z-index: 0 永远在内容下方、只动 transform 和 opacity 控制动画成本,并用 aria-hidden 避免被屏幕阅读器当作可操作元素。实现上用 ::before 与 ::after 两层、每层多组椭圆形 radial-gradient 拼出非规则云团,两层反向漂移形成轻微深度感,动画时长 6 秒与 8 秒并 alternate 往返。

查看原文:让云雾动起来:聊天界面的分层氛围动画
不影响交互 pointer-events: none 不挤压内容布局 position: absolute,不放进正常 flow 永远在内容下方 雾层 z-index: 0,内容容器 z-index: 1 动画成本可控 只动 transform 和 opacity
查看原文:让云雾动起来:聊天界面的分层氛围动画
真正起作用的不是某一个色值,而是三层关系: 1. 形状不规则:每个 gradient 的大小和位置不同,避免出现一眼可识别的圆形光斑。 2. 透明边界足够长:色彩在 76% 到 82% 之间才消失,云团会更像在空气里扩散。 3. 两层方向相反:一层从左下缓慢移动到右上,另一层反向移动,页面才有轻微的深度感。
查看原文:让云雾动起来:聊天界面的分层氛围动画
这里我刻意只用了 transform 和 opacity。它们通常可以由 compositor 处理,不会每一帧触发布局计算。
查看原文:让云雾动起来:聊天界面的分层氛围动画
这里的 aria-hidden 也很重要。云雾没有语义,不应该被屏幕阅读器读到,更不该被当成一个可操作元素。

彩纸特效的调参顺序被明确为:不像庆祝先调 emitter 方向、颜色亮度和 confetti 形状;太乱先删连续元素、降低 bloom、减少同步运动;不够满先看 distribution 再看 count;太快调 lifetime、delay 与 fade out;不自然先定 motion field 再给随机扰动。实现上选择 SwiftUI Canvas 单层绘制而非 ForEach 渲染大量 View,用 TimelineView 的 elapsed 作为系统时钟,每个粒子按 elapsed 减 delay 计算局部时间与位置、旋转、透明度。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
不像庆祝 emitter 方向、颜色亮度、confetti 形状 太乱 删除连续元素,降低 bloom,减少同步运动 不够满 distribution 先于 count 太快 lifetime、delay、fade out 不自然 motion field 先于 random 主信息不明显 toast 层级、粒子避让、颜色对比 廉价 少用爆点和大光晕,控制高饱和面积
查看原文:粒子系统实践:从一版难看的彩纸特效说起
也就是说,random 只是 variation,不是 composition。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
粒子系统本质上是每帧根据时间计算位置,然后画出来。Canvas 更贴近这个模型。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
elapsed 是整个系统的时钟。每个粒子根据 elapsed - delay 算自己的局部时间,再算 position、rotation、opacity。 这个模型比给每个粒子挂一堆 .animation 更可控。

云雾层文章提出用三项检查验证背景动画:任意一帧内容层级清楚、连续看 10 秒不烦、性能面板无持续压力,并建议生产页面补 prefers-reduced-motion。彩纸特效文章则给出适用场景清单,但未讨论可访问性偏好或低性能设备下的降级方案。在现有资料下,庆祝类粒子特效是否也需要类似的 reduced-motion 处理与性能验证,仍可继续探讨。

查看原文:让云雾动起来:聊天界面的分层氛围动画
1. 停在任意时刻都成立:截取动画中的任意一帧,内容层级都清楚,不能依赖某个刚好干净的瞬间。 2. 连续看 10 秒不烦:如果能明确察觉云团在左右移动,节奏已经太强;正确的感觉应该是视线离开后才意识到页面在呼吸。 3. 性能面板没有持续压力:确认动画只涉及合成友好的属性,并在低性能设备上观察掉帧和 GPU 占用。
查看原文:让云雾动起来:聊天界面的分层氛围动画
此外,生产页面还应该补一条 prefers-reduced-motion,让用户可以在系统层面关闭或静止这类环境动画。审美不能覆盖可访问性偏好。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
适合用的场景: 1. 用户完成一个阶段性目标。 2. 系统需要表达奖励。 3. 状态变化低频且重要。 4. 动画不会打断用户工作流。 不适合用的场景: 1. 高频反馈。 2. 错误提示。 3. 信息密集页面。 4. 用户正在专注输入或阅读。

MCP

覆盖 4/4 份来源 · 模型归纳

在上下文成本上,两篇工程文章给出方向相反但可并存的约束。Codex 工作流文章强调 MCP 不是越多越省:每个 MCP 都会增加工具定义、调用、返回结果和错误重试信息,小任务同时打开多个文档与代码 MCP 可能成本高于收益,因此应按职责选择并用 Session 切断失效历史。BrowserOS 拆解则从工具契约角度说明,若把原始 CDP 直接暴露给模型,模型要面对大量方法、参数、Target、Frame、Node 和 Session 状态,既浪费 Token 也难以稳定完成点击登录按钮这类任务,所以需要 browser-mcp 语义工具加 browser-core 状态抽象。两者共同指向:上下文成本取决于暴露给模型的接口粒度,而不只取决于工具数量。

查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
每个 MCP 都可能增加: - 工具定义 - 工具调用 - 工具返回结果 - 额外的错误和重试信息
查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
如果一个任务只需要改一个 CSS 属性,同时打开多个文档和代码 MCP,成本可能比收益更高。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
如果直接把原始 CDP 暴露给模型,模型会面对大量方法、参数、Target、Frame、Node 和 Session 状态。它不仅浪费 Token,也很难稳定地完成“点击登录按钮”这种在人类看来很简单的任务。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
browser-mcp 定义 Agent 看得懂的 Browser Tools,browser-core 则把 CDP 包装成有状态的 Browser Session。

三个工程案例对“Agent 循环与执行边界”的切法不同。agent-tars 在渲染进程侧用 AgentFlow 组织 Aware 与 Executor:Aware 负责分析环境并决定下一步任务状态,Executor 负责按状态选择并调用工具,循环在任务被取消或计划全部完成时退出。BrowserOS 把 Agent Loop 放在本机独立 Server 中,由 ai-sdk-agent.ts 组合模型、Browser Tools、Filesystem Tools 和外部 MCP Tools,理由是独立进程能拥有自己的数据库、文件系统访问、长任务、模型 SDK、MCP Client 和生命周期,并可被 Extension、CLI、MCP Client 复用。Codex 工作流文章不讨论运行时实现,而是用 Session 在探索、实现、验证之间建立上下文边界。三者共同点是都把“决策/循环”与“工具执行/副作用”分开,差异在于边界画在进程、类还是对话轮次上。

查看原文:字节 agent-tars 技术揭秘(硬啃)
// Agent 循环 while(!this.abortController.signal.aborted && !this.hasFinished) { // 当任务没有被取消或完成时执行 Agent 循环 const awareResult = await aware.run();
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
为什么要单独起一个本地 Server,而不是全部塞进 Extension Background? 我的理解是,独立进程给 Agent Runtime 提供了更稳定的执行边界。它可以拥有自己的数据库、文件系统访问、长任务、模型 SDK、MCP Client 和生命周期,也能被 Extension、CLI、MCP Client 等多个入口复用。
查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
这三轮不是固定模板。小改动可以一轮完成;当目标、证据和日志明显发生变化时,再切 Session。
查看原文:字节 agent-tars 技术揭秘(硬啃)
You are a tool use expert. You should call the appropriate tools according to the aware status and environment information.

领域建模文章把 MCP 的边界说得最明确:MCP 架构定义 Tools、Resources、Prompts 三个 Server Primitive,回答的是 Agent 如何接入能力与资源,不负责定义 Goal、Task、Run、Evidence 或 Evaluation;A2A 规范也把两者定位为互补协议,MCP 面向工具和资源连接,A2A 面向 Agent 之间的任务协作。该文据此把 Capability 与实现分开:Capability 描述能做什么,Tool 是通过什么接口做,MCP Server 只是能力的一种接入方式。这一判断与工程文章的分层实践一致,但属于该文作者的领域建模结论,不是行业统一规范。

查看原文:Agent 系统的一级领域对象:从 Task、Run 到 Evidence
它回答的是“Agent 如何接入能力与资源”,不负责定义 Goal、Task、Run、Evidence 或 Evaluation。A2A 规范也把两者定位为互补协议:MCP 面向工具和资源连接,A2A 面向 Agent 之间的任务协作。
查看原文:Agent 系统的一级领域对象:从 Task、Run 到 Evidence
Capability:能做什么 Tool:通过什么接口做 Skill:按什么方法做 Model:由什么推理能力参与 Runtime:在哪个执行引擎里做
查看原文:Agent 系统的一级领域对象:从 Task、Run 到 Evidence
MCP 解决 Host、Client、Server 之间的上下文与能力交换,不等于完整 Agent 领域模型
查看原文:Agent 系统的一级领域对象:从 Task、Run 到 Evidence
这也意味着,十二个对象是一套用于架构决策的参考模型,不是对任何单一 SDK 或协议的重新命名。

BrowserOS 拆解还给出一个适用条件上的取舍:是否 fork Chromium 取决于产品是否需要浏览器级私有 API、原生管理 Sidecar Runtime、控制 New Tab/Importer/Profile/进程与产品身份、内置固定关键 Extension、拥有安装包签名与更新渠道;若产品主要是总结、翻译、问答、读取当前 Tab 内容或在 Extension 权限内填表导航,Extension 加 Local Server 通常成本更低。该文同时提醒,fork 的代价是长期维护 Patch Stack、解决上游冲突、承担跨平台编译和安全更新压力。这是该文作者基于固定 commit 源码快照给出的判断框架,不是对任何团队适用性的证明。

查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
优先做 Extension 如果产品主要是: - 总结、翻译和问答; - 读取当前 Tab 内容; - 在 Extension 权限范围内填表和导航; - 快速验证产品价值; - 可以接受跟随 Chrome 的产品入口和更新机制。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
代价也很明显:一旦 fork Chromium,就要长期维护 Patch Stack、解决上游冲突、承担跨平台编译和安全更新压力。fork 不是“更高级”的默认答案,它只是用更高的维护成本换取更深的产品控制权。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
本文以 BrowserOS 仓库的 5ddb0f2d0 commit 为源码快照。BrowserOS 后续会继续变化,固定 commit 能让文中的目录、代码和发布流程保持可复查。

现有材料下仍可继续探讨:Codex 工作流文章主张按职责选择 MCP 并手动拆 Session,BrowserOS 拆解主张把浏览器能力沉淀为独立于模型和 UI 的 Browser Runtime,agent-tars 则在渲染进程内用 AgentFlow 循环调用 MCP 工具。这些方案分别针对不同任务规模与产品形态,但材料没有给出同一任务集上的对照评测,因此“哪种边界划分在何种条件下更省上下文、更可靠”仍缺少可比较的证据。

查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
这套组合值得用,但应该把它当成上下文管理方案,而不是工具收藏。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
如果目标是让不同 Agent 稳定使用真实浏览环境,那么最值得先建设的,是独立于模型和 UI 的 Browser Runtime。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
这里存在一个重要边界:BrowserOS 源码能证明这些组件和调用关系存在,但不能仅凭静态源码证明每个网站、每个模型、每个任务都能可靠完成。任务成功率仍然需要基于真实任务集、Provider 和环境做运行时评测。
查看原文:字节 agent-tars 技术揭秘(硬啃)
useAgentFow hook 接收用户输入后,创建一个 AgentFlow 实例,并调用 agentFlow.run() 触发 Agent 执行

学习笔记

覆盖 11/11 份来源 · 模型归纳

这批学习笔记在语言学习材料上呈现出一种可复用的方法结构:先盲听抓主旨,再逐句听写并标注弱读、连读、省音等语音现象,最后整理重点词汇与跟读任务。以算法主题的 TED-Ed 材料为例,笔记明确记录了“盲听抓主旨”阶段只能确定听到 computer science、instruction 等词,并猜测主题为算法,随后在逐句听写中标注 for 的弱读、What's an algorithm 的连读等。这种结构把听力理解、语音细节和词汇积累分层处理,适用于有明确音频来源和逐句文本的学习材料。

查看原文:算法英语听写与跟读练习
🔍 1. 盲听抓主旨 现阶段没办法做到记录主题、观点 - 我确定听到的词:computer science、What's an algorithm、instruction、step-by-step - 我猜他在说:算法
查看原文:算法英语听写与跟读练习
✍️ 2. 逐句听写 1、What's an algorithm. In computer science, an algorithm is a set of instructions for solving some problem, step-by-step. - 弱读: - for:[fɔ:r] - [fər] - an:[æn] - [ən] - 连读: - What's an algorithm - [wɑ:tsənælgrɪðəm] - is a set of - [ɪzəsetəv]
查看原文:算法英语听写与跟读练习
📚 3. 重点语言积累 - algorithm [ˈælɡərɪðəm]:n. 算法,运算法则 - instruction [ɪnˈstrʌkʃn]:n. 指令
查看原文:算法英语听写与跟读练习
🗣️ 4. 跟读任务 - 跟读第 1 句话 30 遍

JavaScript 的变量提升、作用域与闭包三份笔记在概念上互相衔接,但各自强调的机制不同。变量提升笔记指出 var 声明会被提升而初始化不会,因此声明前引用得到 undefined;let 声明不被提升,提前访问会报“Cannot access 'x' before initialization”。作用域笔记区分全局、函数和块作用域,并说明块作用域只适用于 let 或 const 声明的变量。闭包笔记则把闭包定义为函数与其外部词法环境的组合,并用 var 与 let 在 for 循环中的差异说明闭包捕获的是引用还是每次迭代的局部变量。三者共同构成从声明行为到作用域边界再到闭包捕获的递进解释,但每份笔记只覆盖其中一段,不能互相替代。

查看原文:JavaScript 变量提升:双语学习笔记
This is because the declaration gets hoisted above the console.log, but the initialization stays below that line. So it doesn't know anything about the value 27 at the time of execution.
查看原文:JavaScript 变量提升:双语学习笔记
Variables declared with the keyword let are not hoisted. Let's have a look at the same example we just looked at. But we'll replace the keyword var for let. As you can see, we get an error saying that x cannot be accessed before initialization.
查看原文:JavaScript 作用域:双语学习笔记
According to the rules of block scope, variables that are declared inside of a block or a pair of braces can only be accessed inside of that block and nowhere outside of it.
查看原文:JavaScript 闭包:双语学习笔记
To understand why that happens, we also need to understand the difference between var and let when you use var. In a for loop, that variable actually gets hoisted up into the parent scope, which in this case would be the global scope.

事件循环笔记与闭包笔记都涉及异步执行,但关注点不同。事件循环笔记以浏览器为范围,明确区分宏任务与微任务,给出“同步代码 → 清空微任务 → 按需更新渲染 → 下一个宏任务”的顺序,并用 console.log、setTimeout、Promise.then 的示例说明输出为 1 → 4 → 3 → 2。闭包笔记则用 setTimeout 回调解释闭包捕获:var 在循环中捕获全局变量,定时器执行时循环已结束,因此输出三次 3;改用 let 后每次迭代有独立变量,输出 0、1、2。前者解释任务队列的调度顺序,后者解释回调函数访问外部变量的方式,两者共同说明异步代码的结果取决于调度时机与变量捕获两个独立因素。

查看原文:浏览器事件循环与微任务笔记
输出顺序:1 → 4 → 3 → 2 解释: 1. 同步任务输出 1 和 4。 2. 当前宏任务(主线程)结束后,执行微任务队列中的 Promise.then,输出 3。 3. 最后执行宏任务队列中的 setTimeout,输出 2。
查看原文:浏览器事件循环与微任务笔记
以下以浏览器为范围;Node.js 的事件循环阶段和 nextTick 队列不直接套用此顺序。
查看原文:JavaScript 闭包:双语学习笔记
So it would seem like it should log out 0, 1, 2, but if we log it out, it actually console logs 3 three times.
查看原文:JavaScript 闭包:双语学习笔记
The reason it logs 3 three times is because the timeout doesn't run till 100 milliseconds later. Long after that, For Loop has completed and iterated up to 3.

算法类笔记展示了两种不同的解题组织方式。二分查找笔记先声明前提条件(数组必须有序、时间复杂度 O(log n)),再给出左右指针与中点计算 mid=left + Math.floor((right - left) / 2) 的标准实现,并扩展到 lowerBound 和 upperBound 两个边界变体,测试覆盖存在、不存在、开头、末尾和空数组。三数之和笔记则把 nSum 系列归纳为“排序+双指针”,固定一个数后在其右侧用左右指针收缩,并给出三层去重规则:nums[i] 大于 0 时结束循环、nums[i] 与前一元素相同则跳过、sum 为 0 时跳过相邻重复的 left 和 right。两者都依赖有序性和指针移动,但二分查找处理单目标定位,三数之和处理组合枚举与结果去重。

查看原文:二分查找与左右边界
前提条件 - 数组必须有序:升序或降序排列(默认为升序)。 - 时间复杂度:O(log n),每次排除一半元素,效率远超线性查找(O(n))。
查看原文:二分查找与左右边界
变体:查找左右边界 左边界​(第一个匹配元素) js function lowerBound(arr, target) { let left = 0, right = arr.length; while (left < right) { const mid = left + Math.floor((right - left) / 2); arr[mid] < target ? (left = mid + 1) : (right = mid); } return arr[left] === target ? left : -1; }
查看原文:三数之和:排序与双指针
nSum 系列问题的核心思路就是排序+双指针。 先给数组从小到大排序,然后双指针 left 和 right 分别在数组开头和结尾,这样就可以控制 nums[left] 和 nums[right] 这个两数之和的大小
查看原文:三数之和:排序与双指针
- 当 sum == 0 时,nums[left] == nums[left + 1] 则会导致结果重复,应该跳过,left++ - 当 sum == 0 时,nums[right] == nums[right - 1] 则会导致结果重复,应该跳过,right--

ReAct 论文阅读笔记保留了原始实验语境,其提示方法对比表显示:在 HotpotQA 上标准输入输出准确率为 28.7,仅推理(CoT)为 29.4,仅行动为 25.7,最佳 ReAct 为 35.1;在 FEVER 上分别为 57.1、56.3、58.9 和 64.6;在 ALFWorld 上仅行动为 45,最佳 ReAct 为 71;在 WebShop 上仅行动为 30.1,最佳 ReAct 为 40。笔记同时记录监督/模仿学习在足够样本下多数任务表现最佳,而 ReAct 在无大量样本时多个任务表现突出。这些数字属于论文实验报告,笔记本身也标注了“不冒充本人研究成果”,因此只能作为对论文结果的转述,不能读作笔记作者的实验结论。

查看原文:ReAct:推理与行动的论文阅读笔记
提示方法 HotpotQA (问题回答,精确匹配, 6-shot ) FEVER (事实验证,精确度, 3-shot ) ALFWorld (基于文本的游戏,成功率, 2-shot ) WebShop (网页交互,成功率, 1-shot )
查看原文:ReAct:推理与行动的论文阅读笔记
标准输入输出 28.7(准确率) 57.1 无法执行 无法执行 仅推理 基于思维链(Chain of Thought,CoT) 29.4 56.3 无法执行 无法执行 仅行动 25.7 58.9 45 30.1 最佳 ReAct 方法 35.1 64.6 71 40
查看原文:ReAct:推理与行动的论文阅读笔记
总体来看,不同提示方法在各个任务上表现差异明显,监督/模仿学习这个当前最优技术在足够样本的情况下在多数任务中表现最佳,而最佳 ReAct 方法在无大量样本的情况下在多个任务中表现突出。
查看原文:ReAct:推理与行动的论文阅读笔记
保留论文的原始实验语境、图表和原始项目链接,不冒充本人研究成果。

现有资料中,变量提升笔记提到“提升是一个很好的面试问题”,作用域笔记提到“这将有助于我们接下来的 Javascript 面试”,闭包笔记也提到面试中可能遇到的相关问题。这些表述出现在教学材料或译文语境中,不能据此推断笔记作者本人正在准备面试或具有求职经历。若后续要讨论这些笔记与个人学习计划的关系,需要补充明确的本人记录,而不是从教学材料的示例叙述中还原。

查看原文:JavaScript 变量提升:双语学习笔记
This makes hoisting a good topic for an interview question, as it can really test the candidates knowledge of the language.
查看原文:JavaScript 作用域:双语学习笔记
Which will help in our next Javascript interview, let's begin.
查看原文:JavaScript 闭包:双语学习笔记
To take a look at one of the most famous Javascript trick questions that will wreck you on an interview if you don't know closures.

Agent

覆盖 25/25 份来源 · 模型归纳

多篇材料把“给 Agent 沉淀知识”拆成不同载体并给出各自成本模型:常驻规则每次会话都进上下文,因此只放最稳定、最高优先级的约束;按需加载的 skill 平时不占上下文,命中触发词才被拉进来,所以可以写得很长;博客承担“为什么这么做”的判断与复盘。作者强调沉淀不等于复用,缺少触发词会导致该加载时不加载,把一次性操作细节塞进常驻层则会持续付出上下文成本。

查看原文:我在给自己建一个 LLM wiki
CLAUDE.md 是常驻规则。 它每次都进上下文,所以只放最高优先级、最稳定的东西:比如"博客每篇至少 3 张插图""性能规则不能回退""发布流程怎么走"。它贵,所以要克制——不该把操作细节全塞进来。
查看原文:我在给自己建一个 LLM wiki
skill 是按需加载的操作手册。 它平时不占上下文,只有当任务命中触发词("做 mac 应用图标"、".icns")才被拉进来。这意味着 skill 可以写得很详细、很长,因为它不是常驻成本。
查看原文:我在给自己建一个 LLM wiki
写了没触发词 = 白写。 skill 描述里不写"mac 应用图标 / .icns",下次问"帮我做个应用图标"时它根本不会被加载。触发词是 LLM wiki 的"索引"。
查看原文:我在给自己建一个 LLM wiki
写太细放错层 = 变负担。 把一次性的操作细节塞进 CLAUDE.md,每次会话都要为它付上下文成本。分层很重要:常驻的极简、按需的详尽。

关于 Skill 的边界,材料给出的判据不是“命令能否连着执行”,而是“谁拥有决策和证据”。当平台源码维护与具体产品的 Profile、签名、发布、客户端验收混在同一个 Skill 里,Agent 容易把“本地源码已通过测试”说成“发行版已采用”,或让发行版直接依赖平台的 sibling checkout。拆分后的约束包括:发行版只消费 registry 中已发布的精确 package,禁止 file:、link:、workspace:、本地 tarball 等捷径;产品专属内容留在产品侧;测试通过、package 已发布、产品已构建、签名完成、CDN 可读、更新通道激活、旧客户端升级分别记录为不同事实。

查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
如果同一个 Skill 同时覆盖它们,Agent 很容易把“本地源码已经通过测试”说成“发行版已经采用”,或者让发行版直接依赖平台的 sibling checkout。前者缺少发布和安装证据,后者会让本地环境掩盖真实的 package 边界。
查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
第一,发行版只消费 registry 中已发布的精确 package。禁止 file:、link:、workspace:、本地 tarball、sibling lookup 或跨仓 symlink。这样能强迫每次采用都经过版本、锁文件和干净安装。
查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
第三,交付状态必须拆开记录。测试通过、package 已发布、产品已构建、签名完成、CDN 可读、更新通道已激活、旧客户端成功升级,分别是不同事实。
查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
如果工作只发生在一个产品仓库,且没有跨仓发布或受控凭据边界,暂时不必为了形式拆 Skill。真正需要关注的是:Agent 是否会因为错误的上下文和依赖方向,做出无法被交付证据支撑的结论。

在 Agent 系统的对象建模上,材料区分了“执行过程”与“证明结论”两类记录:Trace 和 Log 记录过程,Evidence 则是从过程记录、交付物或权威系统中挑出与某个 Claim 有关的最小事实集合,并声明 supports 或 refutes 方向。没有绑定 Claim 的事实只是 Source、Record 或 Observation。Runtime 与 Harness 的划分同理:只负责循环、调用模型和分发 Tool 的组件接近 Runtime;还拥有 Run ID、权限、审批、恢复、证据和评测的才是 Harness;只提供 Linux、Node.js、Python 和网络的只是运行环境。

查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
Evidence 是带有来源、定位、时间、范围和完整性信息,并明确支持或反驳某个 Claim 的可验证事实记录。
查看原文:Evidence 到底是什么:Agent 系统如何证明自己真的完成了任务
它也不属于 Observability。Trace 和 Log 记录过程,Evidence 从过程记录、交付物或权威系统中挑出与 Claim 有关的最小事实集合。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
如果一个组件只负责 while 循环、调用模型和分发 Tool,它更接近 Agent Runtime。 - 如果它还拥有 Run ID、权限、审批、恢复、证据和评测,它已经是 Harness。 - 如果它只提供 Linux、Node.js、Python 和网络,那只是运行环境,不是 Agent Runtime。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
这也是为什么部署了一个 Agent SDK,并不等于拥有了生产级 Runtime。SDK 解决的是“怎样调用”,Harness 解决的是“这次调用在业务上是否受控、可信、可持续演进”。

并行与隔离是另一组反复出现的工程约束,但材料明确区分了不同层次的隔离能力。git worktree 提供同一仓库的多个独立工作目录,共享 Git 对象库,适合按任务边界拆分实现、发布、修复和文档;它不构成权限隔离,端口、全局缓存、容器、数据库和远端环境仍可能冲突,同一分支也不能被两个 worktree 同时 checkout。Sidecar 则用于隔离异构运行时和高风险能力,由主应用启动和监管、通过明确协议协作,但进程隔离不等于安全沙箱,权限仍必须由主应用强制执行。

查看原文:Git worktree:AI 时代的并行开发工作台
worktree 不是隔离环境的万能替代品。 - 它们仍共享同一个仓库的 Git 对象库,不能把它当成权限隔离。 - 端口、全局缓存、Docker 容器、数据库和远端环境依然可能冲突。 - 同一分支不能被两个 worktree 同时 checkout;这是 Git 用来避免同一分支出现两份独立未提交状态的保护。
查看原文:Git worktree:AI 时代的并行开发工作台
真正的收益是,每个 Agent 的输入和输出都更明确:它只能在自己的目录里修改;构建日志、node_modules、生成文件和未提交 diff 都不会悄悄影响另一个任务。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
Sidecar 是由主应用启动和监管、通过明确协议协作的独立辅助进程。它适合隔离异构运行时和高风险能力,但进程隔离不等于安全沙箱,权限仍然必须由主应用强制执行。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
把所有能力塞进一个进程当然最快,但代价也很直接:UI、数据库、凭据、文件系统和 Agent Runtime 混成一团,一个 Provider SDK 崩溃或越权,就可能拖垮整个应用。

现有材料中,Owlet 的项目记录标注状态为“未核实”、已记录结果为“未记录”,并说明不能据此推断项目没有成果或尚未完成;同时多篇文章以第一人称描述其开发过程与取舍。在资料不完整的情况下,可以继续探讨的是:如何在不把文章叙述当作当前版本、用户规模或上线状态证明的前提下,为这类个人项目建立可复查的交付证据与状态更新机制。

查看原文:Owlet:从个人需求出发的 macOS 工具
状态:未核实 已记录结果:未记录(不能据此推断项目没有成果或尚未完成)
查看原文:Owlet:从个人需求出发的 macOS 工具
场景:2026-07-10 的公开文章回顾个人工具的开发动机与分工;确切立项日期未知。这里保留当时的项目自述,不据此推定当前版本、用户规模或上线状态。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
它叫 Owlet,是我用 Claude Code 和 Codex 一起 vibe 出来的 macOS 小工具:常驻菜单栏,实时显示 Claude Code 和 Codex 的 token 消耗,附带一个贴合刘海的灵动岛面板、一个桌面灵动卡、还有一个看历史用量和排名的 dashboard。

技术英语

覆盖 2/2 份来源 · 模型归纳

这两份材料都属于技术英语学习材料,但组织方式不同:算法听写材料以 TED-Ed 视频为来源,按“盲听抓主旨—逐句听写—重点语言积累—跟读任务”的流程展开,并逐句标注弱读、连读、同化、省音等语音现象;软件开发词汇材料则以词条为单位,给出音标、释义、技术语境例句或英文定义,适合检索复习。前者侧重语音与听辨训练,后者侧重术语理解与例句积累。

查看原文:算法英语听写与跟读练习
包含逐句听写、语音标记和明确的 TED-Ed 来源,属于具体学习材料。
查看原文:算法英语听写与跟读练习
📚 3. 重点语言积累 - algorithm [ˈælɡərɪðəm]:n. 算法,运算法则
查看原文:软件开发英语词汇与例句
长期积累的技术词汇、音标与应用例句,适合检索复习。
查看原文:软件开发英语词汇与例句
Javascript(JS)是一种具有函数优先特性的轻量级、解释型或者说即时编译型的编程语言。

算法听写材料把语音规则落到具体句子上,例如把 for、an 标为弱读,把 What's an algorithm 标为连读,并记录 would you 的同化、point at each 的 Silent T 以及 and 在鼻音后的省音;材料还给出跟读第 1 至第 8 句各 30 遍的任务。这说明该材料的训练单位是句子和语音细节,而不是孤立单词。

查看原文:算法英语听写与跟读练习
- 弱读: - for:[fɔ:r] - [fər] - an:[æn] - [ən] - 连读: - What's an algorithm - [wɑ:tsənælgrɪðəm] - is a set of - [ɪzəsetəv]
查看原文:算法英语听写与跟读练习
- 连读: - would you:[wʊdju](我的油)-(同化) [wʊʤu](我竹) - in a:[ɪnə] -(辅元连读) [ɪnə] -(懒音) [ənə]
查看原文:算法英语听写与跟读练习
- 连读 - point at each:[pɔ-ɪn-tæ-ti:-ʧ] -(Silent T) [pɔɪ-nə-i:-ʧ] - your're:[jər](叶er) - one at a time:wʌ-nə-nə-ˈtaɪm
查看原文:算法英语听写与跟读练习
🗣️ 4. 跟读任务 - 跟读第 1 句话 30 遍 - 跟读第 2 句话 30 遍 - 跟读第 3 句话 30 遍 - 跟读第 4 句话 30 遍 - 跟读第 5 句话 30 遍 - 跟读第 6 句话 30 遍 - 跟读第 7 句话 30 遍 - 跟读第 8 句话 30 遍

软件开发词汇材料在解释术语时经常把设计取舍写进词条。例如 shamefully-hoist 被解释为退回 npm/yarn 的扁平化 node_modules 模式,并破坏 pnpm 严格依赖隔离的设计初衷;React 词条强调组件化、虚拟 DOM、单向数据流和 Hooks;Redux 词条强调单一状态树、只读状态、action 与 reducer 带来的可预测性;Zustand 词条则强调轻量、少样板代码。这些词条呈现的是不同工具在依赖隔离、状态管理和组件架构上的定位差异,而不是对它们优劣的统一结论。

查看原文:软件开发英语词汇与例句
pnpm 的 shamefully-hoist 选项故意用此词命名,暗示开启它是一种「不光彩」的行为——它退回了 npm/yarn 的扁平化 node_modules 模式,破坏了 pnpm 严格依赖隔离的设计初衷。
查看原文:软件开发英语词汇与例句
通过虚拟 DOM 技术,React 优化了性能:仅在状态变化时计算差异并更新实际 DOM 的对应部分,而非直接操作整个 DOM 树。
查看原文:软件开发英语词汇与例句
它的核心概念是将应用的整个状态存储在一个单一的对象树中,这个状态树是只读的。当要修改状态时,只能通过发送一个被称为 action 的纯对象来描述发生了什么。
查看原文:软件开发英语词汇与例句
它的设计轻巧且易于使用,使得开发者能够处理复杂的与状态相关的操作,同时无需大量的样板代码。

两份材料都涉及 JavaScript 生态,但用途不同:算法听写材料只把 pseudocode 作为英语听写文本,解释“类似英语的语法、看起来像编程语言”,不展开具体工程实现;软件开发词汇材料则系统给出 Javascript、React、Redux、Zustand、Node.js、WebAssembly、Expo 等术语的定义与定位。前者服务于语音识别和跟读,后者服务于技术阅读与词汇检索,不能把前者的学习流程当作后者所述框架的使用经验。

查看原文:算法英语听写与跟读练习
让我们试着用更正式一点的伪代码来描述它——这是一种类似英语的语法,看起来像编程语言。
查看原文:软件开发英语词汇与例句
Javascript(JS)是一种具有函数优先特性的轻量级、解释型或者说即时编译型的编程语言。
查看原文:软件开发英语词汇与例句
Node.js 是一个免费、开源的跨平台 Javascript 运行时环境,让开发者创建服务器、Web 应用程序、命令行工具和脚本。
查看原文:软件开发英语词汇与例句
WebAssembly(缩写为 Wasm /'wɔzəm/)是一种基于堆栈的虚拟机的二进制指令格式。

现有材料能说明算法听写材料包含逐句语音标记和跟读任务,也能说明词汇材料按词条积累术语,但没有记录这些练习实际持续了多久、听辨或跟读效果如何,也没有说明词汇材料中的技术术语是否被用于实际开发或面试准备。若继续讨论,可以追问:这些学习材料的使用频率、复习方式和效果评估是否有独立记录,而不是仅凭材料本身推断学习者的掌握程度。

查看原文:算法英语听写与跟读练习
🔍 1. 盲听抓主旨 现阶段没办法做到记录主题、观点
查看原文:算法英语听写与跟读练习
提示 - 来源:TED-Ed - 链接: - 时长:4:58 - 日期:2026-01-08 - 难度自评:️️ - 核心关键词:algorithm, step-by-step, problem-solving
查看原文:软件开发英语词汇与例句
长期积累的技术词汇、音标与应用例句,适合检索复习。

Vector Search

覆盖 2/2 份来源 · 模型归纳

对关键词检索与语义检索的取舍,两篇给出相近的工程结论:FTS/BM25 擅长类名、错误码、配置项、产品名等精确词,Vector Search 擅长同义表达与自然语言问法,因此生产上常见的是 Hybrid Search,并配合 Metadata Filter 与 Rerank。区别在落地顺序的叙述:一篇以 GBrain MVP 当前先使用 FTS 为例,理由是本地部署简单、依赖少、可解释,后续再加 Embedding 解决中文与同义召回;另一篇则把“向量 RAG”在生产中的实际链路直接描述为 BM25、Vector Search、Metadata Filter、Rank Fusion、Reranker 的组合,并指出相似度高不等于业务上可用。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
当前的 GBrain MVP 先使用 FTS,原因很务实:本地部署简单、依赖少、可解释,而且对项目里的英文领域术语已经有效。后续再加入 Embedding,解决中文自然语言和同义表达的召回问题。
查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
Hybrid Search = FTS/BM25 + Vector Search + Metadata Filter
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
所谓“向量 RAG”在生产里通常不是只查向量:BM25 守住精确词,Vector Search 处理同义表达,Metadata Filter 先排除过期和越权内容。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
没有这些 Metadata,检索器可能把旧版本、测试环境或无权限文档排在最前面。相似度高,不等于业务上可用。

两篇都反对把 GraphRAG 当作默认底座或“Vector RAG 加图数据库”。一篇强调图适合“几个对象之间有什么关系”“这条结论依赖哪些事实”“修改某个事实会影响什么”,代价是数据建模与维护成本更高、抽取可能引入错误关系;另一篇进一步列出实体消歧、关系方向、时间有效性、来源追踪、增量更新、权限裁剪六类难点,并主张第一版只定义少量 Typed Edge,结构化资料用确定性解析器产生,非结构化资料才交给 LLM 抽取并标记较低 Confidence。两者共同点是:图解决的是关系路径,不保证图里的结论天然可信,每一跳仍需锚定带版本的原文。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
GraphRAG 的优势是关系可追踪、路径可解释,适合架构依赖、权限关系、组织知识、实体关联和影响分析。代价是数据建模和维护成本更高,图谱抽取也可能引入错误关系。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
如果团队不能维护这些约束,GraphRAG 会把“检索偶尔漏片段”变成“图谱稳定地提供错误关系”。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
不从所有自然语言里自由抽取任意关系,而是先定义少量 Typed Edge
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
GraphRAG 解决的是“沿什么关系找到答案”,不是“图里的结论天然可信”。每一跳仍要锚定带版本的 Source Span。

关于编译式 RAG,材料明确说明它并非边界稳定的标准术语,并采用一种知识工程定义:在构建阶段把不可直接高效消费的 Raw Sources 加工成可检查、可版本化、可增量更新的知识中间表示,查询时优先读取编译产物,必要时回原文核验。其收益是把跨文档合并、常用概念页面、冲突记录、Procedure 审阅与复用从查询时前移到构建时;但编译会丢信息、写错关系、把条件句压成绝对规则,因此必须守住四条线:Raw Sources 不可被编译器改写、每个 Claim 能追到 Source Span 与 Source Revision、编译产物可全部删除并重建、高风险 Procedure 未 reviewed 前不能驱动自动执行。

查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
编译式 RAG,是把不可直接高效消费的 Raw Sources,在构建阶段加工成面向后续任务的、可检查、可版本化、可增量更新的知识中间表示;查询时优先读取这些编译产物,必要时回到原文核验。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
编译式 RAG 的核心不是提前写摘要,而是让知识产物进入版本、校验和重建闭环;查询时对关键 Claim 仍需回查原文。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
如果一个 Wiki 页面引用另一个 Wiki 页面,最后却找不到原文,这会形成循环证据。页面之间可以互相导航,事实依据必须落回 Source。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
一项 2026 年的小规模预注册比较发现,LLM-compiled Wiki 更擅长跨论文连接与 Claim 级引用对齐,但测试设置下每次查询使用的 Token 反而明显高于 RAG;分解式 RAG 又追回了大部分综合能力差距。

两篇材料都提出按问题形状与瓶颈分阶段演进,但对“何时值得升级”仍留下可继续探讨的空间:一篇给出 FTS/BM25→Embedding→Hybrid→关系图→Revision/权限/冲突/审核的五阶段顺序,另一篇给出先建评测集、Hybrid RAG、只为高价值关系建图、编译高频知识、再让路由器学会组合的 Phase 0–4,并列出问题形状、关系稳定性、Query 是否重复、Source 变化速度、错误代价、团队维护中间表示能力六个变量。在现有资料下,如何用自有 Query 分布、更新频率与人工复核成本量化“编译能否回本”、以及图与编译产物的增量重建成本阈值,仍是需要结合具体评测数据回答的问题,材料本身未给出可直接套用的数值标准。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
第一阶段:FTS/BM25,确保精确术语能找到 第二阶段:Embedding,提升中文和语义召回 第三阶段:Hybrid Search,结合关键词与向量 第四阶段:对稳定实体建立关系图 第五阶段:补齐 Revision、权限、冲突和审核
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
Phase 0:先建评测集 从 30–50 个真实问题开始,标注必要 Evidence、允许版本、禁止答案和拒答条件。没有这一步,后续只能靠“看起来更聪明”做选型。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
编译的收益依赖复用。同一批资料只问一次,直接 RAG 通常更便宜;团队每周都要重新综合同一套规则,提前编译才开始划算。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
编译能否回本,要用自己的 Query 分布、更新频率和 Review 成本测。

better-imagegen:将视觉生成整理成工程流程

覆盖 3/3 份来源 · 模型归纳

better-imagegen 的核心做法是先确定最终文件由谁消费,再决定生成与后处理流程,而不是先选模型或堆叠 Prompt。公开文章把常见任务拆成 Portrait/Cover、Text Poster、Logo/Icon、macOS App Icon、Static/Dynamic Wallpaper、Sprite Loop、Image Edit 等独立工作流,各自对应不同的交付重点;项目记录也把类型选择、规格约束、后处理、失败处理和验收列为可复用流程。判断记录进一步给出取舍:需要准确文字时用 HTML/CSS 排版,需要同一角色时优先参考图编辑,图标和帧动画要检查透明通道、循环与实际运行尺寸。

查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
很多生图流程第一步就是选模型。我现在反过来:先问最终文件要被谁消费。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
目前 better-imagegen 把常见任务拆成独立工作流: 类型 默认交付重点 ------ Portrait / Cover 构图、人物、情绪、WebP 压缩 Text Poster 生图负责视觉底板,HTML/CSS 负责准确文字 Logo / Icon 透明背景、alpha 边缘、缩小后的可读性 macOS App Icon squircle、安全区、iconset、.icns Static Wallpaper 4K、PNG、桌面图标可读区域 Dynamic Wallpaper 多状态帧、HEIC、系统元数据 Sprite Loop 精灵图、编号帧、GIF 预览、manifest Image Edit 参考图输入、身份保持、局部变化
查看原文:better-imagegen:将视觉生成整理成工程流程
我持续完善 better-imagegen,把视觉资产的类型选择、规格约束、后处理、失败处理和验收写成可复用流程。它服务封面、角色、图标和帧动画等不同交付,不把一张模型生成的图片视为全部工程产物。
查看原文:视觉资产按最终使用场景定义交付
做 AI 视觉资产时,我先确定文件由谁使用,再决定生成与后处理流程。需要准确文字时,用 HTML/CSS 排版;需要同一角色时,优先参考图编辑;图标和帧动画要检查透明通道、循环与实际运行尺寸,不能只验收大图预览。

在 Prompt 设计上,文章主张把 Prompt 当作一份 Asset Contract,至少写清 Subject、Composition、Style、Delivery context、Hard constraints 和 Negative constraints 六类信息。以 Argos 菜单栏猫头鹰动画为例,真正决定可用性的不是“可爱猫头鹰”这类形容词,而是横向精灵图、固定 6 帧、每格等宽、透明背景、暖橙色轮廓、18px 仍能辨识、首尾动作连续等运行时约束。文章由此把 Prompt 的职责限定为描述运行时约束,而模型只负责生成像素。

查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
一个可执行的 Prompt,不是堆“高级感、电影感、8K、杰作”这类形容词,而是写清一份资产合同。 我现在通常至少写这 6 类信息: text 1. Subject:画面里必须有什么 2. Composition:主体位置、留白、视线方向、帧网格 3. Style:摄影、插画、像素、产品渲染等视觉语言 4. Delivery context:博客、社交媒体、菜单栏、桌面、App Icon、头像 5. Hard constraints:人数、透明背景、尺寸、帧数、角色身份 6. Negative constraints:不要文字、不要 Logo、不要水印、不要额外肢体
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
例如做 Argos 菜单栏猫头鹰动画时,“可爱猫头鹰”远远不够。真正决定可用性的约束是:横向精灵图、固定 6 帧、每格等宽、透明背景、暖橙色轮廓、18px 仍能辨识、首尾动作连续。 模型生成的是像素,但 Prompt 描述的是运行时约束。

文章用多个案例说明“生成一张图”背后的交付合同差异很大:产品竞赛主视觉需要大量准确中文,最终采用 AI 生成无文字视觉底板、HTML/CSS 叠加真实文本与品牌组件、浏览器渲染截图、WebP 压缩加尺寸检查的流程;角色一致性走 image edit,以现有角色图为 reference 只改服装、姿态、表情或手持物;帧动画的验收单位是运行尺寸而非大图预览,交付物包括精灵图、拆分帧、GIF 预览和 manifest,并须满足等宽 cell、首末帧衔接、真实 alpha、实际尺寸验收四项条件;macOS App Icon 则要从透明源图经 alpha 检查、安全区、squircle 底板、多尺寸 iconset 到 .icns 打包。

查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
我最后采用的流程是: text AI 生成无文字视觉底板 ↓ HTML / CSS 叠加真实文本和品牌组件 ↓ 浏览器渲染并截图 ↓ WebP 压缩 + 尺寸检查
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
如果每次都从文本重新生成,脸型、发型、服装结构和整体年龄感都会漂。更可靠的方法是把现有角色图作为 reference,通过 image edit 只修改服装、姿态、表情或手持物。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
并增加了 4 个验收条件: 1. 每个 cell 尺寸完全一致,不能靠肉眼切。 2. 首帧和末帧的姿态能自然衔接。 3. alpha 通道真实存在,不能用棋盘格“画透明”。 4. 必须在实际运行尺寸验收,而不是只看 512px 预览。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
稳定流程至少包括: text 生成透明源图 → 检查 alpha 边缘 → 裁掉异常透明留白 → 设置视觉安全区 → 生成 macOS squircle 底板 → 输出 16 / 32 / 128 / 256 / 512 / 1024 尺寸 → 组成 .iconset → 转换为 .icns

模型回退在文章中被定义为“仍然能交付同一种资产”,而非“总能出图”。文章描述的回退链路是默认使用 GPT Image 2,失败后归一化 Prompt 重试一次,再回退到 Gemini,最后才考虑 Doubao;同时指出不同模型交付特性不同,GPT Image 2 偶发超时或拒绝,Gemini 适合作为大多数任务的第一回退,Doubao 的水印和最小像素面积会影响透明图与精灵图,因此透明 Logo、Icon 和 sprite sheet 不应回退到会破坏 alpha 或网格的模型。文章还记录了 7 月 9 日沉淀 GPT → Gemini → Doubao 回退链路,这属于文章自述的演进记录。

查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
better-imagegen 现在默认使用 GPT Image 2,失败后归一化 Prompt 重试一次,再回退到 Gemini,最后才考虑 Doubao。 但 fallback 不是无脑串行,因为不同模型的交付特性不同:
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
Doubao Seedream 普通视觉任务的兜底能力 水印和最小像素面积会影响透明图、精灵图 因此透明 Logo、Icon 和 sprite sheet 不应该回退到一个会破坏 alpha 或网格的模型。Fallback 的目标不是“总能出图”,而是“仍然能交付同一种资产”。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
7 月 9 日 GPT → Gemini → Doubao 的回退链路、文字型竞赛封面流程

可追溯性是文章强调的另一项工程约束:每个产物配同名 JSON 元数据,记录文件、模型、请求尺寸、实际分辨率、生成耗时、输出格式、后处理说明和 Prompt,使视觉生成从聊天记录里的偶然结果变成可审计的工程产物。文章还提出把一次成功拆成类型层、Prompt 层、后处理层、验收层四层,把稳定部分写进对应 reference,并列出 7 月 4 日至 7 月 10 日间静态壁纸规格、动态壁纸与 HEIC 元数据、默认输出目录与类型 reference 拆分、回退链路、.iconset/.icns 工作流等沉淀内容。这些是文章自述的演进时间线,项目记录则注明起始日期未详、状态未核实。

查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
所以我给每个产物增加了同名 JSON 元数据: json { "file": "cover.webp", "model": "gpt-image-2-all", "requested_size": "1536x1024", "actual_resolution": "1280x720", "generation_time_seconds": 38.8, "output_format": "webp", "postprocess": "center-cropped to 16:9; WebP quality 78", "prompt": "..." }
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
我会把过程拆成 4 层: 1. 类型层:这是封面、图标、壁纸还是动画? 2. Prompt 层:哪些构图和负向约束真正起作用? 3. 后处理层:裁切、透明、压缩、拆帧、系统封装做了什么? 4. 验收层:在真实博客、菜单栏、Dock、网页里效果如何?
查看原文:better-imagegen:将视觉生成整理成工程流程
场景:2026-07-15 的公开文章回顾近期实践;项目起始日期未详。这里保留维护方向,不推定当前支持模型或发布状态。

现有资料对 better-imagegen 的当前状态留有空白:项目记录标注状态为“未核实”、已记录结果为“未记录”,并明确不推定当前支持模型或发布状态;文章中的模型回退链路与 7 月演进时间线属于 2026-07-15 公开文章的回顾。在这些材料下,可以继续探讨的是:该 skill 目前实际支持哪些模型与交付类型、回退链路是否仍按文章所述运行,以及文章所述流程在真实项目中的验收结果如何,但这些问题不能由现有资料直接回答。

查看原文:better-imagegen:将视觉生成整理成工程流程
状态:未核实 已记录结果:未记录(不能据此推断项目没有成果或尚未完成)
查看原文:better-imagegen:将视觉生成整理成工程流程
这里保留维护方向,不推定当前支持模型或发布状态。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
这就是我理解的 Agent skill:不是一段“万能指令”,而是把成功经验变成一套带条件分支、失败处理和交付标准的操作系统。

Owlet

覆盖 4/4 份来源 · 模型归纳

Owlet 的工程约束来自“纯 SPM + 手动组装 .app”这一打包路线:该快照文档声明,SwiftPM 会为带资源的 target 合成 Bundle.module,找不到资源包时直接 fatalError,而手动把可执行文件放进 Contents/MacOS、资源包放进 Contents/Resources 后,默认候选路径失效。作者为此写了按 .app 真实布局查找的 AppResourceBundle 封装,但 8 处资源加载中排名图标一处仍直接调用 Bundle.module,导致用户首装即崩。

查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
根因是纯 SPM 的 macOS app 手动组装成 .app 之后,Swift Package Manager 默认生成的 Bundle.module 资源定位逻辑找不到资源包,会直接 fatalError;而我在 8 处加载资源里,唯独一处漏用了自己写的兜底封装。
查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
问题在于,它内置的候选路径是为 swift build/swift test 那套 .build/ 目录布局准备的。当你手动把可执行文件塞进 Owlet.app/Contents/MacOS/、把资源包塞进 Contents/Resources/ 时,布局对不上,Bundle(url:) 在它预设的候选路径里全部返回 nil,于是走到最后一行崩掉。
查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
全项目一共 8 处加载资源,其中 7 处都规规矩矩用了 AppResourceBundle.module:hook 脚本、app 图标、菜单栏猫头鹰、Dashboard 图片、本地化 bundle……唯独排名图标这一处漏了网
查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
如果我能把 Bundle.module 的可见性收窄、逼所有资源加载都必须走 AppResourceBundle,这个 bug 从一开始就写不出来。可惜 SwiftPM 合成的 Bundle.module 是 internal 可见的,没法轻易禁掉——退而求其次,至少可以加一条 lint / grep 规则,在 CI 里扫「除了 AppResourceBundle.swift 之外任何文件出现裸的 Bundle.module」直接 fail。

并发崩溃的复盘把锁的粒度问题讲得很具体:sessionEntryCache 是普通 Dictionary,被标为 @unchecked Sendable 后失去编译期检查;discoverSessions 的读旧 entry、按 offset 增量解析、写回新 offset 构成 read-modify-write,若只对单次字典操作加锁,两个并发 import 会各自从同一 offset 读并互相覆盖,数据错但不一定崩。作者因此改为用 NSLock 的 withLock 把整趟 discoverSessions 串行化,并指出 Swift 6 下 async 上下文不能裸用 lock()/unlock(),因为挂起后可能换线程。

查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
如果只给字典的每次下标访问加一把细粒度锁(读一次锁一次、写一次锁一次),会发生什么? 线程 A 读到 offset=1000,线程 B 也读到 offset=1000。两个线程都从 1000 开始读文件、各自解析、各自把"新 offset"写回。其中一个的结果被覆盖,offset 错乱,同一段 Token 用量被重复计入。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
这里的不变量是"cache 里的 offset 必须和已经解析进去的字节严格对应"。要维持它,整个 discoverSessions() pass 必须串行执行。所以正确的修法是一把粗粒度锁,锁住整趟
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
原因很本质:async 函数可能在任意 await 处挂起,挂起之后恢复执行的线程不一定是原来那个线程。而 NSLock 是要求"谁上锁谁解锁、同一线程"的。如果你在 lock() 和 unlock() 之间跨了一个 await,挂起前后换了线程,就会变成"A 线程上锁、B 线程解锁",直接是未定义行为。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
- 锁的粒度对齐不变量,不对齐单个操作。 遇到 read-modify-write,先问自己"这三步之间的中间状态能不能被别人看到",不能就整段串行。

同一天第二个崩溃是确定性的 Data 下标越界:leftoverData 扫描后 removeFirst(consumed),Data 的 startIndex 前移到 consumed 而非归零,下一次扫描仍用字面量 0 作索引就落在 startIndex 之前触发 SIGTRAP。作者给出的通用规则是切片类型(Data、ArraySlice、Substring)的索引从 startIndex 起,遍历用原生 index 而非硬编码 Int;并说明该 bug 此前被更早发生的并发崩溃掩盖,修掉前者后才暴露。

查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
Swift Data 的 index 是绝对的。removeFirst(n) 之后,它的 startIndex 会前移到 n,而不是回到 0。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
这不是偶发的并发时序问题,是个确定性 bug:只要有一个 Claude 会话在跑、它的 JSONL 被追加写入两次,就必崩。之所以之前一直没暴露,是因为上一个并发崩溃发生得更早,先把进程带走了;修掉前一个,这个就顶到了最前面。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
- 切片类型的索引从 startIndex 起,别信字面量 0。 Data、ArraySlice、Substring 的 startIndex 随时可能不是 0,尤其在 removeFirst / 切片之后。遍历用原生 index,不用 Int 硬编码。

两篇崩溃复盘共享同一种排查姿态:从 crash log 反推根因,并强调“开发机正常、用户机或特定时序才崩”的差异。但两者根因性质不同——Bundle.module 一篇是打包后资源布局与开发布局不一致造成的首启必崩,属于环境差异;并发字典一篇是 @unchecked Sendable 关闭检查后两个 detached task 同时写同一实例,属于时序竞争,且崩溃点会飘到无关线程。前者作者主张用 lint 让危险 API 不可直接访问,后者主张把锁粒度对齐不变量并优先考虑 actor。

查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
这种「开发机好好的,用户机必崩」的 bug,往往指向同一类问题:运行环境的资源布局,和你开发时不一样。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
答案是:堆内存被写坏之后,整个进程都在雷区里跑。 Thread 4 把字典的底层存储写坏,破坏的是共享的堆。此后任何线程在任何位置做一次内存访问,都可能踩到那片被污染的区域,然后随机崩溃。
查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
防它的关键不在于更聪明地写这一行,而在于让这一行根本没机会写错。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
场景 首选 理由 --------- 新写的、可以 async 化的共享可变状态 actor 编译器强制隔离,从根上杜绝数据竞争,不用自己管锁

在设计与协作层面,作者把 Owlet 的视觉方向定为“像原生 macOS 工具,但从青山湖取色”,并给出具体语义分工:湖水青作主操作色、水杉绿承担成功与运行状态、雾白负责空间层次、晨光金只作少量高光,同时明确禁区如不做赛博霓虹、不让金色主导 surface。性能上则列出文件监听用 Dispatch Source 而非轮询、JSONL 增量读取、动画门控、数据库 upsert 等规则,并称这些被写进 CLAUDE.md 和 AGENTS.md 作为后续改动底线。

查看原文:Taste Is All You Need
湖面变成主操作的湖水青,水杉变成成功和运行状态,远山承担次级信息,雾白负责空间和层次,晨光金只留在极少量高光里。母题也同时定义了禁区:不做赛博霓虹,不让金色主导 surface,不用重阴影堆层级,不为了“可爱”牺牲信息效率。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
1. 文件监听用 Dispatch Source,而不是轮询。 之前有些实现会 sleep-loop 检查 active session,我全部砍掉了。 2. JSONL 增量读取。 50 MB 的会话日志不应该造成 50 MB 内存峰值。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
这些规则都被写进了 CLAUDE.md 和 AGENTS.md,成为后续所有改动的底线。一个工具要是自己先变成电老虎,就没资格监控别人的 token 消耗。
查看原文:Taste Is All You Need
后来为了让灵动卡接近系统组件的玻璃质感,我们尝试过 macOS material 和窗口采样,特定组合会带来稳定性风险。最后我没有放弃“雾”,也没有为了视觉效果继续赌系统边界,而是改用纯 SwiftUI 绘制柔焦层:保留雾白的视觉职责,换掉高风险实现。

现有材料留下一个可继续探讨的问题:作者在 Bundle.module 一篇中提出用 CI lint 禁止裸用 Bundle.module,但未说明该规则是否已落地;并发一篇给出 actor / NSLock / 读写锁 / @unchecked Sendable 的选择顺序,也未说明 Owlet 是否已把 adapter 改为 actor。这些属于方案层面的主张,资料未记录实际实施状态。

查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
退而求其次,至少可以加一条 lint / grep 规则,在 CI 里扫「除了 AppResourceBundle.swift 之外任何文件出现裸的 Bundle.module」直接 fail。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
@unchecked Sendable 这类逃生舱不是不能用——actor 化整个 adapter 也要改协议、改一堆调用点,工程上未必划算。

GraphRAG

覆盖 3/3 份来源 · 模型归纳

三篇文章都把 RAG 定位为“先检索再生成”的工作流,而非某个数据库或产品,并共同反对把 FTS、BM25、Vector Search、GraphRAG、LLM Wiki 排成一条“后浪淘汰前浪”的升级线。差异在于分层表述:一篇把 FTS/BM25 与 Vector Search 归入检索层、GraphRAG 归入关系型结构化检索、LLM Wiki 归入知识工程系统;另一篇用 Raw Source→Parse/Chunk→Index→Query→Retrieve/Rank→Evidence→LLM 的链路说明 Source 是事实、Index 是派生数据、Evidence 是本次实际采用的依据;第三篇则强调这些技术今天仍会同时出现在一套系统里。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
它们分别描述的是检索方式、数据结构、工程系统和知识治理方法,不能简单排成一条替代关系。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
这条链路里,Source 是事实,Index 是为了查询而生成的派生数据,Evidence 是本次回答实际采用的依据。三者不能混为一层。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
它们解决的是不同层次的问题,今天仍然会同时出现在一套系统里。

在检索实现上,三篇都认为关键词与语义检索各有边界、生产环境常需组合。一篇指出 FTS 适合类名、错误码、配置项等精确词,BM25 负责排序,Vector Search 处理同义表达,并给出 Hybrid Search = FTS/BM25 + Vector Search + Metadata Filter;另一篇强调“向量 RAG”在生产里通常不是只查向量,BM25 守住精确词、Vector 处理同义表达、Metadata Filter 先排除过期和越权内容,再用 Rank Fusion 与 Reranker;第三篇补充 Reranker 只能重排已有候选,正确文档没进 Top 50 时后续模型救不回来,因此评测要分层看 Recall 与排序质量。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
Hybrid Search = FTS/BM25 + Vector Search + Metadata Filter
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
所谓“向量 RAG”在生产里通常不是只查向量:BM25 守住精确词,Vector Search 处理同义表达,Metadata Filter 先排除过期和越权内容。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
Reranker 只能重排已有候选。正确文档没有进入 Top 50,后面的模型再强也救不回来。

对 GraphRAG 的适用条件,三篇判断一致:它面向关系、多跳与影响分析,不是默认底座。一篇以“Workspace Revision 固定 Asset Version”等实体关系为例,说明问“几个对象之间有什么关系”“修改某个事实会影响什么”时图结构更有价值,代价是建模维护成本高、抽取可能引入错误关系;另一篇用客服场景说明向量检索不会天然执行“取消订单→使用活动权益券→受活动规则约束→部分场景不自动退回”这条路径,并强调每一跳仍要锚定带版本的 Source Span;第三篇则提醒没有真实关系查询就不该为架构图好看而上 GraphRAG,且实体消歧、关系方向、时间有效性、来源追踪、增量更新与权限裁剪都是难点。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
GraphRAG 的优势是关系可追踪、路径可解释,适合架构依赖、权限关系、组织知识、实体关联和影响分析。代价是数据建模和维护成本更高,图谱抽取也可能引入错误关系。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
GraphRAG 解决的是“沿什么关系找到答案”,不是“图里的结论天然可信”。每一跳仍要锚定带版本的 Source Span。
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
没有真实的关系查询,就不该为了架构图好看而上 GraphRAG。

三篇都把 Evidence、Citation、Revision、Permission 与 Scope 视为跨路线共享的治理层,而非某条检索路线的附属功能。一篇要求每个关键回答能回答“依据是哪条 Evidence、来源是哪个事实源、事实发生 Revision 后回答是否仍有效”;另一篇要求 Citation 至少包含 source_uri、source_version、location、content_hash,并指出 Source 更新后 Citation 指向另一段内容则审计失效;第三篇主张 Scope 与 Permission 要在检索前生效,先检索全部再在答案阶段隐藏是危险设计,并强调 no_evidence 是正常结果而非系统故障。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
在这个 Agent 应用里,我希望每一个关键回答都能回答三个问题: - 依据是哪条 Evidence? - 来源是哪一个事实源? - 如果事实发生 Revision,当前回答是否仍然有效?
查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
先检索全部内容、再在答案阶段隐藏结果,是危险设计。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
风险越高,越要加强: - Source Span 级 Citation; - 人工 Review; - Revision Pinning; - Permission / Approval; - Dry Run 与 Evidence; - 无证据拒绝执行。

现有资料对“何时该从 Hybrid RAG 升级到 GraphRAG 或编译层”给出的多是定性信号与作者自设门槛,例如必要证据经常分散在三跳以上、影响分析靠调大 Top K 仍不稳定、大量问题反复综合同一批资料,或中文评测 Recall@5 低于某阈值。这些阈值被明确说明服务于当前项目而非行业标准,且编译式 RAG 的术语边界本身尚不稳定。在缺乏统一评测集与跨团队复现的情况下,如何用可比较的指标判断升级时机与编译是否回本,仍是可继续探讨的问题。

查看原文:AI Native 知识库:给人维护,给 Agent 调用,给双方追溯
我的当前门槛是:先用确定性 Query Rewrite;中文评测出现 Recall@5 5% 时,再把 Multilingual Embedding + Hybrid Search 提到下一阶段。这两个数字服务于当前项目,不是行业标准。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
Vector RAG 和 GraphRAG 已经有相对明确的工程含义,“编译式 RAG”却还不是一个边界稳定的标准术语。
查看原文:向量 RAG、GraphRAG、编译式 RAG:用一个客服实战讲清如何选
编译能否回本,要用自己的 Query 分布、更新频率和 Review 成本测。

FTS

覆盖 2/2 份来源 · 模型归纳

两篇文章都把 FTS 与 BM25 定位为“检索层”的关键词实现,而非知识治理本身:一篇把 FTS 描述为分词建索引后查找包含查询词的文档或 chunk,BM25 负责在候选中排序;另一篇则把 GBrain 的导入流程拆成解析 Front Matter、生成 Slug、计算 Content Hash、创建 Page、拆分 Chunk、建立 Keyword Index,并强调这些步骤只让内容“容易搜索”,没有替代 Source 的所有权、版本与审核流程。共同点是关键词检索擅长精确术语,差异在于前者侧重概念分工,后者侧重工程边界与派生数据可重建。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
FTS 会先把文档分词、建立索引,再快速查找包含查询词的文档或 chunk。
查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
FTS 负责找候选结果,BM25 负责判断谁更相关。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
GBrain 导入时会解析 Front Matter、生成稳定 Slug、计算 Content Hash、创建 Page、拆分 Chunk,然后建立 Keyword Index;配置 Embedding 后还会生成向量,并从文档链接或代码引用中提取 Edge。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
这些步骤把内容变得容易搜索,但没有替代 Source 的所有权、版本和审核流程。Page、Chunk、Embedding 和 Edge 都应该可以从已知 Source 重新构建。

两篇都指出中文自然问句在纯关键词检索下召回不稳定,但给出的原因与修复路径不同。一篇从机制上说明 FTS“看词”不理解语义,中文自然语言问题可能因分词和语言配置而召回不稳定,并主张用 Hybrid Search 组合 FTS/BM25、Vector Search 与 Metadata Filter;另一篇用实测数据说明完整中文词与英文领域词可命中,而“Revision 是什么”“Workspace Revision 是什么”等中文问句为零命中,并明确 simple 只取消英文停用词和 stemming,不提供中文分词,需要 jieba、zhparser、Lindera 等能力。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
FTS 的特点是“看词”,不真正理解语义。因此“Revision 是什么”和“Revision 的定义”未必会得到同样好的结果,中文自然语言问题也可能因为分词和语言配置而召回不稳定。
查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
Hybrid Search = FTS/BM25 + Vector Search + Metadata Filter
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
这个结果说明它不是“完全不支持中文”。索引里恰好存在的完整中文词可以命中,英文领域词也很稳定;真正不可靠的是中文自然问句。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
simple 的主要作用是取消英文停用词和 stemming,不会自动把: text 工作区修订是不可变资产集合快照 切成: text 工作区 / 修订 / 不可变 / 资产 / 集合 / 快照

两篇对 Vector Search 的定位一致:它补足语义与同义表达,但不能替代关键词检索。一篇强调向量模型可能把语义相近却不含精确标识符的文本排前,因此工程上常见 Hybrid Search;另一篇进一步给出融合结构,即 Keyword Search 与 Vector Search 经 RRF Fusion 后再做 Metadata/Permission Filter 得到 Evidence,并指出 Embedding 不保证函数名、错误码、配置项、缩写和精确领域词排在最前。差异在于后者把融合顺序与过滤位置写成了具体链路。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
搜索 Workspace Revision 时,BM25 往往比纯向量相似度更可靠,因为向量模型可能把一些语义相近但并不包含这个精确标识符的文本排得很前。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
Embedding 能把问题和文档映射到语义空间,适合处理: text Revision 是什么? 工作区如何固定可信资产? 一次执行怎样保证知识版本一致?
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
它擅长语义相似,不保证函数名、错误码、配置项、缩写和精确领域词一定排在最前面。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
Keyword Search ─┐ ├→ RRF Fusion → Metadata / Permission Filter → Evidence Vector Search ──┘

两篇都区分“可检索的派生数据”与“可信知识资产”,但展开角度不同。一篇把 LLM Wiki 定义为包含 Fact Sources、Ingestion、Retrieval、Evidence、Citation、Revision、Governance 的知识工程系统,强调回答要能追溯依据、来源与版本;另一篇用对象表划出边界:Raw Knowledge 不能默认信任,GBrain Page/Chunk 只能回到 Source 验证,Knowledge Draft 尚未发布,只有 Knowledge Asset Version 可作为正式依据,Workspace Revision 决定当前 Workspace 使用什么。两者共同反对把索引当作事实源。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
因此,LLM Wiki 的关键问题不是“模型能不能回答”,而是: 这条回答依据的事实是什么?事实来自哪里?什么时候有效?谁能修改?
查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
没有 Evidence,LLM 只是“说得像”;有 Evidence 和 Citation,回答才具备审计能力。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
一篇语雀文档被同步进 GBrain 后,可以被搜索、切块、建立向量和关系,但它依然可能过期、互相冲突、没有明确 Owner,甚至只是一场会议里的临时观点。它是 Raw Knowledge,不是已经发布的 Knowledge Asset。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
如果把“进入索引”直接理解成“成为资产”,GBrain 数据库就会悄悄变成第二事实源。

在落地顺序上,两篇给出的阶段划分有重叠但不完全等同。一篇列出五阶段:FTS/BM25 确保精确术语、Embedding 提升中文与语义召回、Hybrid Search、对稳定实体建关系图、补齐 Revision 权限冲突审核,并建议知识量小、关系未稳定时不要先上完整 GraphRAG;另一篇给出三阶段修复路线:先做 Query Rewrite(别名来自 CONTEXT.md 与受治理 Glossary),再迁移 Multilingual Embedding 并启用 Hybrid Search,最后视评测决定是否加本地中文 Side Index 或云端 pg_jieba/zhparser。前者是检索能力递进,后者是中文召回的具体修复次序。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
第一阶段:FTS/BM25,确保精确术语能找到 第二阶段:Embedding,提升中文和语义召回 第三阶段:Hybrid Search,结合关键词与向量 第四阶段:对稳定实体建立关系图 第五阶段:补齐 Revision、权限、冲突和审核
查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
不建议一开始就上完整 GraphRAG。知识量还小、关系还没稳定时,先把事实源、分块、检索、引用和版本做好,收益更高。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
第一阶段:Query Rewrite 这是成本最低、应该最先做的一步。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
第三阶段:真正的本地中文 FTS 如果后续评测证明 Embedding 仍不能满足精确中文术语检索,再给应用侧增加中文 Side Index: text GBrain Vector Search + GBrain Keyword Search + 本地 Tantivy 中文 BM25 → RRF Fusion

现有材料留下一个可继续探讨的问题:中文检索升级后如何判定“够用”。一篇提出至少测命中率、证据准确率、引用覆盖率与额外延迟,并做“知识库没有答案时能否明确说不知道”的反向问题;另一篇给出更细的指标集,包括 Recall@5、MRR@5、Zero-hit Rate、Citation Precision、P95 Latency 与 Scope Leakage,并强调全局 Brain 未绑定 Workspace 和 Source 时高召回可能意味着跨项目污染。两篇都未给出这些指标的具体阈值或评测结论,因此何种水平算达标仍待补充。

查看原文:从 FTS、BM25 到 LLM Wiki:把 RAG 知识检索讲明白
验证效果时,不要只看“回答听起来不错”。至少要测四件事:命中率、证据准确率、引用覆盖率、额外延迟。尤其要做反向问题:知识库没有答案时,系统能不能明确说不知道,而不是编造一个答案。
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
至少观察下面几个指标: 指标 关注的问题 --- --- Recall@5 正确文档是否进入前 5 MRR@5 正确文档排得是否足够靠前 Zero-hit Rate 中文问句是否仍频繁零召回 Citation Precision 引用是否真的支撑回答 P95 Latency Hybrid Search 增加了多少延迟 Scope Leakage 是否检索到其他 Workspace 的知识
查看原文:Raw Knowledge 如何变成可信知识资产:以及中文 FTS 为什么不是改个配置
最后一项尤其重要。一个全局 Brain 如果没有绑定 Workspace 和 Source,再高的召回率也可能意味着更严重的跨项目污染。

Accessibility Tree

覆盖 2/2 份来源 · 模型归纳

两篇材料都把“观察”与“执行”拆成不同层次:AX Tree 提供角色、名称、状态与层级,但动作执行仍需执行器另行完成。前一篇明确指出 CDP 的 Accessibility 域主要提供查询和事件,没有通用 click、fill 接口,因此不能因为调用 getFullAXTree() 就假定动作已解决;后一篇则说明 agent-browser 在取得 AX 节点后,由工具代码组织引用,执行 click 时再解析引用、定位元素并处理可操作性。两者共同点是语义观察不等于可操作,差异在于前者讨论 AX-only 实验的边界,后者描述具体工具如何把观察接到动作命令上。

查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
Chromium 的原生 Accessibility 系统支持辅助技术发起默认动作、聚焦、改变值与滚动。CDP 的 Accessibility 域则主要提供查询和事件,并没有通用的 click、fill 接口。不能因为使用了 Accessibility.getFullAXTree(),就假定动作执行也已经解决。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
执行 click @e2 时,后台解析此前保存的引用,优先尝试关联的缓存节点,再进入元素定位和可操作性处理。节点替换或文档导航会影响这项关联;角色与名称恢复存在歧义时应停止动作。

关于“只使用 Accessibility Tree”这一约束,两篇材料的界定方式不同。前一篇把“不用截图”“只给模型语义快照”“完全通过原生 Accessibility API 操作”列为三种不同实验,并指出模型没有观察 DOM 不代表系统内部完全不接触 DOM;后一篇则说明 agent-browser 当前实现还包含 DOM 范围解析、可点击线索补充等处理,不能把漫画理解为纯 AX-only 约束。两者都强调要区分模型收到的表示与执行器内部使用的信息,但前一篇是在方法论上拆解约束层次,后一篇是在具体工具上澄清实现范围。

查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
“不用截图”“只给模型语义快照”“完全通过原生 Accessibility API 操作”是三种不同的实验。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
这个区分决定了实验结论的范围:模型没有观察 DOM,不代表系统内部完全不接触 DOM。本文允许后者,但不允许执行器把额外读到的页面内容悄悄补给模型。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
读取 AX Tree 也不代表整套工具只使用 AX 信息:当前实现还包含 DOM 范围解析、可点击线索补充等处理,不能把这张漫画理解为纯 AX-only 约束。

引用机制是两篇材料交汇的具体约束。后一篇说明 @e1 这类引用在后台保留与节点、frame 和文档的关联,但页面或 iframe 导航、元素替换会影响引用有效性,没有对应 DOM 节点的虚拟无障碍节点其引用只适用于当前快照;前一篇则从观察范围角度指出,虚拟列表的总行数、行索引不能代表未挂载行的内容,滚动、翻页或筛选后仍要重新观察。两者共同指向一个条件:引用可解析不等于业务对象未变,列表复用同一 DOM 容器展示另一条记录时,仍需核对书名、商品规格等任务条件。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
当前官方文档的规则是:仍然存在的 DOM 元素可以在后续快照和同一文档更新中保留引用;页面或 iframe 导航、元素替换会影响引用有效性。没有对应 DOM 节点的虚拟无障碍节点,其引用只适用于当前快照。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
因此,稳定的节点引用也不能独立证明业务对象没变。列表可能复用同一个 DOM 容器展示另一条记录;“购买”按钮可能仍然存在,但页面当前商品已经不同。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
虚拟列表还需要额外关注观察范围。总行数、行索引不能代表未挂载行的内容;滚动、翻页或筛选后仍要重新观察。

两篇材料对“结果可验证”的处理方式有共同点也有差异。前一篇提出采用前检查四个条件:目标可观察、目标可区分、动作受支持、结果可验证,不满足时应修复语义、扩展定位、补齐执行器支持或保留受阻状态;后一篇则用具体命令说明 snapshot -i 偏向可引用的操作目标,“有货”这样的普通结果文字可能被排除,检查业务结果时需要保留相关正文、状态或表格内容。两者都反对把动作成功当成任务成功,但前一篇给出的是通用验收条件,后一篇给出的是快照过滤选项带来的具体观察缺口。

查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
目标可观察 必要控件和字段是否出现在语义表示中? 修复页面语义,或明确采用其他观察方式 目标可区分 重名元素能否由行、区域、业务对象关联? 扩展带范围的定位;当前不能消歧则停止 动作受支持 执行器是否能把 AX 目标转换成正确操作? 补齐角色、动作和 frame 支持,再归因于页面 结果可验证 参数与业务结果能否通过 AX 再次确认? 保留受阻或未验证状态,不以调用成功替代业务结果
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
snapshot -i 偏向可引用的操作目标,“有货”这样的普通结果文字可能被排除;某些标题和表格单元格能够留下,也不保证所需字段完整。找动作目标时可以压缩观察,检查业务结果时则需要保留相关正文、状态或表格内容,不能把“交互快照里没出现”理解为“页面没有”。

两篇材料都提醒不要把语义声明等同于实际行为。前一篇用示例说明 role="button" 不会自动添加 Enter/Space 激活、事件处理或禁用逻辑,单独 aria-disabled 只传达不可用状态而不自动阻止事件,aria-hidden="true" 本身不让像素消失也不自动移除焦点资格;后一篇则指出页面若把搜索按钮暴露成有明确名称的 button,Agent 就有直接证据,若只是一块没有名称的图形,单靠语义观察可能无法确定用途。共同结论是:AX 中的角色和状态是观察证据,页面实现与声明是否一致仍需核对,语义缺失时应补充其他受控读取或报告受阻。

查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
第二种写法可以向辅助技术声明“我是按钮”,但 role="button" 不会自动添加 Enter/Space 激活、事件处理或正确的禁用逻辑。可用原生 button 时,优先直接使用。否则 AX 中有 button,也可能遇到“按键没有反应”的实现缺口。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
原生 disabled 在支持它的控件上具有实际禁用行为,通常也使其退出 Tab 顺序;单独 aria-disabled 只传达不可用状态,不自动阻止事件。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
页面若把搜索按钮暴露成一个有明确名称的 button,Agent 就有直接证据。若它只是一块没有名称的图形,单靠这份语义观察可能无法确定用途,需要补充截图、上下文或其他受控读取。

现有材料留下一个可继续探讨的问题:在跨 frame 和虚拟列表场景下,AX-only 观察的覆盖范围应如何界定。前一篇提到 getFullAXTree() 的 full 不等于自动解决所有跨进程 iframe,跨 frame 支持仍需由具体执行器单独验证;后一篇说明引用与 frame 和文档关联,导航会影响引用有效性。两篇都未给出跨 frame 观察与引用恢复的统一方案,也未说明虚拟列表未挂载行在何种条件下可被可靠观察,这可以作为后续核验的具体方向。

查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
getFullAXTree() 的 full 也不等于自动解决所有跨进程 iframe,跨 frame 支持仍需由具体执行器单独验证。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
生成引用时,后台保留引用与节点、frame 和文档的关联;后续文本中出现的 @e1 因而能回到浏览器中的具体目标。

AX 是 Accessibility 的常用缩写。本文的页面观察裁剪涉及 DOM 到 AX 的语义投影、结构压缩和快照输出过滤,网页本身的 DOM 与业务状态仍然保留;不能把输出变短理解为删除网页节点。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
AX 是 Accessibility(无障碍)的常用缩写,AX Tree 即 Accessibility Tree,无障碍树。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
本文这条路径更适合称为页面观察裁剪,具体包括语义投影、结构压缩和快照输出过滤。这些处理不会把网页里的 DOM 节点删除,也不会改变页面的业务状态。

0.19.0 默认 CLI 已经是 Rust,该版本也提供实验性 --native Rust daemon;不能把新旧路径概括为 CLI 从 Node.js 换成 Rust。Playwright 本身也能通过 CDP 连接 Chrome,判断实际路径应核对依赖、运行模式与调用链,不能只看协议地址。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
关键变化包括后台运行时和浏览器控制层,不能简化成“旧版是 Node CLI,新版才有 Rust CLI”:0.19.0 的默认 CLI 就已经是 Rust;该版本还提供实验性、需选择启用的 --native Rust daemon。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
旧版 Playwright 也能通过 connectOverCDP() 连接 Chrome

Android

覆盖 2/2 份来源 · 模型归纳

两篇文章对 TaleFrame 的存储归属给出同一套划分:原生 Android 客户端负责书库、阅读、书架与本地进度;Next.js 管理后台与 API 部署在 Vercel;小说书目与章节正文存于 Neon Postgres;封面存于 Vercel Blob。架构实录进一步区分草稿与发布态:编辑器读写 chapters.body,读者接口读取 chapter_versions.body,公开列表由当前发布指针关联 releases 生成,不直接暴露编辑中的草稿。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
TaleFrame 的服务端采用一个 Next.js 项目。管理员页面与 API 放在一起,共享输入校验、内容模型和发布逻辑。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
所以,“小说列表存在哪”的完整答案有两层:管理员维护的书目在 books,读者读取的列表由当前发布指针关联 releases 后生成。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
“小说文本存在哪”同样需要区分草稿与发布态:编辑器读写 chapters.body,读者接口读取 chapter_versions.body。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
这里的 Postgres 由 Neon 提供。Vercel 是后台与接口的运行平台,也提供 Blob;数据库和文件存储各自承担持久化职责。

正文留在 Postgres 的判断建立在实测规模上:92 本、4,105 章,草稿正文约 22.83 MB,数据库实际占用约 42.71 MB。两篇文章都强调这是当前规模下的取舍,而非通用结论;把正文拆成对象文件需要额外处理上传与数据库更新不一致、快照引用缺失对象、旧对象清理与回退冲突等问题。封面则走另一条路径,上传时限制尺寸并转成 WebP 后放入 Blob。

查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
这组数据支持的是一个有限判断:在当前书库规模下,正文并没有大到必须拆出另一套文本文件服务。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
也可以将正文存成对象文件,数据库只保留索引。但这样需要额外处理上传成功而数据库更新失败、快照引用了不存在的对象、旧对象清理与回退发生冲突等情况。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
封面则值得先处理。图片上传后统一解码、限制尺寸并转换成 WebP,比让几 MB 的图片直接进入小说列表更符合移动端需要。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
封面采用另一条路径:后台验证图片,限制上传大小,缩放到最多 768 像素宽并转成 WebP,再上传 Blob。

发布链路被设计成显式动作:保存只更新草稿,Publish 时计算正文 SHA-256、按“章节 ID + 哈希”写入版本表、生成发布快照,并在同一事务内切换发布指针与递增目录版本。客户端用 ETag 条件请求目录,未变返回 304;正文下载后核对哈希再入缓存,缓存键包含正文版本。两篇文章都指出发布不是实时推送,共享缓存有 60 秒窗口,下架也无法远程抹除设备上已缓存的内容。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
在同一个数据库事务里切换当前发布版本,并递增全局目录版本。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
当目录变了,App 校验数据结构、章节引用与地址格式,成功后原子替换本地目录。更新失败时保留之前可用的内容,而不是先清空书库。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
这也意味着发布不是实时推送。读者需要发生刷新请求,目录还可能处于共享缓存有效期内。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
下架也需要明确语义:服务端可以移除公开目录,并拒绝后续正文读取;已经到达 CDN 的响应可能在缓存期内继续可用,设备上已有的离线内容也无法靠下架动作远程抹除。

两篇文章对“在线更新”的边界表述一致但侧重不同:交付套件篇把它概括为目录版本检查与按章缓存,并明确不含 APK 升级或动态下发可执行代码;架构实录篇补充了客户端缓存上限约 100 MiB、按最近访问淘汰,以及已打开的阅读页保留自身快照。两者都强调缓存不等于全部离线可读,首次无缓存时需要联网。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
TaleFrame 采用目录版本检查与按章缓存。这里的“在线更新”指书目和正文更新,不包含 APK 升级、动态下发可执行代码或绕过应用商店更新。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
客户端正文与封面共用约 100 MiB 的自动缓存预算,按文件最近访问时间淘汰。这个上限不是整台 App 的总存储上限:目录和阅读偏好另行保存。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
已经打开的阅读页保留其书籍版本对象,目录刷新不会立即把正在阅读的章节切换到新版本。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
在线版本的安装包不再携带整套历史小说资源,因此首次打开需要网络。之后能否离线阅读,取决于相应章节是否已经缓存。

成本与运维边界被反复限定:沿用的是已有 Vercel Pro 计划与 Neon Free,不能据此推断从零开始没有固定成本;Vercel 的 On-Demand Budget 本身不停止用量,只有启用暂停动作才会暂停团队所有项目的生产部署,且检查有延迟、存储费用仍可能产生。备份方面,导出与恢复脚本存在,但封面只存 URL 不含 Blob 图片本体,恢复脚本拒绝覆盖非空数据库,工具存在也不等于已运行定时备份。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
本项目沿用了已有的 Vercel Pro 计划,数据库采用 Neon Free,没有新增付费订阅或部署席位。这描述的是本次新增资源的情况,不能据此得出从零开始也没有固定成本。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
Vercel 的 On-Demand Budget 本身不会停止用量;只有启用相应暂停动作,达到阈值后才会暂停团队所有项目的生产部署。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
备份里的封面是 URL,不包含 Blob 图片本体,因此数据库备份不能替代图片备份。恢复脚本拒绝向非空目标数据库覆盖写入;这些工具的存在,也不等于已经运行了定时备份服务。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
TaleFrame 所在的团队还承载其他项目,这次没有为了一个新 App 修改全团队暂停策略。若要启用,必须先确认其他项目可以接受同时停服。

现有资料留下几个可继续验证的问题:全量目录随书库扩大会带来多大的响应体与解析耗时,是否需要拆分目录或增量补丁;真实地区网络与实体设备下的稳定性尚未验收;读者账号、付费章节与跨设备进度需要重新设计身份与授权模型,不能由管理员会话机制直接扩展。此外,两篇文章对源码是否公开的表述不一致,一处称源码仍在本地尚未公开,另一处称项目已开源,这一差异在现有材料下无法判定。

查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
当前目录包含所有已发布小说及其章节引用,不是仅含书名的轻量首页,也没有目录分页和增量补丁接口。这降低了首版实现复杂度,但书库继续扩大时,需要测量目录响应体与解析耗时,不能只关心正文占用。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
它不代表真实用户规模下的稳定性:目前没有实体手机或不同国家、运营商网络验收,本次联网验证使用了现有代理环境,App 也尚未上架应用商店。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
需要这些能力时,应重新设计身份与授权模型,不能把管理员密码机制直接扩展成面向所有读者的账号系统。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
服务端已经通过 Vercel CLI 部署,TaleFrame 源码当时仍在本地,尚未公开,也没有接通 Git 自动部署。

SwiftUI

覆盖 3/3 份来源 · 模型归纳

三篇材料分别处理 macOS 工具中三类不同的系统边界:Argos 灵动卡涉及 AppKit 窗口层级、透明 NSPanel 与持久化恢复;Argos 段位彩纸涉及粒子系统的发射器、生命周期与分布;Owlet 数据面涉及刷新合并、按 scope 计算与发布前短路。它们的共同点是把问题从“单个视图或单次查询”上移到“系统组合路径”:崩溃来自 window level、材质与启动恢复叠加,特效观感来自 emitter 方向与 lifetime 叠加,性能浪费来自多 surface 共用重型刷新与无变化赋值。

查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
真正的问题不在业务逻辑,而在 AppKit window level、透明 panel、系统材质和启动持久化策略叠加后的边界行为。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
好看的关键不是“粒子越多越好”,而是让粒子的出生位置、生命周期、运动方向、密度分布、视觉层级服务同一个动势。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
把“任何事件都立即全量刷新”改成“合并请求、分层计算、变化才发布”。

彩纸特效的取舍是删减而非堆叠:最终保留矩形彩纸、圆形亮片、菱形与十字星芒,删除彩带、爆点和大面积 bloom。理由是彩带作为连续曲线对起点分布、控制点切线与左右活动区域要求高,做不好负收益明显;爆点会把语义带向烟花,与克制型 macOS 工具不符;大面积 bloom 在真实桌面与窗口上会显脏。实现上用 Canvas 单层绘制配合 TimelineView 时钟,按 elapsed 计算每个粒子的局部时间,而不是用大量 SwiftUI View 各自挂动画。

查看原文:粒子系统实践:从一版难看的彩纸特效说起
最终我放弃彩带后,保留了更稳定的 area/edge 混合
查看原文:粒子系统实践:从一版难看的彩纸特效说起
彩带一旦做不好,负收益很明显。所以最终删掉。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
工具型产品里的 bloom,要像盐,不能像汤底。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
粒子系统本质上是每帧根据时间计算位置,然后画出来。Canvas 更贴近这个模型。

Owlet 的刷新优化分三层:用单个长期持有的 auto-refresh Task 加 pendingAutoRefresh 标记实现 trailing-edge 合并,保证刷新期间的最后一次变化不丢;把 analytics 拆成 none、surface、board、all 四种 scope,菜单栏与灵动岛只取今日 Token 与近 7 日聚合,仪表盘才取完整数据;发布前对 Equatable snapshot 做值级短路,避免无变化数组重新赋值触发 SwiftUI diff。轮询节奏也分两档:检测到活跃 Agent 时每 3 秒检查,空闲时 30 秒兜底,文件观察事件立即合并到下一次刷新。

查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
这相当于一个 trailing-edge coalescer。它允许短时间内的事件合并,又保证「刷新期间发生的最后一次变化」不会消失。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
当用户点开菜单栏时,先从已经落到本地 SQLite 的数据快速加载 surface snapshot,再在后台走 adapter 增量同步。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
这一步很朴素,但它把“数据库读到一个结果”与“UI 需要看到一次新状态”明确区分开了。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
检测到活跃 Agent:每 3 秒检查并按需同步 没有活跃 Agent:30 秒才做一次兜底刷新

三篇材料对“何时值得上复杂方案”给出不同适用条件。灵动卡的经验是:普通工具窗口不应一上来追系统小组件质感,桌面小组件式 surface 可以上玻璃质感但默认路径要克制,等真实设备反馈足够再考虑把高层级设为默认。彩纸特效的经验是:粒子系统适合低频、正向、阶段性的反馈,不适合高频反馈、错误提示或信息密集页面。Owlet 的经验是:数据源有 burst 写入且多个 UI surface 订阅同一份状态时优先做刷新合并与 scope 拆分;只有一个页面、单次刷新读极少量数据时先保持简单。三者共同指向同一判断顺序:先确认语义与默认稳定性,再决定是否引入更高风险的视觉或调度复杂度。

查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
如果你只是做一个普通工具窗口,不建议一上来就追系统小组件质感。
查看原文:粒子系统实践:从一版难看的彩纸特效说起
适合用的场景: 1. 用户完成一个阶段性目标。 2. 系统需要表达奖励。 3. 状态变化低频且重要。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
值得上:数据源有 burst 写入,且多个 UI surface 订阅同一份状态。优先做刷新合并和 scope 拆分。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
可以再等:只有一个页面、一次刷新只读极少量数据。先保持简单,不要过早拆 Task。

现有材料留下一个可继续探讨的问题:灵动卡把默认层级降为普通窗口、把浮动与桌面组件风格放入设置后,是否收集到足够多真实设备反馈来重新评估默认值,材料未给出结论;彩纸特效删掉彩带与爆点后,在更多桌面背景与多屏环境下是否仍稳定,材料也未记录;Owlet 的 scope 拆分与值级短路在长时间运行下的实际收益,作者明确没有给出量化数字,只提出以“减少了哪一类工作”来陈述。

查看原文:一次 macOS 灵动卡崩溃排查:别把桌面小组件当普通窗口
等收集到足够多真实设备反馈后,再决定要不要把更像系统小组件的层级设为默认。
查看原文:从高频轮询到按需刷新:本地 Agent 数据面的性能优化
这次我没有编造一个漂亮数字,而是把验证拆成三个层次
查看原文:粒子系统实践:从一版难看的彩纸特效说起
工具型产品里的庆祝动画,不应该朝游戏化一路狂奔。

Agent Runtime

覆盖 2/2 份来源 · 模型归纳

在架构取舍上,Runtime/Harness 文章主张先固定领域对象和稳定协议,而不是先选框架或做图编辑器:内部 runId 作为事实主键,Provider Session ID 只作外部引用;Tool 调用必须绑定 runId、stepId、权限、幂等键和调用前后状态;Run State 属于系统而非进程。其最小落地路径是先做薄 Harness,再按“可定位、控副作用、进程级恢复、证据验收、评测驱动”五阶段推进,并明确 React Flow 只在用户确实需要编辑确定性流程时引入。

查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
内部 runId 是事实主键,Provider Session ID 只是 ExternalRunRef。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
重试只能作用于已声明幂等的边界。否则“失败后自动重试”可能变成重复扣款、重复发信或重复发布。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
自有 Thin Harness + 一个 Agent Runtime / SDK + 持久化数据库 + 统一 Tool Gateway + OpenTelemetry / Provider Trace + 任务级 Eval Suite
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
如果当前目标是让 Agent 可靠执行,先做 React Flow 往往会把注意力带到节点拖拽、连线和表单配置上,最难的恢复与验收仍然没有答案。

两篇材料对“完成”与“证据”的处理可以互相印证:Runtime/Harness 文章把 Agent 自述“已完成”降为 Claim,要求回到权威系统重新读取状态,并用 Claim Verifier 生成最小 Evidence Bundle;职业规划文章则把“模型自述‘已经完成’只能是待核验证据”写入阶段验收,并要求越权用例必须阻断。差异在于前者给出 Trace、Evidence、Eval 的区分和四层评测指标,后者把同一原则转化为季度复盘与阶段交付的检查维度。

查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
“任务已完成”只是一条 Claim,不是事实。 真正的验证应该回到权威系统重新读取状态。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
Evidence 是从 Trace、Artifact 和权威状态中挑出的、足以支撑 Claim 的最小集合。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
验收器和工具授权由受控代码执行,模型自述“已经完成”只能是待核验证据。
查看原文:从 AI 工程到产品技术专家:我的三年职业发展规划
评测中的越权用例必须阻断;有限测试零漏拦不等于实际环境绝对安全。

恢复能力被 Runtime/Harness 文章明确分为 L0 到 L4,并建议多数生产系统先做到 L3,即 Checkpoint、幂等 Tool 与 Workspace Snapshot 的组合,而不必一开始追求跨 Runtime/Provider 迁移。文章同时区分 Memory、State、Trace、Evidence 与 Eval,指出聊天记录不是完整 State,Trace 不自动构成 Evidence;长周期跨服务场景可把 Agent Framework 与 Temporal 组合,由后者承担 Durable Execution。

查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
大多数生产系统应该先做到 L3,不必一开始追求 L4。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
聊天记录可以参与恢复,但它不是完整 State;Trace 可以帮助调查,但它不自动构成 Evidence;Evidence 能证明一次交付,却不能替代跨版本的 Eval。
查看原文:如何构建可验证、可恢复、可评测的 Agent Runtime 与 Harness
Agent Framework 负责模型循环和 Tool 选择,Temporal 负责 Durable Execution、Timer、Retry 与跨服务状态。

Release Engineering

覆盖 3/3 份来源 · 模型归纳

三篇材料都把“工具或参数能否使用”转化为可验证的边界问题,而不是以命令是否成功作为结论。Bun 单文件 EXE 的兼容层采用 fail-closed:只放行已识别的 .rsrc → .reloc → .bun 布局,写入后要求非资源 section 的名称、RVA、virtual size、raw size、attributes 与内容不变,未知 .custom section 或资源增长导致虚拟布局移动时直接失败。Chromium 启动参数一文同样把 Production 快捷方式定义为参数为空,把 GPU、Sandbox、Remote Debugging、Profile、日志与 V8 覆盖归入有生命周期的诊断或自动化 Profile。Omaha 一文则强调只调通一份 JSON response 不能证明更新链路,需要验收旧客户端从检查、验签到安装、重启的完整路径。

查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
这次实现采用 fail-closed 策略。只有同时满足以下条件,兼容路径才会启用: 1. PE 中存在资源 section。 2. .rsrc 之后除了 .reloc,只多出一个 .bun。 3. 写入新资源后,整个 image 的虚拟大小不变。 4. 所有非资源 section 的名称、RVA、virtual size、raw size、attributes 和二进制内容不变。 5. 重新解析输出文件后,所有目标 VERSIONINFO 字段与预期值一致。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
我的判断更严格:正式发布的浏览器快捷方式,默认应该只有可执行文件路径,不附加任何强制启动参数。 GPU、Remote Debugging、独立 Profile、日志和网络覆盖都有使用场景,但它们应该属于有生命周期、有隔离边界、可审计的诊断或自动化 Profile,而不是用户每天点击的入口。
查看原文:Omaha 到底是什么:一篇讲清 Chromium 自动更新的客户端、协议与服务端
如果决定接入,优先验收一条真实旧客户端链路:发现新版本、验证 CUP response、下载 CRX3、校验 payload、执行已签名 installer、重启后读到新版本,同时保留用户数据。只调通一份 JSON response,证明不了这条链路。

三篇材料对“磁盘位置”和“虚拟布局”的敏感度不同,但共同点是区分可移动的物理位置与不可破坏的信任或运行边界。PE 兼容层刻意不把 PointerToRawData 设为不变量,因为 .rsrc 增长后后续 section 的磁盘位置可以顺延,只要 Section Table 同步更新;真正锁住的是 RVA、virtual size 与 payload 内容。启动参数一文则把 Remote Debugging 与 User Data Directory 成对管理,要求每个并行 Run 使用唯一目录,避免 Cookie、Cache、Extension 状态串扰。Omaha 一文把 CDN 下载成功与更新完成分开:下载只证明 bytes 到达本地,仍需校验大小与 hash、处理 CRX3、执行 installer。

查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
这里刻意没有把 PointerToRawData 设为不变量。.rsrc 增长时,后续 section 在磁盘文件中的位置可以移动;只要 PE Header 正确反映新位置,Loader 仍能读取它。兼容层需要锁住的是虚拟布局与 payload 内容。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
不把 Remote Debugging 接到用户日常 Profile; - 每个并行 Run 使用唯一目录,不共享同一个 C:\Temp\profile; - Harness 优先使用 Pipe;必须用 Port 时,让 Runner 分配和回收,不固定写死 9222;
查看原文:Omaha 到底是什么:一篇讲清 Chromium 自动更新的客户端、协议与服务端
客户端收到 pipeline 后,才向 Download Server 或 CDN 发起 HTTP GET。下载成功只能证明一串 bytes 到了本地;Chromium Updater 还要校验大小与 hash,处理 CRX3,执行 installer,并根据 user/system scope 处理权限、进程和安装状态。

在安全机制的责任划分上,Omaha 与启动参数两文都反对用单一手段替代多层边界。Omaha 把 TLS、CUP、CRX3 与 Authenticode 分开:TLS 只保护传输与站点身份,CUP 保护 Update Check 请求与响应的完整性和新鲜度,CRX3 证明 payload 来自受信 publisher key,Authenticode 证明 Windows 可执行文件的签名者与完整性。启动参数一文则指出 --no-sandbox 会拆掉 Restricted Token、Job Object 等构成的 Sandbox 边界,--ignore-certificate-errors 会越过真正需要验证的 TLS 行为,应改用受控测试 CA。两者都强调关闭一层保护不能换来可交付的结论。

查看原文:Omaha 到底是什么:一篇讲清 Chromium 自动更新的客户端、协议与服务端
TLS HTTP 连接 传输加密和站点身份 不等于 payload 发布者签名 CUP Update Check 的 request/response 组合 响应完整性、新鲜度,以及对当次请求的绑定 不提供内容保密,不代替包签名 CRX3 publisher signature 更新 payload 包来自客户端信任的 publisher key 不代替 OS 对可执行文件的信任判断 Authenticode Windows 可执行文件 文件的签名者与签名后完整性 不代替 Omaha 渠道决策或 CUP
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
Chromium 的 Windows Sandbox 设计 使用 Restricted Token、Job Object、Desktop Object 和 Integrity Level 限制 Renderer 等不可信进程。它的目的不是消除漏洞,而是限制漏洞能触达的文件、Registry、进程和用户数据。 --no-sandbox 会直接拆掉这层边界。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
证书则不要走捷径。--ignore-certificate-errors 会让测试越过你真正需要验证的 TLS 行为,既扩大攻击面,也可能把证书链、代理中间人和时间错误一起掩盖。更可靠的做法是在隔离测试机安装受控测试 CA,限定域名和环境,并让用例同时覆盖证书有效、过期、名称不匹配与撤销场景。

构建与发布的分层归属是三篇材料共同关心的架构取舍。PE 兼容层把 resedit 锁定为 Build Kit 的 npm dependency,不复制进 Runway payload,也不作为孤立 .exe 混入 Browser App;Distribution 只拥有品牌名、版本号、publisher 与图标等产品输入,Windows release gate 负责原生启动、File Properties、签名与安装验收。启动参数一文把品牌、更新通道、内置 Extension、Native Host 与默认 Policy 交给安装包与产品配置,而不是快捷方式参数。Omaha 一文则列出 App ID、endpoint、CUP 公私钥、CRX3 publisher key、代码签名身份与版本渠道策略必须自有,并建议先画清责任边界再决定服务端实现方式。

查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
这次落地将 resedit 精确锁定在 3.1.0,作为 Build Kit 的 npm dependency。它参与构建,但不会被复制到 Runway payload,也不会作为一个孤立的 .exe 混入 Browser App。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
品牌、更新通道、内置 Extension、Native Host、默认 Policy 和 Runtime 发现应由安装包与产品配置负责。不要用快捷方式参数替代正式配置面。
查看原文:Omaha 到底是什么:一篇讲清 Chromium 自动更新的客户端、协议与服务端
我的建议是,先画清这些责任边界,再决定服务端是自行实现、使用现成实现,还是采用另一套 updater。先选中一个开源项目,再反推产品 identity 和 key 如何放置,很容易留下无法平滑迁移的历史负担。

三篇材料都给出了“何时不该采用”的停止条件,而非只论证方案可行。PE 兼容层指出,若 PE 带有未知自定义 section、已经签名、资源增长可能改变虚拟布局,或发行链没有原生 Windows 验收,就不应把生成成功当成可发布;若构建始终在原生 Windows 且 Bun metadata 参数已覆盖需求,直接使用 Bun 参数更短。启动参数一文认为,只有同时回答明确故障、最小作用域、回退条件与跨版本验收四件事的参数才有资格进入受管配置。Omaha 一文认为,用户规模很小的内部工具或尚未建立稳定代码签名、制品存储与发布流程时,先把可重复构建、正确签名与不可变上传做稳更有价值。

查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
只要 PE 带有未知自定义 section、已经签名、资源增长可能改变虚拟布局,或者发行链没有原生 Windows 验收,就不应该把“生成成功”当成可发布。先建立结构快照、负向测试和重签名路径,再决定是否修改。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
一个参数只有同时回答了“明确故障、最小作用域、回退条件、跨版本验收”四件事,才有资格进入受管配置。其余参数都应该留在实验记录里。
查看原文:Omaha 到底是什么:一篇讲清 Chromium 自动更新的客户端、协议与服务端
你只有一个用户规模很小的内部工具,手动下载新版本的成本可接受;或者你还没有稳定的 code signing、artifact storage 和 release process。这时先把“可重复构建 + 正确签名 + 不可变上传”做稳,比匆忙增加 Omaha Server 更有价值。

现有材料留下一个可继续探讨的问题:当构建工具链本身跨平台时,如何界定“已验证”的范围。PE 兼容层明确说,macOS 上的结构检查不能描述成 Windows 原生验收,正式发布还需在 Windows 上启动 executable、回读 VersionInfo 并在 metadata 修改后完成 Authenticode 签名;启动参数一文也要求每次 Chromium baseline 升级后重跑 GPU、Sandbox、Profile、Automation 与 Memory Regression。这些要求如何与 CI 中可自动化的部分衔接,材料未给出统一答案。

查看原文:从 rcedit 到 resedit:给 Bun 单文件 EXE 修改 VERSIONINFO 的兼容层设计
真实 artifact 验证完成后,仍不能把 macOS 上的结构检查描述成 Windows 原生验收。正式发布还需要在 Windows 上启动 executable、回读 File Properties 或 PowerShell VersionInfo,并在 metadata 修改之后完成 Authenticode 签名。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
每次 Chromium baseline 升级后重新跑 GPU、Sandbox、Profile、Automation 与 Memory Regression。

React Native

覆盖 8/8 份来源 · 模型归纳

在组件库的工程组织上,资料给出的方案是把仓库拆成多个独立包:用 Lerna 管理 monorepo,并配合 yarn workspaces 做依赖提升,使每个组件拥有独立版本、可单独发布与回滚,用户只安装所需组件包即可实现按需加载。该方案同时强调关注点分离与单一职责,以降低大型项目的复杂度。

查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
基于 Lerna 的多包管理架构的优点在于: - 组件级别解耦,独立版本控制,每个组件都有版本记录可追溯 - 组件单独发布,支持灰度、版本回滚以及平滑升降级 - 按需引用,用户安装具体某个组件包,无需配置即可实现按需加载的效果。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
使用 yarn workspaces 结合 Lerna useWorkspaces 可以实现 Lerna Hoisting。这并不是多此一举,这可以让你在统一的地方(根目录)管理依赖,这即节省时间又节省空间。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
对与每个子包我们期望使用一样的配置,所以我们会先在整个项目的根目录新建 tsconfig. base.json,在子包继承即可。

主题化被处理为跨组件的公共能力:先从设计资源抽取一套 JavaScript 常量(色彩、字号、圆角等),再基于 React Context 提供 ThemeProvider 与 useTheme 等消费方式,并把主题能力单独发布为 @vant-react-native/theme 包。具体组件通过 useStyle 钩子从上下文取主题并计算样式,而不是把样式写死在组件内。

查看原文:前端组件化实战之 Button
几乎所有的组件库都会将色彩、布局这些以 css 变量的形式提供给使用者和开发者为,React Native 不同的是样式基于 CSS in JS,不过道理相通,参照 vant 的设计资源,我们抽出了一套 JavaScript 常量
查看原文:前端组件化实战之 Button
主题功能是通用的,因此我将主题相关的能力都放在 @vant-react-native/theme 包中发布。
查看原文:前端组件化实战之 Button
我们的组件为了适应主题化需求,样式不能是写死在组件里的,而是要通过上下文获取样式常量。我们思路是首先使用 useTheme 从上下文中获取主题,然后由于样式定义较多,我们为每个组件编写一个 useStyle hook 放在单独的 style.ts 文件中

字体缩放的处理被明确区分为“修复布局”与“关闭无障碍”两件事:应先在大字号真机环境复现,检查固定高度裁切、横向排列缺少 flexShrink 或换行、输入框按默认行高计算等问题;推荐用弹性布局、换行与最小高度解决,只对品牌字标等无法随字号变化的元素做组件级限制,空间受限区域可用 maxFontSizeMultiplier 设上限。全局设置 allowFontScaling=false 被视为最后手段,仅适合固定字号为产品要求的封闭场景。

查看原文:React Native 字体缩放:别为了布局稳定一刀切关掉无障碍
默认尊重系统字体缩放;只有品牌字标、极小的辅助标识等无法随字号变化的元素,才做组件级限制。布局错位应优先通过弹性布局、换行和最小高度修复。
查看原文:React Native 字体缩放:别为了布局稳定一刀切关掉无障碍
如果不在真实的大字体环境复现,给某个组件加 allowFontScaling={false} 往往只是碰巧掩盖了布局问题。
查看原文:React Native 字体缩放:别为了布局稳定一刀切关掉无障碍
它只适合明确以固定字号为产品要求的封闭场景,例如内部大屏、受控硬件终端。普通 App 应把它视为最后手段,并在设计评审中确认无障碍取舍。

Owlet:从个人需求出发的 macOS 工具

覆盖 5/5 份来源 · 模型归纳

Owlet 的起点是一个很具体的个人问题:作者从前端转向 Agent / AI Infra 后,每天大量使用 Claude Code 与 Codex,想知道自己烧了多少 token、钱花在哪个项目上,而现有工具不直接回答,于是决定自己做。项目自述把 Owlet 定位为 macOS 菜单栏工具,围绕菜单栏、浮动会话面板和历史用量视图组织信息,作者负责产品方向、关键取舍和验收,AI 协助实现;立项日期未记录,当前版本、用户规模与上线状态均未核实。

查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
做这个 app 的动机很私人。今年我开始从前端往 Agent / AI Infra 方向转,每天大部分时间都在跟 Claude Code 和 Codex 泡在一起。泡着泡着就产生了一个很朴素的疑问:我每天到底烧了多少 token?钱花哪儿了?哪个项目最费钱? 现有的工具都不直接回答这个问题,那我就自己做一个。
查看原文:Owlet:从个人需求出发的 macOS 工具
我为看清 Claude Code 与 Codex 的使用成本,开发了 macOS 工具 Owlet。它围绕菜单栏、浮动会话面板和历史用量视图组织信息;我负责产品方向、关键取舍和验收,AI 协助实现。
查看原文:Owlet:从个人需求出发的 macOS 工具
2026-07-10 的公开文章回顾个人工具的开发动机与分工;确切立项日期未知。这里保留当时的项目自述,不据此推定当前版本、用户规模或上线状态。

在 AI 分工上,作者把 Claude Code 当作主架构师,用于需要长上下文、跨模块理解和系统边界判断的问题,例如实时 session 监控链路同时涉及 hook 机制、NSPanel 与 SwiftUI 边界、文件监听 debounce 和 SQLite 三张表的 upsert;Codex 则作为快枪手处理范围小、目标具体的改动。作者据此归纳出一条当时的分工原则:需要理解系统边界和做取舍的找 Claude Code,需要快速验证想法的找 Codex,并强调这只是当时项目中的选择,不表示不同工具永远只能承担固定角色。

查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
Claude Code 是我的主架构师。 它的长上下文能力太适合这种代码量不大但跨模块关联多的项目。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
这件事让我明确了一条分工:需要理解系统边界和做取舍的,找 Claude Code;需要快速验证一个想法的,找 Codex。
查看原文:AI 协作仍需要由人负责选择与验收
在 Owlet 的开发中,我把系统边界和架构取舍、小范围实现与快速试验分开处理,并由自己决定方向、优先级和验收标准。这个分工是当时项目中的选择,不表示不同工具永远只能承担固定角色。

界面被拆成菜单栏、灵动岛面板、Dashboard 和桌面灵动卡四块,每块各有工程难点:菜单栏图标动画要控制耗电,灵动岛涉及 NSPanel 圆角、多屏与透明度,Dashboard 要处理 SwiftUI 图表与数据库查询,灵动卡要做出类似系统 widget 的效果但不能真用 WidgetKit。灵动卡曾在同为 Apple Silicon、同为 macOS 15 的机器上出现有的能开、有的直接崩,最终定位到 AppKit window level、NSPanel、系统材质与透明圆角叠加后的边界行为,而非业务逻辑。

查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
Surface 作用 难点 --------- Menu bar 常驻图标 + token 总数 图标动画不能太耗电 Floating island 刘海区实时会话面板 NSPanel 圆角、多屏、透明度 Dashboard 历史用量、排名、设置 SwiftUI 图表和数据库查询 Dynamic card 桌面小组件式面板 像系统 widget,但不能真用 WidgetKit
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
同样是 Apple Silicon、同样是 macOS 15,有的机器能打开,有的机器直接崩。最后定位到问题不在业务逻辑,而在 AppKit window level、NSPanel、系统材质和透明圆角叠加后的边界行为。

性能约束围绕“常驻应用不该自己变成电老虎”展开:文件监听用 Dispatch Source 而非轮询,JSONL 按 (mtime, fileSize, byteOffset) 增量读取以避免大日志造成内存峰值,动画按 token 变化和 active session 存在与否门控,数据库用 upsert 替代 deleteAll + insert。作者另记录了一条判断:本地数据刷新中合并短时间内的更新、按菜单栏与仪表盘的实际需要分层计算、仅在值变化时发布 UI 状态,并保留刷新期间的最后一次变化;由于没有运行时测量,不宣称 CPU 或耗时改善了某个百分比。这些规则被写进 CLAUDE.md 和 AGENTS.md 作为后续改动的底线。

查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
1. 文件监听用 Dispatch Source,而不是轮询。 之前有些实现会 sleep-loop 检查 active session,我全部砍掉了。 2. JSONL 增量读取。 50 MB 的会话日志不应该造成 50 MB 内存峰值。ClaudeCodeAdapter 用 (mtime, fileSize, byteOffset) 做缓存,文件增长时只读新增 bytes。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
这些规则都被写进了 CLAUDE.md 和 AGENTS.md,成为后续所有改动的底线。一个工具要是自己先变成电老虎,就没资格监控别人的 token 消耗。
查看原文:性能优化先减少无效工作,再讨论快了多少
在 Owlet 的本地数据刷新中,我选择合并短时间内的更新,按菜单栏与仪表盘的实际需要分层计算,并在值发生变化时才发布 UI 状态。刷新期间的最后一次变化必须保留;没有运行时测量,就不宣称 CPU 或耗时改善了某个百分比。

现有资料留下几个可继续探讨的问题:2026 年 11 月 1 日确定的产品重心调整,与 7 月文章中以 token 用量监控为核心的描述之间如何衔接,资料未记录后续结果;性能优化只给出了做法与“不宣称百分比”的约束,缺少可复验的运行时测量;项目状态标注为未核实,也没有用户规模或上线信息。这些都需要更多材料才能判断,不能由现有文本推断。

查看原文:Owlet 围绕陪伴工作、学习成长、电脑管家组织
已记录选项:以 Agent 状态与用量监控为产品核心 后续结果:未记录
查看原文:性能优化先减少无效工作,再讨论快了多少
场景:公开复盘讨论本地日志、SQLite 与多个 SwiftUI 界面共享数据时的重复刷新问题;原文没有给出可复验的性能提升百分比。
查看原文:Owlet:从个人需求出发的 macOS 工具
状态:未核实 已记录结果:未记录(不能据此推断项目没有成果或尚未完成)

构建

覆盖 3/3 份来源 · 模型归纳

两篇构建主题文章都把“生成/准备”与“执行/交付”拆成不同阶段:GN 在 generation 阶段求值 .gn、BUILD.gn、.gni 与 args.gn,产出 target、config、toolchain 和依赖关系,再生成 Ninja 文件,真正的编译、链接与代码生成由 Ninja 在 build 阶段完成;Git 侧则把 working tree、index、local commit、remote 与 linked worktree 视为不同边界,git add、git commit、git push 推进的是三个不同边界。两者共同强调:某一层通过不能替代另一层的事实,例如 .cc 文件存在不等于进入 target 并链接进 binary,working tree 能构建也不等于某个 commit 快照通过验证。

查看原文:GN 是什么语言:从 .gn、BUILD.gn 到 Chromium 构建图
GN 是一门面向构建图生成的声明式 DSL。它在 generation 阶段执行 .gn、BUILD.gn、.gni 和 args.gn 中的代码,得到 target、config、toolchain 及依赖关系,再生成 Ninja 文件;真正的编译、链接、复制和代码生成由 Ninja 在 build 阶段执行。
查看原文:GN 是什么语言:从 .gn、BUILD.gn 到 Chromium 构建图
一个 .cc 文件存在于 checkout,只说明实现代码可被选择;它进入某个 target、经过特定 toolchain 编译并最终链接进 binary,才构成可验证的构建事实。
查看原文:Codex 到底改了哪里:从两个并发会话讲清 Worktree、暂存区、Commit 与 Origin
这张图里最容易被忽略的是箭头:git add、git commit、git push 推进的是三个不同边界。少执行一步,代码所处的交付状态就不同;多汇报一步,则会把本地事实说成远端或发布事实。
查看原文:Codex 到底改了哪里:从两个并发会话讲清 Worktree、暂存区、Commit 与 Origin
“测试通过”如果没有说明测试读取了哪一层,就可能比证据本身更强。

GN 的约束集中在依赖与传播的最小化:deps 是私有依赖,public_deps 会向消费方传播 public headers、public configs 和输出依赖,data_deps 只保证运行时需要构建而不参与链接传播;configs 只影响当前 target,public_configs 影响符合传播规则的消费方,all_dependent_configs 影响面最大。文章建议阅读顺序固定为 target 类型、sources、deps/public_deps、configs 传播、平台条件、visibility、outputs,并警告把所有依赖改成 public_deps 虽可暂时修掉 include error,却会扩大 API 面和重编译范围。

查看原文:GN 是什么语言:从 .gn、BUILD.gn 到 Chromium 构建图
如果 B 的公开 header 引用了 C 的公开类型,B 应考虑把 C 放入 public_deps。如果 C 只是 B 的 .cc 内部实现,普通 deps 更准确。把所有依赖都改成 public_deps 可以暂时修掉 include error,却扩大了 API 面和重编译范围,也掩盖了 header 分层问题。
查看原文:GN 是什么语言:从 .gn、BUILD.gn 到 Chromium 构建图
阅读顺序建议固定为:target 类型 → sources → deps/public_deps → configs 传播 → 平台条件 → visibility → outputs。这样比从文件名猜模块边界可靠得多。
查看原文:GN 是什么语言:从 .gn、BUILD.gn 到 Chromium 构建图
Chromium 的默认 target configs 通常由 build config 注入,因此修改时常见的是 configs += [...],而不是直接 configs = [...]。直接覆盖可能无意删除默认 warning、optimization、sanitizer 或 platform config。
查看原文:GN 是什么语言:从 .gn、BUILD.gn 到 Chromium 构建图
每个 BUILD.gn 的父 scope 主要来自 build config,而不是另一个 BUILD.gn;跨目录共享变量应该通过 .gni 或 target/config contract 表达。

Git 侧的具体约束是:index 记录路径及准备提交的内容,同一路径可同时存在 staged 与 unstaged 差异,git status --short 的 MM 表示 index 已有候选版本而 working tree 又相对其变化;git commit 只读取 index,不会自动收走整个目录,因此共享仓库中无检查执行 git add -A 会把其他会话或编辑器留下的修改一并纳入。文章给出的做法是按路径或 hunk 暂存,并在 commit 前用 git diff --cached --name-only、git diff --cached --check 和 git diff --cached 核对边界。

查看原文:Codex 到底改了哪里:从两个并发会话讲清 Worktree、暂存区、Commit 与 Origin
它更准确地表示:该路径在 index 中已有一个候选版本,而磁盘上的 working tree 又相对这个候选版本发生了变化。两列 M 分别属于两个比较方向。
查看原文:Codex 到底改了哪里:从两个并发会话讲清 Worktree、暂存区、Commit 与 Origin
git commit 创建的是 index 的快照,并让当前 branch 指向这个新 commit。没有进入 index 的修改会继续留在 working tree。
查看原文:Codex 到底改了哪里:从两个并发会话讲清 Worktree、暂存区、Commit 与 Origin
它会把整个 working tree 中可见的修改都纳入 index,包括其他会话、编辑器或开发者留下的文件。仓库干净、任务单一时它很方便;存在并发工作时,应先用 git status --short 确认所有权,再按路径或 hunk 暂存
查看原文:Codex 到底改了哪里:从两个并发会话讲清 Worktree、暂存区、Commit 与 Origin
index 不能替代真正的执行隔离。测试和构建读取 working tree;两个会话同时编辑同一文件时,仍可能发生覆盖或证据污染。

两篇文章对“隔离”的定位不同:GN 用 toolchain 与 label 区分同一 BUILD.gn 在不同执行环境下的求值,current_ 变量回答当前正在求值的 toolchain 负责什么目标,跨 toolchain label 显式带括号;Git 文章则用 linked worktree 隔离文件目录、HEAD 与 index,但共享同一 Git object database、refs 与 remotes。前者隔离的是构建图求值上下文,后者隔离的是并发编辑与暂存空间;两者都不能仅凭名称相同就推断因果或等价。

查看原文:GN 是什么语言:从 .gn、BUILD.gn 到 Chromium 构建图
在默认 toolchain 中,current_ 通常与 target_ 一致;但 host tool、代码生成器或交叉编译依赖可能使用 secondary toolchain。此时只判断 target_os 可能把 target 配进错误的执行环境。
查看原文:GN 是什么语言:从 .gn、BUILD.gn 到 Chromium 构建图
GN 的完整 label 包含 toolchain,因此同一个 target 可以在不同 toolchain context 下分别存在。
查看原文:Codex 到底改了哪里:从两个并发会话讲清 Worktree、暂存区、Commit 与 Origin
它是一套额外 checkout,拥有独立的文件目录、HEAD 和 index,但共享同一个 Git object database、refs 与 remotes。
查看原文:Codex 到底改了哪里:从两个并发会话讲清 Worktree、暂存区、Commit 与 Origin
它不是“更高级的暂存区”。每个 linked worktree 仍然有自己的 working tree 和 index,仍然遵循 edit、stage、commit、push 的顺序。

第三篇构建文章处理的是工具链版本兼容:Node.js 17+ 升级 OpenSSL 3 后,旧版 Webpack 等构建工具请求旧算法会触发 error:0308010C,堆栈包含 webpack/lib/util/createHash、ERR_OSSL_EVP_UNSUPPORTED 且发生在 dev 或 build 初期时基本可确认。文章把 --openssl-legacy-provider 定位为短期兼容层,长期方案是升级 Webpack、React Scripts 或框架脚手架及 plugin、loader,或对遗留项目用 .nvmrc、Volta 或 CI 固定兼容的 Node LTS;并提醒若错误发生在运行时加密、签名或 TLS 逻辑中,不能简单套用 legacy provider。

查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
如果堆栈里包含 webpack/lib/util/createHash、ERR_OSSL_EVP_UNSUPPORTED,且故障发生在 dev 或 build 初期,基本就是这个问题。常见组合是旧版 Webpack 4 与 Node.js 17+。
查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
--openssl-legacy-provider 只能救急。长期方案是升级 Webpack/相关 loader,或把项目固定在兼容的 Node LTS;不要把这个环境变量当作永久配置。
查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
如果错误发生在运行时的加密、签名或 TLS 逻辑中,而不是构建阶段,不能简单套用 legacy provider。应先确认算法、证书或上游 SDK 是否需要迁移,否则可能降低安全性。
查看原文:「已解决」error:0308010C:digital envelope routines::unsupported
选择旧 LTS 是为了给升级争取窗口,不是长期停留在已停止维护的运行时。

PostgreSQL

覆盖 2/2 份来源 · 模型归纳

两篇来源对 TaleFrame 的存储归属给出同一套划分:小说书目与章节正文放在 Neon Postgres,封面图片放在 Vercel Blob,阅读进度、书架与已下载内容留在 Android 应用私有存储。差异在于正文被拆成两层:编辑器读写 chapters.body 草稿,读者接口读取 chapter_versions.body 发布版本,公开目录由当前发布指针关联 releases 快照生成,因此编辑中的草稿不会直接出现在公开列表里。

查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
“小说文本存在哪”同样需要区分草稿与发布态:编辑器读写 chapters.body,读者接口读取 chapter_versions.body。正文没有拆成 Blob 文本文件,也没有在当前网络版 APK 中打包整个书库。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
所以,“小说列表存在哪”的完整答案有两层:管理员维护的书目在 books,读者读取的列表由当前发布指针关联 releases 后生成。 公开列表不会直接暴露编辑中的书目草稿。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
这里的 Postgres 由 Neon 提供。Vercel 是后台与接口的运行平台,也提供 Blob;数据库和文件存储各自承担持久化职责。围绕 Vercel 组织交付,不意味着所有东西都属于同一个计费产品。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
当前系统有三类持久化位置:Neon 数据库、Blob 对象存储、Android 应用私有存储。每一类都承担明确职责。

正文留在 Postgres 的判断建立在一次实测上:92 本、4,105 章,草稿正文约 22.83 MB,数据库整体约 42.71 MB。两篇来源都强调这是当前规模下的有限结论,而非通用规则;把正文拆成对象文件需要额外处理上传与数据库更新不一致、快照引用缺失对象、旧对象清理与回退冲突等问题,当前收益不足以抵消这些工作。封面则走另一条路径,上传时校验、限制尺寸并转成 WebP 后放入 Blob。

查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
这组数据支持的是一个有限判断:在当前书库规模下,正文并没有大到必须拆出另一套文本文件服务。 直接使用 Postgres,可以在一处处理草稿、正文版本、发布引用和回退,减少数据库与外部文件之间的一致性协调。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
也可以将正文存成对象文件,数据库只保留索引。但这样需要额外处理上传成功而数据库更新失败、快照引用了不存在的对象、旧对象清理与回退发生冲突等情况。它可能适合更大的内容库,当前还没有足够收益抵消这些工作。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
封面则值得先处理。图片上传后统一解码、限制尺寸并转换成 WebP,比让几 MB 的图片直接进入小说列表更符合移动端需要。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
封面采用另一条路径:后台验证图片,限制上传大小,缩放到最多 768 像素宽并转成 WebP,再上传 Blob。App 按公开 URL 读取图片。图片无需参与正文的数据库事务,独立放在对象存储中更直接。

发布协议把“保存”和“发布”分开:保存只更新草稿,发布时计算章节正文 SHA-256,按“章节 ID + 哈希”写入版本表,生成发布快照,并在同一事务内切换当前发布指针、递增全局目录版本。客户端用 ETag 条件请求目录,未变返回 304,变化时校验后原子替换本地目录;正文下载后核对哈希再入缓存,缓存键包含正文版本。两篇来源都指出发布不是实时推送,共享缓存窗口为 60 秒,读者需要刷新请求才能看到新内容。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
正文版本按“章节 ID 与内容哈希”去重。只修改一章时,其余章节可以复用已有正文版本;发布快照保存引用,无需每次复制整本正文。当前保留最近五次发布,回退通过切换已发布快照完成,也不会覆盖编辑中的草稿。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
随后创建发布快照,把书目信息与章节引用保存到 releases,更新 books.published_release,并递增目录版本。相关更新在同一数据库事务中提交。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
正文下载后会核对 SHA-256,通过后才进入缓存。缓存键包含正文版本,同一章节被修订后不会误读旧文件。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
这也意味着发布不是实时推送。读者需要发生刷新请求,目录还可能处于共享缓存有效期内。当前没有消息推送或长连接通知。

成本结构上,两篇来源都区分固定费用与使用量:项目沿用已有的 Vercel Pro 计划与 Neon Free,没有新增付费订阅,但这不能推出从零开始没有固定成本。Vercel Pro 每月 20 美元平台费含使用额度,而使用额度不等于账单硬上限;On-Demand Budget 本身不停止用量,只有启用暂停动作才会暂停团队所有项目的生产部署,且检查存在延迟、暂停后存储费用仍可能产生。因此成本控制落在按章下载、目录条件请求、封面压缩、正文版本去重与限制历史版本数量等具体动作上。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
本项目沿用了已有的 Vercel Pro 计划,数据库采用 Neon Free,没有新增付费订阅或部署席位。这描述的是本次新增资源的情况,不能据此得出从零开始也没有固定成本。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
Vercel 的 On-Demand Budget 本身不会停止用量;只有启用相应暂停动作,达到阈值后才会暂停团队所有项目的生产部署。检查存在几分钟延迟,暂停后存储费用仍可能继续产生。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
目前的成本控制还包括按章下载、目录条件请求、封面压缩和历史正文清理。最终费用仍受数据库计算、函数执行、请求量、存储与分发流量影响;现有免费额度或套餐不能解释成永久零成本。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
核查时,集成返回的套餐为 Free(free_v3),作用范围是集成安装。但同一响应中的费用数据属于 2025 年 5 月,不能用它判断当前账期是否产生费用。

现有资料留下几个可继续验证的问题:全量目录随书库扩大后的响应体与解析耗时尚未测量,目录是否需要拆分或增量补丁仍无结论;共享缓存命中率与最终账单要在真实流量下观察;实体设备、不同地区与运营商网络下的稳定性尚未验收;视频业务进入产品后,小说正文的成本测量不能替视频存储与播放作判断。

查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
当前目录包含所有已发布小说及其章节引用,不是仅含书名的轻量首页,也没有目录分页和增量补丁接口。这降低了首版实现复杂度,但书库继续扩大时,需要测量目录响应体与解析耗时,不能只关心正文占用。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
它不代表真实用户规模下的稳定性:目前没有实体手机或不同国家、运营商网络验收,本次联网验证使用了现有代理环境,App 也尚未上架应用商店。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
重点关注的变化,是全量目录变大、数据库回源压力、真实地区网络可用性,以及付费内容或视频进入产品。这些变化会影响现有边界:目录可能需要拆分,正文分发可能需要调整,漫剧则需要重新测量视频存储与播放成本。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
缓存通常能减少重复工作,但命中率与最终账单仍要在实际流量下观察。

AI Browser

覆盖 2/2 份来源 · 模型归纳

两篇材料都把 AI 浏览器视为多进程、多组件的系统,而不是 Chromium 加一个聊天界面。架构文把系统拆成交互界面、本地 Agent Runtime、模型与外部能力、浏览器能力层、产品原生集成、Chromium 内核与交付控制面;参数文则从运行层指出 Browser Process、Renderer/Extension Renderer、Extension Service Worker、Native Host/Local Runtime 与 Automation Controller 各有不同资源模型,启动参数只能调整 Chromium 接受的那部分运行时行为。两者共同强调:跨进程问题不能用同一组 flags 统一处理,否则会同时损失安全性、可观测性和定位能力。

查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
一个完整的 AI 浏览器,至少同时包含浏览器内核、产品级原生集成、交互界面、Agent Runtime、浏览器工具协议、模型与外部连接,以及支撑多平台构建、签名、发布和更新的工程系统。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
普通 Chromium 浏览器已经是 Browser、Renderer、GPU、Network Service、Extension 等多进程系统。AI 浏览器通常还会增加 Extension Service Worker、Native Host、本地模型 Runtime 或 Automation Controller。它们可能共享一次用户任务,但不共享同一种资源模型。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
浏览器启动参数只能调整 Chromium 接受的那部分 Runtime 行为。

在浏览器能力层,架构文强调把原始 CDP 直接暴露给模型会带来大量方法、参数与状态,既浪费 Token 也难以稳定完成点击等任务,因此需要 browser-mcp 语义工具与 browser-core 状态抽象,把模型生成的点击意图转成确定性的浏览器操作,并维护 Tab/Window 身份、元素引用失效、Frame 归属、快照一致性、副作用与超时重试等约束。参数文则从另一侧说明 CDP 与 MCP 不是同一对象:CDP 更靠近浏览器,MCP 更靠近 Agent,MCP 负责把 navigate、snapshot、act 等工具以标准接口暴露给 Agent。两者共同指向一个边界:模型不直接操作页面,语义工具层承担意图到真实副作用的转换。

查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
如果直接把原始 CDP 暴露给模型,模型会面对大量方法、参数、Target、Frame、Node 和 Session 状态。它不仅浪费 Token,也很难稳定地完成“点击登录按钮”这种在人类看来很简单的任务。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
所以,LLM 没有“点击页面”。它生成了一个点击意图,Browser Tool Plane 才负责把意图变成确定性的浏览器操作。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
CDP 的全称是 Chrome DevTools Protocol,它能创建 Tab、导航、执行 JavaScript、读取 DOM、截屏和监听浏览器事件。MCP 解决的是另一件事:如何把 navigate、snapshot、act 这类工具,以 Agent 能发现和调用的标准接口暴露出去。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
简单说:CDP 更靠近浏览器,MCP 更靠近 Agent。

关于是否 fork Chromium,架构文给出了明确的条件判断:若产品主要是总结、翻译、问答、读取当前 Tab、在 Extension 权限内填表导航并快速验证价值,Extension 加 Local Server 成本更低;只有当需要浏览器级私有 API、原生管理 Sidecar Runtime、控制 New Tab/Importer/Profile/进程与产品身份、内置固定 Extension、拥有安装包签名与更新渠道时,fork 的收益才足以覆盖长期 Patch Stack、上游冲突、跨平台编译与安全更新成本。参数文没有直接讨论 fork 决策,但其对安装器、快捷方式、签名、升级与 Chromium baseline 升级后重新核对参数的论述,从交付侧印证了 fork 产品需要承担的维护面。两者共同说明:产品控制权越深,交付与维护责任越重。

查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
优先做 Extension 如果产品主要是: - 总结、翻译和问答; - 读取当前 Tab 内容; - 在 Extension 权限范围内填表和导航; - 快速验证产品价值; - 可以接受跟随 Chrome 的产品入口和更新机制。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
一旦 fork Chromium,就要长期维护 Patch Stack、解决上游冲突、承担跨平台编译和安全更新压力。fork 不是“更高级”的默认答案,它只是用更高的维护成本换取更深的产品控制权。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
Chromium 的 switches 不是面向终端用户承诺稳定的产品配置 API。每次升级 Chromium baseline,都应该重新核对当前源码和真实二进制行为;不能因为某个参数在旧版本“能跑”,就把它永久固化。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
Installer 升级、修复安装和卸载重装不会把诊断参数重新写回快捷方式;

交付控制面是架构文单独强调的一层:它不在单次 Agent 请求的调用链上,却决定基于哪个 Chromium commit 构建、Patch 按什么顺序应用、多平台如何编译签名、多个产物如何证明来自同一 Release Candidate,以及 Browser、Extension、Server、CLI 如何独立更新。该文把 Build、Release、Update 区分为三个状态转换,并以 immutable candidate 冻结 SHA 来避免各平台 Runner 读取不同 main 导致源码不一致,同时坚持 CI 只 Stage、不自动 Promote。参数文从 Windows 安装验收角度补充了可验证的检查项,例如快捷方式 Arguments 为空、chrome://version 无禁用参数、chrome://sandbox 与 chrome://gpu 状态符合预期,以及每次 Chromium baseline 升级后重跑 GPU、Sandbox、Profile、Automation 与 Memory Regression。两者共同把“能否持续交付”视为与运行时能力同等重要的工程问题。

查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
我把它叫作 Engineering Delivery Control Plane,因为它不在一次 Agent 请求的调用链上,却贯穿 Browser、Server、Extension、CLI 和所有平台产物。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
一个 Binary 在本地编译成功,只能证明 Build;上传到对象存储但没有切换 Feed,通常只是 Staged;客户端能从正式 Feed 发现并安装,才进入 Update 链路。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
BrowserOS 先冻结 Candidate SHA,再让公共资源和各平台 Lane 都绑定这个 SHA、Browser Version、Component Version 和资源摘要。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
每次 Chromium baseline 升级后重新跑 GPU、Sandbox、Profile、Automation 与 Memory Regression。

Architecture

覆盖 2/2 份来源 · 模型归纳

两篇文章都在处理“桌面 Agent Host 如何接入多个异构执行引擎”的问题,但切分边界不同。Provider Pattern 一文把差异吸收在 Adapter 层:业务层只处理统一的 AgentEvent,Codex 的 item/agentMessage/delta 与 Qoder 的 stream_event 都在 Adapter 内转换成 message.delta,上层不需要知道事件来自哪个 SDK。Sidecar 一文则把差异吸收在进程层:原生 Core 保留权限、生命周期与审计,Node Sidecar 只承载 Codex/Qoder SDK、ACP、MCP Adapter 等 Node 生态不可替代的部分。两者共同点是都要求宿主掌握控制面、Provider 只拥有执行上下文;差异在于前者是接口契约层面的防腐,后者是运行时进程层面的隔离。

查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
Codex 的 item/agentMessage/delta 和 Qoder 的 stream_event 都在 Adapter 内转换成 message.delta。上层不需要知道事件来自哪个 SDK。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
边车提供了第三条路:原生 Core 保留控制权,Node Agent Host 只承载 Node 生态中不可替代的部分。
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
Agent Ops App 应该拥有 Session、权限、Workflow 和审计,Provider 只拥有原生执行上下文;新增 Provider 时,理想状态是只增加 Adapter 和 Projection,而不是修改整条业务链路。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
对本地 Agent 来说,我倾向于采用“可信 Core + 受控 Sidecar”:Core 决定谁能做什么,Sidecar 负责把某一种运行时的能力做到最好。边车可以执行任务,但不能决定规则。

Provider Pattern 的核心取舍是把可扩展性放在契约而非类型枚举上。文章刻意把 ProviderId 定义为 string 而非 'codex' | 'qoder' 的封闭 union,理由是封闭 union 每接入一个 Provider 都要修改公共契约,真正的约束应来自 Registry、配置校验和兼容矩阵。与之配套的是 Session 所有权:Provider Session ID 的格式和生命周期不受 App 控制,因此 Agent Ops Session 是权威记录,Provider Session 只是外部引用,创建时还要固定 Provider 版本、Workspace Revision、权限配置和资产投影版本。能力差异则通过 probe() 返回的 Capability 数据表达,而不是用文本解析或业务分支伪造。

查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
这里我刻意把 ProviderId 定义成 string,而不是: ts type ProviderId = 'codex' 'qoder'; 封闭 union 在小型应用里类型体验很好,但对可扩展 Provider 系统意味着每接入一个 Provider 都要修改公共契约。
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
因此 Agent Ops Session 是权威记录,Provider Session 只是外部引用。 创建 Session 时还应该固定 Provider 版本、Workspace Revision、权限配置和资产投影版本。
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
错误做法是用文本解析或业务分支伪造能力。正确做法是让 probe() 返回 Capability
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
不支持 resume 就明确返回不支持,不要偷偷重放 Prompt 并告诉上层“恢复成功”。能力差异应该由数据表达,不能靠语义造假。

Sidecar 一文的关键限定是“进程隔离不等于安全沙箱”。把 Node 放进独立进程只解决部分故障隔离,若它继承完整环境变量、用户目录和网络权限,仍能读取不该读取的文件或绕过审批访问外部服务。因此文章把原生 Core 设计为 Permission Broker:Frontend 不能直接启动 Sidecar,只能提交声明式 Intent;Sidecar 只接收完成任务所需的最小输入;文件、进程、网络和命令权限按 workspace 与任务 scope 收紧;启动时校验 binary hash、签名、协议版本和 capability profile。文章还指出 Tauri capability 主要约束 Webview → 原生 Core,不会自动沙箱已启动的原生插件或 Node Sidecar,把平台 ACL 当完整安全方案是边界误判。

查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
把 Node 放进独立进程,只解决了部分故障隔离:Sidecar 崩溃后可以单独拉起,内存泄漏不会直接污染原生 Core。但如果它继承了完整环境变量、用户目录和网络权限,它仍然能够读取不该读取的文件,或者绕过审批直接访问外部服务。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
因此我会把原生 Core 设计为 Permission Broker: - Frontend 不能直接启动 Sidecar,只能提交声明式 Intent。 - Sidecar 只接收完成当前任务所需的最小输入,不接收完整配置和全部 Secret。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
Tauri capability 主要约束 Webview → 原生 Core,不会自动沙箱已经启动的原生插件或 Node Sidecar。把平台 ACL 当成完整安全方案,是一个危险的边界误判。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
最后一种尤其常见:付出了多进程复杂度,却没有获得真实边界。

两篇文章都给出了“什么时候不该用”的适用条件,且判断标准都落在收益是否大于复杂度上。Provider Pattern 认为若只调用一个稳定 API 且无切换执行引擎计划,直接封装一个 Client 往往足够,不必为了模式而模式;满足两个以上执行引擎、不同 Session 与事件协议、SDK/CLI 更新频繁、UI 与审批审计需统一等任意三项时才尽早建立边界。Sidecar 认为只是几个纯函数、无法定义稳定协议、团队无力维护打包签名 IPC 与崩溃恢复、或拆出去仍给全部权限时都不值得用。两者都把“统一”与“隔离”当作需要论证的收益,而非默认正确。

查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
如果应用只调用一个稳定 API,且没有切换执行引擎的计划,直接封装一个 Client 往往足够,不必为了模式而模式。 但满足下面任意三项时,我会尽早建立 Provider 边界
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
不值得用: - 只是几个纯函数或轻量业务逻辑。 - 无法定义稳定协议,双方需要共享大量可变内存状态。 - 团队没有能力维护打包、签名、IPC、可观测性和崩溃恢复。 - 拆出去以后仍给 Sidecar 全部文件、网络、凭据和数据库权限。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
四个问题都能给出明确答案,Sidecar 才是架构;否则它只是多启动了一个进程。
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
如果新增 Hermes 还需要修改以上模块,说明 Provider 私有语义已经穿透 Adapter 边界。

两篇文章都强调宿主掌握权限与生命周期,但都未给出两者叠加后的具体治理方案:当 Provider Adapter 运行在 Node Sidecar 内时,Provider 原生审批与 Core 的 Permission Broker 如何分工、Capability 声明由哪一层校验、Session Pin 中的 sidecarProtocolVersion 与 providerAdapterVersion 如何协同演进,现有材料只分别描述了各自的边界,尚未展开二者组合时的协议与失败处理细节。

查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
即使 Codex、Qoder 都有自己的 Permission Mode,Agent Ops App 仍然必须持有上层权限策略。Provider 原生审批只能进一步收紧,不能放宽组织策略已经拒绝的动作。
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
所有高风险工具调用经过 Core 审批与审计,Sidecar 不能自己给自己授权。
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
版本不能只在日志里打印一次,而要进入 Session Pin 和 Compatibility Manifest
查看原文:Sidecar 边车模式:给本地 Agent 划出一间受控执行舱
主应用需要回答:握手失败怎么办?任务执行中 Sidecar 崩溃是否重试?取消后怎样确保子进程和工具进程都被清理?升级时协议不兼容如何阻止启动?连续崩溃是否进入熔断?

Vercel

覆盖 2/2 份来源 · 模型归纳

两篇文章都把 TaleFrame 的服务端描述为单个 Next.js 项目,部署在 Vercel,同时承担管理后台与公开 API;业务数据放在 Neon Postgres,封面放在 Vercel Blob,原生 Android 客户端只通过 HTTPS 读取目录、正文与图片。这一组合的取舍在于:Vercel 是运行平台,Neon 与 Blob 各自承担持久化职责,因此“围绕 Vercel 组织交付”并不等于所有资源属于同一计费产品。两文都强调,服务端采用 Next.js 不会把 Kotlin 与 Jetpack Compose 客户端变成跨端应用,将来增加其他客户端可复用内容接口,但各端交互仍需分别实现。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
TaleFrame 的服务端采用一个 Next.js 项目。管理员页面与 API 放在一起,共享输入校验、内容模型和发布逻辑。部署时也只有一个服务端项目需要处理。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
这里的 Postgres 由 Neon 提供。Vercel 是后台与接口的运行平台,也提供 Blob;数据库和文件存储各自承担持久化职责。围绕 Vercel 组织交付,不意味着所有东西都属于同一个计费产品。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
“接上 Vercel”描述的是服务端部署方式,不会把 Kotlin 与 Jetpack Compose 客户端变成跨端应用。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
Neon 是独立的数据库服务。即使通过 Vercel 的集成入口创建或连接数据库,数据管理仍由 Neon 承担。

正文存储位置的选择建立在一组实测数据上:92 本小说、4,105 章,草稿正文约 22.83 MB,数据库实际占用约 42.71 MB。两文据此得出同一有限判断——当前规模下正文没有大到必须拆出独立文本文件服务,继续放在 Postgres 可以在同一处处理草稿、正文版本、发布引用与回退,省去数据库与对象存储之间的一致性维护。封面走另一条路径:上传时校验、限制大小、缩放到最多 768 像素宽并转成 WebP 后存入 Blob。需要注意的是,历史原图仍保留在 Blob 中供旧版本回退,因此封面体积下降描述的是当前资源,不能写成存储量已经减少。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
这组结果支持一个很具体的选择:在当前规模下,把正文继续放在 Postgres,能够省去数据库与对象存储之间的额外一致性维护。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
这组数据支持的是一个有限判断:在当前书库规模下,正文并没有大到必须拆出另一套文本文件服务。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
不过,上表的变化描述的是当前封面资源的体积:历史原图仍保留在 Blob 中供旧版本回退,并没有因为换上新图就自动消失,不能把下载量节省写成存储量已经减少。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
封面采用另一条路径:后台验证图片,限制上传大小,缩放到最多 768 像素宽并转成 WebP,再上传 Blob。

发布机制的核心是把编辑态与读者可见态分开:管理员保存只更新草稿,读者继续读取上一份发布版本;点击发布后,服务端按“章节 ID + 正文哈希”写入正文版本,生成发布快照,并在同一数据库事务中切换当前发布指针、递增全局目录版本。客户端通过 ETag 条件请求检查目录,未变时返回 304,变化时先校验再原子替换本地目录,失败则保留旧目录。两文都指出,这套机制更新的是内容而非客户端程序:不包含 APK 升级、动态下发可执行代码或绕过应用商店更新,首次无缓存时需要联网。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
正文版本按“章节 ID 与内容哈希”去重。只修改一章时,其余章节可以复用已有正文版本;发布快照保存引用,无需每次复制整本正文。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
随后创建发布快照,把书目信息与章节引用保存到 releases,更新 books.published_release,并递增目录版本。相关更新在同一数据库事务中提交。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
TaleFrame 采用目录版本检查与按章缓存。这里的“在线更新”指书目和正文更新,不包含 APK 升级、动态下发可执行代码或绕过应用商店更新。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
当目录变了,App 校验数据结构、章节引用与地址格式,成功后原子替换本地目录。更新失败时保留之前可用的内容,而不是先清空书库。

两文对缓存与回退边界的表述各有侧重但相互印证。一篇从客户端角度说明正文下载后核对 SHA-256 才进入缓存、缓存键包含正文版本、上限 100 MB 按最近读取淘汰,并强调正在阅读的会话保持自己的快照;另一篇从服务端角度补充公开目录与正文响应设置 s-maxage=60,属于 CDN 缓存语义,代码写了缓存头只证明配置意图,实际命中要看响应与运行数据。两者共同指向:发布不是实时推送,下架也无法远程抹除设备上已有的离线内容,客户端缓存不创造无限期的历史访问承诺。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
正文下载后会核对 SHA-256,通过后才进入缓存。缓存键包含正文版本,同一章节被修订后不会误读旧文件。当前缓存上限为 100 MB,按最近读取情况淘汰旧内容;这个数值是本项目的选择,不是阅读 App 的通用标准。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
Vercel 对 s-maxage 的处理属于 CDN 缓存语义;代码中写了缓存头,只能证明配置意图,实际是否命中仍要查看响应与运行数据。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
下架也需要明确语义:服务端可以移除公开目录,并拒绝后续正文读取;已经到达 CDN 的响应可能在缓存期内继续可用,设备上已有的离线内容也无法靠下架动作远程抹除。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
客户端缓存改善体验,并不创造无限期的历史访问承诺。

成本与运维边界被两文反复限定。一篇说明项目沿用已有 Vercel Pro 计划、数据库采用 Neon Free,没有新增付费订阅或部署席位,但这只描述本次新增资源,不能据此得出从零开始也没有固定成本;Vercel 的 On-Demand Budget 本身不会停止用量,只有启用暂停动作才会暂停团队所有项目的生产部署,且检查存在延迟、暂停后存储费用仍可能产生。另一篇补充,集成返回的 Free 套餐与 2025 年 5 月的费用数据不能用于判断当前账期,实际支出应查看 Vercel 当前账单。两文都强调托管平台省下运维,但内容正确性、安全边界与恢复方式仍由应用负责。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
本项目沿用了已有的 Vercel Pro 计划,数据库采用 Neon Free,没有新增付费订阅或部署席位。这描述的是本次新增资源的情况,不能据此得出从零开始也没有固定成本。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
Vercel 的 On-Demand Budget 本身不会停止用量;只有启用相应暂停动作,达到阈值后才会暂停团队所有项目的生产部署。检查存在几分钟延迟,暂停后存储费用仍可能继续产生。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
核查时,集成返回的套餐为 Free(free_v3),作用范围是集成安装。但同一响应中的费用数据属于 2025 年 5 月,不能用它判断当前账期是否产生费用。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
使用托管服务后,可以少维护服务器和运行环境,但内容正确性、安全边界和恢复方式仍然由应用负责。

现有资料留下几个可继续探讨的问题:当前目录包含所有已发布小说及其章节引用,没有分页和增量补丁接口,书库继续扩大时目录响应体与解析耗时如何变化,是否需要拆分目录;正文版本按章节去重并保留每本书最近五份发布快照,清理后旧阅读页再下载已清理正文可能遇到版本不可用,这一体验边界如何取舍;验证只在 Android 15 模拟器与现有代理环境完成,实体设备、不同地区与运营商网络下的稳定性尚未验收;若未来引入读者账号、付费章节或视频,现有单管理员身份模型与小说文本测量都不能直接外推。

查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
当前目录包含所有已发布小说及其章节引用,不是仅含书名的轻量首页,也没有目录分页和增量补丁接口。这降低了首版实现复杂度,但书库继续扩大时,需要测量目录响应体与解析耗时,不能只关心正文占用。
查看原文:TaleFrame 架构实录:原生 Android 如何接上 Vercel 小说后台
但服务端只保留有限历史,旧阅读页若之后再下载已清理的正文,仍可能遇到版本不可用,需要刷新书库。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
它不代表真实用户规模下的稳定性:目前没有实体手机或不同国家、运营商网络验收,本次联网验证使用了现有代理环境,App 也尚未上架应用商店。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
需要这些能力时,应重新设计身份与授权模型,不能把管理员密码机制直接扩展成面向所有读者的账号系统。

Chromium

覆盖 4/4 份来源 · 模型归纳

三篇涉及 Chromium 的文章都把“浏览器内核”与“产品能力”分开讨论,但分层方式不同。ChatGPT App 的静态分析把内置浏览器拆成四层:随应用分发的 Chromium、承载网页的 webview、管理生命周期的主进程、连接 Agent 的 CDP 通道;BrowserOS 拆解则把 AI 浏览器扩展为七层,从 Interaction Surface、Local Agent Runtime、Model 与外部能力、Browser Capability、Product 与 Native Integration、Chromium Kernel 到 Engineering Delivery Control Plane。两者共同点是都认为“用了 Electron/Chromium”只是第一层答案,页面宿主、管理逻辑与控制通道才是额外实现;差异在于前者聚焦单个 macOS 安装包的证据边界,后者以固定 commit 的源码快照讨论产品级架构与交付链路。

查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
这次检查的价值,是把“内置浏览器”拆成可回查的四层:随应用分发的 Chromium,承载网页的 ,管理生命周期的主进程,以及连接 Agent 的 CDP 通道。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
一个完整的 AI 浏览器,至少同时包含浏览器内核、产品级原生集成、交互界面、Agent Runtime、浏览器工具协议、模型与外部连接,以及支撑多平台构建、签名、发布和更新的工程系统。
查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
所以,“用了 Electron”只是第一层答案。网页如何保存、何时挂载、怎样转移、权限由谁处理,都属于应用额外实现的管理逻辑。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
简单说:CDP 更靠近浏览器,MCP 更靠近 Agent。

在 Agent 如何操作页面这一点上,两篇文章给出了不同层次的路径。ChatGPT App 的代码证据显示,Browser Use 后端经过会话路由找到页面的 WebContents,再使用 Electron 的 debugger 接口发送 CDP 命令,并维护 Target、子 Session、控制权释放和超时处理;BrowserOS 则在 CDP 之上增加 browser-mcp 语义工具与 browser-core 状态抽象,让模型通过 snapshot 获得元素引用、再以 act 表达动作,由 Browser Core 解析引用并执行输入事件。共同点是都把原始 CDP 视为底层执行通道而非直接暴露给模型的接口;差异在于前者描述的是应用内 Agent 接入页面的集成路径,后者明确把“把复杂浏览器状态压缩成稳定、低 Token、可验证的 Tool Contract”当作长期壁垒。

查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
本次代码给出的路径是:Browser Use 后端经过会话路由,找到页面的 WebContents,再使用 Electron 的 debugger 接口发送 CDP 命令。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
如果直接把原始 CDP 暴露给模型,模型会面对大量方法、参数、Target、Frame、Node 和 Session 状态。它不仅浪费 Token,也很难稳定地完成“点击登录按钮”这种在人类看来很简单的任务。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
所以,LLM 没有“点击页面”。它生成了一个点击意图,Browser Tool Plane 才负责把意图变成确定性的浏览器操作。
查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
主进程还包含 Target.attachToTarget、Target.getTargets、子 Session、控制权释放和超时处理。因此,这不是只有一个“执行浏览器命令”的按钮;它需要维护任务与页面的归属,并处理控制过程的生命周期。

关于 Chromium 多进程带来的工程约束,RSS 评测文章与启动参数文章从不同角度指向同一事实:Chromium 是 Browser、Renderer、GPU、Network Service 等多进程系统,进程角色不同则资源模型不同。RSS 文章强调跨进程直接相加可能重复计算共享页,因此进程树 RSS 汇总不等于应用独占物理内存,判断 macOS 内存压力应以 Physical Footprint 为主、同口径 RSS 为辅;启动参数文章则强调启动参数只能调整 Chromium 接受的那部分 Runtime 行为,本地模型显存不足、Native Host 内存泄漏、Extension 事件丢失不能靠给所有 Renderer 加大堆上限来统一“治疗”。两者共同反对用单一数字或单一 flag 解释跨进程问题。

查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
问题在于,不同进程可以映射同一份共享库、共享内存或 file-backed page。对单个进程看,这些页面确实属于它的 resident set;但如果把多个进程的 RSS 直接相加,同一批物理页就可能在多个进程名下重复出现。
查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
RSS 不是“假数据”,Physical Footprint 也不是 RSS 的修正版。它们是从不同层面观察内存的两把尺子。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
这里有一个很重要的责任边界:浏览器启动参数只能调整 Chromium 接受的那部分 Runtime 行为。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
本地模型显存不足、Native Host 内存泄漏、Extension 事件丢失,不能靠给所有 Renderer 加大堆上限来统一“治疗”。跨进程系统如果只剩一把 flags 锤子,最后通常会同时损失安全性、可观测性和问题定位能力。

启动参数文章给出的核心约束是“正式入口零强制参数”:Production 快捷方式默认只有可执行文件路径,GPU、Remote Debugging、独立 Profile、日志和网络覆盖应归入有生命周期、有隔离边界、可审计的诊断或自动化 Profile。文章把参数管理标准落在四个问题上:谁添加、作用于哪些进程、何时移除、用什么证据证明它解决了问题;并指出 Chromium 的 switches 不是面向终端用户承诺稳定的产品配置 API,每次升级 Chromium baseline 都应重新核对当前源码和真实二进制行为。这一约束与 RSS 文章的“先问指标在回答什么问题,再看数字大小”属于同一类方法论:先明确口径与作用域,再讨论数值或配置。

查看原文:Windows 下 AI 浏览器的最佳启动参数配置
我的判断更严格:正式发布的浏览器快捷方式,默认应该只有可执行文件路径,不附加任何强制启动参数。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
参数的专业管理标准不在于“记住更多 flags”,而在于回答四个问题:谁添加、作用于哪些进程、何时移除、用什么证据证明它解决了问题。
查看原文:Windows 下 AI 浏览器的最佳启动参数配置
Chromium 的 switches 不是面向终端用户承诺稳定的产品配置 API。每次升级 Chromium baseline,都应该重新核对当前源码和真实二进制行为;不能因为某个参数在旧版本“能跑”,就把它永久固化。
查看原文:RSS 到底是什么:为什么 FlyOS 性能评测不能只看一个内存数字
我的核心原则只有一句:先问指标在回答什么问题,再看数字大小。

BrowserOS 文章对“是否 fork Chromium”给出了条件化判断:若产品主要是总结、翻译、问答、读取当前 Tab、在 Extension 权限内填表和导航,Extension 加 Local Server 通常成本更低;当产品明确需要浏览器级私有 API、原生管理 Sidecar Runtime、控制 New Tab/Importer/Profile/进程与产品身份、内置并固定关键 Extension、拥有安装包签名与更新渠道时,fork 才有足够收益覆盖维护成本。文章同时指出 fork 的代价是长期维护 Patch Stack、解决上游冲突、承担跨平台编译和安全更新压力,并强调无论选择哪条路径,Browser Capability Layer 都值得尽早独立,因为模型会换、UI 会改,而 Page、Tab、Frame、Navigation、Snapshot、Input 与 Side Effect 的语义需要长期稳定。

查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
那么 Extension + Local Server 通常是成本更低的选择。先验证用户是否真的需要 Agent 完成这些任务,再决定是否接管浏览器底座。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
代价也很明显:一旦 fork Chromium,就要长期维护 Patch Stack、解决上游冲突、承担跨平台编译和安全更新压力。fork 不是“更高级”的默认答案,它只是用更高的维护成本换取更深的产品控制权。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
因为模型会换、UI 会改、MCP Client 会增加,但 Page、Tab、Frame、Navigation、Snapshot、Input 和 Side Effect 的语义需要长期稳定。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
如果只想验证一个页面助手,Extension 已经足够;如果要做浏览器级产品,就要接受 Chromium fork 带来的长期成本;如果目标是让不同 Agent 稳定使用真实浏览环境,那么最值得先建设的,是独立于模型和 UI 的 Browser Runtime。

ChatGPT App 的静态分析明确停在证据边界:本次没有运行真实任务,不宣称所有操作都成功、前后台表现一致或全部浏览器工具都采用这条后端;Owl 相关接口虽支持“运行时带有定制扩展,并暴露了页面接管与转移接口”,但具体修改了哪些 Chromium/Electron 源码、对应哪个上游 Electron 版本、迁移时有哪些限制仍不能确定。BrowserOS 文章同样声明源码能证明组件和调用关系存在,但不能仅凭静态源码证明每个网站、每个模型、每个任务都能可靠完成。因此,在现有资料下可继续探讨的是:这些静态结构在真实任务集、不同 Provider 与不同环境下如何被运行时评测验证,以及定制补丁范围需要哪些额外源码或运行证据才能回答。

查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
但铭牌和接口没有交出完整施工图。具体修改了哪些 Chromium/Electron 源码、对应哪个上游 Electron 版本、迁移时有哪些限制,仍不能从这次检查中确定。
查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
本次没有运行真实任务,因而不进一步宣称所有操作都成功、前后台表现一致,或全部浏览器工具都采用这条后端。
查看原文:AI 浏览器不是 Chrome 加个聊天框:从 BrowserOS 拆解七层架构
这里存在一个重要边界:BrowserOS 源码能证明这些组件和调用关系存在,但不能仅凭静态源码证明每个网站、每个模型、每个任务都能可靠完成。任务成功率仍然需要基于真实任务集、Provider 和环境做运行时评测。

Electron

覆盖 2/2 份来源 · 模型归纳

两篇材料都把 Electron 桌面应用拆成主进程与渲染进程两层,但落点不同:ChatGPT 的静态分析把重点放在“页面宿主”上,即用 webview 承载 guest WebContents,再由主进程的 browser-sidebar-manager 管理标签页、挂载转移、恢复、下载与权限提示;agent-tars 的源码剖析则把重点放在“Agent 循环”上,渲染进程通过 ipcClient 调用主进程路由,主进程再接入 LLM 与 MCP 工具。共同点是渲染层不直接持有系统能力,差异在于前者关注浏览器页面生命周期,后者关注任务执行链路。

查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
随后接手的是主进程中的浏览器管理逻辑。名为 browser-sidebar-manager 的日志标识周围,可以找到标签页状态、页面挂载与转移、恢复、后台页面预算、下载和权限提示等代码。will-attach-webview 与 did-attach-webview 事件把界面的嵌入动作连接到主进程。
查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
网页由 Electron 的 guest WebContents 承载,应用再把它与当前任务的展示位置关联起来。
查看原文:字节 agent-tars 技术揭秘(硬啃)
export const ipcClient = createClient({ ipcInvoke: window.electron.ipcRenderer.invoke, });
查看原文:字节 agent-tars 技术揭秘(硬啃)
export const ipcRoutes = t.router({ ...agentRoute, ...llmRoute, // 这里定义了 actionRoute ...actionRoute, ...browserRoute, ...fileSystemRoute, ...searchRoute,

在渲染进程的安全边界上,两篇材料给出的约束方向一致但表述层次不同。ChatGPT 的页面挂载配置明确列出 sandbox: true、nodeIntegration: false、contextIsolation: true、webSecurity: true,并强调 preload 是受控桥接位置,不意味着普通网页获得 Node.js 权限;agent-tars 则说明渲染进程默认不启用 Node.js 集成、默认隔离,通过 preload 与 contextBridge 暴露有限 API,并用 ipcRenderer.send/ipcMain.on 做异步通信。两者都把“页面能力”限制在桥接层,但 ChatGPT 的配置针对内嵌网页,agent-tars 的描述针对应用自身渲染进程。

查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
{ sandbox: true, nodeIntegration: false, contextIsolation: true, webSecurity: true }
查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
Preload 是应用与页面能力之间的桥接位置,可以接入批注等受控功能;它不意味着普通网页直接获得 Node.js 权限。这些配置是已见的隔离措施,不能替代完整安全审计。
查看原文:字节 agent-tars 技术揭秘(硬啃)
- 部分 Node.js能力:默认不启用 Node.js 集成,但可通过 preload 脚本和 contentBridge 暴露有限 API(如 fs 模块的部分功能)。 - 沙箱环境:出于安全考虑,渲染进程默认隔离,无法直接访问系统资源或执行危险操作。
查看原文:字节 agent-tars 技术揭秘(硬啃)
- 在渲染进程加载前注入,通过 contextBridge.exposeInMainWorld() 安全暴露主进程 API(如 sendMessageToMain)

agent-tars 的 Agent 循环把“决策”和“执行”拆成两个角色:Aware 负责根据环境信息与事件流决定下一步状态并维护 plan,Executor 负责按 aware 状态选择工具并调用;AgentFlow 的 launchAgentLoop 在未取消且未完成时反复调用 aware.run() 与 executor.run(),并在任务全部 Done 时退出。工具调用分两类:MCP 工具经 ipcClient.listMcpTools 识别后由 executor.executeTools 执行,浏览器快照动作则单独判断。这说明该架构的取舍是把规划与工具选择解耦,代价是每轮都要经过 LLM 决策与 IPC 往返。

查看原文:字节 agent-tars 技术揭秘(硬啃)
while(!this.abortController.signal.aborted && !this.hasFinished) { // 当任务没有被取消或完成时执行 Agent 循环 const awareResult = await aware.run();
查看原文:字节 agent-tars 技术揭秘(硬啃)
const toolCallList = (await executor.run(awareResult.status)).filter( Boolean, ); const mcpTools = await ipcClient.listMcpTools(); const customServerTools = await ipcClient.listCustomTools();
查看原文:字节 agent-tars 技术揭秘(硬啃)
const awareResult = JSON.parse( result.tool_calls.filter(Boolean)[0].function.arguments, ) as AwareResult;
查看原文:字节 agent-tars 技术揭秘(硬啃)
You are a tool use expert. You should call the appropriate tools according to the aware status and environment information.You should not output any response text and only return the JSON.

两篇材料都留下可继续追问的边界。ChatGPT 一侧,Owl 相关属性与 adoptForWindowTransfer 等接口只支持“运行时带有定制扩展并暴露页面接管与转移接口”的判断,具体修改了哪些 Chromium/Electron 源码、对应哪个上游版本、迁移限制如何,材料明确说不能从这次检查确定;agent-tars 一侧,chat-ui 因内部原因暂未公开,EventManager 与 chat-ui 的交互被描述为黑盒,文件上传在发稿日也暂不支持。这些都属于现有资料下可继续探讨的问题,而非已确认结论。

查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
但铭牌和接口没有交出完整施工图。具体修改了哪些 Chromium/Electron 源码、对应哪个上游 Electron 版本、迁移时有哪些限制,仍不能从这次检查中确定。
查看原文:漫画拆解 ChatGPT App:内置浏览器藏在哪里
这些证据支持“运行时带有定制扩展,并暴露了页面接管与转移接口”的判断。
查看原文:字节 agent-tars 技术揭秘(硬啃)
EventManager 类主要是负责和 chat-ui 交互的,由于 chat-ui 没有开源,这块是黑盒的。后续开源之后详细讲解。
查看原文:字节 agent-tars 技术揭秘(硬啃)
@vender/chat-ui 由于内部原因,暂未公开,可以关注 issues417。

Agent Skill

覆盖 2/2 份来源 · 模型归纳

better-imagegen 的核心做法是先确定最终产物由谁消费,再选择模型与工作流,而不是先写一个万能生图 Prompt。公开文章把任务拆成 Portrait/Cover、Text Poster、Logo/Icon、macOS App Icon、Static Wallpaper、Dynamic Wallpaper、Sprite Loop、Image Edit 等独立类型,各自对应不同的交付重点,例如封面关注构图与 WebP 压缩,菜单栏图标关注透明通道与 18px 可读性,动态壁纸关注 HEIC 与系统元数据。项目记录同样把类型选择、规格约束、后处理、失败处理和验收描述为可复用流程,并明确不把一张模型生成的图片视为全部工程产物。

查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
很多生图流程第一步就是选模型。我现在反过来:先问最终文件要被谁消费。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
目前 better-imagegen 把常见任务拆成独立工作流: 类型 默认交付重点 ------ Portrait / Cover 构图、人物、情绪、WebP 压缩 Text Poster 生图负责视觉底板,HTML/CSS 负责准确文字 Logo / Icon 透明背景、alpha 边缘、缩小后的可读性 macOS App Icon squircle、安全区、iconset、.icns Static Wallpaper 4K、PNG、桌面图标可读区域 Dynamic Wallpaper 多状态帧、HEIC、系统元数据 Sprite Loop 精灵图、编号帧、GIF 预览、manifest Image Edit 参考图输入、身份保持、局部变化
查看原文:better-imagegen:将视觉生成整理成工程流程
我持续完善 better-imagegen,把视觉资产的类型选择、规格约束、后处理、失败处理和验收写成可复用流程。它服务封面、角色、图标和帧动画等不同交付,不把一张模型生成的图片视为全部工程产物。

在 Prompt 设计上,文章主张把 Prompt 当作一份 Asset Contract,至少写清 Subject、Composition、Style、Delivery context、Hard constraints 和 Negative constraints 六类信息。以 Argos 菜单栏猫头鹰动画为例,真正决定可用性的不是“可爱猫头鹰”这类描述,而是横向精灵图、固定 6 帧、每格等宽、透明背景、暖橙色轮廓、18px 仍能辨识、首尾动作连续等运行时约束。文章由此把模型生成像素与 Prompt 描述运行时约束区分开来。

查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
一个可执行的 Prompt,不是堆“高级感、电影感、8K、杰作”这类形容词,而是写清一份资产合同。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
1. Subject:画面里必须有什么 2. Composition:主体位置、留白、视线方向、帧网格 3. Style:摄影、插画、像素、产品渲染等视觉语言 4. Delivery context:博客、社交媒体、菜单栏、桌面、App Icon、头像 5. Hard constraints:人数、透明背景、尺寸、帧数、角色身份 6. Negative constraints:不要文字、不要 Logo、不要水印、不要额外肢体
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
真正决定可用性的约束是:横向精灵图、固定 6 帧、每格等宽、透明背景、暖橙色轮廓、18px 仍能辨识、首尾动作连续。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
模型生成的是像素,但 Prompt 描述的是运行时约束。

文章对几类资产给出了明确的职责边界:准确中文不交给图像模型,而采用 AI 生成无文字视觉底板、HTML/CSS 叠加真实文本、浏览器渲染截图、再做 WebP 压缩与尺寸检查的流程;角色身份连续时使用 image edit 并锁定标准立绘,只有同类风格而不要求身份连续时才用 text-to-image;帧动画的验收单位是实际运行尺寸,交付物包括等分精灵图、拆分帧、GIF 预览和 manifest,并要求 cell 尺寸一致、首末帧衔接、alpha 真实存在、在运行尺寸验收。macOS App Icon 则需在透明源图之后完成 alpha 检查、留白裁切、安全区、squircle 底板、多尺寸 iconset 与 .icns 封装。

查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
AI 生成无文字视觉底板 ↓ HTML / CSS 叠加真实文本和品牌组件 ↓ 浏览器渲染并截图 ↓ WebP 压缩 + 尺寸检查
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
用户必须认出“还是同一个角色”时,使用 image edit。 - 只需要同类风格、不要求身份连续时,才用 text-to-image。 - 角色进入帧动画时,先锁定标准立绘,再做动作变化。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
1. 每个 cell 尺寸完全一致,不能靠肉眼切。 2. 首帧和末帧的姿态能自然衔接。 3. alpha 通道真实存在,不能用棋盘格“画透明”。 4. 必须在实际运行尺寸验收,而不是只看 512px 预览。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
生成透明源图 → 检查 alpha 边缘 → 裁掉异常透明留白 → 设置视觉安全区 → 生成 macOS squircle 底板 → 输出 16 / 32 / 128 / 256 / 512 / 1024 尺寸 → 组成 .iconset → 转换为 .icns

模型回退在文章中被定义为有约束的链路:默认使用 GPT Image 2,失败后归一化 Prompt 重试一次,再回退到 Gemini,最后才考虑 Doubao;不同模型在 Prompt 遵循、自由尺寸、4K、水印和最小像素面积等方面特性不同,因此透明 Logo、Icon 和 sprite sheet 不应回退到会破坏 alpha 或网格的模型。文章强调 fallback 的目标不是“总能出图”,而是“仍然能交付同一种资产”。此外,每个产物配同名 JSON 元数据,记录模型、请求尺寸、实际分辨率、生成耗时、输出格式、后处理和 prompt,使结果可审计、可复现。

查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
better-imagegen 现在默认使用 GPT Image 2,失败后归一化 Prompt 重试一次,再回退到 Gemini,最后才考虑 Doubao。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
因此透明 Logo、Icon 和 sprite sheet 不应该回退到一个会破坏 alpha 或网格的模型。Fallback 的目标不是“总能出图”,而是“仍然能交付同一种资产”。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
所以我给每个产物增加了同名 JSON 元数据: json { "file": "cover.webp", "model": "gpt-image-2-all", "requested_size": "1536x1024", "actual_resolution": "1280x720", "generation_time_seconds": 38.8, "output_format": "webp", "postprocess": "center-cropped to 16:9; WebP quality 78", "prompt": "..." }
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
元数据看起来是小事,但它让视觉生成从“聊天记录里的偶然结果”变成了可审计的工程产物。

文章也划出了能力边界与适用条件:better-imagegen 适合快速生成产品概念视觉、封面、角色和状态物料,让 Agent 自主选择工作流并完成后处理,把 sprite、App Icon、壁纸等非单图资产交付到工程,并在多模型间做有约束的 fallback;但它不是 Figma 的替代品,涉及精确排版、复杂 Design System、连续镜头或严格 3D 资产时仍需专业工具和人工判断。是否值得工程化,文章给出三个判断问题:同类资产是否重复出现、输出是否要进入代码或内容系统、失败是否影响交付节奏。项目记录则保留维护方向,注明项目起始日期未详、状态未核实、已记录结果未记录,不据此推定当前支持模型或发布状态。

查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
但它不是 Figma 的替代品,也不会自动解决所有品牌一致性问题。涉及精确排版、复杂 Design System、连续镜头或严格 3D 资产时,仍然需要专业工具和人工判断。
查看原文:我把AI生图做成了工程能力:better-imagegen的实战与判断
我的结论是:如果你每周都有两次以上视觉生成需求,值得把生图从 Prompt 升级成 skill。 判断是否值得工程化,我看 3 个问题: 问题 是 否 --------- 同类资产会重复出现吗? 建立类型 reference 临时生成即可 输出要进入代码、客户端或内容系统吗? 增加后处理和验收 保存图片即可 失败会影响交付节奏吗? 增加模型回退和元数据 手动重试即可
查看原文:better-imagegen:将视觉生成整理成工程流程
场景:2026-07-15 的公开文章回顾近期实践;项目起始日期未详。这里保留维护方向,不推定当前支持模型或发布状态。
查看原文:better-imagegen:将视觉生成整理成工程流程
状态:未核实 已记录结果:未记录(不能据此推断项目没有成果或尚未完成)

Next.js

覆盖 3/3 份来源 · 模型归纳

三篇文章都把 Next.js 放在交付链路的一环,但承担的角色不同:Fumadocs 方案把 Next.js 文档站静态导出后交给 Egg.js 的 egg-static 托管,与 Midway 后端共用端口;TaleFrame 方案把管理后台与 API 放在同一个 Next.js 项目并部署到 Vercel;Facebook Pixel 文章则把站点描述为 Next.js 静态导出、全站推 CDN、没有运行中的 Node.js 服务。因此“Next.js”在三个来源中分别对应静态托管、服务端后台和纯静态内容站三种边界,不能互相套用。

查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
Next.js 支持 output: 'export',构建后输出纯静态文件
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
TaleFrame 的服务端采用一个 Next.js 项目。管理员页面与 API 放在一起,共享输入校验、内容模型和发布逻辑。
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
我的站点用 Next.js output: 'export' 静态导出,全站 HTML/CSS/JS 推 CDN,没有运行中的 Node.js 服务。

Fumadocs 方案的架构取舍集中在“一个项目、两个进程”:生产环境用 Next.js 静态导出生成 client/out,再由 egg-static 优先命中静态文件、未命中才走 Midway 路由;本地开发则用 concurrently 同时启动 Midway 与 Next.js dev server,并通过 Home controller 在本地缺少导出产物时重定向到 :3000。该方案同时记录了版本对齐约束:fumadocs-mdx 需 ^15.0.0 才支持 core v16,fumadocs-openapi ^10.0.0 要求 core ^16.9、ui ^16.9,Tailwind 为 v4 的 @import 方式。

查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
也就是说,GET / 返回文档站首页,GET /api/skills 走 Midway 控制器——静态文件和 API 共用同一个端口,完全无感。
查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
本地开发时,Next.js 需要一个 dev server 做热更新,不能用静态文件。用 concurrently 解决
查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
fumadocs-mdx ^15.0.0 注意不是 ^12,v15 才支持 core v16
查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
fumadocs-openapi ^10.0.0 要求 core ^16.9、ui ^16.9

TaleFrame 的存储取舍以实测为前提:2026 年 11 月 1 日导入 92 本、4,105 章后,原始正文约 22.8 MB、数据库实际占用约 42.7 MB,因此正文继续放在 Postgres,避免数据库与对象存储之间的一致性维护;封面则在上传时解码、限制尺寸并转 WebP,但历史原图仍保留在 Blob 中,所以不能把下载量节省说成存储量已减少。发布侧用草稿与发布快照分离、正文按“章节 ID 与内容哈希”去重、同一事务切换发布版本并递增目录版本,保留最近五次发布用于回退。

查看原文:围绕 Vercel,搭一套独立开发者的交付套件
这组结果支持一个很具体的选择:在当前规模下,把正文继续放在 Postgres,能够省去数据库与对象存储之间的额外一致性维护。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
历史原图仍保留在 Blob 中供旧版本回退,并没有因为换上新图就自动消失,不能把下载量节省写成存储量已经减少。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
正文版本按“章节 ID 与内容哈希”去重。只修改一章时,其余章节可以复用已有正文版本;发布快照保存引用,无需每次复制整本正文。
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
缓存键包含正文版本,同一章节被修订后不会误读旧文件。当前缓存上限为 100 MB,按最近读取情况淘汰旧内容;这个数值是本项目的选择,不是阅读 App 的通用标准。

Facebook Pixel 文章给出的约束是事件分层与触发位置:标准事件可直接选为优化目标,自定义事件必须先包装成自定义转化才会出现在广告管理工具的下拉里;ChapterCompleted 不能用 scrollHeight 比例判断,因为推荐区会占页面高度 15-25%,应在正文末尾放哨兵并用 IntersectionObserver 监听。文章还指出 CAPI 在静态导出站不是零成本,需要服务端中转,当前阶段流量不大时只上 Browser Pixel,等 Events Manager 出现信号丢失警告再评估。

查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
ChapterRead50 / ChapterCompleted / TimeOnPage30 是自定义事件,必须先包装。
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
document.body.scrollHeight 包含正文下方的"YOU MIGHT ALSO LIKE"推荐区。这块区域通常占页面高度的 15-25%。
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
CAPI 需要从服务端调用 Meta Graph API 回传事件,这意味着
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
核心判断:先把事件质量做好(正确触发、正确包装自定义转化),再考虑量的问题(CAPI)。顺序搞反了没意义。

三篇文章对“静态导出”的利用方式形成对照:Fumadocs 把静态导出当作嵌入既有 Node 服务的产物,由 egg-static 与 API 共端口;TaleFrame 的 Next.js 后台部署在 Vercel 并承担 API,客户端是原生 Android,通过目录版本与按章缓存更新内容;Pixel 文章则把静态导出视为没有服务端的前提,因而 CAPI 需要另找 Vercel Route Handler、Cloudflare Worker 或 CAPI Gateway。共同点是都强调先测量或先跑通最小链路再增加基础设施,但各自增加的门槛不同:Fumadocs 是包版本对齐,TaleFrame 是发布与恢复机制,Pixel 是事件质量与信号丢失。

查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
Egg.js 内置 egg-static 插件,开启后可以托管静态目录
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
App 下次检查目录时获得新快照,阅读对应章节时请求新正文。
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
方案 A:改用 Vercel 部署(支持 Next.js Route Handler),在 app/api/fb-event/route.ts 里回传
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
先把小说的更新与阅读做好,等实际需要承载视频时,再为视频选择服务。

现有资料下仍可继续探讨:Fumadocs 方案中 Next.js 静态导出与 egg-static 共端口的做法,在文档站体积增长或需要服务端渲染时如何调整;TaleFrame 的正文留在 Postgres 的结论基于 4,105 章、约 22.8 MB 正文的测量,规模扩大后一致性维护成本与对象存储方案如何重新比较;Pixel 文章建议等 Events Manager 出现信号丢失再评估 CAPI,但未给出该警告出现后的具体迁移顺序与去重实现细节。

查看原文:为什么选 Fumadocs:Node.js 项目接入开箱即用文档站
对 Next.js 包体积有严格限制(文档站打出来还是有一定体积的)
查看原文:围绕 Vercel,搭一套独立开发者的交付套件
它可能适合更大的内容库,当前还没有足够收益抵消这些工作。
查看原文:Facebook Pixel 接入踩坑全记录:从 AEM 到 ChapterCompleted 触发时机
CAPI 和 Browser Pixel 同时上报同一事件时,需要用 event_id 去重

JavaScript

覆盖 8/8 份来源 · 模型归纳

关于 moment().tz 报错,原文把根因定位为 moment-timezone 未被正确加载,而非 timeZone 取值或格式问题:tz() 来自 moment-timezone,不是 moment 本体 API。推荐做法是直接从 moment-timezone 导入(ESM 用 import moment from 'moment-timezone',CommonJS 用 require('moment-timezone')),以避免 bundler、默认导入和重复依赖造成的实例不一致。旧项目常见的副作用导入 import 'moment-timezone' 依赖其修改同一份 moment 实例,在 monorepo、alias 配置或 lockfile 出现多个 moment 副本时可能修改的是 A 实例而业务代码拿到 B 实例,仍会报错。

查看原文:「已解决」TypeError: moment().tz is not a function
moment().tz is not a function 通常不是时区格式问题,而是 moment-timezone 没有被正确加载。本文给出可复现的导入方式、排查步骤和替代方案。
查看原文:「已解决」TypeError: moment().tz is not a function
一句话总结 tz() 来自 moment-timezone,不是 moment 本体 API。直接从 moment-timezone 导入,最能避免 bundler、默认导入和重复依赖导致的实例不一致。
查看原文:「已解决」TypeError: moment().tz is not a function
它依赖 moment-timezone 修改同一份 moment 实例。在 monorepo、alias 配置或 lockfile 出现多个 moment 副本时,副作用可能修改的是 A 实例,而业务代码拿到的是 B 实例,于是仍然报 tz is not a function。

同一篇 moment 文章还给出排查清单与迁移取舍:用包管理器命令确认没有意外安装多份 moment、检查 moment-timezone 是否在生产依赖而非仅 devDependencies、检查 bundler alias 是否把 moment 指到不同路径、确认时区名是 IANA 格式(如 Asia/Shanghai)而非 GMT+8 这类展示字符串。作者给出的判断框架是:遗留项目继续使用 moment-timezone 并统一入口导入,风险最低;新项目优先选择现代日期库或 Intl,避免新增 Moment 依赖,因为 Moment 已进入维护模式。

查看原文:「已解决」TypeError: moment().tz is not a function
1. 运行 pnpm why moment 或对应包管理器命令,确认没有意外安装多份 moment。 2. 检查 moment-timezone 是否在生产依赖中,而不是只在 devDependencies。 3. 检查 bundler alias 是否把 moment 指到不同路径。 4. 确认时区名是 IANA 格式,例如 Asia/Shanghai,而不是 GMT+8 这类展示字符串。
查看原文:「已解决」TypeError: moment().tz is not a function
Moment 已进入维护模式。新项目如果只需时区转换,可以评估 date-fns-tz、Luxon 或原生 Intl.DateTimeFormat;但在已有 Moment 代码库里,局部替换的成本未必值得。先把导入链路修正确,再决定是否迁移。
查看原文:「已解决」TypeError: moment().tz is not a function
我的判断框架 遗留项目:继续使用 moment-timezone 并统一入口导入,风险最低。 新项目:优先选择现代日期库或 Intl,避免新增 Moment 依赖。

作用域与闭包两份笔记构成一条知识链:作用域笔记把作用域分为全局、函数、块三种,块作用域只适用于 let 或 const 声明的变量,并说明当编译器无法在当前作用域解析变量时会逐级向上查找直至全局作用域,即作用域链。闭包笔记则把闭包定义为函数与其外部状态或词法环境的结合,并指出闭包比纯函数需要更多内存和处理能力,主要实用价值是数据封装与函数工厂。两者共同点在于都强调变量可访问范围由声明位置决定;差异在于作用域描述查找规则,闭包描述函数对外层变量的持续持有。

查看原文:JavaScript 作用域:双语学习笔记
This is a special type of scope which applies to variables that are declared using the let or the const keyword only. According to the rules of block scope, variables that are declared inside of a block or a pair of braces can only be accessed inside of that block and nowhere outside of it.
查看原文:JavaScript 作用域:双语学习笔记
This is called the scope chain, it does this all the way up to the global scope. And if the variable is still not resolved, then we get the error that the variable is not defined.
查看原文:JavaScript 闭包:双语学习笔记
So a closure is not just a function, it's a function combined with its outer state or lexical environment. As you might imagine, closures require more memory and processing power than a pure function.
查看原文:JavaScript 闭包:双语学习笔记
the most important one being data encapsulation to prevent leaking or exposing data where it's not needed. We can create a closure by defining an outer function that contains the state, then an inner function that operates on it.

变量提升笔记与 this 笔记分别处理声明与调用上下文两类约束。提升方面:var 声明被提升而初始化不提升,故 console.log(x) 在 var x = 27 之前输出 undefined;let 声明的变量不被提升,提前访问报 Cannot access 'x' before initialization;函数声明可先调用后声明,但匿名函数赋值给变量后提前调用会报 notHoisted is not a function。this 方面:普通函数作为对象属性调用时 this 指向该对象,箭头函数没有自己的 this 绑定而沿用外层执行上下文,严格模式下全局上下文调用函数的 this 为 undefined;bind 返回绑定新 this 的函数,call 立即调用并逐个传参,apply 与 call 相同但第二个参数是参数数组。

查看原文:JavaScript 变量提升:双语学习笔记
This is because the declaration gets hoisted above the console.log, but the initialization stays below that line. So it doesn't know anything about the value 27 at the time of execution.
查看原文:JavaScript 变量提升:双语学习笔记
Variables declared with the keyword let are not hoisted. Let's have a look at the same example we just looked at. But we'll replace the keyword var for let. As you can see, we get an error saying that x cannot be accessed before initialization.
查看原文:JavaScript 的 this:双语学习笔记
Now, if we write a second property and use an arrow function, you'll notice this is now the global object or undefined in strict mode in an arrow function. This is based on the enclosing object's execution context, which in this example, would be global.
查看原文:JavaScript 的 this:双语学习笔记
And lastly, I'll point out that you also have the apply method, which is identical to call. The only difference is that the second argument is an array of arguments. A good way to remember the difference is to think a for array or apply, or c for comma or call.

浏览器事件循环笔记明确把范围限定在浏览器,并声明 Node.js 的事件循环阶段和 nextTick 队列不直接套用此顺序。其执行流程为:先执行同步代码,当前宏任务结束后立即清空所有微任务(包括执行过程中新产生并加入队尾的微任务),再按需检查 UI 渲染,然后取下一个宏任务。示例输出顺序为 1 → 4 → 3 → 2;嵌套场景中 setTimeout 回调内产生的微任务在回调交还控制后执行,输出“宏任务 → 微任务”;长时间运行的微任务会延迟 UI 渲染,因为微任务队列必须在渲染前清空。

查看原文:浏览器事件循环与微任务笔记
以下以浏览器为范围;Node.js 的事件循环阶段和 nextTick 队列不直接套用此顺序。
查看原文:浏览器事件循环与微任务笔记
- ​新微任务继续排队:微任务执行过程中产生的新微任务会加入队尾,在本次微任务检查点继续处理,直到队列清空;不会打断当前正在执行的回调。
查看原文:浏览器事件循环与微任务笔记
输出顺序:1 → 4 → 3 → 2 解释: 1. 同步任务输出 1 和 4。 2. 当前宏任务(主线程)结束后,执行微任务队列中的 Promise.then,输出 3。 3. 最后执行宏任务队列中的 setTimeout,输出 2。
查看原文:浏览器事件循环与微任务笔记
2、​微任务阻塞渲染 长时间运行的微任务会延迟 UI 渲染,因为微任务队列必须在渲染前清空。

原型链笔记以 Object.create 示例说明属性查找:custom 对象通过 Object.create(obj) 继承 obj 的 name,toString 则来自 Object.prototype;查找从对象自身开始沿原型向上,直到找到属性或到达 null。示例注释还标出 custom.__proto__ 为 obj、obj.__proto__ 为 Object、obj.__proto__.__proto__ 为 null。原文把原型链定位为 JavaScript 实现继承和代码重用的方式。

查看原文:JavaScript 原型链:双语学习笔记
In Javascript, every object has a hidden link called or its prototype. If a property or method isn't found on the object, Javascript looks up these prototype. This lookup process continues up the prototype chain. It starts with your object, moves to its prototype and keeps going until it either finds the property or hits null.
查看原文:JavaScript 原型链:双语学习笔记
Here, customObj inherits name from obj and toString from Object.prototype. That's the power of the prototype chain.
查看原文:JavaScript 原型链:双语学习笔记
// Inherited from obj console.log(custom.name); // Found in Object.prototype console.info(custom.toString()); // custom's prototype is obj console.info(custom.__proto__) // custom's prototype is Object console.info(obj.__proto__) // Object's __proto__ is null

Linux

覆盖 2/2 份来源 · 模型归纳

两篇材料都涉及 Linux 平台标识,但切入层次不同。安装包命名文章把 linux 视为 OS/platform 维度,并强调对含 native code 的程序还需继续区分 libc/ABI:gnu 通常表示 GNU toolchain / glibc environment,musl 表示 musl libc environment,CPU 与 kernel 都对但 libc 不匹配时,程序仍可能在启动时报告 dynamic linker 不存在或 native dependency 无法加载。Linux 实战教程则在具体发行版上操作,记录镜像为 Ubuntu 18.04.4 LTS、内核 4.15.0-91-generic x86_64,并用 apt update、apt upgrade 更新与升级系统源。两者共同点是都把 Linux 当作需要核对具体运行环境的平台,而非单一标签。

查看原文:darwin-arm64、win32-x64、linux-x64 到底是什么:一篇讲清安装包命名
gnu 通常表示 GNU toolchain / glibc environment,musl 表示 musl libc environment。CPU 和 kernel 都对,libc 不匹配,程序仍可能在启动时报告 dynamic linker 不存在、symbol version 找不到,或者某个 native dependency 无法加载。
查看原文:darwin-arm64、win32-x64、linux-x64 到底是什么:一篇讲清安装包命名
这也是 Linux 安装包经常比 macOS 多出一截后缀的原因:发布者需要把更多用户态兼容边界写进名字。
查看原文:写给前端的 Linux 实战教程
笔者使用的是 AliYun 服务器 ECS,镜像选择的是 Ubuntu,Ubuntu的详细版本信息是:Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-generic x86_64)
查看原文:写给前端的 Linux 实战教程
更新系统源 $ apt update 升级系统源 $ apt upgrade

两篇材料对“检测对象”的敏感度不同。安装包命名文章明确提醒要区分 physical machine、operating system 与当前 process,在 Rosetta、WOW64、container 和 cross-compilation 环境里三者可能不同;它给出的 Linux 检测方式是 uname -m 与 ldd --version,并列出 x86_64 对应 x64/amd64/x86_64、aarch64 对应 arm64/aarch64 等映射,同时指出 ldd --version 输出通常能帮助判断 glibc 还是 musl,但不同 distribution 实现与输出不完全一致。Linux 实战教程则把 uname -a 列为显示全部 Linux 系统信息、cat /proc/version 显示 Linux 信息、cat /etc/lsb-release 查看发行版信息,属于同一类“先确认环境再操作”的思路,但没有展开 libc 或 process 与硬件差异的讨论。

查看原文:darwin-arm64、win32-x64、linux-x64 到底是什么:一篇讲清安装包命名
第三,把检测对象说清楚。 你检测的是 physical machine、operating system,还是当前 process?在 Rosetta、WOW64、container 和 cross-compilation 环境里,这三个答案完全可能不同。
查看原文:darwin-arm64、win32-x64、linux-x64 到底是什么:一篇讲清安装包命名
ldd --version 的输出通常能帮助判断当前环境属于 glibc 还是 musl,但不同 distribution 的实现与输出不完全一致。发布者若提供了专门的 gnu / musl artifact,应继续对照其支持矩阵,而不是只看 uname -m。
查看原文:写给前端的 Linux 实战教程
- uname -a:显示全部Linux系统信息 - cat /proc/version:显示Linux信息 - cat /etc/lsb-release:查看发行版信息 - echo $SHELL:当前的shell

Linux 实战教程在工具链配置上给出了具体取舍。Git 部分把 core.autocrlf 设为 input,理由是 Linux 或 Mac 系统使用 LF 作为行结束符,不希望 Git 在签出文件时自动转换,同时希望在提交时把 CRLF 转换成 LF;文中说明这样会在 Windows 系统上的签出文件中保留 CRLF,会在 Mac 和 Linux 系统上包括仓库中保留 LF。Node 版本管理使用 n 模块,先 apt install nodejs npm build-essential,再 sudo npm install -g npm n,之后可用 n latest、n lts、n rm 指定版本或清理缓存。Shell 方面记录安装 zsh、克隆 oh-my-zsh、复制模板到 ~/.zshrc、用 chsh -s /bin/zsh 修改默认 Shell,并强调修改 ~/.zshrc 后需执行 source ~/.zshrc 使之立即生效。

查看原文:写给前端的 Linux 实战教程
Linux或Mac系统使用LF作为行结束符,因此你不想 Git 在签出文件时进行自动的转换;当一个以 CRLF 为行结束符的文件不小心被引入时你肯定想进行修正,把 core.autocrlf 设置成 input 来告诉 Git 在提交时把 CRLF 转换成 LF,签出时不转换
查看原文:写给前端的 Linux 实战教程
我们使用 n 模块来维护 Node 的版本: shell $ apt install nodejs npm build-essential $ sudo npm install -g npm n 安装最新版 $ sudo n latest
查看原文:写给前端的 Linux 实战教程
修改 ~/.zshrc 之后都需要执行 source ~/.zshrc 命令使之立即生效 echo $SHELL 可以查看当前 Shell
查看原文:写给前端的 Linux 实战教程
- 修改默认Shell:chsh -s /bin/zsh

在进程与定时任务方面,Linux 实战教程记录了几组可操作约束:ps 的 -ef 列出所有用户在所有终端的所有进程,-aux 通过 CPU 和内存使用来过滤进程,并可用 --sort -pcpu 或 --sort -pmem 降序排列;kill -9 强制结束进程,killall 根据进程名结束所有进程。后台运行可用 &、nohup 使进程与终端分离,Ctrl + Z 与 bg 把进程转为后台,jobs 显示后台进程状态,fg 使进程转为前台。定时任务用 crontab 的 m h dom mon dow command 五段格式,文中特别提醒“一定要换行,不换行不会生效的”,并给出重启 cron 服务的方式 systemctl cron.service restart。这些是教程中的操作说明,不代表任何个人已完成的运维经历。

查看原文:写给前端的 Linux 实战教程
- -ef:列出所有用户在所有终端的所有进程,可以配合管道方便查看 ps -ef less - -efH:按照乔木状列出进程 - -u:列出此用户运行的进程 - -aux:通过CPU和内存使用来过滤进程
查看原文:写给前端的 Linux 实战教程
& 符号:后台运行进程 - cp file.txt file-copy.txt & - find / -name "log" output_find 2&1 & nohup: 使进程与终端分离
查看原文:写给前端的 Linux 实战教程
m h dom mon dow command - 顺序口诀:分 时 日 月 周 - m:minute 的缩写,表示”分钟“(0~59)
查看原文:写给前端的 Linux 实战教程
实例 一定要换行,不换行不会生效的 重启 cron 服务:systemctl cron.service restart

现有材料留下一个可继续探讨的问题:安装包命名文章主张 Linux 选包要多看一层 libc 与最低版本,并建议对照发布者支持矩阵;而 Linux 实战教程记录的是 Ubuntu 18.04.4 LTS 上的 apt 安装与命令操作,未讨论 gnu/musl artifact 的选择或 glibc baseline 验证。在具体项目里,如何把“uname -m 显示架构匹配”与“ldd --version 判断 libc 环境”组合成可执行的验收步骤,以及当发布页只给 linux-x64 而不标注 gnu/musl 时应如何确认兼容边界,资料本身没有给出答案。

查看原文:darwin-arm64、win32-x64、linux-x64 到底是什么:一篇讲清安装包命名
- Linux 多看一层 libc 与最低版本。 CPU 匹配后,再核对 gnu/musl、distribution baseline 和 package format。
查看原文:darwin-arm64、win32-x64、linux-x64 到底是什么:一篇讲清安装包命名
名称片段 描述对象 不能单独证明什么 --- --- --- linux-arm64 OS + CPU 不保证 libc 与最低系统版本兼容 gnu / musl libc / ABI environment 不表示 package manager
查看原文:写给前端的 Linux 实战教程
更新系统源 $ apt update 升级系统源 $ apt upgrade 必备环境及应用 Git shell 安装 git $ apt install git

紫升

覆盖 2/2 份来源 · 模型归纳

在跨端技术选型上,该文记录宗心给出的判断是:Flutter 与 React Native 适用的业务场景不同,Flutter 更多替代原生开发作为 App 开发的新模式,React Native 则承担动态化场景,并对前端更友好。作者由此归纳出选型应跟随业务场景,脱离业务谈技术架构会制造焦虑。这一判断属于访谈转述与作者感悟,不是可验证的框架性能结论。

查看原文:闲鱼宗心大佬聊跨端职业发展
Flutter 和 React Native 所适用的业务场景是不一样的,Flutter 更多地可以替代原生开发作为 App 开发的新模式,闲鱼目前的基础链路就在用 Flutter 做归一的架构。而 React Native 可以做动态化的事情,比如手淘的活动引导页这类需要高度动态化的场景。
查看原文:闲鱼宗心大佬聊跨端职业发展
技术存在即合理,站在宗心大佬的高度,一切技术的选型和架构一定是跟随业务场景走的。脱离业务去谈技术和架构,就是流氓行为,不负责任的,纯属制造焦虑的。

关于闲鱼基础链路的架构取舍,文中转述的方向是以 Flutter 作为基础链路核心,辅以原生、H5 等容器,最终做到基础链路归一,并明确否认放弃 Flutter。其背景被描述为 RN 容器、H5 容器、原生壳、小程序与 Flutter 共存带来管理成本和性能问题,因此需要统一基础链路的技术。作者同时提到涂鸦内部有类似“一码多端”小组,但这是作者所在环境的类比,不构成对闲鱼方案的独立验证。

查看原文:闲鱼宗心大佬聊跨端职业发展
那么闲鱼是否会放弃 Flutter 呢?答案是否定的,宗心大佬描述了闲鱼基础链路架构的方向:Flutter 作为基础链路的核心,辅以原生、H5 等容器,最终做到基础链路的归一。
查看原文:闲鱼宗心大佬聊跨端职业发展
目前跨端处于比较混乱的局面,RN 容器、H5 容器、原生壳、各厂封闭生态的小程序以及 Flutter 共存于一个 App 的情况屡见不鲜。这带来的不只是管理成本,还有性能问题。此时急需一个能够统一基础链路的技术,闲鱼基于多年的经验选择了 Flutter。
查看原文:闲鱼宗心大佬聊跨端职业发展
其实,在涂鸦也有相应的小组在做同样的事情,在我们的沟通里叫一码多端。也是基于 Flutter 实现一套代码多端运行。

在职业能力边界上,文中把专家分为技术向与业务向:技术向需要对某一领域或问题有专精研究,业务向则更常见,要求产品意识并能在缺少产品时顶上。宗心还建议作者不要只执着技术追求,应读经管、管理、心理类书籍,并强调综合能力与平衡生活家庭。作者据此反思不能简单模仿他人,而应学习习惯、学习方法、架构思路与技术前瞻性。

查看原文:闲鱼宗心大佬聊跨端职业发展
大佬将专家分为技术向专家和业务向专家。技术向专家比较少见,需要对某一个领域或某一个问题有很专精的研究,比如 Flutter 渲染引擎的优化、音视频方向的编码研究等等。而更常见的是业务向专家,这里的业务并不是具体的 ERP 或者电商。而是要有产品意识,需要在缺少产品的紧急情况下能顶上去的能力。
查看原文:闲鱼宗心大佬聊跨端职业发展
宗心大佬最后还是劝诫我不要只在意技术方面的进步,能走的更远需要的不只是你的技术能力,更多的是综合能力,甚至是平衡生活和家庭的能力。
查看原文:闲鱼宗心大佬聊跨端职业发展
我们要做的是学习大佬的习惯、学习方法、对于技术框架的架构以及技术的前瞻性。

两篇材料都涉及作者的技术成长路径,但时间与语境不同。2020 年中总结记录的是作者在郑州求职时观察到 RN 岗位少、Vue 岗位多,最终进入 React 技术栈公司并独立负责基于 umijs 的中台项目;2023 年的访谈文章则记录作者以跨端方向为职业目标,向宗心请教 Flutter 与 RN 选型、专家指标和全栈边界。前者是求职与项目经历的回顾,后者是职业规划问答,二者不能互相证明技术判断的变化。

查看原文:2020 年中总结
本人找工作的base是郑州,一个互联网三线城市。刚开始主动打招呼的和海投回应的都很多,9成都是 Vue 开发,甚至需要维护 jquery 项目。我心想还是主动投投 React Native 岗位吧,现实再次打了我的脸,郑州这边 RN 岗位两个手数的过来,并且范围都是 8-10K,甚至 4-8K。
查看原文:2020 年中总结
新公司入职有两个月了,独立负责了两个不大的中台项目,技术栈是基于 umijs 的,而 umijs 基于 dva、antd、react-router,而 dva 又基于 redux。两个项目下来,我的水平停留在了熟练基于 umijs 开发业务。
查看原文:闲鱼宗心大佬聊跨端职业发展
嗯,技术专家是紫升目前努力的方向,也制定了一系列的目标和计划。但是我并不知道这些目标和计划是否正确!
查看原文:闲鱼宗心大佬聊跨端职业发展
我从 18 年开始做 React Native 开发,积淀了很多业务开发知识和架构工程化方面的能力。一直在我心里过不去的坎是原生开发能力的欠缺。

关于全栈与原生能力,文中记录宗心的建议是:前端不必精通后端细枝末节,而应培养解决问题的通用能力,把安身立命的前端深度做扎实;原生开发可以学,起 Demo 了解运行与开发方式即可,目标是做懂客户端的大前端,而不是放弃前端转向客户端。作者据此决定暂缓 Deno、Rust 学习,保留 Go 作为编译语言来解 JS 的毒,并明确原生“要懂而不是什么都会”。这些是作者在访谈后的个人取舍记录。

查看原文:闲鱼宗心大佬聊跨端职业发展
紫升你思考一下你作为一个前端真的需要精通后端吗?你需要的不是精通那么多后端细枝末节,而是培养自己解决问题的通用能力。
查看原文:闲鱼宗心大佬聊跨端职业发展
我建议你去学一下 iOS 和 安卓开发,起 Demo 玩一玩知道怎么运行的,如何开发的。
查看原文:闲鱼宗心大佬聊跨端职业发展
但是宗心大佬还是告诫我一定要知道自己安身立命的东西是什么,不要忘记初心。不管是就业形势还是职业发展我更希望你能做一个懂客户端的大前端,而不是放弃前端往客户端突破。
查看原文:闲鱼宗心大佬聊跨端职业发展
虽然还是很不舍,但我不得不逼自己暂时放弃 Deno、Rust 的学习。之所以要坚持 Go 的学习是因为我需要一个编译语言来解 JS 的毒,而 Go 足够简单不会对我造成太大的负担。

现有材料中,作者对 Flutter 与 RN 的判断主要来自访谈转述和感悟,缺少作者本人对具体项目选型的决策记录;同时,2020 年总结中的求职与项目经历与 2023 年访谈中的职业规划之间,资料没有提供明确的转变节点或本人对转变的说明。若要继续探讨,可追问:作者在涂鸦“一码多端”小组中的实际参与程度如何,以及其跨端专家目标后来是否有可核对的进展记录。

查看原文:闲鱼宗心大佬聊跨端职业发展
其实,在涂鸦也有相应的小组在做同样的事情,在我们的沟通里叫一码多端。也是基于 Flutter 实现一套代码多端运行。这在跨端领域可以说是炙手可热的话题了。
查看原文:闲鱼宗心大佬聊跨端职业发展
嗯,技术专家是紫升目前努力的方向,也制定了一系列的目标和计划。但是我并不知道这些目标和计划是否正确!

Skill

覆盖 2/2 份来源 · 模型归纳

两篇文章都把 Agent Skill 的边界问题落在“上下文从哪里来、谁拥有决策与证据”上,而不是命令能否连续执行。平台与发行版拆分一文主张按所有权拆 Skill:平台团队读平台源码、基线与 package manifest,交付证据是测试、tarball 与 registry readback;发行版团队读 Profile、lock、产品 workspace 与受控凭据,交付证据是 native artifact、签名回读、CDN 与旧客户端升级。LLM Wiki 一文则把稳定流程留在 Skill,把持续变化的业务知识移入知识库,由 Raw Sources 保存不可被 AI 改写的事实源,Wiki 作为可重建的中间层,Schema 约束页面类型、回源条件与审核规则。两者共同点是拒绝让 Agent 在模糊上下文中自行推断交付状态或事实口径。

查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
一句话总结 Skill 应该按“谁拥有决策和证据”拆分,而不是按“这些命令能不能连着执行”拆分。平台开发与发行版开发之间,最重要的产物是已发布、精确版本锁定的 package,而不是共享一个工作目录。
查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
平台 Skill 放在平台仓库的 .codex/skills/,含义是:它服务这个仓库的维护者,不应被产品安装、CI 或运行时依赖。发行版 Skill 则面向拥有产品配置和交付责任的工程。两者可以引用同一套平台契约,但不能共享“直接读取平台源码”这条捷径。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
这一层的核心约束是:AI 可以读取,但不能把自己的总结反向覆盖原始事实。任何 Wiki 页面和 Agent 答案都应该能够回到具体 Source、版本和位置。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
对 Agent Skill 来说,合理的边界也因此更清楚:稳定方法写进 Skill,稳定规则留在 Reference,变化中的事实进入知识库,执行中得到的经验经过审核后再反哺事实源。

两篇文章对“静态 Reference 是否够用”给出了不同适用条件。平台拆分文认为,如果工作只发生在一个产品仓库,且没有跨仓发布或受控凭据边界,暂时不必为了形式拆 Skill;真正要关注的是 Agent 是否会因错误上下文和依赖方向得出无法被交付证据支撑的结论。LLM Wiki 文则把静态 Reference 的失效条件限定为知识规模变大、变化变快、存在多版本冲突或需要跨任务复用校准结论;资料规模小、规则稳定、任务复用率低时,几份静态 Reference 已能清楚覆盖。差异在于前者按所有权与证据分叉判断是否拆 Skill,后者按知识变化频率与复用需求判断是否引入知识库。

查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
如果工作只发生在一个产品仓库,且没有跨仓发布或受控凭据边界,暂时不必为了形式拆 Skill。真正需要关注的是:Agent 是否会因为错误的上下文和依赖方向,做出无法被交付证据支撑的结论。
查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
四个答案相同,通常可以留在一个 Skill 里。只要其中一个答案分叉,特别是出现“平台已发布 package”与“产品已签名 artifact”两种证据时,就应该拆开。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
如果继续扩充静态 Reference,Skill 会逐渐变成一个难以维护的资料压缩包。知识更新需要修改 Skill,Skill 发布又和知识变更绑定;资料越多,Agent 每次加载的 Context 越大,真正需要的内容反而更难命中。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
可以再等:资料规模小、规则稳定、任务复用率低,几份静态 Reference 已经能够清楚覆盖。

在依赖与验收约束上,平台拆分文给出三条可检查规则:发行版只消费 registry 中已发布的精确 package,禁止 file:、link:、workspace:、本地 tarball、sibling lookup 或跨仓 symlink;产品专属内容留在产品侧;交付状态必须拆开记录,测试通过、package 已发布、产品已构建、签名完成、CDN 可读、更新通道已激活、旧客户端成功升级分别是不同事实。LLM Wiki 文则用四个硬门槛约束知识底座:Wiki 不能替代事实源,Citation 与 Revision 必须进入查询协议,权限必须早于召回,评测不能只看代码生成比例。前者约束的是依赖方向与交付证据,后者约束的是知识来源、版本与权限,二者都把“可回查的证据”作为 Agent 结论成立的前提。

查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
第一,发行版只消费 registry 中已发布的精确 package。禁止 file:、link:、workspace:、本地 tarball、sibling lookup 或跨仓 symlink。这样能强迫每次采用都经过版本、锁文件和干净安装。
查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
第三,交付状态必须拆开记录。测试通过、package 已发布、产品已构建、签名完成、CDN 可读、更新通道已激活、旧客户端成功升级,分别是不同事实。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
Wiki 是可重建的知识产物。删除 Wiki 后,系统应该能够从 Raw Sources 重新编译;删除 Raw Sources 后,只剩 Wiki 就失去了可信根基。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
知识编译不能绕过原始权限。Source、Wiki 页面和查询结果都要继承 Scope 与 Permission,过滤应该发生在召回和生成之前。

LLM Wiki 文把知识维护拆成 Ingest、Query、Lint 三个稳定操作,并强调增量更新比全量重建更重要。Ingest 不只生成摘要,还要提取事实、实体、关系与适用范围,查找已有页面,标记冲突与待确认项,更新 index.md 与 log.md,并保留 Source Citation。Query 默认先读 Wiki,遇到字段口径、时间范围、过滤条件等精确事实,可能被新版本替代的结论,会影响代码生成或生产任务的关键规则,以及标记为冲突或低置信度的内容时,再回查 Raw Sources。Lint 检查命名不一致、新旧页面矛盾、缺少来源或 Revision、孤岛页面、重要实体缺少独立页面,以及 Source 已更新而 Wiki 仍停留在旧版本。结构检查可自动执行,涉及业务语义的冲突应进入人工审核。

查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
一次 Ingest 不应该只生成摘要。完整流程至少包括: text 读取新 Source → 提取事实、实体、关系与适用范围 → 查找已有相关页面 → 新增或更新 Wiki 页面 → 标记冲突与待确认项 → 更新 index.md 与 log.md → 保留 Source Citation 增量更新比全量重建更重要。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
Query 的默认路径是先读取 Wiki,快速定位主题、实体和已有综合结论。遇到下面几类内容时,再回到 Raw Sources 核验: - 字段口径、时间范围、过滤条件等精确事实; - 可能已被新版本替代的结论; - 会影响代码生成或生产任务的关键规则; - Wiki 中明确标记为冲突或低置信度的内容。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
结构检查可以自动执行;涉及业务语义的冲突,应该进入人工审核,而不是让模型自行决定哪一方是真相。
查看原文:从静态 Reference 到 LLM Wiki:让 Agent Skill 拥有可持续演进的知识底座
这里最重要的变化,是 Skill 从“知识容器”变成“知识消费者和执行编排器”。领域知识可以独立演进,Skill 只需要保持操作协议稳定。

agent-browser

覆盖 2/2 份来源 · 模型归纳

两篇材料都把“观察”与“动作/结果核验”分开:AX 文章强调 Accessibility Tree 是带损失的信息投影,能提供角色、名称、状态等语义,但不保证对象在视口内、未被遮挡,也不保证声明与实现一致;agent-browser 文章则把 snapshot 视为观察接口,把 click 等视为动作接口,并指出动作成功不等于业务结果完成。两者共同点是语义观察可支撑受控任务,但都需要额外的完成条件与重新观察。

查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
这是一种有明确损失的信息投影:布局装饰通常被省略,纯颜色含义可能缺失,未挂载的数据不会自动出现。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
Agent 可以从可靠语义知道目标及状态,但无法凭一条 role 或 aria-expanded 保证页面实现与声明一致。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
网页上的某次点击成功,只能证明一个动作完成了,距离回答用户的问题还差一次结果核对。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
重新观察的目的包括获取可用引用,也包括更新决策证据。即使 @e1 仍然有效,页面条件也可能已经不允许继续执行原计划。

agent-browser 的引用机制把观察与动作对应起来,但引用不是业务身份。该快照文档声明,引用与节点、frame 和文档关联,后续命令可据此定位;同时页面或 iframe 导航、元素替换会影响引用有效性,虚拟无障碍节点的引用只适用于当前快照。因此执行涉及具体对象的动作前,仍需核对书名、商品规格、订单号等任务条件,不能仅凭引用仍可解析就认定业务对象未变。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
生成引用时,后台保留引用与节点、frame 和文档的关联;后续文本中出现的 @e1 因而能回到浏览器中的具体目标。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
页面或 iframe 导航、元素替换会影响引用有效性。没有对应 DOM 节点的虚拟无障碍节点,其引用只适用于当前快照。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
稳定的节点引用也不能独立证明业务对象没变。列表可能复用同一个 DOM 容器展示另一条记录;“购买”按钮可能仍然存在,但页面当前商品已经不同。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
引用省去了为每一步重新编写 selector 的工作,但它不是商品 ID、订单号,也不是跨页面永久有效的地址。

观察范围的选择会直接影响任务验收。agent-browser 文章指出 snapshot -i 偏向可引用的操作目标,适合找输入框、链接和按钮,但“有货”这类普通结果文字可能被排除;检查业务结果时需要保留相关正文、状态或表格内容,不能把交互快照里没出现理解为页面没有。AX 文章也提醒虚拟列表的总行数、行索引不能代表未挂载行的内容,滚动、翻页或筛选后仍要重新观察。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
snapshot -i 偏向可引用的操作目标,“有货”这样的普通结果文字可能被排除;某些标题和表格单元格能够留下,也不保证所需字段完整。找动作目标时可以压缩观察,检查业务结果时则需要保留相关正文、状态或表格内容,不能把“交互快照里没出现”理解为“页面没有”。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
虚拟列表还需要额外关注观察范围。总行数、行索引不能代表未挂载行的内容;滚动、翻页或筛选后仍要重新观察。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
snapshot -i 偏向可引用的操作目标,适合先找输入框、链接和按钮;具体保留范围见后文的裁剪说明。

两篇文章对版本与实现路径都作了限定。agent-browser 文章区分了本站 AX 文章核验的 @mastra/agent-browser 0.4.1 与 agent-browser 0.19.0 组合(通过 Playwright ariaSnapshot() 生成工具快照),以及该文核验的上游 0.41.1 Chrome 原生路径(直接读取 CDP AX Tree),并提醒工具名和命令相似不能代替对依赖版本及真实调用链的检查。AX 文章同样把“原生 AX-only 观察”与“ARIA snapshot-only 观察”列为不同实验,并说明其 Demo 采用原生 AX 观察与动作,但未实现平台 AX 的默认动作。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
本站只用 Accessibility Tree,浏览器 Agent 能走多远?核验的是 @mastra/agent-browser 0.4.1 与 agent-browser 0.19.0 的组合,那条路径通过 Playwright ariaSnapshot() 生成工具快照。本文核验的上游 0.41.1 Chrome 原生路径直接读取 CDP AX Tree。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
工具名和命令相似,不能代替对依赖版本及真实调用链的检查。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
原生 AX-only 观察 CDP 返回的角色、名称、值、状态、父子关系 从语义引用重新定位、检查可操作性并执行 Demo 采用
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
Chromium 的原生 Accessibility 系统支持辅助技术发起默认动作、聚焦、改变值与滚动。CDP 的 Accessibility 域则主要提供查询和事件,并没有通用的 click、fill 接口。

现有材料留下一个可继续探讨的问题:在第三方站点缺少必要语义、或同名控件无法消歧时,是应修复页面语义、扩展带范围的定位,还是明确转入混合观察并报告受阻?AX 文章提出采用前检查目标可观察、可区分、动作受支持、结果可验证四个条件,并建议不满足时如实记录实验条件;agent-browser 文章也建议无法确认时停止操作。但两篇材料均未给出跨站点、跨版本的统一判定阈值或已完成对照结果。

查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
面对第三方站点,应先检查真实任务中的关键控件,再决定是否坚持这条路线。缺少必要语义时,可以明确转入混合观察,也可以保持 AX-only 并报告受阻;两者都需要如实记录实验条件。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
出现多个同名按钮 补充行、区域或业务字段以消歧;无法确认时停止操作
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
评估接入价值时,我会先看三项条件:页面语义是否足够表达目标,引用与页面状态能否持续对应,以及结果是否有可检查的完成标准。

按任务缩小观察时,需要同时保留动作目标与上下文、业务对象身份、结果与约束证据。不能点击的库存、规格和错误文字仍可能决定验收;证据不足时扩大范围或取消过滤,不能从按钮出现推断任务完成。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
过滤后即使标题和购买按钮都留下了,库存文字仍可能消失。按钮可以定位,只说明存在一个动作目标,不能据此回答“有货”。裁剪策略至少要保住当前任务需要的三类信息:
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
1. 动作目标与上下文:输入框、按钮、关联标签及所属区域,避免同名控件之间失去区分。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
2. 业务对象身份:书名、版本、规格及结果行的对应关系,避免把其他对象的库存接到当前对象上。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
3. 结果与约束证据:库存、价格、加载状态、禁用或选中状态、错误提示及失败原因。

agent-browser 的核心定位是面向 AI Agent 的浏览器自动化 CLI,基础命令通常由上层决策调用。0.41.1 另有可选 chat 模式,配置模型后将自然语言转成命令;CLI/SDK 的接入形式与 Agent 的决策职责应分别判断。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
agent-browser 的核心定位是面向 AI Agent 的浏览器自动化 CLI
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
0.41.1 也提供可选的 agent-browser chat:配置模型后,将自然语言转成命令并执行。

前端工程化

覆盖 2/2 份来源 · 模型归纳

两篇文章都把代码规范与提交规范作为工程化的基础层,但组织方式不同:一篇以单项目为对象,用 EditorConfig 统一跨编辑器风格,用 ESLint(基于 airbnb 扩展并叠加 react-native、typescript、prettier 插件)与 Prettier 约束代码,再用 husky 的 pre-commit 钩子执行 tsc --noEmit 与 lint-staged;另一篇在组件库场景下改用 yorkie 配置 commit-msg 与 pre-commit 钩子,并直接复用作者自建的 @youngjuning/eslint-config 与 @youngjuning/prettier-config。共同点是都把 lint 与格式化前移到提交阶段,差异在于钩子工具选择(husky 对 yorkie)以及配置是自建共享包还是项目内联。

查看原文:前端规范化开发实践
"husky": { "hooks": { "pre-commit": "tsc --noEmit && lint-staged" } }, "lint-staged": { "/.{js,jsx,ts,tsx}": [ "eslint --fix", "git add" ], "/.{md,json}": [ "prettier --write", "git add" ] }
查看原文:前端规范化开发实践
作者自己团队的 ESLint 方案是基于 eslint-config-airbnb 扩展的,有兴趣可以体验一下 @sishuguojixuefu/eslint-config
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
"gitHooks": { "commit-msg": "commitlint -e -V", "pre-commit": "lint-staged" }
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
vant-react-native 暂时使用 @youngjuning/eslint-config、@youngjuning/prettier-config 约束项目代码规范。

在版本与发布自动化上,两篇都采用 Conventional Commits 作为版本推导与 CHANGELOG 生成的输入,但落点不同:单项目文章用 commitlint 校验提交信息,并用 standard-version 完成版本号更新、CHANGELOG、打 tag 与推送发布;组件库文章则在 lerna 的 version 配置中开启 conventionalCommits 与固定发布消息,由 lerna 统一决定各包版本升级并生成 CHANGELOG。前者面向单一包的一次性发布流程,后者面向多包仓库的独立版本管理。

查看原文:前端规范化开发实践
standard-version 是一款遵循语义化版本( semver)和 commit message 标准规范 的版本和 changlog 自动化工具。
查看原文:前端规范化开发实践
"commitlint": { "extends": [ "@commitlint/config-conventional" ] }, "husky": { "hooks": { "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" } }
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
当配置 conventionalCommits 为 true 后,lerna 版本将使用 Conventional Commits Specification 来确定版本升级并 生成 CHANGELOG.md 文件。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
组件级别解耦,独立版本控制,每个组件都有版本记录可追溯

组件库文章给出的多包架构取舍是:用 lerna 管理 monorepo,并以 yarn workspaces 配合 useWorkspaces 实现依赖提升,在根目录统一管理依赖以节省时间与空间;子包按组件拆分(如 button、icons),主包只负责统一导出。该架构的代价体现在调试与构建顺序上:子包之间存在依赖,批量构建时不能用 --parallel 并行执行打包脚本;实时编译时又必须用 --parallel 运行 dev,并预先编译 icons 包,再用 npm-run-all 并行启动 lerna run dev 与 react-native start。这说明多包解耦带来的独立发布能力,需要以更复杂的构建编排为交换。

查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
使用 yarn workspaces 结合 Lerna useWorkspaces 可以实现 Lerna Hoisting。这并不是多此一举,这可以让你在统一的地方(根目录)管理依赖,这即节省时间又节省空间。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
由于子包之间有依赖关系,不要使用 --parallel 参数并行执行打包脚本。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
"predev": "lerna run build --scope @vant-react-native/icons", "dev": "lerna run dev --parallel", "start": "react-native start", "debug": "run-p dev start",
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
组件单独发布,支持灰度、版本回滚以及平滑升降级

图标与文档两条支线展示了具体工具约束。图标方面,文章对比了 ttf 字体方案(每次更新需重新打包 APP、不支持多色、react-native-vector-icons 内置字体约 2M 仍会打包进 APP)与 react-native-iconfont-cli 方案(纯 JavaScript 转换、不依赖 ttf、不需手动下载图标),并因图标产物不入 git 而在发布前用 prepublishOnly 触发构建。文档方面,用 dumi 配合 dumi-theme-mobile 与 umi-plugin-react-native 搭建可交互 Demo,dumi 默认以 packages/[包名]/src 搜寻子包 Markdown,且因实际依赖 packages 下的包,部署前必须先编译所有包,否则报依赖未找到错误。

查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
使用 ttf 字体有一个弊端,就是每次更新图标,都要相应的更新 ttf 文件,然后再次打包发布 APP。而且 ttf 不支持多种色彩的图标,导致所有图标都是单色。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
fwh1990 大佬针对以上痛点用纯 Javascript 实现 iconfont 到 React 组件的转换操作,不需要依赖 ttf 字体文件,不需要手动下载图标到本地。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
由于实际依赖的是 packages 下的包,我们必须先编译所有的包,否则部署的时候会报 This dependency was not found: 的错误。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
Dumi 是支持 Lerna 仓库的,它默认会以 packages/[包名]/src 为基础路径搜寻所有子包的 Markdown 文档并生成路由。

现有材料中,组件库文章提到 @youngjuning/eslint-config 计划也用 lerna 管理并产出 react、react-native、vue 三个包,但未说明该计划是否落地;同时按需加载部分明确当前只是函数导出的配置而非真正插件,未来定制独立 babel 插件也属计划。这些计划性表述与已完成的配置之间边界如何,在现有资料下无法确认,可作为后续可继续探讨的问题。

查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
@youngjuning/eslint-config 计划也用 lerna 管理,产出 @youngjuning/eslint-config-react、@youngjuning/eslint-config-react-native、@youngjuning/eslint-config-vue 让开发者无需过多配置开箱即用。
查看原文:每个前端都值得拥有自己的组件库,就像每个夏天都拥有西瓜🍉
所以未来我会定制一个 vant-react-native 自己的按需加载 babel 插件。

Swift

覆盖 3/3 份来源 · 模型归纳

在 Owlet 的并发崩溃复盘中,作者把 @unchecked Sendable 定义为关闭编译期并发检查的逃生舱,而非运行时保护:sessionEntryCache 是普通 Dictionary,没有锁、串行队列或 actor 保护,两个 Task.detached 触发的刷新可能并发进入同一 adapter 实例的 discoverSessions(),同时读写该字典并破坏堆内存,崩溃点还会飘到无关线程。

查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
@unchecked Sendable 是一个逃生舱:它告诉编译器"这个类型我人工审计过了,线程安全我自己保证,你不用检查"。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
sessionEntryCache 是一个普通的 Dictionary,没有锁、没有串行队列、没有 actor,什么保护都没有。@unchecked Sendable 关掉了编译器的并发检查,于是这个隐患一路绿灯上了线。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
Thread 4 把字典的底层存储写坏,破坏的是共享的堆。此后任何线程在任何位置做一次内存访问,都可能踩到那片被污染的区域,然后随机崩溃。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
当两次刷新时间上挨得很近(比如启动时 bootstrap 和文件监听几乎同时发生),两个 detached task 就并发进入了同一个 adapter 实例的 discoverSessions(),一起写那个没有任何保护的字典。

该复盘的架构取舍在于锁的粒度:discoverSessions() 对 cache 的访问是 read-modify-write,读出旧 offset、增量解析文件、再写回新 offset;若只对每次字典下标访问加细粒度锁,两个线程可能读到同一 offset,导致重复计入 Token 用量。作者因此用 NSLock 锁住整趟 discoverSessions pass,并指出持锁做磁盘 I/O 的等待可被热缓存抵消。

查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
细粒度锁保护了"每一次字典操作"的原子性,却没保护"读—改—写"这个序列整体的原子性。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
这里的不变量是"cache 里的 offset 必须和已经解析进去的字节严格对应"。要维持它,整个 discoverSessions() pass 必须串行执行。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
第二个调用等第一个做完之后拿到锁,此时 cache 已经是热的,绝大多数文件的 mtime / fileSize 都没变,直接命中缓存、零 I/O 秒回。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
编译器无法证明你两者之间没有 await,于是干脆禁止在 async 上下文里裸用 lock()/unlock()。

同一篇复盘还记录了第二个确定性崩溃:leftoverData 是不断追加、扫描后 removeFirst 的 Data buffer,而 Swift Data 的 index 是绝对的,removeFirst(n) 后 startIndex 前移到 n 而非归零;第二次扫描仍用字面量 0 索引便越界触发 SIGTRAP。作者据此提出切片类型一律从 startIndex 起遍历,并给出 actor、NSLock + withLock、读写锁/原子类型、@unchecked Sendable 加注释的选择顺序。

查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
Swift Data 的 index 是绝对的。removeFirst(n) 之后,它的 startIndex 会前移到 n,而不是回到 0。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
这不是偶发的并发时序问题,是个确定性 bug:只要有一个 Claude 会话在跑、它的 JSONL 被追加写入两次,就必崩。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
Data、ArraySlice、Substring 的 startIndex 随时可能不是 0,尤其在 removeFirst / 切片之后。遍历用原生 index,不用 Int 硬编码。
查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
看到 @unchecked Sendable,就当成一个待验证的 TODO。 它旁边必须有一句注释说明"靠什么保证线程安全"(哪把锁、哪个串行队列、哪个 actor)。

Bundle.module 首启崩溃的复盘显示另一类约束:SwiftPM 为带资源的 target 合成 Bundle.module,找不到资源包时直接 fatalError;纯 SPM 的 macOS app 手动组装成 .app 后,资源包位于 Contents/Resources/ 而可执行文件在 Contents/MacOS/,默认候选路径失效。作者已有 AppResourceBundle 兜底封装,但 8 处资源加载中排名图标一处直接用了 Bundle.module,且 guard let 的 nil 兜底无法拦截表达式求值时的 fatalError。

查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
注意最后一行:找不到资源包,它不给你 fallback,直接 fatalError。
查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
当你手动把可执行文件塞进 Owlet.app/Contents/MacOS/、把资源包塞进 Contents/Resources/ 时,布局对不上,Bundle(url:) 在它预设的候选路径里全部返回 nil,于是走到最后一行崩掉。
查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
全项目一共 8 处加载资源,其中 7 处都规规矩矩用了 AppResourceBundle.module:hook 脚本、app 图标、菜单栏猫头鹰、Dashboard 图片、本地化 bundle……唯独排名图标这一处漏了网
查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
但崩溃发生在 Bundle.module 这个表达式被求值的瞬间,压根轮不到 .url(...) 返回 nil。

两篇崩溃复盘共享同一诊断方法:从 crash log 反推根因,并强调开发机与用户机环境差异会掩盖问题。差异在于故障性质与防线:并发字典崩溃是时序相关、崩溃点会飘,需认准 triggered 线程并让锁对齐不变量;Bundle.module 崩溃是首启必现的确定性 fatalError,编译器无法区分 Bundle.module 与 AppResourceBundle.module,作者主张用 CI lint 禁止裸用危险 API,把“记得用封装”变成“想漏都漏不掉”。

查看原文:@unchecked Sendable 骗过了编译器:一次 Swift 并发字典崩溃复盘
崩溃日志里"触发信号的那个线程"(triggered: true)才是凶手,其他线程往往只是受害者。
查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
Bundle.module 和 AppResourceBundle.module 类型一样、API 一样、调用方式一样,编译期没有任何区别。
查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
至少可以加一条 lint / grep 规则,在 CI 里扫「除了 AppResourceBundle.swift 之外任何文件出现裸的 Bundle.module」直接 fail。
查看原文:打包后 Bundle.module 直接崩:一个 SPM app 首启必崩的资源陷阱
凡是「开发机好好的、用户机崩」的 bug,第一反应就去查运行环境差异——资源布局、签名方式、路径假设、权限。

Owlet 总览文章交代了项目背景与协作方式:作者用 Claude Code 负责架构、长上下文和需要判断力的重构,Codex 负责快速试错和小范围实现,自己负责拍板与验收;项目是常驻菜单栏 app,含菜单栏图标、灵动岛面板、dashboard 和桌面灵动卡。性能规则包括 Dispatch Source 文件监听、JSONL 增量读取、动画门控和数据库 upsert,并被写入 CLAUDE.md 与 AGENTS.md。这些是作者自述的协作与工程安排,不构成对具体崩溃修复归属的证明。

查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
Claude Code 负责架构、长上下文和需要判断力的重构;Codex 负责快速试错和小范围实现;我负责拍板、验收和把家乡青山湖的颜色塞进 UI。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
文件监听用 Dispatch Source,而不是轮询。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
JSONL 增量读取。 50 MB 的会话日志不应该造成 50 MB 内存峰值。ClaudeCodeAdapter 用 (mtime, fileSize, byteOffset) 做缓存,文件增长时只读新增 bytes。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
这些规则都被写进了 CLAUDE.md 和 AGENTS.md,成为后续所有改动的底线。

vibe coding

覆盖 2/2 份来源 · 模型归纳

LLM wiki 方案的关键约束是分层与成本:CLAUDE.md 每次会话自动加载,因此只放最高优先级、最稳定的全局约束;skill 平时不占上下文,命中触发词才按需加载,因此可以写得详细;博客承载“为什么这么做”的判断框架,并作为公开层供他人检索。作者还提出三条硬要求:可执行而非描述、有明确触发条件、能被 ground truth 校验,并把提交推送必须以 git 真实输出为准写成自我校验规则。

查看原文:我在给自己建一个 LLM wiki
skill 是按需加载的操作手册。 它平时不占上下文,只有当任务命中触发词("做 mac 应用图标"、".icns")才被拉进来。
查看原文:我在给自己建一个 LLM wiki
1. 可执行,不是描述。 别写"记得处理透明背景",直接给能跑的脚本 + 参数 + 兜底分支。
查看原文:我在给自己建一个 LLM wiki
涉及提交推送,一律以 git rev-parse、git status、git show 的真实输出为准,绝不用中间回显下结论。
查看原文:我在给自己建一个 LLM wiki
"这次用了方案 A"没价值;"因为 X 约束所以选 A、代价是 Y"才能迁移到下一个场景。

Owlet 项目的架构取舍集中在常驻应用的资源约束与系统边界:文件监听用 Dispatch Source 而非轮询,JSONL 采用 (mtime, fileSize, byteOffset) 增量读取以避免大日志造成内存峰值,动画按 active session 存在与否门控,数据库用 upsert 而非 deleteAll + insert。这些规则被写进 CLAUDE.md 和 AGENTS.md 作为后续改动底线。UI 上则把刘海面板、桌面灵动卡等拆成多块表面,各自处理 NSPanel 圆角、多屏、透明度与 AppKit window level 等边界问题。

查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
文件监听用 Dispatch Source,而不是轮询。 之前有些实现会 sleep-loop 检查 active session,我全部砍掉了。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
ClaudeCodeAdapter 用 (mtime, fileSize, byteOffset) 做缓存,文件增长时只读新增 bytes。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
这些规则都被写进了 CLAUDE.md 和 AGENTS.md,成为后续所有改动的底线。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
最后定位到问题不在业务逻辑,而在 AppKit window level、NSPanel、系统材质和透明圆角叠加后的边界行为。

现有材料中,LLM wiki 的分层规则与 Owlet 的性能底线都被写入 CLAUDE.md/AGENTS.md,但两篇文章没有说明这些规则在后续会话中实际被加载、触发和校验的频率与效果;也没有记录触发词写错或规则放错层后如何被发现和修正。这些可作为继续探讨的问题,而非既定事实。

查看原文:我在给自己建一个 LLM wiki
写了没触发词 = 白写。 skill 描述里不写"mac 应用图标 / .icns",下次问"帮我做个应用图标"时它根本不会被加载。
查看原文:我在给自己建一个 LLM wiki
把一次性的操作细节塞进 CLAUDE.md,每次会话都要为它付上下文成本。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
这些规则都被写进了 CLAUDE.md 和 AGENTS.md,成为后续所有改动的底线。

Browser Agent

覆盖 2/2 份来源 · 模型归纳

两篇都区分“动作成功”与“任务成功”,但给出的检查路径不同。第二篇以查库存为例,指出 snapshot -i 偏向可引用的操作目标,普通结果文字可能被排除,检查业务结果时需要保留正文、状态或表格内容;动作失败或超时未知时,应先检查页面是否已变化,尤其提交、支付、删除不能仅凭未收到成功响应就重复执行。第一篇则提出采用前检查四个条件:目标可观察、目标可区分、动作受支持、结果可验证,不满足时应修复语义、扩展定位、补齐执行器支持或保留受阻状态。两者共同反对把调用成功当作业务结果,差异在于前者偏任务执行循环的验收,后者偏 AX-only 路线的适用条件。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
snapshot -i 偏向可引用的操作目标,“有货”这样的普通结果文字可能被排除;某些标题和表格单元格能够留下,也不保证所需字段完整。找动作目标时可以压缩观察,检查业务结果时则需要保留相关正文、状态或表格内容,不能把“交互快照里没出现”理解为“页面没有”。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
若请求超时而动作效果未知,应先检查页面是否已经发生变化。尤其是提交、支付、删除等操作,不能仅凭未收到成功响应就重复执行。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
目标可观察 必要控件和字段是否出现在语义表示中? 修复页面语义,或明确采用其他观察方式
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
结果可验证 参数与业务结果能否通过 AX 再次确认? 保留受阻或未验证状态,不以调用成功替代业务结果

两篇都提醒不要把语义属性当成行为本身。第一篇用原生 button 与 role="button" 对比,指出后者不会自动添加 Enter/Space 激活、事件处理或禁用逻辑;disabled、aria-disabled、readonly、aria-hidden 各自改变不同东西,aria-expanded 与 aria-invalid 也必须随真实界面更新。第二篇则从工具实现角度说明,snapshot 内部还包含 DOM 范围解析、可点击线索补充等处理,不能把漫画理解为纯 AX-only 约束。共同点是“声明”与“实现”之间存在缺口;差异在于前者关注页面语义质量对 Agent 观察的影响,后者关注工具在 AX 之外还做了哪些工程处理。

查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
role="button" 不会自动添加 Enter/Space 激活、事件处理或正确的禁用逻辑。可用原生 button 时,优先直接使用。否则 AX 中有 button,也可能遇到“按键没有反应”的实现缺口。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
原生 disabled 在支持它的控件上具有实际禁用行为,通常也使其退出 Tab 顺序;单独 aria-disabled 只传达不可用状态,不自动阻止事件。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
读取 AX Tree 也不代表整套工具只使用 AX 信息:当前实现还包含 DOM 范围解析、可点击线索补充等处理,不能把这张漫画理解为纯 AX-only 约束。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
点击“更多筛选”时,脚本需同时更新内容是否显示和 aria-expanded。aria-controls 只表达控制关系,不会自动把按钮连成可工作的折叠组件。

两篇都涉及版本与实现边界,但结论范围不同。第二篇明确其核验的是 2026 年 11 月 1 日的上游 0.41.1 版本与 Chrome/CDP 默认路径,并指出另一篇文章核验的是 @mastra/agent-browser 0.4.1 与 agent-browser 0.19.0 的组合,那条路径通过 Playwright ariaSnapshot() 生成工具快照;工具名和命令相似不能代替对依赖版本及真实调用链的检查。第一篇则把“ARIA snapshot-only 观察”与“原生 AX-only 观察”列为不同实验,并说明前者由工具生成角色、名称、状态和引用,后者由 CDP 返回语义数据。共同点是都要求说明实际收到哪种表示;差异在于第二篇给出了具体版本坐标,第一篇更侧重实验类型划分。

查看原文:漫画拆解 agent-browser:从网页快照到动作验证
本站只用 Accessibility Tree,浏览器 Agent 能走多远?核验的是 @mastra/agent-browser 0.4.1 与 agent-browser 0.19.0 的组合,那条路径通过 Playwright ariaSnapshot() 生成工具快照。本文核验的上游 0.41.1 Chrome 原生路径直接读取 CDP AX Tree。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
工具名和命令相似,不能代替对依赖版本及真实调用链的检查。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
ARIA snapshot-only 观察 工具生成的角色、名称、状态和引用 DOM 遍历、名称计算、Locator 用于解释现有工具
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
原生 AX-only 观察 CDP 返回的角色、名称、值、状态、父子关系 从语义引用重新定位、检查可操作性并执行 Demo 采用

现有资料下仍可继续探讨:在受控后台表单这类语义较完整的场景中,AX-only 观察作为可测量基线时,失败应如何归因到观察、候选构造、目标绑定还是结果验收;以及当页面缺少必要语义时,是转入混合观察还是保持 AX-only 并报告受阻,两种选择各自需要记录哪些实验条件。第二篇提出的四类变化检查——同名按钮、结果区域替换、弹窗遮挡、点击后仍在加载——可作为设计验收的起点,但资料未给出实际测试结果或性能对照,因此不宜据此推断降本或提速比例。

查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
语义完整、任务范围受控的后台表单,值得把 AX-only 观察作为可测量的基线。它能帮助判断一次失败发生在观察、候选构造、目标绑定还是结果验收,也会直接暴露页面语义质量问题。
查看原文:只用 Accessibility Tree,浏览器 Agent 能走多远?
缺少必要语义时,可以明确转入混合观察,也可以保持 AX-only 并报告受阻;两者都需要如实记录实验条件。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
这是建议的验收方法,不是本次已经完成的测试结果。
查看原文:漫画拆解 agent-browser:从网页快照到动作验证
后续若比较速度、token 或费用,还需要固定任务、页面状态和完成条件,并将失败与恢复过程计入;本文没有进行这样的性能对照,不据此给出降本或提速比例。

CLI

覆盖 2/2 份来源 · 模型归纳

两篇 CLI 文章都围绕命令行工具展开,但技术栈与分发方式不同:Go 项目基于 Cobra 框架,并强调将 CLI 打包成二进制以方便嵌入式开发者、无需本地安装运行环境;Node 项目则通过 package.json 的 bin 项指定可执行文件,并用 npm link 或 npm install -g 安装到全局环境。两者都涉及命令定义与交互输入,但 Go 侧使用 promptui 做选择提示,Node 侧使用 commander 定义指令、inquirer 处理交互问答。

查看原文:从零使用 Go 语言构建 CLI 项目
为了最大程度方便开发者(无需安装运行环境)我们们需要一个可以将 CLI 打包成二进制的方案。
查看原文:从零开发一个 Node Cli
使用 package.json 的 bin 项是用来指定各个内部命令对应的可执行文件的位置
查看原文:从零使用 Go 语言构建 CLI 项目
我用的爬虫插件是 colly,选择提示插件是 promptui。
查看原文:从零开发一个 Node Cli
我选择了 tj 大神的 commander

在模板初始化与文件处理上,两篇文章给出了不同实现路径:Go 项目通过 GitHub CI 在 tag 推送时打包发布模板 release,再爬取模板列表、用 net/http 下载、archiver 解压并复制到当前目录;Node 项目则用 recursive-readdir 递归读取文件、handlebars 做模板替换、fs 读写文件,并列出 ncp、download-git-repo 等辅助库。共同点是都依赖外部模板仓库与文件复制/替换流程,差异在于 Go 侧把模板发布与版本管理绑定到 GitHub release,Node 侧更侧重本地递归编译与拷贝。

查看原文:从零使用 Go 语言构建 CLI 项目
GitHub CI 监听到有新的 git tag 被 push 到仓库,则将所有模板打包并发布一个草稿版的 release
查看原文:从零使用 Go 语言构建 CLI 项目
我是使用 net/http 手撸了一个文件下载函数,然后使用 archiver 对压缩包解压到缓存目录,最后使用 copy 复制到当前目录。
查看原文:从零开发一个 Node Cli
利用 recursive-readdir 库递归读取项目所有文件
查看原文:从零开发一个 Node Cli
利用 handlebars 进行模板替换

Go 项目的技术选型记录了明确的排除理由:Node 方案因需要 NPM 安装和本地 Node 环境而不适合非前端开发者,oclif 因安装包过大和暴露源代码落选,pkg 因功能简陋被排除;Deno 因生态不完善、缺少成熟的跨平台编译与 Flag 解析等插件而未被采用;最终选择 Go 并借助其自带跨平台编译能力,用 build 脚本分别生成 Windows、Linux、macOS 二进制。这些理由属于该文作者对当时方案的判断,不等同于对其他项目适用性的普遍结论。

查看原文:从零使用 Go 语言构建 CLI 项目
Node 开发的 CLI 是需要通过 NPM 安装的,开发者需要在本地事先安装 Node 环境。
查看原文:从零使用 Go 语言构建 CLI 项目
它由于将 Node 环境打包进安装程序造成安装包过大以及直接暴露源代码落选了
查看原文:从零使用 Go 语言构建 CLI 项目
没有选择 Deno 的原因生态不够完善需要自己造的轮子有点多。
查看原文:从零使用 Go 语言构建 CLI 项目
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o ${name}.exe main.go

Cobra 的选型依据来自其特性清单:支持子命令、POSIX 长短标志、嵌套子命令、全局与级联标志、自动生成帮助与 bash 自动完成、命令别名,以及可选与 viper 集成。文章同时提到 urfave 更适合小型或单命令程序,说明框架选择与命令规模相关。项目总结中明确“暂未和 viper 联动,后续有需求可以加上”,因此 viper 集成在该文中属于可选能力而非已落地部分。

查看原文:从零使用 Go 语言构建 CLI 项目
urfave 比较简单易上手,如果是小型的或者单命令的程序推荐选择,我选择的是 cobra。
查看原文:从零使用 Go 语言构建 CLI 项目
自动为你的应用程序生成的 bash 自动完成
查看原文:从零使用 Go 语言构建 CLI 项目
可选与 viper 紧密集成,可用于 12factor 应用程序
查看原文:从零使用 Go 语言构建 CLI 项目
暂未和 viper 联动,后续有需求可以加上。

现有两篇文章分别描述 Go 与 Node 的 CLI 实现,但未提供同一项目跨语言版本的对照结果,也未说明二进制打包方案在嵌入式开发者实际使用中的反馈。后续可继续探讨:在需要隐藏源代码且面向非前端开发者时,二进制分发与 npm 全局安装各自的维护成本如何;以及 Cobra 的 viper 集成在何种需求下才值得引入。

查看原文:从零使用 Go 语言构建 CLI 项目
为了最大程度方便开发者(无需安装运行环境)我们们需要一个可以将 CLI 打包成二进制的方案。
查看原文:从零开发一个 Node Cli
在命令行输入 npm link 或 npm install -g 将当前项目安装到全局环境
查看原文:从零使用 Go 语言构建 CLI 项目
暂未和 viper 联动,后续有需求可以加上。

Git

覆盖 4/4 份来源 · 模型归纳

Git worktree 的核心边界是共享对象库而隔离工作目录:同一仓库可同时检出多个分支,每个工作目录有自己的分支、文件和未提交改动,但共享提交历史与对象数据库。它不替代 branch,branch 仍定义历史线,worktree 只是让多条历史线同时拥有可工作的文件系统。该机制不提供运行时隔离:端口、全局缓存、容器、数据库和远端环境仍可能冲突,同一分支也不能被两个 worktree 同时检出,大型依赖目录通常各自安装。

查看原文:Git worktree:AI 时代的并行开发工作台
一句话总结 git worktree 是同一个 Git 仓库的多个 checkout。每个 checkout 有自己的分支、文件和未提交改动,但共享提交历史与对象数据库。
查看原文:Git worktree:AI 时代的并行开发工作台
它不是替代 branch。branch 仍然定义历史;worktree 只是让多条历史线同时拥有可工作的文件系统。
查看原文:Git worktree:AI 时代的并行开发工作台
它们仍共享同一个仓库的 Git 对象库,不能把它当成权限隔离。
查看原文:Git worktree:AI 时代的并行开发工作台
同一分支不能被两个 worktree 同时 checkout;这是 Git 用来避免同一分支出现两份独立未提交状态的保护。

Stash 与 worktree 都用于临时切换任务,但保留现场的方式不同。Stash 把未完成改动寄存到本地,普通 push 默认不收未跟踪文件,需 -u 一并收纳;取回后普通 pop 不保证恢复原来的暂存划分,且 stash 不随普通 push 同步。worktree 则新增独立工作区,原目录的未提交修改不会自动出现在新目录,两边各有工作区、index 和 HEAD。选择依据是是否需要保留原现场:需要并行保留则用 worktree,只需临时收起则用 stash。

查看原文:Git 闯关记:从工作区到远端仓库的完整漫画
普通 git stash push 默认不收未跟踪文件,-u 把它们一并收纳,忽略文件仍默认留着。Pop 成功应用后移除条目;发生冲突时保留条目,先解决冲突,再决定是否删除。
查看原文:Git 闯关记:从工作区到远端仓库的完整漫画
两边有各自的工作区、index 和 HEAD,共享仓库对象与多数引用;原目录的未提交修改不会自动出现在新目录里。
查看原文:Git 闯关记:从工作区到远端仓库的完整漫画
临时换任务时,按是否需要保留原现场,在 Stash 和 Worktree 之间选择。
查看原文:漫画读懂 Zed Git 面板:Stage、Unstage 和 Stash
取回后重新检查 Diff 和暂存状态,不能假设 Zed 的 Pop 会恢复原来的 Staged / Unstaged 划分。Stash 不会随普通 Push 同步,也不能代替远端备份。

GitHub 443 连接失败发生在 HTTPS 建连阶段,尚未进入认证。排查顺序为 DNS 解析、本机代理、网络出口、Git 配置:浏览器能打开而 Git 失败时重点查 Git 代理配置,两者都失败则更可能是 DNS、代理客户端或网络出口问题。代理客户端退出或端口变化后 Git 仍可能尝试旧地址,确认不需要代理时应清除 http.proxy 与 https.proxy。hosts 写死 IP 只应作为明确、临时且可回滚的诊断手段,不是长期方案;HTTPS 策略不稳定且已配置 SSH key 时,可切换远程地址到 SSH。

查看原文:「已解决」Failed to connect to github.com port 443
执行 git push 或 git clone 时出现 Failed to connect to github.com port 443,表示连接还没到 GitHub 的认证阶段,就在 HTTPS 建连前失败了。
查看原文:「已解决」Failed to connect to github.com port 443
按“DNS 解析 → 本机代理 → 网络出口 → Git 配置”的顺序排查。hosts 只应作为明确、临时且可回滚的诊断手段,不是长期方案。
查看原文:「已解决」Failed to connect to github.com port 443
代理客户端退出、端口变化后,Git 仍会尝试连接旧地址。确认不需要代理时,清掉旧配置:
查看原文:「已解决」Failed to connect to github.com port 443
避免采用:从第三方网站抄 IP 后长期写 hosts。它可能短暂恢复访问,却会在下一次基础设施变更时再次失效。

现有资料中,worktree 的适用判断以“同时处理发布、修复、审查或多个 Agent 任务”为值得上的条件,以“仓库很小、任务严格串行、几乎没有未提交改动”为可以再等的条件,但未给出量化阈值或失败案例。另外,Zed 面板行为核对参考了固定版本源码,而截图未显示安装版本号,具体菜单以当前版本为准;不同 Zed 版本下 Commit Tracked 与 Stash Staged 的实际表现是否一致,仍可继续验证。

查看原文:Git worktree:AI 时代的并行开发工作台
值得上:你同时处理发布、修复、审查或多个 Agent 任务;你不想为了切分支 stash 半成品;你需要从一个干净 commit 产出可追溯制品。
查看原文:Git worktree:AI 时代的并行开发工作台
可以再等:仓库很小、任务严格串行,而且你几乎没有未提交改动。
查看原文:漫画读懂 Zed Git 面板:Stage、Unstage 和 Stash
行为核对于 2026 年 10 月 29 日,参考 Zed 官方文档及固定版本源码;截图未显示安装版本号,具体菜单以当前版本为准。

跨端开发

覆盖 2/2 份来源 · 模型归纳

两篇原文都把跨端开发放在具体项目与团队条件中描述:2020 年总结提到作者在上家公司写过小程序、参与公众号与基于 element 和 vue 的后台程序、用 React Native 开发业务并搞过 RN 项目架构;另一篇则回忆 2018 年夏天与两位同事组成“三剑客”开始用 React Native 开发 App。后者还说明跨端方案相较原生开发有迭代周期快、发布后热更新、代码可由服务动态下发等优点,并以涂鸦智能 App 原生搭建、嵌入核心面板业务为例,说明 RN 可用于“开发面板 - 打包 - 注册到云端 - 客户端根据从服务端动态加载相应的业务代码”的流程。

查看原文:2020 年中总结
上家公司是从 2018年3月干到2020年5月的,整整两年,写过小程序,负责过公众号、参与过基于element 和 vue 的后台程序开发、基于React Native开发过业务,搞过React Native 项目的架构。
查看原文:当我们在聊 React Native 时,我们在聊什么
那是 18 年的夏天,公司 6 月底去成都团建回郑州后,小弟、肖老师和当时绰号小萌的我(以下简称三剑客)开始了使用 React Native 开发 App 的工作。
查看原文:当我们在聊 React Native 时,我们在聊什么
跨端开发相较于传统的原生开发有其迭代周期快、可以在发布应用后热更新代码、甚至代码直接通过服务动态下发的优点,相较于 Codava、H5 打包这种解决了 60 帧问题,性能更好更接近原生。
查看原文:当我们在聊 React Native 时,我们在聊什么
我们不可能把所有的设备控制面板都写在 App 中,ios、android 的平台也不能动态下发代码,而 React Native 可以实现开发面板 - 打包 - 注册到云端 - 客户端根据从服务端动态加载相应的业务代码这个流程。

两篇原文对 RN 岗位与入门难度的描述侧重不同。2020 年总结以郑州求职为背景,称主动打招呼和海投回应中“9成都是 Vue 开发”,RN 岗位“两个手数的过来”,范围是 8-10K 甚至 4-8K;另一篇则说 RN 包括 Flutter 在内岗位比 Web 前端少很多,但掌握跨端技能后薪资待遇“很诱人”。入门方面,后者强调环境搭建对 RN 和 Flutter 都不友好,并给出 Java jdk 安装 1.8 系列、尽量使用安卓真机测试、不要随便升级 gradle、RN 0.60 之后 ios 使用 cocoapod 管理等具体提醒;前者没有展开这些技术条件。

查看原文:2020 年中总结
刚开始主动打招呼的和海投回应的都很多,9成都是 Vue 开发,甚至需要维护 jquery 项目。我心想还是主动投投 React Native 岗位吧,现实再次打了我的脸,郑州这边 RN 岗位两个手数的过来,并且范围都是 8-10K,甚至 4-8K。
查看原文:当我们在聊 React Native 时,我们在聊什么
有一说一,React Native 包括 Flutter 在内,岗位比 Web 前端开发是要少很多的,但是这并不意味着不值得投资。相较于 Web 开发,跨端开发需要掌握更多的技能,入门更难一些。但是一般掌握了它,对应的薪资待遇也是很诱人的。
查看原文:当我们在聊 React Native 时,我们在聊什么
万事开头难这句话用在 RN 和 Flutter 上尤其合适,跨端对于原生转和前端上手都是不太友好的,所以不要再问前端转合不合适,原生转不比你舒服到哪里去。
查看原文:当我们在聊 React Native 时,我们在聊什么
如果用 Android Studio 打开项目,不要跟着提示随便升级 gradle - RN 0.60 之后 ios 使用 cocoapod 管理项目依赖,这玩意如果网速不好,会卡住。

关于 RN 开发所需能力,原文区分了“快速从事业务开发”和“掌控整个 App 的架构和开发”。前者认为有编程经验即可,页面主要用 React 语法、RN 内置组件和第三方组件/API;后者要求全局状态管理、路由管理、组件封装等能力。原文还明确回答不会原生开发也可以从事 RN 开发,理由是官方和社区有大量封装好的 SDK,如 react-native-svg、react-native-camera、react-native-video、react-native-sound、react-native-permissions;但若社区没有现成方案或需自定义原生功能,则没那么简单,并建议会写 ios、android 桥接代码、懂原生配置。

查看原文:当我们在聊 React Native 时,我们在聊什么
以我的经验来看,只要你有编程经验,快速从事 RN 业务开发难度并不大。写页面用到的无非是 React 语法、React Native 内置组件的使用和第三放组件、API 的使用。
查看原文:当我们在聊 React Native 时,我们在聊什么
但是如果是要掌控整个 App 的架构和开发,那要求会多一些。但也无非是 React 开发同样需要掌握的全局状态管理、路由管理、组件封装等能力。
查看原文:当我们在聊 React Native 时,我们在聊什么
你可能会问不会原生开发可以从事 RN 开发吗?答案是肯定的,跨端方案的出现对于前端开发者的一大利好便是可以使用前端技术开发移动应用。
查看原文:当我们在聊 React Native 时,我们在聊什么
当然你可能还有疑问,如果社区没有现成的,或者需要自定义原生的功能才能完成业务怎么办?这个就没那么简单了,但是别担心,现代工业社会是讲究协作和精细化分工的,在涂鸦,我们有专业的原生开发团队为我们提供底层 SDK 业务编写,但是我还建议大家 ios、android 的桥接代码还是要会写、原生的配置要懂,有助于提升个人能力和稀缺性。

两篇原文都提到 React Native 项目架构与相关输出,但只能作为文章与项目清单层面的记录。2020 年总结称因工作需要总结了 RN 开发经验,输出《React Native 项目架构面面观【持续更新】》《react-navigation 5.x 最佳实践》等博文,并称这些文章成为阅读量和点赞最多的;另一篇在“为社区做的一些事”下列出 umi-plugin-react-native、react-native-quill-editor、react-native-form、react-native-screenshot、react-native-office-viewer、react-native-template-sishu、react-native-qiniu、react-native-float-ball 等项目,以及 TypeScript、react-navigation、项目架构、CodePush 等主题文章。相同项目名称或标签不证明这些项目之间存在因果,也不能据此推断作者主导了全部项目。

查看原文:2020 年中总结
工作需要,总结了React Native 开发经验并输出了React Native 项目架构面面观【持续更新】、react-navigation 5.x 最佳实践 等多篇相关博文,这几篇也成为了几十篇文章中阅读量和点赞最多的。
查看原文:当我们在聊 React Native 时,我们在聊什么
- umi-plugin-react-native:Show React Native Demo with dumi powered by react-native-web - react-native-quill-editor:React Native Quill Rich Text Editor Wrapper - react-native-form:私塾React Native动态表单项目,这个项目后来只在内部更新了,离职一年多了,大概率被同事重构了已经,我一直说要用 hooks 实现以下,也没得机会。
查看原文:当我们在聊 React Native 时,我们在聊什么
- react-native-screenshot:简单易用的 React Native 截屏、监听系统截屏事件组件(ios、android) - react-native-office-viewer:Office Preview Plugin for React Native(support png,pdf,doc,xls,txt...) - react-native-template-sishu:👾 Clean and minimalist React Native template for a quick start with TypeScript.
查看原文:当我们在聊 React Native 时,我们在聊什么
- 优雅地使用TypeScript开发React Native应用 - react-navigation 5.x 最佳实践 - React Native 项目架构面面观 - React Native 集成 CodePush 指南

现有材料能说明作者在 2020 年总结中记录了从郑州求职时 RN 岗位较少、最终转向 React 技术栈公司并实现试用期工资高于上家,也能说明另一篇原文把 RN 岗位少与“值得投资”并列讨论;但两篇都没有给出可核验的岗位市场数据或统一的比较口径。若继续探讨,可追问:在不同城市与时间点,RN 岗位数量、薪资范围与 Web 前端岗位的差异应如何用同一口径衡量?原文中的个人求职结果不能直接推广为普遍结论。

查看原文:2020 年中总结
抱着快要放弃的心态,再次缩小范围投递了几家 React 技术栈的公司,最终实现了试用期工资高于上家的目标。
查看原文:2020 年中总结
郑州这边 RN 岗位两个手数的过来,并且范围都是 8-10K,甚至 4-8K。
查看原文:当我们在聊 React Native 时,我们在聊什么
React Native 包括 Flutter 在内,岗位比 Web 前端开发是要少很多的,但是这并不意味着不值得投资。

Codex

覆盖 4/4 份来源 · 模型归纳

三篇涉及 Codex 的文章都把“边界”放在架构中心,但边界对象不同:Skill 文章要求按“谁拥有决策和证据”拆分平台开发与发行版开发,避免 Agent 把本地源码测试通过误报为发行版已采用;Provider 文章要求用 Adapter 吸收 Codex、Qoder 等执行引擎的私有协议,避免 UI、Workflow、Session 直接判断 provider;token 文章要求用 Session 切断已失去价值的历史上下文,用 Serena 缩小代码阅读范围、用 Context7 定向查外部文档。共同点是都反对把可执行命令的连续性当作组织依据,主张先确定上下文入口、依赖方向和验收证据,再决定是否合并。

查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
一句话总结 Skill 应该按“谁拥有决策和证据”拆分,而不是按“这些命令能不能连着执行”拆分。
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
真正的难点不是多写几个 SDK 调用,而是阻止 Provider 私有协议渗透业务层。
查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
真正起作用的,是把正确的信息送到正确的阶段,尽量不让无关的文件、文档、日志和历史决策进入当前上下文。

Skill 拆分与 Provider 拆分都采用“新增代码而非修改旧链路”的扩展方式,但约束落点不同。Skill 文章把边界写进名称和目录,要求发行版只消费 registry 中已发布的精确 package,禁止 file:、link:、workspace:、本地 tarball、sibling lookup 或跨仓 symlink,并把测试通过、package 已发布、产品已构建、签名完成、CDN 可读、更新通道已激活、旧客户端成功升级分别记录为不同事实。Provider 文章则要求新增 Hermes 时只增加 Adapter、Runtime Resolver、Materializer 和契约 fixture,不修改 Agent Chat 事件渲染、Workflow Run 状态机、Approval 数据模型、Audit Event 格式和 Asset 事实源模型。前者约束的是仓库与发布依赖方向,后者约束的是运行时协议与领域模型。

查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
第一,发行版只消费 registry 中已发布的精确 package。禁止 file:、link:、workspace:、本地 tarball、sibling lookup 或跨仓 symlink。
查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
测试通过、package 已发布、产品已构建、签名完成、CDN 可读、更新通道已激活、旧客户端成功升级,分别是不同事实。
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
不应该修改: - Agent Chat 的事件渲染逻辑 - Workflow Run 状态机 - Approval 数据模型 - Audit Event 格式 - Asset 的事实源模型
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
如果新增 Hermes 还需要修改以上模块,说明 Provider 私有语义已经穿透 Adapter 边界。

token 文章与 Provider 文章都处理“上下文该给谁看”,但一个面向单次 coding 任务的上下文选择,一个面向多执行引擎的运行时所有权。token 文章把 Session 视为上下文边界,建议在从调查切换到实现、从实现切换到大量测试和排障、开始处理另一个独立问题、当前对话不断重复背景、旧探索过程不再有参考价值时新开 Session,并用短 handoff 传递决策、文件、约束和验收标准;同时明确 MCP 不是越多越省,应按职责选择 Context7、Serena、rg 和 Codex 原生工具。Provider 文章则把 Session 视为 Agent Ops App 的权威记录,Provider Session ID 只是外部引用,创建时还要固定 Provider 版本、Workspace Revision、权限配置和资产投影版本。两者都反对让历史或私有细节无边界地进入当前工作面,但 token 文章的 Session 是对话生命周期,Provider 文章的 Session 是业务身份与治理对象。

查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
判断标准不是“聊了多少轮”,而是当前上下文是否还服务同一个目标。
查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
所以应该按职责选择,而不是把所有工具都打开: text 查外部文档 → Context7 理解代码结构 → Serena 查精确字符串 → rg 修改代码和跑测试 → Codex 原生工具
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
因此 Agent Ops Session 是权威记录,Provider Session 只是外部引用。
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
创建 Session 时还应该固定 Provider 版本、Workspace Revision、权限配置和资产投影版本。

三篇文章都给出“何时不必上”的适用条件,说明这些方案不是无条件推荐。Skill 文章认为,如果工作只发生在一个产品仓库,且没有跨仓发布或受控凭据边界,暂时不必为了形式拆 Skill;Provider 文章认为,如果应用只调用一个稳定 API,且没有切换执行引擎的计划,直接封装一个 Client 往往足够;token 文章认为,小型仓库、单文件修改、不涉及外部依赖行为、一次对话就能完成并验证的任务可以先简单一点,不要为了省 token 把一个小任务拆成很多 Session。三者共同把复杂度门槛放在跨边界证据、多引擎切换和多阶段上下文污染上,而不是工具数量或形式完整性。

查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
如果工作只发生在一个产品仓库,且没有跨仓发布或受控凭据边界,暂时不必为了形式拆 Skill。
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
如果应用只调用一个稳定 API,且没有切换执行引擎的计划,直接封装一个 Client 往往足够,不必为了模式而模式。
查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
但不要为了“省 token”把一个小任务拆成很多 Session。每次新建 Session 都有重新传递背景和重新建立上下文的成本。

Owlet 一文提供了另一种 Codex 使用位置:Codex 被描述为“快枪手”,负责范围小、很具体的快速试错和小范围实现,而 Claude Code 负责架构、长上下文和需要判断力的重构;作者明确保留项目是否要做、功能优先级、命名、配色方向和性能底线等决定权。该文还记录了具体工程约束:文件监听用 Dispatch Source 而非轮询,JSONL 增量读取用 (mtime, fileSize, byteOffset) 缓存,动画按 active session 门控,数据库用 upsert 而非 deleteAll + insert,并把规则写进 CLAUDE.md 和 AGENTS.md。这些是作者对 Owlet 项目的自述,不能外推为 Codex 在所有项目中的固定角色,也不能与另外两篇的架构方案互相证明因果。

查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
需要理解系统边界和做取舍的,找 Claude Code;需要快速验证一个想法的,找 Codex。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
整个过程中,AI 没有替我做任何一个真正重要的决定。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
文件监听用 Dispatch Source,而不是轮询。
查看原文:我用 Claude Code + Codex vibe 了一个 macOS App:Owlet
这些规则都被写进了 CLAUDE.md 和 AGENTS.md,成为后续所有改动的底线。

现有材料分别描述了 Skill 拆分、Provider 边界和 Session 上下文管理,但没有记录这些方案在同一工程中同时落地时的冲突处理。例如,发行版 Skill 要求禁止 sibling lookup 和本地 tarball,而 Provider 文章允许开发兜底使用系统 CLI;token 文章又建议用短 handoff 跨 Session 传递约束。三者叠加时,哪些约束应进入 AGENTS.md 或 Skill 的固定上下文、哪些应留在 Session handoff、哪些应由 Runtime Resolver 和 Compatibility Manifest 承担,资料未给出统一答案。另一个可继续探讨的问题是:Provider 文章把 Capability 差异交给 probe() 返回数据,Skill 文章把交付状态拆成多个事实,但两者如何共同支撑“旧客户端成功升级”这类跨版本证据,现有文本没有展开。

查看原文:把 Agent Skill 当作架构边界:平台开发与发行版开发为什么要拆开
禁止 file:、link:、workspace:、本地 tarball、sibling lookup 或跨仓 symlink。
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
解析顺序是: text 显式环境变量覆盖 → App/SDK bundled runtime → 系统 CLI 开发兜底
查看原文:用 Context7、Serena 和 Session 把 Codex 的 token 花在刀刃上
探索完成后,我会把结论压缩成一份 handoff,再开始实现
查看原文:Provider Pattern:在 Agent Ops App 中统一 Codex、Qoder 与未来执行引擎
上层根据数据决定是否展示“恢复”“Fork”或“审批”按钮,而不是判断 Provider 名称