Files
STM32F4-Base/.dsh/roles/README.md
T
wandering1 1355dbe1b1 fix(cfg): 配置热重载吞段缺陷修复 + 两点标定工具链与台架实测落档
修复运行期改配置被打回出厂值的缺陷:cfg_file_poll() 按段循环复用同一
份读缓冲,而 s_parse() 通过 s_split_line()/s_key_value() 就地改写缓冲
(把换行与等号换成 NUL)。第一个段解析完,缓冲里已没有键值行,后续 7
个段静默保持出厂值;随后 run_par_store_save() 又把这份出厂值写回
config.ini,用户的标定值被永久覆盖。开机路径 cfg_file_load() 只解析一
轮,所以该缺陷长期不可见,只在运行中改配置时发作。

- s_parse() 改为非破坏性:入参 const char *,逐行 memcpy 到栈缓冲
  (CFG_LINE_TEST_MAX + 1)后再交给会破坏缓冲的解析子函数;超长行跳
  过(保存侧已拒绝落盘超长受管键行)。
- 新增 TC-CONFIG-063:同时改两段内容,断言第二个注册段也重载成功、
  含负值 INT 键存活,把「热重载吞段」钉成机器面。

新增两点标定台架工具链(test/host/):
- cal_two_point.py:整数算术镜像 adc_cal_two_point(),支持单路模式与
  从执行卡 CALDATA 表批量求解(--from-doc),带合法带与零点自检拦截。
- cal_write.py:复用 iec104_master 作库,经 104 定值段写 r 后写 b 并
  读回校验,是所有写入的唯一入口。

adc_task 的 meas: 心跳行精度提到 4 位小数,标定读数需要。

文档:新增《采样数据校正全流程》(端到端导航)与《ADC 两点标定执行
流程》(台架执行卡,含 CALDATA 可填表);ADC通道映射说明新增 §7.3 台
架实测结果(UA 554.687914、IA 29.634259,出厂默认值保持不变);配置
文件设计说明新增解析器契约 v1.19;采集与算法层设计说明 §13 系列与
README 索引同步。

台架实测:UA r=554.687914(出厂 1000.0 偏大 1.80 倍,根因是接线分压
使 PT 一次侧只拿到一半电压,实测与参数算定 606.06 只差 8.5%)、IA
r=29.634259(与出厂 29.4118 只差 0.76%,反证链路未算错)。UN 按用户
裁定本轮不标定,保护闭锁(vl=0x11)是预期行为,未伪造 VALID。

同时入库 .dsh/roles 角色定义(原被 .gitignore 挡住)。
2026-11-13 01:35:58 +08:00

