ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

DeepSeek Harness 持久化能力缝瘦身实录:清理无人调用的 `has()`/`delete()` 抽象方法

DeepSeek Harness 持久化能力缝瘦身实录:清理无人调用的 `has()`/`delete()` 抽象方法 DeepSeek Harness 持久化能力缝瘦身实录清理无人调用的has()/delete()抽象方法【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness本文以仓库中的 Agent Note 2026-06-20-prune-dead-seam-methods.md 为骨架结合会话持久化session persistence能力缝的源码实现完整还原一次裁剪死缝方法的工程实践为什么SessionPersistence.has()/.delete()必须删、怎么删、删完如何验证以及先删掉、等真实消费者出现再按真实需求加回的演进哲学。读完你可以掌握能力缝capability seam设计中识别投机性speculative抽象面的方法以及如何在接口、实现、契约测试三处同步做减法。背景能力缝是什么为什么它需要缝得住在 DeepSeek Harness 中可替换能力如 shell 执行、模型提供方、会话持久化被建模为能力缝capability seam。根据 2026-06-13-capability-seams.md 的定义一个能力缝由三个角色组成而不是一个孤立的 TypeScriptinterfaceService Definition服务定义——CordisService及词汇表类型拥有ctx.key例如dsh-session-persistence中的抽象SessionPersistenceService Provider服务提供方——注册实现的插件例如dsh-session-persistence-jsonl与dsh-session-persistence-sqlite两个后端Consumer消费者——模型与插件编程所面向的对象例如恢复会话、会话发现等调用方。三者的变化速率和变化原因各不相同契约描述能力是什么实现描述它怎么运行消费者描述别人编程时用到什么。把它们捆在一个包里就会把这些变化速率耦合在一起。能力缝存在的意义正是让 Service Provider 与 Consumer 可以独立演进——但前提是缝上暴露的每一个方法都必须真的有消费者在编程调用它。这就引出本文的核心论点一个没有任何消费者编程调用的方法不是缝而是投机性表面speculative surface——每个实现方仍必须实现它、测试它却得不到任何回报。问题剖析SessionPersistence的has()与delete()为什么是死方法原始笔记 2026-06-20-prune-dead-seam-methods.md 记录的问题非常具体抽象服务SessionPersistence声明了超出 create/append 之外的操作——load、list、has、delete共六个公开方法。而真实的生产消费者只使用其中一部分load()用于会话恢复resume从磁盘重新构建会话list()用于会话发现session discovery列出已持久化的会话。至于has()与delete()没有任何生产代码调用它们。笔记特别强调协议层和 UI 代码中同名的内存集合调用例如states.has(meta.id)、this.chains.delete(id)这类内部 Map 操作与持久化服务的has/delete完全无关持久化has/delete的唯一调用者是契约测试套件contract suite和各后端自己的 spec 测试。这两方法的死各有其根源has()——职责重叠的冗余探针。has()本意是回答这个会话是否已被持久化。但协调器在冷路径上已经通过PersistenceBackend.loadStored(id)这个钩子做持久化存在性检查见 coordinator.ts 中create碰撞探测的loadStored分支。也就是说has()增加了一个已跟踪 vs 未跟踪的协调器探针和一个契约分支而真正拥有持久化存在性语义的loadStored(id)早已存在——has()只是在重复造轮子。delete()——拖拽整条后端钩子链。delete()的存在迫使PersistenceBackend上出现一个deleteStored钩子而每个后端jsonl 与 sqlite都只是为了满足这个钩子而实现了它。一个没有任何消费者使用的删除能力让两个后端各背负一段死代码。这正是笔记中引用的 drop-mutable-session-summary 模式该系列笔记的命名模式为drop-*/prune-*契约测试同时测试了这两个方法但没有任何在交付代码shipping code会问这个会话是否已持久化或删除一个会话。决策从抽象缝、实现、契约套件三处同步做减法决策很干脆把没有任何消费者使用的方法从三个层面同时移除——抽象缝abstract seam、实现implementation、以及仅仅为了练习它们而存在的契约/spec 套件。具体移除清单包括层面移除内容抽象服务SessionPersistence.has()/.delete()的抽象声明协调器实现coordinator 中的has/delete/deleteCore后端钩子PersistenceBackend.deleteStored钩子以及 jsonl、sqlite 各自为满足钩子而写的deleteStored实现契约与测试只为这两个方法而存在的契约分支与 per-backend spec从当前源码可以验证移除结果。抽象类 index.ts 中SessionPersistence现在的抽象方法集合是locate、create、append、load、inspect、readFrom、list、listSnapshots等已经看不到has或delete。同样在 coordinator.ts 中残留的delete都是对内部Mapthis.states、this.chains、this.retirements、this.live的内存清理操作而非对外暴露的持久化删除能力——与笔记所述协议/UI 层同名调用与持久化服务无关完全一致。后端侧同理在packages/session目录下检索deleteStored/deleteCore已无任何命中说明 jsonl 与 sqlite 后端的那份只为满足钩子而写的实现确已随钩子一同移除。两个后端是笔记所称的**双后端dual-backend**设计详见 session-persistence 笔记本次改动刻意不触及后端的存储语义——移除一个没有消费者而实现的钩子属于移除钩子本身而不是后端重构。文档与注释的联动更新删除不是改代码就完事删除方法会留下文档债笔记强调所有文档和源码注释引用都要同步更新为存活下来的四方法契约create/append/load/list不止是字面上的has(/delete(/deleteStored拼写还包括JSDoc 中的{link has}/{link delete}链接six public methods六个公开方法这类数量描述能力缝与后端的 READMEdocs/architecture.md持久化与写协调器的 Agent Notescoordinator 与后端的 JSDoc。这一点对任何 API 精简工作都有普适启发删一个公开方法等于删声明 实现 测试 文档/注释引用四件事漏掉任何一件都会留下误导后人的僵尸引用。边界说明为什么BashExecutor.get()和.list()保留下来笔记开头的 Implementation note 明确记录了一个刻意保留的边界本次只删了SessionPersistence.has()和.delete()BashExecutor.get()与.list()仍然保留。理由很实在——删除它们那一行查找表面one-line lookup surface需要在消费者中引入大量的完成跟踪机制completion-tracking machinery收益不抵成本。而它们的 id 品牌化id branding问题由 branded-ids 笔记 单独覆盖。这是一个很有价值的工程判断示范删死方法不是一刀切的教条判断标准不是有没有被调用而是移除它的成本 vs 持有它的成本。BashExecutor.get()/list()的移除成本过高牵连消费者的大量机制于是选择保留并另用类型层面的 id 品牌化来保障安全SessionPersistence.has()/delete()的移除成本低无跨包消费者于是干净利落地删掉。备选方案分析为什么缝应当完整的直觉是错的笔记专门回应了一个自然的反对意见持久化缝当然应该提供 delete 啊——这个直觉persistence seam should offer delete是真实存在的但它恰恰是**投机性完备性speculative completeness**的典型表现。仓库根目录 AGENTS.md 的 pre-release 立场对此有明确指引为正确的根基优化而不是为你不存在的假设性调用者优化。具体拆解重新加回的成本极低delete()不过是一个方法等真正需要它的消费者出现那天再按需加回即可——例如会删除旧会话的会话管理 UI就需要它。届时针对该 UI 的真实需求设计软删除级联确认交互而不是现在靠猜。带真实消费者重新设计契约更优消费者会把契约钉死consumer pins the contract重新加回的方法会比现在凭空的版本设计得更好。持有的成本被低估一个闲置方法意味着每个现有实现和每一个未来后端都必须实现并测试一个什么都不做的方法——这个成本随后端数量线性增长。一句话总结删掉等消费者出现再按真实需求加回严格优于现在交付一个猜测出来的契约。验证如何证明删除没有破坏任何东西笔记的 Verification 章节给出了三层验证口径这在任何 API 裁剪中都可复现符号消失has/delete/deleteStored已从持久化缝、实现和契约套件中消失且没有产生新的死导出no new dead exports。幸存面未动剩余操作create/append/load/list原样保留基于持久化的会话查询persistence-backed session queries与崩溃恢复crash recovery行为与删除前完全一致。文档一致能力缝 README 与docs/architecture.md只列出幸存的方法。仓库层面的可验证依据还包括持久化契约测试套件 contract.ts 中的runPersistenceContract(name, make)依然存在——这是 session-persistence 笔记 中记录的同一套契约同时约束 jsonl 与 sqlite 两个后端的机制契约套件本身被保留了被移除的只是其中围绕has/delete的分支。值得一提的是当前SessionPersistence的实际契约已比笔记描述的四方法更丰富locate、prepare、inspect、readFrom、listSnapshots等是后续其他笔记陆续引入的但这恰恰印证了能力缝的正确演进方式每个新增方法都有明确的生产消费者驱动例如 write-coordinator 笔记 描述的PersistenceBackend钩子集合loadStored、appendBatch、materializeHeader?、commitRepair、list、close?——每个钩子都对应一个真实存在的协调器职责而非凭空设计。影响与工程启示把缝从为没人提供什么还原为消费者正好用什么笔记的 Consequences 部分冷静地评估了这次改动的两面代价真实的直觉delete()是产品最终想要的那类操作——最终正是关键。删除它、等真实消费者出现再加回严格优于现在就交付一个猜测的契约。双后端各自卸掉一个deleteStored实现是在原本不在本次范围的包内的一次有界编辑bounded edit。收益低耦合移除被限定在持久化缝 实现 测试内部没有任何跨包消费者引用被移除的方法所以除文档外零涟漪no ripple。笔记结尾的一句话是对整个工程姿态的精准概括Modest size, but it converts the seam from what an implementation must provide for nobody back to exactly what a consumer uses.改动不大但它把缝从实现方必须为无人提供什么还原为消费者正好用什么。给读者的三条可迁移经验用消费者编程对表面而不是方法存在性来审计抽象接口每半年对核心能力缝做一次调用面扫描凡是只被测试代码调用的公开方法就是候选删除对象。删除是四维操作声明、实现、测试、文档/注释引用必须同步处理尤其注意 JSDoc{link}引用和共 N 个公开方法这类计数描述。权衡标准是移除成本 vs 持有成本SessionPersistence.has()/delete()移除成本低所以删BashExecutor.get()/list()移除会牵连消费者的大量完成跟踪机制所以暂时保留——同一个方法论两个不同的结论。如果你想深入这条能力缝的完整演进脉络推荐按以下顺序阅读仓库内文档capability seams 笔记三角色模型→ session-persistence 笔记双后端与契约→ write-coordinator 笔记后端钩子面的真实消费者→ 本文主题的 prune 笔记源码侧则可对照 抽象服务定义、协调器实现、契约套件 以及两个后端的 jsonl 实现 与 sqlite 实现。【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表