Files
deepseek-harness/docs/defensive-patterns
yudshj 611e42b9a5 fix(office): 输出清理限定在自有目录,缓存命中前确认读权限
- office-kit:启动 sweep 只处理 session-<hash>/<uuid> 格式的真实目录,不跟随 symlink;删除成功后才释放记账,失败保留并重试,dispose 等待全部删除;容量腾不出时 save 明确失败
- office-kit / web-app 测试:显式使用临时 outputDirectory,不再清理真实 $DSH_HOME
- tool-office:交给 kit 前读 1 字节并重核 version,缓存命中也受当次读权限约束
- 文档:升级指南与 README 写明 render 不再保存图片文件、原生引擎在 Host 内运行;skill-office 链接 #7677;清理 Office-to-PDF 旧描述并重新生成 catalog
- 客户端:renderImages 改用 useCallback;e2e 补 assertNever,依赖按字母序
2026-11-04 18:17:58 +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.