12451 7d2b57d021 docs: 澄清"唯一 TCP 协议文档"并隔离硬件总线协议;删除已完成任务、摘出未结待办
## 起因

用户提问:**"我们不是有一个 tcp 协议权威文档了吗?为啥还有其他 tcp 协议文档"** ——
查证后确认:**权威文档只有一份**,但目录布局让人容易误判,且**我上一轮的搬迁引入了一处断链**。

## 一、查证结果:全仓只有一份 TCP 协议文档

按"是否同时出现 `auth_str`/`status_post`/`bat_in` 等 act 名"全仓扫描,含协议内容的只有:

| 文件 | act 命中 | 性质 |
|---|---:|---|
| `docs/protocol/柜控板固件对接文档.md` | 171 | ⭐ **唯一权威 TCP 协议规格** |
| `docs/tech/API.md` | 14 | HTTP 接口文档,TCP 章节**只有一句指回权威文档的链接** |
| `AGENTS.md` / `数据模型.md` / `小程序用户端.md` | 13 / 8 / 3 | 规则与存储说明,非协议规格 |
| `docs/archive/项目深度分析报告-2026-07-06.md` | 1 | 历史归档 |

⇒ **没有任何第二份 TCP 协议文档。** 用户看到的"另一份"应是下面二者之一(都已处理):

### 1. `docs/protocol/1TN协议标准_*` —— **不是 TCP 协议**

它是**仓控板 ↔ 翌工电源的 RS485 总线协议**(另一条物理链路)。与 TCP 权威文档同放
`protocol/`,名字又像"协议标准",极易被当成第二份平台协议。
**已移到新目录 `docs/hardware/`**(硬件侧总线协议),并在两处都写明"**不是**平台 TCP 协议"。

**结果:`docs/protocol/` 下有且仅有一个文件** —— 一眼就能确认"只有一份"。

### 2. `tasks/001-TCP协议对齐与安全修复.md`(66 KB)—— 是任务记录,不是协议文档

文件名含"TCP协议",且 66 KB。它已被完整处理(见下节)。

## 二、删除已完成的任务文件,并摘出真正的未结待办

`tasks/` **已 gitignore(`.gitignore:27`),是本地草稿区、从不入库**。

`tasks/001` 的 A~AH **全部 ✅ 已完成**,但其**状态头写着"待排期(未开始编码)"** —— 是错的。
按「已完成的任务文件及时清理」,**已删除**;删前把**唯一两项未结**摘成
`tasks/002-未结待办-协议待确认项与长函数重构.md`:

1. **`energy` 数据源待硬件答复**(协议待确认第 13 项,阻塞中)+ 关联的第 16 项;
2. **长函数重构**(已授权未开工)。

> ⚠️ **顺带纠正 001 的两处数字**(实测后才发现,**不能沿用**):
> - 001 记"23 个函数超 80 行"—— **当前实测只有 8 个**(本会话多轮重构已拆掉大部分);
> - 001 记 `migrate.rs::run` 已从 280 拆到 **46 行** —— **拆分本身没被回退**
>   (`SCHEMA_SQL` 确在 L20、`run` 内 0 个 `CREATE TABLE`),但后续每轮迁移改动都往 `run` 里追加
>   (`LEGACY_COLUMN_TARGETS` 对齐、`ensure_active_order_unique`、列注释对齐……),
>   **它又长回 174 行,重新成为全仓最长函数** —— 这是一次**重构回归**,已列为第一优先。
> - 实测脚本随 002 一起留在 `tasks/`(该目录不入库,避免下次重新发明)。

## 三、修复我上一轮搬迁引入的断链(1 处真缺陷 + 1 处机械替换误伤)

搬迁脚本只覆盖了 `docs/<name>` 与 `../<name>` 两种形态,**没覆盖三种情况**,已全部修好并加了体检:

| 位置 | 问题 | 修复 |
|---|---|---|
| `docs/tech/API.md` | 同级相对链接 `](柜控板固件对接文档.md)` 因文件被移走而断链 | → `](../protocol/柜控板固件对接文档.md)` |
| `docs/tech/数据模型.md` | 我的替换把 **markdown 链接目标** `](docs/API.md)` 也换成了 `docs/tech/API.md` ⇒ 解析成 `docs/tech/docs/tech/API.md` | 显示文字保留可读路径,**链接目标改回 `API.md`** |
| `docs/archive/审查报告…md` | 指向当时已删除的 `./tcp-protocol.md`(历史事实) | 归档**保留原文**,顶部加**归档横幅 + 旧名→现名映射表** |

**新增体检方法并实测能发现问题**:遍历 `docs/**/*.md` 的所有相对链接、逐个还原路径判存在性。
修完后复跑 → 只剩归档那一处(按设计保留),已用横幅给出映射。

> 📌 教训(已写进 `docs/README.md` 维护约定):**移动文档后必须做链接体检**,
> 不能只做字符串替换 —— 同级相对链接、以及"写在链接目标里的仓库相对路径"都会被漏掉。

## 四、文档地图同步更新