193 lines
11 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.
# Agent Teams 角色定义说明
本文档说明 STM32F4-Base 项目中所有可用的子 agent 角色,供 Lead 在分配任务时参考。
## 使用方式
创建 teammate 时在 `prompt` 第一行写 `@role:<角色id>`,fork 版 `dsh-plugin-subagent-roles` 插件会自动注入对应角色的 persona 到系统提示词并应用工具策略。
```js
spawn_teammate({
name: "algo-fix",
description: "修复傅氏相量窗口偏移",
prompt: "@role:algo-specialist\n\n## 本次任务\n检查 phasor.c 的窗口对齐逻辑..."
})
```
## 角色总览
### 核心模块专家(双层结构:通用行业标准 + 项目专项)
| 角色 ID | 显示名 | 职责范围 | 工具权限 | 调用预算 |
|---------|--------|---------|---------|---------|
| `algo-specialist` | 采集算法专家 | ADC 语义取数、全周傅氏相量、测频、保护判据 | read/edit/write/grep/glob | 80 |
| `network-specialist` | 网络协议专家 | CH395F SPI 以太网、netTask socket 栈、IEC 60870-5-104、FTP、SNTP | read/edit/write/grep/glob | 80 |
| `storage-specialist` | 存储文件系统专家 | GD5F SPI NAND、dhara FTL、FatFs、日志系统、卷自愈 | read/edit/write/grep/glob | 80 |
| `ui-specialist` | UI/LVGL 专家 | LVGL 160×160 单色菜单、PC 模拟器、菜单树生成器、UI 自动化回归 | read/edit/write/grep/glob | 80 |
### 通用工作角色(项目专项)
| 角色 ID | 显示名 | 职责范围 | 工具权限 | 调用预算 |
|---------|--------|---------|---------|---------|
| `code-reviewer` | 代码审查员 | 审查改动的正确性、安全性与规范合规 | read/grep/glob(只读) | 3000 |
| `test-engineer` | 测试工程师 | 主机侧单测、板级测试套件编写维护 | read/edit/write/grep/glob | 3000 |
| `build-gatekeeper` | 构建与门禁验证 | Keil 构建、pre-commit 门禁、CI 本地自查诊断 | read/grep/glob(只读) | 3000 |
| `doc-writer` | 技术文档写手 | 技术文档编写维护、链接有效性、计数准确性 | read/edit/write/grep/glob | 80 |
## 角色详细说明
### algo-specialist(采集算法专家)
**通用知识体系**:信号采样与量化理论(奈奎斯特定理、ENOB、抗混叠滤波)、数字信号处理算法(全周波 DFT、频率自适应、功率计算)、继电保护判据(过流/过压/差动/方向元件)、实时嵌入式约束(ISR 最小化、确定性时序、内存安全)。
**行业标准**:IEC 60255-1/181(继电保护性能)、IEC 61850-9-2(采样值传输)、IEC 61000-4-30(电能质量测量)、GB/T 14549(公用电网谐波)、IEEE C37.90(继电器标准)。
**项目专项**:App/algo/ 分层边界、ISR 只走 adc_tick_irq_notify()、V0.1 跨转换器禁止相位运算、保护判据未标定闭锁态、新算法进 algo 不进 task。
**适用场景**:修改采集算法、调整傅氏相量计算、新增保护判据、标定流程变更、ADC 取数问题排查。
---
### network-specialist(网络协议专家)
**通用知识体系**:TCP/IP 协议栈裁剪、嵌入式以太网驱动(DMA/PHY/缓存一致性)、Socket 编程模型(非阻塞+事件驱动、连接状态机)、零拷贝、静态内存池、心跳保活与指数退避重连、背压控制、接收状态机。
**行业标准**:IEC 60870-5-104(APCI 帧格式、定时器 t0-t3、流控 k/w)、IEC 62351(安全扩展)、Modbus TCP、RFC 793/6298(TCP/RTO)、IEEE 802.3。
**项目专项**:CH395F 全局中断读即清、netMsgQueue 串行执行、错误码经 xTaskNotify 回传、单连接 socket 断开语义、SPI 分频固定为 8、就绪屏障 osFlagsNoClear。
**适用场景**:修改网络驱动、调整 socket 生命周期、IEC 104 协议变更、FTP 服务问题、网络自愈逻辑、SNTP 对时。
---
### storage-specialist(存储文件系统专家)
**通用知识体系**:NAND Flash 物理特性(读写擦不对称、P/E 寿命、数据保持力、读干扰)、FTL 算法(页/块/混合映射、GC、磨损均衡)、文件系统原理(日志结构 vs FAT、掉电安全)、可靠性理论(ECC 选型、写放大、寿命估算)、WAL/环形缓冲/幂等写入。
**行业标准**:JEDEC JESD230(NAND 接口)、ONFI、JEDEC JESD216(SFDP)、JESD218/219(SSD 耐久性)、FAT Specification。
**项目专项**:FatFs FA_OPEN_APPEND 不含 FA_WRITE、f_write 短写不报错须校验字节数、FF_USE_LFN=0 仅 8.3 短名、defaultTask 唯一日志写者、破坏性测试默认关闭。
**适用场景**:NAND 驱动修改、FTL 调优、FatFs 问题排查、日志格式变更、卷自愈逻辑、配置文件读写。
---
### ui-specialist(UI/LVGL 专家)
**通用知识体系**:LVGL 渲染管线(失效区→绘制任务→像素输出)、部分刷新与 DMA 双缓冲、线程安全约束、样式系统、字体光栅化与 CJK 子集化、色彩空间与调色板。
**行业标准**:IEC 62366-1(医疗可用性工程)、ISO 9241-161/171(人机交互)、WCAG 2.2(无障碍)、触摸目标物理尺寸研究。
**项目专项**:I1 palette 头越界陷阱、白底白字整屏纯白、UI 源码与模拟器同一份、BOM 保护(Drivers/BSP/UI/*)、生成器改动必须重跑、ui-verify 5 步门禁、注释禁星号形态。
**适用场景**:UI 界面修改、菜单树变更、模拟器问题、字体子集更新、黄金参考基线变更、绘制缓冲调整。
---
### code-reviewer(代码审查员)
**职责**:审查代码改动的正确性、安全性和规范合规性。按「阻塞项 / 建议项」分级输出结构化审查结论。
**审查维度**:正确性(分层边界、ISR 路径、socket 串行)、安全性(堆分配、返回值校验、竞态)、规范合规(命名、ASCII 字面量、BOM、日志冗余)、内存与资源(RAM 余量、DBG 成本)。
**工具限制**:只读(read/grep/glob),不做修改。
**适用场景**:提交前代码审查、跨模块改动评审、安全审计。
---
### test-engineer(测试工程师)
**职责**:编写和维护主机侧单测(test/host/)和板级测试套件(test/board/),验证代码改动的正确性。
**关键约束**:新 .c 文件双端注册、测试配置互斥(test_config.h)、破坏性测试默认关闭、主机侧单测不依赖硬件、测试命名用语义短语。
**适用场景**:新增测试用例、修改测试框架、板级套件维护、测试覆盖率提升。
---
### build-gatekeeper(构建与门禁验证)
**职责**:执行 Keil 构建和 pre-commit 门禁检查,诊断失败原因,给出修复建议。
**关键知识**:52 个钩子的触发面与口径、keil-build/serial-boot-test skill、ci_local.py 流程、Python .venv 环境、UV4 工程文件不入库。
**工具限制**:只读(read/grep/glob),只做验证和诊断。
**适用场景**:构建失败诊断、门禁报错排查、环境问题定位、提交前验证。
---
### doc-writer(技术文档写手)
**职责**:编写和维护项目技术文档,确保内容准确、格式合规、链接有效。
**写作规范**:每节首句答"干什么/为什么"、不许未解释的内部速记、不写死源码行号、同一事实只在一处详述、待办完成即销项、语义短语标识。
**门禁约束**:doc-links(章节引用有效)、task-table(生成器产物)、mem-numbers(内存数字一致)、generated-fresh(生成器幂等)、mermaid-syntax(围栏语法预检)。
**适用场景**:新增/修改设计文档、更新索引、修复断链、文档规范合规检查。
## 角色选择指南
| 任务类型 | 推荐角色 |
|---------|---------|
| 修改 App/algo/ 下的采集/算法代码 | `algo-specialist` |
| 修改网络驱动/socket 栈/IEC 104 | `network-specialist` |
| 修改 NAND/FatFs/日志/配置引擎 | `storage-specialist` |
| 修改 UI 界面/模拟器/菜单树 | `ui-specialist` |
| 提交前审查代码改动 | `code-reviewer` |
| 新增或修改测试用例 | `test-engineer` |
| 构建失败或门禁报错诊断 | `build-gatekeeper` |
| 编写或修改技术文档 | `doc-writer` |
| 涉及多个模块的复杂任务 | 拆分为多个 teammate,各绑对应角色 |
## 注意事项
- **复杂任务一律用 Agent Teams**,不用单独的 subagent/subagent_role
- 创建 teammate 时**必须在 prompt 第一行写 `@role:<id>`**
- 角色文件修改后**不需要重启 DSH**,下次委派时自动读取最新版本
- 所有 8 个角色均为双层结构(第一部分通用知识体系 + 第二部分项目专项)
## `tools` 字段说明
角色文件 frontmatter 中的 `tools` 字段控制子 agent 可用的工具白名单。它通过 `ctx.tools.restrict()` 实现,作用于子 agent 作用域内**通过 tools registry 注册的所有工具**。
### 不能被 `tools` 字段管的工具
以下工具由 DSH harness 保留,`tools.restrict()` 拒绝接受其名称,始终对所有子 agent 可用:
| 工具 | 原因 | 源码依据 |
|------|------|---------|
| `run_code` | PTC 传输层保留工具 | `policy.js` L27: `UNRESTRICTABLE_TOOL_NAMES = new Set(['run_code'])`;`restrict()` 抛出 `cannot name reserved PTC mode presentation transport "run_code"` |
> **注意**:billion-context 工具(`compress`/`decompress`/`search_context`/`acp_status`)、Mnemon 工具、QQ 工具、WorkBuddy 工具等**都可以被 `tools` 字段管理**。它们走正常的 tools registry,不在保留名单里。如果角色白名单里没有写它们,子 agent 就**不能用**这些工具。
### 容错机制
当角色白名单中包含子 agent 作用域内不存在的工具名时(如未连接的 MCP 工具),`restrict()` 抛出 `names unknown global tool "xxx"`,插件捕获后自动丢弃该名称并用剩余有效名称重试,同时在日志中输出 warn。如果所有白名单名称都被丢弃,整个工具限制失效,子 agent 获得全部工具。
源码依据:`policy.js` L44-51 `parseUnrestrictableToolNames()`,`tool.js` L816-831 容错重试逻辑。
### 当前角色的工具策略
所有角色均包含以下公共工具组:
- **文件操作基础**:`read`, `grep`, `glob`, `ops_bash`, `ops_inspect_local_file`, `ops_discover_tools`
- **文件修改**(仅读写角色):`edit`, `write`
- **交付与规划**:`present`, `todo_write`
- **团队协作**:`send_message`, `list_agents`
- **共享任务板**:`team_task_get`, `team_task_list`, `team_task_update`
- **技能管理**:`skill`, `create_skill`
- **图片查看**:`read_image`
- **后台任务管理**:`job_list`, `job_output`, `job_kill`
- **工作目录**:`working_directory`
- **目标管理**:`get_goal`, `update_goal`
- **项目记忆**:`mnemon_recall`, `mnemon_remember`, `mnemon_document_search`
- **历史检索**:`session_search`, `session_event_search`
- **Web 工具**:`web_search`, `web_fetch`
- **调度/目标工具**:`schedule_create`, `schedule_list`, `create_goal`
- **上下文管理工具**:`compress`, `decompress`, `search_context`, `acp_status`
在此基础上按职责区分业务工具:
- **只读角色**(code-reviewer / build-gatekeeper):`[read, grep, glob]` + 公共工具组 — 禁止 edit/write,确保只做审查/诊断
- **读写角色**(algo/network/storage/ui-specialist / test-engineer / doc-writer):`[read, edit, write, grep, glob]` + 公共工具组 — 允许文件修改