docs(任务规划): 新增 RS-485 解锁与门禁口径对账分工说明

A 线(RS-485 驱动契约):补两条未修缺陷——单缓冲包撕裂改双缓冲
加帧序号,消费者一次取整帧,对齐临界区原子快照语义;
TX 超时路径先等 TC 再拉 DE,避免尾字节被截;错误码走 bsp_err 通道,
返回值不得裸丢弃(consume-result 会拦)。结论回填问题记录,
并写清解锁条件是否满足。

B 线(门禁口径对账):把 AGENTS 与《门禁说明》§2 的钩子计数对到实跑;
口径 = YAML 解析后的条目数,声明 / 文档 / 实跑三数同源,
注释掉的候选钩子不计入。

跨线接口先在本文件登记再动手;两线互不编辑对方范围。
本文件只分工、不改行为;接线节奏与建任务 / 抬栈属 Ask first,
是否接线由用户裁定,不由本分工决定。

整理项(Lead 代提交前修的 2 处门禁问题):两条指向尚不存在产物的引用,
按《文档规范》「计划中」形态在反引号内加 [计划] 前缀——
test/host/rs485/run_unit_test.py 与 docs/问题记录/RS485_Trap_Records.md;
改后 check_doc_links --all --sections-strict 由 2 处失效转为通过。

风险与回滚:纯文档新增,单提交可 git revert,不涉及构建与真机。
This commit is contained in:
2026-10-28 11:40:44 +08:00
parent 02c42dea94
commit 155bd5e1e8
@@ -0,0 +1,44 @@
# 分工说明:RS-485 解锁与门禁口径对账(2026-10-28)
**目标**:**A 线**补齐 `Drivers/BSP/RS485/` 两条未修契约缺陷,为 `rs485_task` 解除 **RS-485 接线门禁** 的技术前提;**B 线**把 `AGENTS.md` 与 `docs/门禁说明/README.md` 的 **钩子口径** 对账到实跑。
**口径**:本文件只分工、**不改行为**;两条线 **不交叉编辑** 对方文件,跨线接口 **先在本文件登记** 再动手。
## A 线 · RS-485 驱动契约(负责人 A)
- **涉及文件**:`Drivers/BSP/RS485/rs485.c`、`Drivers/BSP/RS485/rs485.h`、`App/task/rs485_task.c`(**新建**)、`test/host/rs485/`(**新建**)
- **交付物**:
1. 修 **单缓冲包撕裂**:RX 改 **双缓冲 + 帧序号**,消费者一次取整帧,对齐 `tpafe5160_snapshot()` 的 **临界区原子快照** 语义(旧的两步取数在两步之间被抢占会混帧);
2. 修 **TX 超时拉 DE**:超时路径 **先等 TC 再拉 DE**,避免尾字节被截;错误码走 `Drivers/BSP/bsp_err.h` 通道,返回值 **不得裸丢弃**(`bsp-err` 的 consume-result);
3. `[计划] test/host/rs485/run_unit_test.py` 覆盖 **撕裂**、**TX 超时**、**DE 时序** 三例;新增 `.c` 须 **双端注册**(`MDK-ARM/STM32F407-Demo.uvprojx` + `simulator/CMakeLists.txt`,见 `new-source-file` skill);
4. 结论回填 `[计划] docs/问题记录/RS485_Trap_Records.md`,并在 `docs/任务规划/暂缓-RS485.md` 写清 **解锁条件是否满足**(接线节奏仍受门禁约束,**不由本线决定**)。
- **禁止**:`malloc/calloc/realloc/strdup/free`(`coding-standard` CODE-RULE-20);`osKernelStart` 之前调任何创建类 API;注释里写 **星号形态的路径**(`nested-comment` 9-D)。
- **预算**:建任务 **前后各跑一次** `scripts/stack_report.py` 与 `scripts/ram_report.py`;**建任务/抬栈属 Ask first**。
## B 线 · 门禁与文档口径(负责人 B)
- **涉及文件**:`AGENTS.md`、`docs/门禁说明/README.md`、`docs/代码规范/pre-commit使用说明.md` §2;`.pre-commit-config.yaml` **只读核对、不改**。
- **交付物**:
1. **口径 = YAML 解析后的 hook 条目数**:用 `& ".venv\Scripts\python.exe"` 解析 `.pre-commit-config.yaml` 取实数,与 `AGENTS.md` 的 **51** 做 **声明 / 文档 / 实跑** 三数同源核对(**注释掉的候选钩子不计**,直接 grep 声明行会多算 1);
2. `docs/门禁说明/README.md` 的 **篇数 ↔ 钩子数** 差集清单,核对 **27 篇 + 1 指针** 是否仍成立;
3. 有差异 **只改文档、不加钩子**(Lead 裁定:`test/host/` 40 套里只有 22 根专属钩子,**没有专属钩子 ≠ 没被跑**,余量由 `test-coverage` 总闸兜);新条目标识用 **语义短语**,**不再发字母+数字编号** → `docs/编号规范.md` §1。
- **禁止**:手工全局替换改名/挪目录(走 `scripts/rename_ref.py`,先 dry-run);章节引用写成非紧邻形态(`doc-links` 带 `--sections-strict` 拦提交);在配置注释里复述那个 grep 字面量(文本计数再虚高 1)。
## 共用约束(A/B 都要守)
- 改代码/改文档 **只用 Edit 精确替换**;**绝不**用 `Get-Content`/`Set-Content`/`cmd` 重写含中文的文件(`U+FFFD` 不可逆);带 BOM 的 `Drivers/BSP/UI/`、`App/cfg/cfg_file.c`、`Lib/lv_conf.h` 改完核对 `EF BB BF`(`bom-guard`)。
- **字符串字面量纯 ASCII**,中文只进注释;行尾 **LF**(`.gitattributes` 已写死 `* text=auto eol=lf`);怀疑乱码先数 `EF BF BD` 字节,**不要 `git checkout`**。
- 门禁 **只在提交时** 统一跑:`@build` + `& ".venv\Scripts\python.exe" scripts/ci_local.py` + `scripts/check_doc_links.py --all`,**不要中途反复跑**。
- `git commit` / `git push` / 烧录 / CubeMX 重生成 / 登记簿删行销项 / 开 `ENABLE_DESTRUCTIVE_TESTS` —— **Ask first**。
## 验收(合并前)
| 线 | 判据 | 证据 |
|---|---|---|
| A | RS485 两条 ❌ 清零,`rs485_task` 的技术门禁解除(**是否接线仍由用户裁定**) | `test/host/rs485` 全绿 + `MDK-ARM/build_log.txt` **0 错误 0 警告** |
| B | 声明 / 文档 / 实跑 **三数一致** | 解析计数输出 + `docs/门禁说明/README.md` 差集为空 |
| A+B | `registration-check`、`bsp-err`、`nested-comment`、`id-check` 基线 **只减不增** | `scripts/ci_local.py` 输出 + `scripts/id_known_backlog.json` 台账 |
## 交接
- 两条线各自 **只回报**:**改了哪些文件、跑了哪些自检、剩余风险**;跨线接口(`rs485_frame_take()` 签名)变更 **先在本文件登记**。
- `docs/任务规划/README.md` 的 **完成即销项** 由协调者在用户确认后统一做,**A/B 都不得自行删行**。