`docs/README.md` 新增:
- 顶部**「关于到底有几份 TCP 协议文档」**专节:直接回答,并列出"三份内部件何时被删"的历史;
- `hardware/` 目录说明;
- `protocol/` 明确标注 **⛔ 不要在这里放第二份协议文档**(要补充就改那一份并升版本号)。

`AGENTS.md` 项目结构同步加 `hardware/` 一行。
2026-09-20 04:55:28 +08:00

134 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# docs/ 文档地图
> **本文件是 `docs/` 的分类索引。** 新增、移动或改名任何文档后,**必须回来更新本文件**
> 并同步全仓引用(见文末「维护约定」)。
## 一、分类总览
| 目录 | 定位 | 权威性 | 谁该读 |
|------|------|--------|--------|
| [`protocol/`](#protocol设备协议) | **平台设备协议**(TCP,冻结,对硬件工程师交付) | ⭐ **唯一权威** | 硬件工程师、固件、平台 TCP 相关开发 |
| [`tech/`](#tech平台技术文档) | **平台技术文档**(开发/运维必读) | ⭐ 权威(各自领域内) | 后端/前端/运维 |
| [`hardware/`](#hardware硬件侧总线协议) | **硬件侧总线协议**(RS485,**不是**平台 TCP 协议) | 硬件事实依据 | 硬件工程师、对接电源/BMS 的人 |
| [`contract/`](#contract合同与规格) | **合同、规格、验收标准**(商务依据) | 事实依据,但不描述实现 | PM、验收方、新人了解范围 |
| [`compound-notes/`](#compound-notes经验沉淀) | **单点经验笔记**(踩坑/技法) | 参考,非权威 | 遇到同类问题的人 |
| [`archive/`](#archive历史归档) | **历史留痕**(只读,**不代表现状**) | ⛔ **不可作为依据** | 追溯历史决策时 |
## 二、谁是权威(口径优先级,避免"两份文档谁对"的扯皮)
> ### ⚠️ 关于"到底有几份 TCP 协议文档"
>
> **全仓只有一份**:`docs/protocol/柜控板固件对接文档.md`。
> `docs/protocol/` 目录下**有且仅有这一个文件** —— 这是刻意的,便于一眼确认。
>
> 历史上曾有三份内部件,已在协议 v1.1 前后删除(用户指示:只保留一份权威):
> `docs/tcp-protocol.md`、`docs/TCP报文交互示例.md`、`docs/柜控板-平台TCP接口文档.md`。
>
> 若你看到的"另一份 TCP 协议"是下面这些,它们**都不是平台 TCP 协议**:
> - `docs/hardware/1TN协议标准_*` —— **RS485 总线协议**(仓控板 ↔ 翌工电源),另一条物理链路;
> - `docs/tech/API.md` 的「TCP 设备通讯协议」章节 —— 只有一句**指回权威文档的链接**,不重复内容;
> - `tasks/*.md` —— 任务草稿(**`tasks/` 已 gitignore,不入库**),文件名可能含"TCP协议"
> 但那是任务记录,不是规格。
1. **`protocol/柜控板固件对接文档.md`** —— 设备协议(帧格式 / `act` / 字段名 / 签名 / `id` 规则)
的**唯一权威**。协议**冻结**,设备端固件不可改。
2. **根目录 `AGENTS.md`** —— **平台侧实现口径**的权威:Redis 键与字段、接口行为、库结构、
验收流程、部署注意事项。与 `tech/API.md` 的平台存储/行为描述冲突时,**以 `AGENTS.md` 为准**
(它的每一条都按代码契约与库实测核对过)。
3. **`tech/API.md`** —— **HTTP 接口清单与响应结构**的权威(含数据单位规范)。
4. **代码与文档冲突时**:先确认是不是代码错;确认代码对就**改文档**并在报告里点出。
## 三、逐目录说明
### protocol/ —— 平台设备协议(**只有一份**)
| 文件 | 说明 |
|------|------|
| `柜控板固件对接文档.md` | **唯一权威 TCP 文档**(v1.1.1)。帧格式、通用规则(`act`/`suc`/`msg_id`/60 秒超时/登录门控)、指令清单、签名算法与自测向量、安全码自愈、带注释报文示例(附 A)、变更记录(附 B)。**既是内部文档也可直接对外交付。** |
⛔ **不要在这里放第二份协议文档**(哪怕是"内部稿""示例集""补充说明")——
历史上正是这样分叉出三份,最后对不上。要补充内容就**改这一份并升版本号**(记入它的「附 B」)。
### hardware/ —— 硬件侧总线协议
| 文件 | 说明 |
|------|------|
| `1TN协议标准_YG20240118-1_V1.0.md` | 仓控板 ↔ 电源(苏州翌工)1TN RS485 协议,文本版 |
| `1TN协议标准_苏州翌工电源_V1.0.pdf` | 同上,厂家原始 PDF |
> ⚠️ 这是**另一条物理链路**(柜内 485 总线),**与平台 TCP 协议无关** ——
> 别把它当成"第二份 TCP 协议"。硬件侧的其它总线协议(BMS:星恒 Modbus / 天能 485)如需入库,也放这里。
### tech/ —— 平台技术文档
| 文件 | 说明 | 入口 |
|------|------|------|
| `API.md` | HTTP 接口清单与响应结构 + **数据单位规范**(整数存储,禁浮点) | PC/小程序前端、后端 |
| `数据模型.md` | 21 张表的逐列语义、外键/唯一键、建表依赖顺序 | **改表结构前必读** |
| `部署手册.md` | 完整部署步骤、nginx 两份 conf.d 全文、**全部 11 条部署注意事项** | 运维、发版 |
| `小程序用户端.md` | 小程序页面清单、逐页职责、状态位分层展示、RSSI 分档口径 | 小程序开发 |
> 这四份是 `AGENTS.md` 的**详细参考篇**:`AGENTS.md` 只保留"判据 + 链接"
> (因为 `AGENTS.md` 超出工作区指令预算 65,536 B 时会被**按头部截断**,尾部根本不加载)。
### contract/ —— 合同与规格
`开发合同` / `附件一-硬件规格` / `附件二-软件规格` / `附件三-交付与验收标准` /
`附件-开发需求规格说明书`,各含 `.md` + 原始格式(`.docx` / `.pdf` / `.html`)双份。
> 用途:**范围与验收的事实依据**。描述"要做什么 / 达到什么标准",**不描述当前实现**
> ——实现现状一律以 `AGENTS.md` + 代码为准。
### compound-notes/ —— 经验沉淀
单点问题的笔记(如某次 SQL 注入的成因与修法)。**参考性**内容,
遇到同类问题时查;结论若上升为通用规范,应回写进 `AGENTS.md` 的「踩过的坑」。
### archive/ —— 历史归档
| 文件 | 说明 |
|------|------|
| `开发文档.md` | 早期(现行实现之前)的开发文档,**与当前实现多处不一致** |
| `审查报告-数据单位一致性-2026-07-06.md` | 2026-07-06 的数据单位审查报告 |
| `项目深度分析报告-2026-07-06.md` | 2026-07-06 的项目深度分析报告 |
⛔ **归档目录只读、不作依据**——里面的路径、结论、数字都是**当时**的。
其中出现的旧文档名(如 `tcp-protocol.md`、`docs/柜控板-平台TCP接口文档.md`)
是历史事实,**不要求可点击**;对应关系到当前文档的映射见下节。
## 四、旧名 → 现名映射(查旧链接时用)
| 旧路径(已不存在) | 现路径 |
|---|---|
| `docs/tcp-protocol.md` | `docs/protocol/柜控板固件对接文档.md` |
| `docs/柜控板-平台TCP接口文档.md` | 已于协议 v1.1 删除(内部重复文档,内容并入上者) |
| `docs/柜控板固件对接文档.md` | `docs/protocol/柜控板固件对接文档.md` |
| `docs/API.md` | `docs/tech/API.md` |
| `docs/数据模型.md` · `docs/部署手册.md` · `docs/小程序用户端.md` | 同名,移到 `docs/tech/` |
| `docs/开发文档.md` | `docs/archive/开发文档.md` |
| 其余合同/规格/验收/协议标准 | 见上表,分别归入 `contract/` 与 `protocol/` |
## 五、维护约定(新增/移动文档时必做)
1. **归位**:按"协议 / 技术 / 合同 / 经验 / 归档"分类放入对应目录,**不要再平铺在 `docs/` 根**。
2. **更新本索引**:在对应章节的表格里加一行(文件 + 一句话定位 + 谁该读)。
3. **同步全仓引用**:文档路径散落在 `AGENTS.md`、`README.md`、**Rust/TS/Vue 源码注释**、
`test/`、`tools/`、`tasks/` 里;移动后必须全仓替换。
校验方法(**应无输出**):
```bash
# 找仍指向旧平铺路径的活引用
# · 排除 docs/archive/ —— 归档按设计保留历史原文
# · 排除 docs/README.md —— 本文件的「旧名 → 现名映射」表**必须**出现旧名
grep -rn --exclude-dir={.git,node_modules,target,dist} \
-e 'docs/API\.md' -e 'docs/数据模型\.md' -e 'docs/部署手册\.md' \
-e 'docs/小程序用户端\.md' -e 'docs/开发文档\.md' . \
| grep -v '^\./docs/archive/' | grep -v '^\./docs/README\.md:'
```
> 已实测该命令**能抓到问题**:往 `docs/tech/API.md` 末尾植入一行
> `<!-- probe: docs/API.md -->` → 命中;删除后 → 无输出。
> ⚠️ 注意这些 `.md` 多为 **CRLF** —— 用脚本批量删除/替换时**必须按 `\r?\n` 处理**,
> 否则会漏改(我第一次就踩了:`\n` 正则配不上 `\r\n`,以为删干净了其实残留)。
4. **改 `AGENTS.md` 的链接**:`AGENTS.md` 里所有 `docs/...` 链接都必须是**分类后**的路径
(`docs/protocol/...`、`docs/tech/...`)。
5. **别把权威内容只放进归档**:归档是留痕,规范要写进 `AGENTS.md` 或 `tech/`。