diff --git a/devdocs/02-前后端协同事项.md b/devdocs/02-前后端协同事项.md
index 43e2b75..4023348 100644
--- a/devdocs/02-前后端协同事项.md
+++ b/devdocs/02-前后端协同事项.md
@@ -1064,3 +1064,47 @@ POST /api/v1/chat (221-byte body) → 200 OK
6. **没有「命中总数」**:面板顶栏那个「N 条命中」是**已加载条数**、不是总数。措辞上我们写的就是实话;若你们以后加 total,我们改成总数即可。
另:**W15(手动重试复用幂等键)是纯客户端改动**、无所求 —— 但它把 `duplicate` 两侧路径又读了一遍(WS `chat_duplicate` / REST `{duplicate:true}`),行为与我们理解**一致,无异议**。
+
+### 回执八(后端会话,2026-10-04 深夜 · 契约 **v0.60 / v0.61** 已发布 + 三条行为变化)
+
+> 你们只看版本号做 diff ⇒ 这两版都要过一眼。**都没有对你们造成破坏性形状变更**,但有一条会改变你们调试脚本的行为。
+
+## 一、`v0.60` —— 新增管理只读端点(**纯增量**)
+
+`GET /api/v1/admin/system/storage`(**owner|admin**):
+
+```json
+{"data":{
+ "main":{"kind":"sqlite","path":"…","fileBytes":N,"walBytes":N,"shmBytes":N,
+ "pageSize":4096,"pageCount":N,"freelistPages":N,"freeBytes":N},
+ "documents":{"count":N,"bytes":N},
+ "vector":{"kind":"pgvector"|"none","enabled":bool,"ready":bool}
+}}
+```
+
+- **只读**(`SELECT`/`PRAGMA` + `os.Stat`),**绝不含凭据**(`vector` 只回 `kind`,不回 host/DSN);
+- **失败粒度**:「路径未配置 / 活连接未注入 / 页级统计失败 / `documents` 表缺失」共用 **`500 storage_unavailable`**,**绝不回全 0 假快照**(宁可报错也不骗人);
+- 面板首页「存储」卡已接真数据(体积/WAL/页数/附件占用 + PG 三态);**你们做管理端时可直接用这个端点**,不必自己 stat 文件。
+
+## 二、`v0.61` —— `.pdf` 文本层(**行为变更 + 纯增量**)
+
+1. **白名单 22 → 23 项**(新增 `.pdf`),并改为 **(扩展名, 字节嗅探) 成对裁决**:
+ - `.pdf` **只**收嗅探为 `application/pdf` 的字节;**PDF 字节也只收在 `.pdf` 名下**;
+ - ⇒ **HTML/纯文本改名成 `.pdf` ⇒ 415**;**PDF 改名成 `.txt` ⇒ 415**(都是刻意的双向收紧)。
+2. **文本层 PDF 能读**:抽正文进既有侧车链路,`status:"extracted"`;**扫描件/图片型 ⇒ `status:"unreadable"`**,原因文案含「图片型/无文本层 PDF,需要 OCR(当前未做)」;**加密**与**损坏**可区分(都走 `unreadable`,原因不同)。
+3. **读侧 MIME**:真 PDF 如实下发 `application/pdf`,**仍 `Content-Disposition: attachment` + `nosniff`**(不可内联 —— 别指望能在 `
`/`