Files
deepseek-harness/docs/defensive-patterns
yudshj a220e017b5 refactor(office): 合并为 office-kit,Kit 缺失时降级而非加载失败
- Kit CLI 由 office-kit/locate 在 Host 中定位(含 ASAR 映射与可选 root 越界检查),删除 Desktop 壳的 office-cli 与诊断文件;生产版 Desktop 由壳通过 DSH_BUNDLED_RUNTIME_ROOT 显式传入 Kit 根目录,开发版与 Web 不检查
- office-to-pdf 与 office-kit-resolver 合并为 @deepseek-ai/dsh-office-kit,由同一包定位 Kit 并提供转换服务
- Kit 缺失时 provider 照常注册,转换请求以 OfficeKitError unavailable 拒绝,之后安装 Kit 无需重载
- 类型统一使用 OfficeKit 前缀(OfficeKitRequest/Result/Priority/Key),同步消费方、文档、升级指南与 catalog
- 处理 ds-review-bot 意见,并更新 unknown 断言基线

本 PR 的 snapshot 统一在这个提交里用 keyless refresh 重新生成,前 3 个提交中的 snapshot 不一定和那一步的代码对应。
2026-11-04 18:17:57 +08:00
..
…

Defensive patterns

English | 中文

Hard-won rules: each pattern in this directory is a requirement this repository enforces in review, stated as the rule and the defect it prevents. Every rule states what must hold, the condition a reviewer judges it by, its boundary and who approves an exception, and a correct and a wrong example. Read the page for the artifact you are about to change, before you change it.

Why these rules

Five habits cover most of what follows, and each page is their application to one artifact:

  • Make correctness explicit. Write it into the structure — named call points, explicit lifecycles, explicit conditions and types — rather than compensating for it afterwards with timing.
  • Keep one source of truth. One read path for a piece of data, one home for a fact, one owner for shared state.
  • Extend through the registered seam. A new capability registers; an existing carrier stops taking new logic instead of growing a branch inside it.
  • Keep the change face equal to the review face. A change carries only the lines its stated behavior change needs, a migration moves code rather than rewriting it, and a performance-sensitive change carries its measurement.
  • Require evidence. A claim is falsifiable and recomputable — measured before and after, or checked by a gate — rather than kept in sync by hand.
Changing Read
Package exports, package shape, build faces, dependency declarations package-surface.md
Remote services, @Remote methods, API dispatch, business ownership at the API layer remote-and-api.md
Client components, slots, stores, hooks, effects client-components.md
Session reads, retention, conversation nodes, renderers conversation-and-session.md
Timing, state representation, shared ownership, decentralization, refactors, migrations, performance evidence, disposal, callbacks, subprocesses general.md

Type definitions and per-subsystem semantics live in subsystems/; this directory carries the rules, and the semantics pages carry what the types mean. dsh-code-review reads this directory when judging a pull request, and Development routes through the same table from AGENTS.md.