8 Commits
50 changed files with 2233 additions and 5577 deletions

No files matched your search

+49 -66
View File
@@ -1,83 +1,66 @@
# 钉钉进度通知参考
# 个人 DWS 项目通知
这里的脚本和配置只演示 Hub 如何向项目群发送辅助通知,不属于 Etunel 的任务通信主链路,也不能代替任务派发、负责人确认、阶段门禁或项目留档。成员 Agent 不调用本脚本。
Hub 使用负责人确认的个人 DWS 账号发阶段汇报和 @ 提醒。只需要原生 DWS、Python 3.9+ 和一个项目配置文件;不使用机器人、应用密钥、Webhook 或 Stream 监听。
当前布局刻意把工具和项目配置分开:
**旧版升级:** 用新的个人账号配置替换旧配置,旧机器人配置不会自动转成个人发送授权。摘要入口已改名为 `dingtalk-message`/`dingtalk-message.ps1`,删除目标部署中的旧 `dingtalk-bot-message` 入口及 Stream 实验脚本。更新脚本和 Hub Skill/Hook 不等于已经迁移在途项目;按实际部署安排确认。
- `dingtalk-workspace-cli@1.0.60` 由 Bun 安装在用户级全局目录,项目不保存二进制或 `node_modules`。
- 官方 multi skills 保留在项目 `.agents/skills/dingtalk-*`,只对本项目生效。
- Client ID、群目标、`robotCode` 和汇报开关保存在项目 `.dingtalk/config.env`。
- Client Secret 从环境变量 `DING_SEC` 读取,未设置时回退到 macOS Keychain;脚本只临时注入给 `dws api`,App Token 由 DWS 自动获取和缓存。
## 首次由 Hub 完成配置
项目统一通过稳定入口调用全局命令:
负责人不需要找编号、复制配置模板或填写密钥。Hub 在项目初始化时执行:
```sh
./scripts/dws version
```
1. 检查本机 DWS;未登录时请负责人通过官方 DWS 登录流程授权,不索取密码或 Token。
2. 用 `dws profile list --format json` 查看可用账号,以姓名和组织向负责人确认发送身份。
3. 在选定的同一账号下,用 `dws chat +chat-search --query "负责人提供的群名称" --page-all --profile "查询返回的账号标识" --format json` 查群;结果不完整或有多个候选时不能自行选第一个。
4. 一次问清:“是否由这个账号向这个项目群自动发送进度、阻塞和必要的 @ 提醒?”得到确认后,Hub 把工具实际返回的账号标识、群标识及项目名称传给初始化入口。下面为参数结构,不是需要人填写的编号表:
Bun 默认阻止上游 `postinstall`;本机安装时已校验官方 SHA-256 并只释放 DWS 原生二进制,没有执行会发布全局 Skills 的安装脚本。升级 DWS 时也应保持这一边界。
```text
python scripts/dingtalk_notify.py init --profile "实际查询结果" --group "实际查询结果" --project "项目名称" --yes
```
## 应用身份(无需用户登录)
初始化检查账号存在且可登录,创建 `.dingtalk/config.env` 并启用通知;**不会发测试消息,也不会替人确认群选择**。群标识必须来自该账号的查询结果。初始化不创建钉钉群、不申请权限。已有配置默认不覆盖;迁移或变更账号、群时重新确认,再加 `--replace`,原配置被替换且不另存含密钥的备份。
本项目不执行 `dws auth login`。进度脚本通过 `dws api` 调用企业内部应用 OpenAPI:
配置仅 4 项:
| 字段 | 含义 | 谁填写 |
| --- | --- | --- |
| `DINGTALK_PROGRESS_ENABLED` | `1` 启用、`0` 暂停 | 初始化写入,负责人可随时要求暂停 |
| `DINGTALK_PROGRESS_PROFILE` | 固定个人账号 | Hub 使用 DWS 真实返回值 |
| `DINGTALK_PROGRESS_TARGET` | 固定项目群 | Hub 使用同账号查询并经确认的结果 |
| `DINGTALK_PROGRESS_PROJECT` | 项目名称 | Hub 使用已确认名称 |
配置不包含凭据,但仍是本机信息,本仓库已排除出 Git;Hub 在其他目标项目初始化时也应把 `.dingtalk/config.env` 加入该项目的 Git 忽略规则。不要把它或登录态复制给其他同事;各部署分别确认账号和群。登录由 DWS 自己管理,后续切换 DWS 默认账号不会改变本项目的发送身份。
## Windows 与 macOS/Linux
- Windows 使用 PowerShell 7.3+,优先运行 `./scripts/dingtalk-python.ps1 init ...`、`check ...`;事件用 `./scripts/dingtalk-progress.ps1 ...`,提醒用 `./scripts/dingtalk-message.ps1 ...`。
- PowerShell 共用启动器选择独立 Python,避免商店版 Python 无法读取终端的 DWS 登录。必要时用 `DINGTALK_PYTHON` 指定独立解释器路径;原生 `dws.exe` 须在当前进程 PATH 中。
- macOS/Linux 通常用 `python3 scripts/dingtalk_notify.py ...`;也可用 `sh scripts/dingtalk-progress ...`、`sh scripts/dingtalk-message ...`。初始化生成的配置在 POSIX 系统为仅当前用户读写;Windows 使用部署目录的访问权限。
- 将共用 Python 文件和所需平台入口放在目标 Hub 项目的 `scripts/` 中。安装职责 Skill 不会自动部署这些脚本。
DWS 安装与登录以 [官方项目](https://github.com/DingTalk-Real-AI/dingtalk-workspace-cli) 和当前命令帮助为准;不要为通知分发机器人应用密钥。
## 日常调用
```text
POST https://api.dingtalk.com/v1.0/robot/groupMessages/send
python scripts/dingtalk_notify.py progress milestone "**已完成**:阶段成果已归档。下一步安排联调。"
python scripts/dingtalk_notify.py progress blocked "缺少接口说明,请补充后回自己的角色会话同步。" --at "完整姓名"
python scripts/dingtalk_notify.py message --title "资料补充提醒" --text "请补齐已约定资料,并回自己的角色会话确认。" --at "完整姓名"
```
管理员侧只需确保:
通知保留 AI 标识并标注自动汇报;摘要用简短中文 Markdown。`--at` 按完整姓名查询唯一人员,再生成个人消息的原生提及标记。两个发送命令都支持 `--file` 正文和完全离线的 `--dry-run`。不支持临时换群、手填人员编号或退回机器人发送。
- Client ID/Secret 属于企业内部应用;
- 应用已有“企业内机器人发送消息”权限(`qyapi_robot_sendmsg`);
- `robotCode` 属于同一个应用;
- 机器人已加入目标 `openConversationId` 对应的群。
事件含义见 [通知规则](../etunel-role-collaboration/references/dingtalk-progress-reporting.md),详细调用与结果见 [脚本用法](../etunel-role-collaboration/references/dingtalk-script-usage.md)。
当前使用 zsh 环境变量时,先确保它已导出(不要把真实值写进项目文件):
## 检查与失败处理
- `python scripts/dingtalk_notify.py check --at "完整姓名"`:只检查固定账号登录和可选姓名,不发消息,不证明实际 @ 提醒成功。不是每条通知的必做步骤。
- `accepted` 加有效 `openTaskId`:个人发送请求已接受,不等于已投递或已读。必要时在同账号下用 `dws chat +messages-query-send-status --open-task-id "回执中的实际值" --profile "配置中的账号" --format json` 只读查询;不把任务回执当消息编号,不循环重发。
- 仅明确 DNS 解析失败最多尝试 3 次、间隔 10 秒;认证、权限或未知结果停止。登录失效请负责人恢复登录,不切账号、不退回机器人。通知失败不阻塞 Etunel 主任务。
维护时只做离线测试;真实发送必须另获明确授权:
```sh
export DING_SEC='<Client Secret>'
python -X utf8 scripts/test_dingtalk_notify.py
bash -n scripts/dingtalk-progress
bash -n scripts/dingtalk-message
```
也可以不设置 `DING_SEC`,改用本项目专用的 macOS Keychain 项。`-w` 必须放在最后,它会在终端中隐藏输入:
```sh
/usr/bin/security add-generic-password \
-U \
-a '<Client ID>' \
-s 'com.example.dingtalk.your-project' \
-l 'Your project DingTalk bot Client Secret' \
-w
```
`dws auth status` 显示未登录是正常状态,与 App Token 发送链路无关。
## 配置进度群
```sh
cp .dingtalk/config.env.example .dingtalk/config.env
chmod 600 .dingtalk/config.env
```
填写以下非密钥参数:
```dotenv
DINGTALK_PROGRESS_MODE=app-bot
DINGTALK_PROGRESS_CLIENT_ID=<Client ID>
DINGTALK_PROGRESS_TARGET=<openConversationId>
DINGTALK_PROGRESS_ROBOT_CODE=<robotCode>
```
先保持 `DINGTALK_PROGRESS_ENABLED=0`。凭据和参数就绪后改为 `1`,并保持 `DINGTALK_PROGRESS_DRY_RUN=1` 做无网络、无发送的请求预览:
```sh
./scripts/dingtalk-progress milestone "**已完成**
- 项目资料已经归档
- 本阶段成果已经负责人确认
**下一步**
- Hub 将安排下一阶段任务"
```
确认请求中的目标和正文正确后,再把 `DINGTALK_PROGRESS_DRY_RUN=0`。真实发送由 Hub 按根目录 `AGENTS.md` 的时机调用;响应中的 `processQueryKey` 才表示服务端已经接受该条机器人消息。摘要可以使用多行 Markdown,重点写已经确认的结果、下一步或阻塞原因,不要粘贴大段日志。
+5 -17
View File
@@ -1,19 +1,7 @@
# Copy this file to .dingtalk/config.env, fill the selected mode, then chmod 600 it.
# Values are literal text after '='; do not add shell quotes.
# Keep both switches safe until credential setup and a dry-run have succeeded.
# Hub 查询账号和群、取得负责人确认后,用 init 生成真实 config.env。
# 不需手工复制或填编号;不保存机器人密钥或个人登录凭据。
# 等号右侧为字面值,不加 Shell 引号。ENABLED=0 暂停通知。
DINGTALK_PROGRESS_ENABLED=0
DINGTALK_PROGRESS_DRY_RUN=1
# Enterprise-internal app bot: App Token via dws api; no user OAuth login.
DINGTALK_PROGRESS_MODE=app-bot
DINGTALK_PROGRESS_CLIENT_ID=
DINGTALK_PROGRESS_PROFILE=
DINGTALK_PROGRESS_TARGET=
DINGTALK_PROGRESS_ROBOT_CODE=
DINGTALK_PROGRESS_KEYCHAIN_SERVICE=com.example.dingtalk.your-project
# Client Secret is never stored here. The script first reads exported DING_SEC,
# then falls back to the project-specific macOS Keychain item above.
DINGTALK_PROGRESS_PROJECT=你的项目名称
DINGTALK_PROGRESS_TITLE_PREFIX=[项目进度]
DINGTALK_PROGRESS_PROJECT=
+6 -1
View File
@@ -1,5 +1,8 @@
* text=auto
.gitattributes text eol=lf
.gitignore text eol=lf
.dingtalk/config.env.example text eol=lf
.dingtalk/config.env
*.md text eol=lf
*.txt text eol=lf
*.html text eol=lf
@@ -8,4 +11,6 @@
*.json text eol=lf
*.py text eol=lf
*.sh text eol=lf
*.ps1 text eol=lf
scripts/dingtalk-progress text eol=lf
scripts/dingtalk-message text eol=lf
+2
View File
@@ -1,5 +1,7 @@
# Local credentials and machine-specific configuration
.dingtalk/config.env
.dingtalk/config.env.*
!.dingtalk/config.env.example
**/.env
**/.env.*
!**/.env.example
+23 -11
View File
@@ -6,10 +6,10 @@
- `etunel-role-collaboration/`:供各角色按需读取的渐进式披露 Skill;
- `etunel-role-hook-contexts/`:供 Etunel 独立配置的八角色精简 Hook 上下文;
- `doc/`:流程设计基线和历史资料;
- `doc/`:当前流程设计基线和模板参考资料;
- 钉钉参考集成:仅帮助 Hub 理解如何调用辅助通知,不属于 Etunel 任务通信主链路。
这是以 Markdown、HTML 和 Shell 为主的约束仓库,没有需要猜测的安装或构建步骤。
这是以 Markdown、HTML 为主、附带 Python 和平台启动脚本的约束仓库,没有需要猜测的应用构建步骤。
## Scope
@@ -19,11 +19,11 @@
1. 先读根 Skill:[etunel-role-collaboration/SKILL.md](etunel-role-collaboration/SKILL.md)。
2. 只按其中的条件路由读取本次修改涉及的 reference,不要一次加载所有角色和测试细则。
3. 本地本轮按用户明确授权,以 [V0.16 总流程图](doc/20260907/Codex多角色项目推进总流程图-V0.16.html) 为 Skill、关联职责及 Hook 的试运行依据。V0.16 仍为 REVIEW,不代表已发布或已替换在途项目基线;V0.15 与 V0.16 HTML 均保持原样。未经用户再次通知,不提交、不推送、不合入主分支,也不自动更新已安装的插件缓存。旧版流程仅作追溯;已在运行的项目继续使用其登记基线,迁移须明确确认。
3. 当前设计基线为 [V1.0 总流程图](doc/Codex多角色项目推进总流程图.html)(文档生效日期 2026-09-08)。`doc/` 只维护当前流程文件和配套参考,不再按日期或版本复制文档;后续直接更新同一文件,历史通过 Git 提交追溯。仓库更新不等于部署 Skill/Hook 或迁移在途项目;已运行项目继续使用其登记基线,迁移及插件缓存更新须明确确认。
4. 运行时 Hook、Etunel 工具 schema、项目角色契约、成员登记及已确认的项目流程基线,高于 Skill 的通用说明。发现冲突时说明冲突,不要自行猜测或发明能力。
5. 保留用户已有改动;修改前后检查 Git 状态与差异。
不要让运行时 Skill 依赖某个带版本号的流程图或提示词文件。应把已确认且仍有效的规则整理为稳定约束,并放入正确的渐进式 reference;版本文件只作为设计来源和追溯依据。
不要让运行时 Skill 依赖某个带版本号的流程图或提示词文件。应把已确认且仍有效的规则整理为稳定约束,并放入正确的渐进式 reference;流程文档只作为设计来源,历史以 Git 提交追溯。
## 必须保持的协作边界
@@ -47,9 +47,9 @@
| `etunel-role-collaboration/references/roles/` | 七个成员角色的职责契约 | 角色专属决定、输入、输出和边界写在对应文件 |
| `etunel-role-collaboration/references/testing/` | 测试角色二级细则 | 只保留匹配任务时才需要的深层内容 |
| `etunel-role-hook-contexts/` | 八角色 Hook 的完整精简职责与每轮提醒 | 独立于 Skill 发现树;简短、可直接注入、与正式职责一致 |
| `doc/` | 已确认流程来源及历史版本 | 不把历史版本误写成当前规则;新增基线时明确其状态 |
| `doc/` | 当前流程来源及模板参考 | 固定路径维护一份当前文档;不建日期或版本副本,历史查 Git;变更同步核对链接与基线说明 |
| `.agents/skills/dingtalk-*` | 钉钉官方能力的项目内参考副本 | 不是 Etunel 核心 Skill;除非任务明确要求更新参考包,否则不要批量改动 |
| `.dingtalk/`、`scripts/dingtalk-progress` | Hub 通知接入说明、示例配置和当前演示封装 | 不把通知能力扩大为任务派发、审批、门禁或事实源 |
| `.dingtalk/`、`scripts/` 中的钉钉封装 | Hub 通知配置说明、跨平台入口、共用 Python 实现和离线测试 | 不把通知能力扩大为任务派发、审批、门禁或事实源 |
修改共享流程、角色边界、阶段、正式成果或跨角色信息流时,必须同步检查根 Skill、相关公共 reference、受影响角色 reference 和对应 Hook。角色细节优先下沉到角色文件;测试专项优先下沉到测试二级 reference。不要靠复制整段规则维持一致性。
@@ -61,10 +61,10 @@
- 只有 Hub/主 Agent 可以调用通知;成员 Agent 只向 Hub 返回成果、状态或阻塞。
- 通知是项目群的单向辅助可见性与异常提醒,不是角色间通信、任务派发、审批、人类确认、项目门禁或项目事实源。
- Agent 只能使用 `scripts/dingtalk-progress`,事件类型限定为 `start`、`milestone`、`blocked`、`complete` 或 `failed`;不得绕过脚本直接调用 OpenAPI 或 `dws api`。可验证里程碑先完成项目留档,再发送简短中文 Markdown。例如:
- Agent 只用 `scripts/dingtalk_notify.py` 的 `progress`/`message`,或等价的 `dingtalk-progress`/`dingtalk-message` Shell、PowerShell 入口,统一以已确认的个人 DWS 账号发送。进度事件仍限定为 `start`、`milestone`、`blocked`、`complete`、`failed`;负责人提醒不新增状态。同一事项不重复通知,不得绕过封装直接调用 OpenAPI 或 `dws api`。可验证里程碑先完成项目留档,再发送简短中文 Markdown。例如:
```sh
./scripts/dingtalk-progress milestone "**已完成**
python scripts/dingtalk_notify.py progress milestone "**已完成**
- 阶段成果已确认并归档
@@ -73,9 +73,10 @@
- Hub 安排后续任务"
```
- 事件语义与消息格式以 [dingtalk-progress-reporting.md](etunel-role-collaboration/references/dingtalk-progress-reporting.md) 为准;安装与本机配置参考 [.dingtalk/README.md](.dingtalk/README.md)。
- `scripts/dingtalk-progress` 是当前用于跑通通知链路的演示封装,不得据此反推或改变 Etunel 主流程。
- 通知封装是辅助接入参考,不得据此反推或改变 Etunel 主流程;不创建通知队列或外层重试。仅明确 DNS 失败最多 3 次、间隔 10 秒,结果未知不盲目重发。
- 仓库维护和测试期间不得把真实发送当作冒烟测试。只有任务明确要求发送且当前环境已经授权时,才允许触发真实通知。
- 不读取、输出、修改或提交 `.dingtalk/config.env`、Client Secret、`DING_SEC`、App Token 或其他凭据和内部标识。
- Hub 首次查询个人账号及项目群,以姓名、组织和群名取得负责人确认后,用封装 `init` 创建 `.dingtalk/config.env`;只含通知开关、固定账号、群和项目名,不保存机器人或登录密钥。AI 可以在授权范围内维护该配置,但不提交或在群里展示内部标识;换账号或群须重新确认。
- 不读取、输出或提交 DWS 登录凭据、Client Secret、`DING_SEC`、App Token。旧机器人配置须经确认重新初始化,不静默启用个人代发;保留 AI 标识,个人通知不代表负责人亲自批准。
## 编辑约定
@@ -87,13 +88,24 @@
- 不把模拟流程结果描述为真实发布、客户验收或生产就绪;不适用项对人统一写“不适用”,只在机器字段要求时使用对应枚举。
- 文本文件保持 LF;不要提交日志、缓存、临时文件、机器专属配置或凭据。
## 版本与发布
- 全仓库统一使用三位版本 `vX.Y.Z`:前两位 `X.Y` 跟随 `doc/Codex多角色项目推进总流程图.html` 内明确标注且已确认的流程版本;第三位 `Z` 是该流程版本下的仓库发布迭代号。Git 标签与发布包确定该版 Skill、Hook、脚本和文档,组件不另设发布序列。
- HTML 主流程版本不迭代时,所有变更均只递增第三位,包括 Skill/Hook 优化、脚本新增、修复、配置调整和文档更新;不按功能规模或兼容性自行提升前两位。流程保持 V1.0 时依次发布 `v1.0.0`、`v1.0.1`、`v1.0.2`。HTML 流程正式升到新的 `X.Y` 时,仓库前两位同步,第三位从 0 开始,例如流程 V1.1 对应 `v1.1.0`;不为凑发布号改流程图。
- 这是流程版本驱动的项目约定,不采用“新增功能就升次版本”的语义化版本规则;第三位更新也可能需要配置迁移,发布说明必须如实列出。涉及职责或门禁变化仍须先按项目约束确认流程,不能借版本编号规则跳过确认。
- 日常提交不必发版。发版前确认版本号、完成适用校验,说明流程基线、变更内容、需更新的 Skill/Hook 和在途项目影响;具体说明见 [README 版本与升级](README.md#版本与升级)。
- 仅在用户要求时提交、推送或发版;已发布标签不可覆盖或移动,修正另发新版本。推送后核验远程分支与标签提交,不能把本地提交当成已发布。
- 发布不等于部署。仅更新受影响的 Skill/Hook 配置,插件缓存更新及在途项目迁移仍须明确确认;不要求角色每轮核对发布号,不将仓库发版规则塞进运行时 Skill。
## Quick Commands
修改后按影响范围执行:
```powershell
rtk python -X utf8 "$env:USERPROFILE\.codex\skills\.system\skill-creator\scripts\quick_validate.py" "etunel-role-collaboration"
rtk python -X utf8 scripts/test_dingtalk_notify.py
rtk "C:\Program Files\Git\bin\bash.exe" -n scripts/dingtalk-progress
rtk "C:\Program Files\Git\bin\bash.exe" -n scripts/dingtalk-message
rtk proxy git diff --check
rtk proxy git status --short
```
@@ -103,7 +115,7 @@ Skill Creator 的验证脚本位置取决于协作者的 Codex 安装。若默
## Definition of Done
- 修改 Skill 时已通过 Skill Creator 的结构校验。
- 仅在修改 `scripts/dingtalk-progress` 时执行 Shell 语法检查。
- 修改钉钉封装时运行离线测试;修改 Shell 入口时检查语法,修改 PowerShell 入口时核验解析和实际参数传递。只使用隔离假配置,不触发真实通知。
- 所有新增或改动的 Markdown 相对链接均能解析。
- 文件中没有待办标记、占位内容、真实凭据、群标识或误导性的缺失文件引用。
- 根 Skill、公共 reference、角色 reference 和对应 Hook 在受影响规则上保持一致。
+72 -19
View File
@@ -2,15 +2,54 @@
本仓库为 Etunel 多 Agent 项目提供一套中文版、渐进式披露的角色职责与协作流程:项目Hub负责跨角色中继和全局推进,七个成员角色在各自真人负责人参与下完成专业任务,并以可追踪成果交回 Hub。
> **钉钉定位说明:** 仓库中的 `.agents/skills/dingtalk-*`、`.dingtalk/` 和 `scripts/dingtalk-progress` 只作为参考与演示,用来告诉 Hub 如何调用钉钉发送项目进度或异常通知。钉钉不是 Etunel 的角色通信链路、任务队列、审批、门禁或项目事实源,也不会改变任何角色边界。
> **钉钉定位说明:** 仓库中的 `.agents/skills/dingtalk-*`、`.dingtalk/` 和 `scripts/` 下的钉钉封装只作为接入参考,用来告诉 Hub 如何发送项目进度、异常摘要或负责人提醒。钉钉不是 Etunel 的角色通信链路、任务队列、审批、门禁或项目事实源,也不会改变任何角色边界。
## 先了解这三件事
1. [主 Skill](etunel-role-collaboration/SKILL.md) 是角色 AI 的统一入口,只保留共享硬约束和条件路由;详细职责按当前任务逐层读取。
2. [Hook 上下文](etunel-role-hook-contexts/) 是给 Etunel 单独配置的精简提醒,不属于 Skill 的渐进式发现树,也不应替代完整职责文件。
3. 本地本轮按用户明确授权,以 [V0.16 总流程图](doc/20260907/Codex多角色项目推进总流程图-V0.16.html) 为 Skill、关联职责及 Hook 的试运行依据。V0.16 仍为 REVIEW,不代表已发布或已替换在途项目基线;V0.15 与 V0.16 HTML 均保持原样。未经用户再次通知,不提交、不推送、不合入主分支,也不自动更新已安装的插件缓存。运行时规则已整理进稳定 reference,不要求目标项目持有版本 HTML。
3. 当前设计基线为 [V1.0 总流程图](doc/Codex多角色项目推进总流程图.html)(文档生效日期 2026-09-08)。流程文档只维护一份,后续直接更新同一文件,旧版通过 Git 历史追溯,不再按日期或版本另存。仓库更新不代表部署 Skill/Hook 或自动迁移在途项目;运行时规则已整理进稳定 reference,不要求目标项目持有流程 HTML。
仓库没有应用安装、编译或发布流程。主要工作是维护角色约束、流程文档、Hook 上下文以及 Hub 通知参考集成。
仓库没有应用安装或编译步骤;发布对象是职责 Skill、Hook 上下文及配套文档,不是设备固件或运行中的 Etunel 服务。
## 版本与升级
本版为 `v1.0.3`,流程设计基线仍为 **V1.0**。版本采用 `vX.Y.Z`:前两位 `X.Y` 跟随 HTML 主流程中明确标注且已确认的版本,第三位 `Z` 表示该流程版本下的仓库发布迭代。正式发布以 Git 标签和对应发布包为准,主分支可能包含尚未发布的修改。
| 变更 | 版本规则 |
| --- | --- |
| HTML 流程版本不变,更新 Skill、Hook、脚本、配置或说明等任意内容 | 只递增第三位,例如流程保持 V1.0,`v1.0.1 → v1.0.2` |
| HTML 流程正式更新到新的 X.Y | 前两位同步,第三位从 0 开始,例如流程 V1.1 对应 `v1.1.0` |
| 日常提交,尚未安排发布 | 不必为每次提交创建标签;下一次正式发版按上述规则编号 |
全仓库只维护这一套发布序列,不给 Skill、Hook 或脚本分别编号。前两位不按功能规模、变更文件数或兼容性自行调整,也不为新增脚本等非流程更新修改 HTML 版本。这不是按变更性质升主/次版本的语义化版本规则,第三位更新也可能需要配置迁移;职责或门禁变更仍须先确认流程。日常修改正常提交,需要交给团队使用时才统一校验、确定版本、创建 Git 标签及发布说明;已发布标签和内容不覆盖,修正发新版本。
发布说明应写清:流程基线、改了什么、使用者需要更新哪些文件、在途项目是否需要重新确认。不要把“仓库已发布”写成“角色已更新”。更新插件缓存、Etunel 中独立配置的 Hook 或迁移在途项目,都需另外明确确认;已运行项目继续使用其登记基线。
### v1.0.3 更新范围
阶段汇报和负责人 @ 提醒统一改为个人 DWS。Hub 首次查询账号和群,经负责人确认后用 `init` 自动创建四项无密钥配置;旧机器人配置不能直接沿用。摘要入口改名为 `dingtalk-message`/`dingtalk-message.ps1`,不再部署机器人或 Stream 实验。更新时同步脚本、通知 reference 和中心 Hook;其他角色边界及 V1.0 主流程不变。详见 [部署与迁移](.dingtalk/README.md)。
- `progress` 与 `message` 都支持按姓名 @,查询和发送固定同一账号;保留 AI 标识和中文自动汇报说明,不自动更换身份或通知群。
- Windows 共用启动器使用独立 Python,修复商店版 Python 子进程无法识别终端 DWS 登录的部署问题。
- 27 项离线回归通过,覆盖配置初始化、旧配置替换、个人发送回执、@ 参数、有限重试和 Windows 实际传参。
- Windows 个人账号里程碑消息已通过新封装实测,投递状态为 `SUCCESS`;个人 @ 请求此前已成功提交,接收端提醒效果仍待本人确认。原生 macOS/Linux 运行尚未实测,Shell 语法已检查。
- 配置迁移、目标项目脚本部署、Etunel 中心 Hook 和插件缓存更新须按部署安排确认,不自动迁移其他项目。通知仍不是任务通道、审批、门禁或事实源。
### v1.0.2 更新范围(历史,不是当前部署说明)
- 明确前两位跟随 HTML 流程、其余发布迭代只升第三位的版本约定;主流程仍为 V1.0,八角色及阶段门禁不变。
- 钉钉通知改为共用 Python 实现,保留 macOS/Linux 入口,新增 Windows PowerShell 入口;支持项目事件、自定义中文 Markdown、文件正文和按姓名提醒负责人。
- Windows、macOS、Linux 统一从本地 `config.env` 的 `DINGTALK_PROGRESS_CLIENT_SECRET` 取机器人密钥,不再读取环境变量或钥匙串。**升级时须由部署负责人补填本地密钥字段,并删除旧 `DINGTALK_PROGRESS_KEYCHAIN_SERVICE` 字段**;不提交真实配置。
- 两个入口统一遵守离线预览;仅明确 DNS 失败每隔 10 秒重试、总计最多 3 次,结果未知不盲目重发。补充 27 项离线测试与部署说明。
- 更新核心 Skill 的通知路由与细则,以及中心 Hook 的完整职责和每轮提醒;其他角色 Hook 无需因本次通知更新而替换。目标项目需同步共用 Python 文件及所需平台入口,安装 Python 3.9+ 与原生 DWS;PowerShell 入口需 7.3+。
- Windows 普通群通知已获服务端回执并经负责人确认显示成功;按姓名 @ 和原生 macOS 发送仍未实测。通知升级不自动迁移在途项目或更新 Etunel Hook/插件缓存,需按部署安排明确执行。
### v1.0.1 更新范围
- 根据一轮项目复盘,补清旧任务收尾、开工输入与本次产出的区分、资料异常交专业角色核实、查询无新线索时转交负责人决定,以及模拟不默认跳过交接。
- 更新核心 Skill;Hook 仅调整中心与产品两份,保持完整职责 JSON 和每轮提醒分开配置。产品 Hook 修改的是完整职责区块,中心两个区块均有调整。
- 八角色、八阶段、正式成果、原有审批与测试验收条件不变;不自动迁移在途项目、不关闭真实遗留问题。本版不涉及钉钉脚本更新。
## 协作模型
@@ -47,7 +86,7 @@ flowchart LR
| 角色 | 主要定位 |
| --- | --- |
| 项目Hub | 建立项目、维护状态、规划任务波次、校验交付结构、协调阻塞并完成跨角色中继 |
| 业务 | 形成商业需求、客户与授权信息、业务验收及发布结项输入 |
| 业务 | 形成业务需求、客户与授权信息,确认客户验收及复盘结项 |
| 产品 | 把业务需求转化为产品定义、范围、交互和验收标准 |
| 技术负责人 | 负责总体技术方案、接口与跨技术域设计协调 |
| 嵌入式应用层 | 负责应用层软件设计、实现、联调和对应成果 |
@@ -74,18 +113,29 @@ EP-Hub-Skill/
│ ├── project-lifecycle.md # 八阶段、成果和门禁
│ ├── project-status-and-membership.md
│ ├── etunel-message-lifecycle.md
│ ├── document-templates.md # 模板复用与审核边界
│ ├── artifacts-and-evidence.md
│ ├── exceptions-and-coordination.md
│ ├── human-readable-communication.md
│ ├── project-files-and-progress.md
│ ├── dingtalk-progress-reporting.md
│ ├── dingtalk-script-usage.md # 通知的跨平台调用与负责人提醒
│ ├── roles/ # 七个成员角色职责
│ └── testing/ # 测试任务按需读取的二级细则
├── etunel-role-hook-contexts/ # 八角色独立 Hook 源文件
├── doc/ # 当前设计基线和历史流程资料
├── doc/ # 当前设计基线与模板参考,历史由 Git 保存
│ ├── Codex多角色项目推进总流程图.html # 当前 V1.0,后续原位更新
│ └── 文档模板参考/ # 按任务读取的参考笔记与来源清单
├── .agents/skills/dingtalk-*/ # 钉钉官方能力参考副本,不是核心 Skill
├── .dingtalk/ # 通知接入说明与无秘密示例配置
└── scripts/dingtalk-progress # Hub 钉钉通知的当前演示封装
└── scripts/ # Hub 辅助通知,不是 Etunel 任务机制
├── dingtalk_notify.py # Python 共用实现,含有限重试
├── dingtalk-progress # macOS/Linux 进度入口
├── dingtalk-message # macOS/Linux 个人摘要与负责人提醒
├── dingtalk-progress.ps1 # Windows PowerShell 进度入口
├── dingtalk-message.ps1 # Windows PowerShell 个人摘要与提醒
├── dingtalk-python.ps1 # Windows 共用启动器,含初始化与检查
└── test_dingtalk_notify.py # 不联网的隔离测试
```
Skill 被用于实际项目时,Hub 在目标项目中维护统一的 `项目资料/`,而不是把项目成果写回本约束仓库:
@@ -128,7 +178,7 @@ Etunel 为角色会话配置本 Skill 后,角色 AI 应按以下顺序工作
[etunel-role-hook-contexts/](etunel-role-hook-contexts/) 为八个默认角色各提供一份“精简职责与每轮提醒”。它们适合由 Etunel Hook 在每轮会话中注入,用来持续提醒身份、边界、负责人参与和工具使用。
本轮先同步远程 `main` 的 Hook 提醒(`0b133bf`),保留“完整职责 JSON + 每轮精简提醒”结构;职责 JSON 不是接口请求,实际绑定与工具参数仍以 Etunel 为准。本地源文件修改不会自动写入已安装插件或 Etunel 配置。
每份 Hook 文档分为“完整职责 JSON”和“每轮精简提醒”两个独立配置区块,分别复制到 Etunel 对应字段。职责 JSON 不是接口请求,实际绑定与工具参数仍以 Etunel 为准。仓库源文件修改不会自动写入已安装插件或 Etunel 配置。
Hook 文件需保持短小,并与完整 Skill 职责一致。它们由 Etunel 独立配置,因此不需要从 `SKILL.md` 中发现;修改角色边界时,应同时检查对应角色 reference 与 Hook,避免两套规则漂移。
@@ -136,22 +186,26 @@ Hook 文件需保持短小,并与完整 Skill 职责一致。它们由 Etunel
钉钉集成是 Hub 的辅助通知参考,不是 Etunel 协作系统的一部分。仓库保留它,是为了让 Hub 在满足事件条件时有一个清晰、安全、可替换的调用方法。
只有 Hub/主 Agent 可以使用下面的封装入口:
只有 Hub/主 Agent 可以使用下面的通用 Python 封装入口(Python 3.9+):
```sh
./scripts/dingtalk-progress <start|milestone|blocked|complete|failed> "<简短中文 Markdown 摘要>"
python scripts/dingtalk_notify.py progress <start|milestone|blocked|complete|failed> "<简短中文 Markdown 摘要>"
```
五类事件分别表示项目正式开始、可验证里程碑、真实阻塞、整体完成和最终失败。可验证里程碑由 Hub 先完成成果和进度留档,再发送钉钉消息。成员角色不得发送钉钉消息,只把结果交给 Hub。通知正文可使用多行 Markdown,只写可公开的已验证结论、下一步或阻塞原因,不发送密钥、个人数据、大段日志和未经证实的推断。
更详细的 Hub 事件语义、有限重试和结果判定见 [钉钉项目进度汇报](etunel-role-collaboration/references/dingtalk-progress-reporting.md);当前演示接入与本地配置见 [.dingtalk/README.md](.dingtalk/README.md)。`.agents/skills/dingtalk-*` 是钉钉官方多 Skill 的项目内参考副本,不应被当作 Etunel 核心 Skill,也不应被成员用来绕过 Hub。
新增 `message --title "中文标题" --text "问题和下一步"` 用于辅助摘要与负责人提醒,可按需用 `--at`;提醒结果回各自角色会话,不在群里另派任务或批准。两个入口均支持文件正文与离线 `--dry-run`,Windows 可用 `.ps1`,macOS/Linux 保留原 Shell 入口。它们是同一封装,不要重复调用。
本地 `.dingtalk/config.env` 已被 Git 忽略。不要读取、输出或提交其中的配置;不要在文档、Skill、Hook 或脚本中硬编码 Client Secret、Client ID、`robotCode`、`openConversationId`、App Token 或群名。仓库维护时也不要用真实发送作为普通测试。
所有通知统一使用负责人确认的个人 DWS 登录,不再使用机器人。Hub 在首次初始化时查询账号和项目群,用姓名、组织和群名取得确认后,调用 `init` 自动生成配置;人不用找编号或填密钥。配置只保留通知开关、固定账号、固定群和项目名,个人登录凭据由 DWS 管理。`progress` 也支持 `--at`,事件汇报和行动提醒可合成一条;保留 AI 标识和自动汇报说明,不冒充本人批准。
事件语义、有限重试和结果判定见 [钉钉项目进度汇报](etunel-role-collaboration/references/dingtalk-progress-reporting.md),命令细节见 [通知脚本用法](etunel-role-collaboration/references/dingtalk-script-usage.md);跨平台安装、初始化和旧配置迁移见 [.dingtalk/README.md](.dingtalk/README.md)。`.agents/skills/dingtalk-*` 是钉钉官方多 Skill 的项目内参考副本,不应被当作 Etunel 核心 Skill,也不应被成员用来绕过 Hub。
本地 `.dingtalk/config.env` 已被 Git 忽略,Hub 可在负责人授权范围内创建或修改;不要提交配置、硬编码真实账号/群标识,或读取和传播 DWS 凭据。`accepted` 表示取得个人发送任务回执,不等于已投递、已读或接收端 @ 提醒成功。仓库维护时不要用真实发送作为普通测试。
## 修改项目的推荐流程
1. 阅读 [AGENTS.md](AGENTS.md) 和本次变更涉及的最小文件集合。
2. 若变更来自流程设计,核对本轮授权的 [V0.16 REVIEW 总流程图](doc/20260907/Codex多角色项目推进总流程图-V0.16.html);保持历史 HTML 不变,不把本地规则更新当作发布或在途项目自动迁移。
2. 若变更来自流程设计,核对 [当前 V1.0 总流程图](doc/Codex多角色项目推进总流程图.html),在固定文件上修改并通过 Git 提交记录变更;不要新增日期目录或旧版副本。部署及在途项目迁移另行确认。
3. 把共享规则放在公共 reference,把角色专属规则放在对应角色文件,把低频测试细节放在测试二级 reference。
4. 只有必须让所有角色立即知道的规则才进入根 `SKILL.md`;同时保持条件路由可发现。
5. 同步检查受影响的 Hook 文件,并验证链接、结构和 Shell 语法。
@@ -167,10 +221,12 @@ git status --short
修改核心 Skill 后,使用已安装的 Skill Creator 对 `etunel-role-collaboration/` 运行 `scripts/quick_validate.py`。Skill Creator 的位置取决于协作者的 Codex 安装,不要为此把验证器复制进仓库。
修改钉钉演示脚本后再运行:
修改钉钉封装后运行隔离测试;Shell 入口有修改时再检查对应语法:
```sh
python -X utf8 scripts/test_dingtalk_notify.py
bash -n scripts/dingtalk-progress
bash -n scripts/dingtalk-message
```
还应人工确认:
@@ -183,12 +239,9 @@ bash -n scripts/dingtalk-progress
## 设计资料
- [本轮本地试运行依据 V0.16(REVIEW)](doc/20260907/Codex多角色项目推进总流程图-V0.16.html)
- [保留的总流程图 V0.15](doc/20260904/Codex多角色项目推进总流程图-V0.15.html)
- [历史总流程图 V0.14](doc/20260902/Codex多角色项目推进总流程图-V0.14.html)
- [补充与历史追溯:项目Hub系统提示词 V0.13](doc/20260828/Codex多角色项目推进-项目Hub系统提示词-V0.13.txt)
- [历史总流程图 V0.13](doc/20260828/Codex多角色项目推进总流程图-V0.13.html)
- [历史总流程图 V0.4](doc/20260827/Codex多角色项目推进总流程图-V0.4.html)
- [当前总流程图 V1.0](doc/Codex多角色项目推进总流程图.html)
- [文档模板参考](doc/文档模板参考/README.md)
- 历史流程与变更说明通过 `git log --all -- doc/` 查询,不在工作目录保留旧版副本。
- [核心 Skill](etunel-role-collaboration/SKILL.md)
- [Hub 工作流](etunel-role-collaboration/references/hub-workflow.md)
- [项目生命周期](etunel-role-collaboration/references/project-lifecycle.md)
@@ -1,933 +0,0 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="light" />
<link rel="icon" href="data:," />
<title>Codex 多角色项目推进总流程图与信息流图谱|V0.3</title>
<style>
:root {
--navy: #10253f;
--navy-2: #17395f;
--blue: #2368a2;
--cyan: #2a9d9f;
--amber: #c67a1b;
--ink: #182331;
--muted: #5d6a78;
--line: #d8e0e7;
--paper: #f5f8fa;
--white: #ffffff;
--soft-cyan: #e9f7f6;
--soft-amber: #fff4df;
--soft-red: #fcecee;
--soft-green: #e9f6ef;
--max: 1180px;
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
color: var(--ink);
background: var(--paper);
font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont,
"Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
line-height: 1.65;
}
.hero {
color: white;
background:
radial-gradient(circle at 88% 8%, rgba(42,157,159,.32), transparent 28%),
linear-gradient(145deg, #0c1f36 0%, #173f67 100%);
}
.hero-inner {
width: min(var(--max), calc(100% - 56px));
margin: 0 auto;
padding: 62px 0 52px;
}
.eyebrow {
display: inline-block;
margin-bottom: 18px;
padding: 6px 10px;
border: 1px solid rgba(255,255,255,.18);
border-radius: 999px;
color: #b9eff0;
background: rgba(255,255,255,.06);
font-size: 11px;
font-weight: 800;
letter-spacing: .12em;
}
h1, h2, h3, h4, p { margin-top: 0; }
h1 {
max-width: 900px;
margin-bottom: 18px;
font-size: clamp(40px, 5vw, 68px);
line-height: 1.05;
letter-spacing: -.04em;
}
.hero p {
max-width: 860px;
margin-bottom: 0;
color: rgba(255,255,255,.68);
font-size: 18px;
}
.page {
width: min(var(--max), calc(100% - 56px));
margin: 0 auto;
padding: 46px 0 72px;
}
.map-shell {
padding: 30px;
border: 1px solid var(--line);
border-radius: 24px;
background:
linear-gradient(rgba(35,104,162,.035) 1px, transparent 1px),
linear-gradient(90deg, rgba(35,104,162,.035) 1px, transparent 1px),
#eef4f7;
background-size: 28px 28px;
}
.map-head {
display: flex;
justify-content: space-between;
gap: 24px;
align-items: end;
margin-bottom: 28px;
}
.map-head h2 { margin-bottom: 6px; font-size: 30px; letter-spacing: -.025em; }
.map-head p { max-width: 760px; margin: 0; color: var(--muted); font-size: 14px; }
.legend { display: flex; flex-wrap: wrap; gap: 7px; justify-content: flex-end; }
.legend span {
padding: 5px 8px;
border-radius: 999px;
color: var(--muted);
background: var(--white);
box-shadow: 0 3px 12px rgba(16,37,63,.06);
font-size: 10px;
white-space: nowrap;
}
.track { display: grid; gap: 0; }
.node {
display: grid;
grid-template-columns: 58px 180px minmax(0,1fr) minmax(270px,.9fr);
gap: 18px;
align-items: center;
padding: 20px;
border: 1px solid #ccd9e3;
border-radius: 16px;
background: rgba(255,255,255,.97);
box-shadow: 0 8px 22px rgba(16,37,63,.055);
}
.index {
display: grid;
width: 46px;
height: 46px;
place-items: center;
border-radius: 14px;
color: white;
background: var(--navy-2);
font-weight: 850;
}
.stage h3 { margin: 0 0 5px; font-size: 19px; }
.role {
display: inline-block;
padding: 3px 7px;
border-radius: 999px;
color: #155e60;
background: var(--soft-cyan);
font-size: 10px;
font-weight: 800;
}
.work { color: var(--muted); font-size: 13px; }
.work strong { color: var(--ink); }
.artifacts {
padding-left: 18px;
border-left: 1px solid var(--line);
}
.artifacts strong { display: block; margin-bottom: 6px; font-size: 12px; }
.artifacts span { display: block; color: var(--muted); font-size: 11px; line-height: 1.55; }
.artifacts span + span { margin-top: 8px; }
.artifacts span::first-line { color: var(--ink); font-size: 12px; font-weight: 600; line-height: 1.75; }
.connector {
display: grid;
min-height: 72px;
place-items: center;
}
.connector::before { content: ""; width: 2px; height: 22px; background: #93aec5; }
.gate {
position: relative;
margin: 4px 0;
padding: 8px 14px 8px 30px;
border: 1px solid #e6c27b;
border-radius: 999px;
color: #70480d;
background: var(--soft-amber);
font-size: 11px;
font-weight: 760;
text-align: center;
}
.gate::before { content: "◆"; position: absolute; left: 11px; color: var(--amber); }
.connector::after { content: "↓"; color: var(--blue); font-size: 20px; font-weight: 900; line-height: 1; }
.parallel {
display: grid;
grid-template-columns: repeat(2, minmax(0,1fr));
gap: 8px;
margin-top: 8px;
}
.parallel span {
padding: 8px;
border: 1px solid var(--line);
border-radius: 9px;
color: var(--ink);
background: #f8fafb;
font-size: 11px;
}
.branch {
display: grid;
grid-template-columns: repeat(2, minmax(0,1fr));
gap: 10px;
margin-top: 12px;
}
.path { padding: 12px 14px; border-radius: 12px; font-size: 11px; }
.path strong { display: block; margin-bottom: 3px; }
.path.pass { border: 1px solid #a9d4c0; color: #266746; background: var(--soft-green); }
.path.return { border: 1px dashed #dc9ca0; color: #863b40; background: var(--soft-red); }
.crosscut {
margin-top: 20px;
padding: 18px 20px;
border: 1px dashed #95abc0;
border-radius: 14px;
background: rgba(255,255,255,.75);
}
.crosscut strong { color: var(--blue); }
.crosscut p { margin: 5px 0 0; color: var(--muted); font-size: 12px; }
.footer {
margin-top: 24px;
color: var(--muted);
font-size: 11px;
text-align: center;
}
@media (max-width: 920px) {
.node { grid-template-columns: 54px 160px minmax(0,1fr); }
.artifacts { grid-column: 3; padding-left: 0; border-left: 0; }
}
@media (max-width: 640px) {
.hero-inner, .page { width: min(100% - 28px, var(--max)); }
.hero-inner { padding: 44px 0 36px; }
.hero p { font-size: 15px; }
.page { padding-top: 24px; }
.map-shell { padding: 16px; border-radius: 18px; }
.map-head { display: block; }
.legend { justify-content: flex-start; margin-top: 14px; }
.node { grid-template-columns: 44px minmax(0,1fr); gap: 12px; padding: 16px; }
.index { width: 40px; height: 40px; border-radius: 12px; }
.stage, .work, .artifacts { grid-column: 2; }
.artifacts { padding-top: 12px; border-top: 1px solid var(--line); }
.parallel, .branch { grid-template-columns: 1fr; }
.gate { max-width: 290px; }
}
@media print {
@page { size: A4 portrait; margin: 12mm; }
body { background: white; font-size: 9pt; }
.hero { color: var(--ink); background: white; border-bottom: 3px solid var(--navy); }
.hero-inner, .page { width: 100%; }
.hero-inner { padding: 14mm 0 10mm; }
.hero .eyebrow { color: var(--blue); border-color: var(--line); }
.hero p { color: var(--muted); }
.page { padding: 10mm 0 0; }
.map-shell { padding: 0; border: 0; background: white; }
.node { break-inside: avoid; box-shadow: none; }
.connector { min-height: 16mm; }
}
/* Embedded stage information-flow atlas */
.if-atlas {
margin-top: 76px;
padding-top: 58px;
border-top: 4px solid var(--navy);
}
.if-intro {
margin-bottom: 42px;
padding: 40px;
border-radius: 22px;
color: white;
background:
radial-gradient(circle at 88% 10%, rgba(42,157,159,.28), transparent 30%),
linear-gradient(145deg, #10253f, #1a4a72);
}
.if-intro .if-eyebrow {
color: #b9eff0;
font-size: 11px;
font-weight: 850;
letter-spacing: .13em;
}
.if-intro h2 {
margin: 10px 0 12px;
font-size: clamp(34px,4vw,56px);
line-height: 1.05;
}
.if-intro p {
max-width: 900px;
margin-bottom: 20px;
color: rgba(255,255,255,.7);
}
.if-quicknav { display: flex; flex-wrap: wrap; gap: 8px; }
.if-quicknav a {
padding: 6px 9px;
border: 1px solid rgba(255,255,255,.18);
border-radius: 999px;
color: rgba(255,255,255,.75);
background: rgba(255,255,255,.06);
font-size: 10px;
text-decoration: none;
}
.if-section {
padding: 58px 0;
border-bottom: 1px solid var(--line);
}
.if-section-head {
display: grid;
grid-template-columns: 122px minmax(0,1fr);
gap: 24px;
margin-bottom: 28px;
}
.if-section-no {
color: var(--blue);
font-size: 11px;
font-weight: 850;
letter-spacing: .13em;
}
.if-section-head h2 {
margin-bottom: 8px;
font-size: clamp(28px,3vw,43px);
line-height: 1.1;
}
.if-section-head p {
max-width: 900px;
margin: 0;
color: var(--muted);
font-size: 14px;
}
.if-callout {
padding: 21px 24px;
border-left: 5px solid var(--cyan);
border-radius: 0 16px 16px 0;
background: var(--white);
box-shadow: 0 10px 28px rgba(16,37,63,.07);
font-size: 17px;
font-weight: 680;
}
.if-role-legend {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin: 21px 0;
}
.if-actor {
display: inline-flex;
min-width: 125px;
min-height: 50px;
align-items: center;
justify-content: center;
padding: 9px 12px;
border: 2px solid currentColor;
border-radius: 13px;
background: white;
font-size: 12px;
font-weight: 800;
text-align: center;
}
.if-center { color: #183d63; background: #eaf2f8; }
.if-business { color: #9b5d0b; background: #fff5df; }
.if-product { color: #7755a7; background: #f4eefb; }
.if-tech { color: #14787a; background: #e9f7f6; }
.if-app { color: #2f855a; background: #edf8f1; }
.if-low { color: #4265af; background: #eef2fc; }
.if-hardware { color: #8b5e3c; background: #f7f0eb; }
.if-test { color: #9b3d45; background: #fceef0; }
.if-human { color: #68561b; background: #fff9df; }
.if-flow-board {
display: grid;
gap: 10px;
padding: 23px;
border: 1px solid var(--line);
border-radius: 19px;
background: #edf3f6;
}
.if-exchange {
display: grid;
grid-template-columns: 150px minmax(240px,1fr) 150px;
gap: 14px;
align-items: center;
padding: 12px;
border: 1px solid #d0dce5;
border-radius: 15px;
background: rgba(255,255,255,.94);
}
.if-exchange .if-actor { width: 100%; }
.if-arrow {
position: relative;
min-height: 60px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 8px 34px 9px 10px;
color: var(--navy-2);
text-align: center;
}
.if-arrow::before {
content: "";
position: absolute;
left: 8px;
right: 18px;
top: 50%;
height: 2px;
background: #83a9c5;
}
.if-arrow::after {
content: "";
position: absolute;
right: 7px;
top: calc(50% - 6px);
border-left: 11px solid #83a9c5;
border-top: 7px solid transparent;
border-bottom: 7px solid transparent;
}
.if-arrow > * {
position: relative;
z-index: 1;
padding: 0 7px;
background: rgba(255,255,255,.96);
}
.if-flow-id {
color: var(--blue);
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 10px;
font-weight: 900;
}
.if-arrow strong { font-size: 13px; }
.if-arrow small { color: var(--muted); font-size: 10px; }
.if-conditional { border-style: dashed; }
.if-blocking .if-arrow::before { background: #d28c91; }
.if-blocking .if-arrow::after { border-left-color: #d28c91; }
.if-stage-summary {
display: grid;
grid-template-columns: repeat(3,minmax(0,1fr));
gap: 12px;
margin-bottom: 18px;
}
.if-summary-card {
padding: 16px;
border: 1px solid var(--line);
border-radius: 14px;
background: white;
}
.if-summary-card b {
display: block;
margin-bottom: 5px;
color: var(--blue);
font-size: 11px;
}
.if-summary-card span { color: var(--muted); font-size: 12px; }
.if-table-wrap {
margin-top: 23px;
overflow-x: auto;
border: 1px solid var(--line);
border-radius: 15px;
background: white;
}
.if-table-wrap table {
width: 100%;
min-width: 1050px;
border-collapse: collapse;
font-size: 12px;
}
.if-table-wrap th,
.if-table-wrap td {
padding: 12px 13px;
border-right: 1px solid var(--line);
border-bottom: 1px solid var(--line);
text-align: left;
vertical-align: top;
}
.if-table-wrap th:last-child,
.if-table-wrap td:last-child { border-right: 0; }
.if-table-wrap tr:last-child td { border-bottom: 0; }
.if-table-wrap th {
color: white;
background: var(--navy);
font-size: 11px;
white-space: nowrap;
}
.if-table-wrap tbody tr:nth-child(even) { background: #f8fafb; }
.if-table-wrap td:first-child {
color: var(--blue);
font-family: "SFMono-Regular", Consolas, monospace;
font-weight: 850;
white-space: nowrap;
}
.if-block { color: #8f3038; font-weight: 700; }
.if-pass { color: #266746; font-weight: 700; }
.if-cross-flow {
padding: 22px;
border: 1px dashed #9aafc0;
border-radius: 18px;
background: #eef4f7;
}
@media (max-width: 920px) {
.if-exchange { grid-template-columns: 125px minmax(210px,1fr) 125px; }
}
@media (max-width: 640px) {
.if-intro { padding: 26px 20px; }
.if-intro h2 { font-size: 30px; }
.if-section-head { grid-template-columns: 1fr; gap: 8px; }
.if-stage-summary { grid-template-columns: 1fr; }
.if-flow-board { padding: 13px; }
.if-exchange { grid-template-columns: 1fr; gap: 7px; }
.if-exchange .if-actor { min-height: 45px; }
.if-arrow { min-height: 72px; padding: 22px 10px; }
.if-arrow::before {
left: 50%;
right: auto;
top: 7px;
bottom: 15px;
width: 2px;
height: auto;
}
.if-arrow::after {
right: auto;
left: calc(50% - 6px);
top: auto;
bottom: 5px;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-top: 11px solid #83a9c5;
border-bottom: 0;
}
.if-blocking .if-arrow::after {
border-top-color: #d28c91;
border-left-color: transparent;
}
}
@media print {
.if-atlas { page-break-before: always; }
.if-exchange,
.if-summary-card { break-inside: avoid; box-shadow: none; }
.if-table-wrap table { font-size: 8pt; }
}
</style>
</head>
<body>
<header class="hero">
<div class="hero-inner">
<div class="eyebrow">CODEX MULTI-ROLE PROJECT FLOW · V0.3</div>
<h1>项目推进总流程图</h1>
<p>以业务、项目、产品、技术负责人、嵌入式应用层、嵌入式底层、硬件、测试八类角色为基础,其中项目角色由中心 AI 承担;通过正式成果、角色内部确认门和中心服务路由,推进项目从需求到发布结项。</p>
</div>
</header>
<main class="page">
<section class="map-shell">
<div class="map-head">
<div>
<h2>从业务需求到发布结项</h2>
<p>主线按成果和确认门推进;测试失败、业务验收驳回和需求变更通过回路返回正确阶段,不需要从头重启项目。</p>
</div>
<div class="legend" aria-label="流程图图例">
<span>白色卡片=项目阶段</span>
<span>黄色门=角色/阶段确认</span>
<span>红色虚线=返工回路</span>
</div>
</div>
<div class="track" aria-label="完整项目推进流程">
<article class="node">
<div class="index">01</div>
<div class="stage"><h3>业务需求</h3><span class="role">主责:业务</span></div>
<div class="work"><strong>明确问题与价值。</strong>补齐业务目标、范围、规则、优先级和可度量成功指标。</div>
<div class="artifacts"><strong>正式成果</strong><span>Project Background Brief(项目背景说明)<br>客户信息:客户名称、最终客户名称<br>项目名称:统一名称或客户规定的项目代号<br>产品要求:产品形态、提测平台<br>项目来源:新客户、新项目、旧产品升级、竞品替换或成本优化<br>需求背景:客户为什么提出这个需求,要解决什么问题<br>商业目标:获取订单、维护客户、降低成本、拓展市场或形成标准产品<br>预期价值:预计订单量、销售额</span><span>Project Milestone Plan(项目目标与里程碑计划)<br>提测时间<br>入库时间<br>小批量试产时间<br>量产时间</span></div>
</article>
<div class="connector"><div class="gate">业务确认需求基线</div></div>
<article class="node">
<div class="index">02</div>
<div class="stage"><h3>产品定义</h3><span class="role">主责:产品 · 批准:业务</span></div>
<div class="work"><strong>把目标转成可实现、可验证的产品定义。</strong>技术负责人组织可行性评估,嵌入式应用层、嵌入式底层和硬件分别评估实现约束,测试评估可测试性。</div>
<div class="artifacts"><strong>正式成果</strong><span>Project Initiation Package(立项资料)<br>立项书:包含产品详细信息、开发模式、开发范围、测试范围及其他补充信息<br>规格书:包含产品硬件规格和主要元器件型号(主控芯片、Sensor、镜头、WiFi 芯片)<br>功能清单:定义设备支持的功能<br>灯态:描述设备上电、绑定、升级、网络断开等状态下的指示灯状态与语音播报内容<br>产测功能清单:描述产测工具支持项<br>版本说明:描述当前版本的背景、主要功能等关键信息,并包含该项目此前所有版本和阶段的信息<br>结构板框图:包含主要器件位置和禁止限制区域</span><span>Hardware Development Package(硬件开发资料)<br>外设器件和关键器件规格书:主控、Flash、Sensor、复位按键、指示灯、WiFi 模块、音频功放驱动芯片、IR-CUT 驱动芯片、电机达林顿管驱动芯片<br>结构板框图:包含主要器件位置和禁止限制区域</span><span>Embedded Development Package(嵌入式开发资料)<br>平台 SDK<br>串号表<br>平台对接文档<br>平台接入标准及开发规范</span><span>Test &amp; Acceptance Criteria(测试验收标准)<br>平台测试用例<br>客户验收测试用例和验收标准</span><span>Milestone Requirements(里程碑要求)<br>提测时间<br>客户验收时间<br>试产、量产时间</span></div>
</article>
<div class="connector"><div class="gate">产品确认方案,业务批准范围</div></div>
<article class="node">
<div class="index">03</div>
<div class="stage"><h3>项目规划</h3><span class="role">主责:中心 AI</span></div>
<div class="work"><strong>基于成果、成员能力和依赖自动编排任务、进度和风险。</strong>任务计划草案先由技术负责人确认;中心 AI 只对存在疑点的任务定向询问对应执行角色,真实资源和日期基线再提交业务确认。</div>
<div class="artifacts"><strong>正式成果</strong><span>Project Plan(项目计划)<br>项目任务拆分<br>实际项目排期</span><span>Risk Register(项目风险)<br>技术风险<br>时间风险<br>其他风险</span><span>Role Assignment(角色分工)</span><span>Product Documentation Package(产品资料整合)</span><span>Project Status Record(项目状态内部记录)<br>阶段与门禁<br>任务与依赖<br>阻塞与风险<br>决策与成果基线<br>下一步与时限</span></div>
</article>
<div class="connector"><div class="gate">技术负责人确认任务计划,问题任务由对应执行角色定向确认,业务确认资源与日期基线</div></div>
<article class="node">
<div class="index">04</div>
<div class="stage"><h3>方案设计</h3><span class="role">主责:技术负责人 · 协作:嵌入式应用层 + 嵌入式底层 + 硬件 + 测试</span></div>
<div class="work"><strong>技术负责人统一组织总体方案设计和确认。</strong><div class="parallel"><span>技术负责人:总体架构、软硬件边界、关键决策</span><span>嵌入式应用层:业务逻辑、应用协议、功能模块设计</span><span>嵌入式底层:BSP、驱动、RTOS、HAL 设计</span><span>硬件:原理图、PCB、BOM、电源/信号/热设计</span><span>测试:范围、环境、用例、通过标准</span></div></div>
<div class="artifacts"><strong>正式成果</strong><span>Solution Architecture(总体技术方案)</span><span>Software/Hardware Interface Contract(软硬件接口契约)</span><span>Hardware Design Package(硬件设计包)</span><span>Architecture Decision Record(架构决策记录)</span><span>Test Plan(测试计划)</span></div>
</article>
<div class="connector"><div class="gate">技术负责人确认整体方案,嵌入式应用层/嵌入式底层/硬件确认接口可实施,产品确认不偏离,测试确认可验证</div></div>
<article class="node">
<div class="index">05</div>
<div class="stage"><h3>嵌入式软硬件实现</h3><span class="role">并行:嵌入式应用层 + 嵌入式底层 + 硬件</span></div>
<div class="work"><strong>嵌入式应用层、嵌入式底层和硬件在已确认总体方案及软硬件接口契约下并行实现、样机调试和自测。</strong>嵌入式底层将可消费版本交给嵌入式应用层合版,嵌入式应用层负责生成并提交唯一的最终固件版本;接口或器件约束发生重大偏离时返回技术负责人确认。</div>
<div class="artifacts"><strong>正式成果</strong><span>Hardware Implementation Package(硬件实现资料)<br>原理图:DSN 源文档和 PDF 文档<br>PCB:源文档<br>贴片资料:PCBA BOM、器件位置图 PDF、贴片坐标<br>维修原理图<br>接口定义<br>静态测试报告</span><span>Low-Level Implementation Package(嵌入式底层实现资料)<br>硬件功能测试报告<br>BSP 输出路径<br>PSP 输出路径<br>WiFi 设备定频测试固件</span><span>Application Firmware Package(嵌入式应用层固件包)<br>正式固件、升级固件<br>自测用例<br>分区表<br>MD5 值文件<br>Flash 烧写固件<br>日志文件<br>Changelog<br>串口使能证书</span></div>
</article>
<div class="connector"><div class="gate">嵌入式底层提交可消费版本,嵌入式应用层合版并提交最终固件,技术负责人确认固件与硬件版本匹配</div></div>
<article class="node">
<div class="index">06</div>
<div class="stage"><h3>测试验证</h3><span class="role">主责:测试 · 修复:嵌入式应用层/嵌入式底层/硬件</span></div>
<div class="work"><strong>执行功能、接口、软硬件集成和回归测试。</strong><div class="branch"><div class="path return"><strong>不通过</strong>应用问题→嵌入式应用层;BSP/驱动问题→嵌入式底层;电路/PCB/器件问题→硬件;接口/架构问题→技术负责人</div><div class="path pass"><strong>通过</strong>质量报告 + 测试证据包</div></div></div>
<div class="artifacts"><strong>正式成果</strong><span>Functional Test Report(功能测试报告)<br>平台测试用例<br>内部测试用例</span><span>Reliability Test Report(可靠性测试报告)<br>高低温测试<br>跌落测试</span><span>Specialized Test Report(专项测试报告)<br>画质测试<br>WiFi 测试<br>功耗测试<br>长稳测试<br>试产一致性测试</span><span>Test Evidence Package(提测佐证)</span><span>Defect Analysis Report(缺陷分析报告)</span></div>
</article>
<div class="connector"><div class="gate">测试确认质量结论和剩余风险</div></div>
<article class="node">
<div class="index">07</div>
<div class="stage"><h3>业务验收</h3><span class="role">主责:产品</span></div>
<div class="work"><strong>依据成功指标、验收标准和质量证据作最终判断。</strong><div class="branch"><div class="path return"><strong>驳回</strong>需求→产品;应用问题→嵌入式应用层;嵌入式底层软件问题→嵌入式底层;硬件问题→硬件;架构问题→技术负责人;证据问题→测试</div><div class="path pass"><strong>通过</strong>形成正式业务验收结论,进入发布准备</div></div></div>
<div class="artifacts"><strong>正式成果</strong><span>Platform Test Approval Report(平台提测通过报告)</span><span>Customer Acceptance Approval Report(客户验收通过报告)</span><span>Conditional Acceptance Items(附条件验收事项)</span></div>
</article>
<div class="connector"><div class="gate">业务批准验收结论和上线条件</div></div>
<article class="node">
<div class="index">08</div>
<div class="stage"><h3>发布结项</h3><span class="role">中心 AI 协调 · 技术负责人确认 · 嵌入式应用层/嵌入式底层/硬件执行 · 测试验证</span></div>
<div class="work"><strong>检查应用、固件、板卡版本、BOM/ECO、发布清单、冒烟、回滚和遗留事项承接。</strong>中心 AI 汇总复盘并归档角色会话。</div>
<div class="artifacts"><strong>正式成果</strong><span>Closure Documentation Archive(结项资料归档)<br>形成最终结果的流程文件</span><span>Change Log(变更记录)</span><span>Closure Report(结项报告)</span><span>Process Closure Summary(流程闭环总结)</span></div>
</article>
</div>
<div class="crosscut">
<strong>贯穿全流程:Change Request(需求变更申请)</strong>
<p>任何角色都可提出变更;中心 AI 自动组织影响评估,产品评估范围,技术负责人评估总体方案,嵌入式应用层、嵌入式底层和硬件分别评估实现与工作量,测试评估验证成本,业务批准后更新对应基线,并从受影响阶段继续推进。</p>
</div>
<div class="crosscut">
<strong>成果适用性:Artifact Waiver(成果文件豁免)</strong>
<p>阶段成果默认必须由主责角色输出;仅当主责角色提交不适用申请、中心 AI 完成项目级适用性与影响审查并取得必要确认后,才能将该成果标记为 WAIVED。未批准的成果仍为 REQUIRED,并继续阻塞阶段门禁。</p>
</div>
</section>
<div class="if-atlas" id="information-flow-atlas">
<section class="if-intro">
<div class="if-eyebrow">STAGE INFORMATION FLOW ATLAS · V0.3</div>
<h2>各阶段角色信息流图谱</h2>
<p>以下内容直接承接总流程图,展示每条会影响成果、决策、门禁、返工或版本的正式信息流,并说明触发条件、发送方、接收方、载荷、确认要求和阻塞约束。</p>
<div class="if-quicknav">
<a href="#rules">通用规则</a><a href="#stage1">01 业务需求</a><a href="#stage2">02 产品定义</a><a href="#stage3">03 项目规划</a><a href="#stage4">04 方案设计</a><a href="#stage5">05 软硬件实现</a><a href="#stage6">06 测试验证</a><a href="#stage7">07 业务验收</a><a href="#stage8">08 发布结项</a><a href="#change">变更与异常</a><a href="#waiver">成果豁免</a>
</div>
</section>
<section class="if-section" id="rules">
<div class="if-section-head">
<div class="if-section-no">00 / RULES</div>
<div><h2>所有阶段共同遵守的流转规则</h2><p>角色可以直接讨论,但讨论不能自动成为项目事实;正式结论必须回到中心 AI,经过校验、登记和重新分发。</p></div>
</div>
<div class="if-callout">唯一正式路径:触发事件 → 主责角色内部完成 AI 辅助自审与人工确认 → 以统一角色主体提交中心 AI → 中心 AI 做形式校验、版本/证据检查和跨角色冲突检查 → 路由目标角色 → 目标角色内部确认后形成正式结果 → 中心 AI 登记与分发下游 → 更新门禁。信息流图只使用正式角色名称,不单列角色内部的 AI 会话与人工确认过程。</div>
<div class="if-callout" style="margin-top: 14px">成果默认 REQUIRED:主责角色必须输出;确认不适用时必须走 Artifact Waiver 流程。只有 APPROVED 的 WAIVED 状态可以替代成果满足门禁,任何角色都不得静默删除或跳过文件。</div>
<div class="if-role-legend">
<span class="if-actor if-center">中心 AI</span><span class="if-actor if-business">业务</span><span class="if-actor if-product">产品</span><span class="if-actor if-tech">技术负责人</span><span class="if-actor if-app">嵌入式应用层</span><span class="if-actor if-low">嵌入式底层</span><span class="if-actor if-hardware">硬件</span><span class="if-actor if-test">测试</span>
</div>
<div class="if-table-wrap" style="margin-bottom: 22px"><table><thead><tr><th>主体</th><th>是否为项目职能角色</th><th>定义</th><th>主要确认权限</th><th>不能做什么</th></tr></thead><tbody>
<tr><td>各专业角色</td><td>是</td><td>图中的正式角色名称统一代表该角色完成 AI 辅助自审与人工确认后的责任主体;内部审查过程不作为跨角色信息流单列。</td><td>以角色名义确认并发出本角色专业结论、正式成果、现实工期承诺、风险接受和正式交付。</td><td>不能替其他角色作出专业确认。</td></tr>
<tr><td>业务</td><td>是;同时承担项目级组织授权</td><td>业务节点同时包含业务专业判断和项目级组织授权的内部确认。</td><td>除业务成果外,负责确认计划基线、真实资源、预算、采购/打样、日期、暂停/取消和高影响成果豁免。</td><td>不替代产品、技术负责人、硬件或测试等角色给出专业结论。</td></tr>
<tr><td>中心 AI</td><td>是;承担项目角色</td><td>项目唯一正式信息中心、任务路由器、成果校验器、阶段门禁执行者和项目状态内部记录维护者。</td><td>可依据证据更新项目状态、按角色需要分发状态快照、完成普通项目级审查和低影响豁免;高影响事项必须升级给业务。</td><td>不能自行承诺真实资源、预算、范围、日期或专业结论,也不能以推测代替角色提供的状态证据。</td></tr>
</tbody></table></div>
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-business">任意角色</div><div class="if-arrow"><span class="if-flow-id">G.1</span><strong>提交已完成内部审查确认的消息、成果或请求</strong><small>附 self_check_result、internal_approved、项目、任务、版本和证据引用</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">G.2</span><strong>形式校验、跨角色冲突检查、登记并路由</strong><small>不替角色判断专业内容质量</small></div><div class="if-actor if-product">目标角色</div></div>
<div class="if-exchange"><div class="if-actor if-product">目标角色</div><div class="if-arrow"><span class="if-flow-id">G.3</span><strong>完成内部审查后返回结构化结果</strong><small>角色内部确认不单列;禁止转发完整聊天记录</small></div><div class="if-actor if-center">中心 AI</div></div>
</div>
<div class="if-callout" style="margin: 22px 0 14px"><strong>项目状态内部记录与按需同步:</strong>Project Status Record(项目状态内部记录)是中心 AI 持续维护的内部运行记录,不是新增角色。它汇总当前阶段、门禁、任务、依赖、阻塞、风险、决策、成果基线、下一步和时限;中心 AI 在关键状态变化时主动推送,也响应角色按项目、阶段或任务发起的查询。</div>
<div class="if-flow-board">
<div class="if-exchange if-conditional"><div class="if-actor if-business">任意角色</div><div class="if-arrow"><span class="if-flow-id">S.1 · 按需查询</span><strong>请求与本角色职责相关的最新项目状态</strong><small>指定 project_id、stage/task scope、关注项和期望时点</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">S.2 · 自动或按需</span><strong>生成并分发角色化项目状态快照</strong><small>关键状态变化时主动推送;收到 S.1 后按查询范围返回</small></div><div class="if-actor if-product">请求角色及受影响角色</div></div>
<div class="if-exchange"><div class="if-actor if-product">接收角色</div><div class="if-arrow"><span class="if-flow-id">S.3</span><strong>确认状态或携带证据提出纠正</strong><small>不得仅凭口头判断覆盖已登记状态</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">S.4 · 状态纠正</span><strong>校验依据、更新内部记录并重新分发</strong><small>保留旧状态、变更原因、证据引用和生效时间</small></div><div class="if-actor if-product">全部受影响角色</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>对项目执行的影响</th></tr></thead><tbody>
<tr><td>S.1</td><td>角色需要了解当前项目、阶段、任务、依赖、风险或门禁状态,但现有上下文不足或可能已过期。</td><td>任意角色 → 中心 AI</td><td>project_id、请求范围、关注字段、所需详细度、as_of 要求和用途。</td><td>只能查询项目授权范围内的信息;请求角色无需知道中心 AI 的内部存储结构。</td><td>创建一次按需状态查询。</td></tr>
<tr><td>S.2</td><td>收到 S.1;或阶段/门禁、任务分派、依赖、阻塞、风险、决策、成果基线、required_by 发生关键变化。</td><td>中心 AI → 请求角色及受影响角色</td><td>Project Status Snapshot:project_id、state_version、as_of、stage/gate、相关任务、依赖、阻塞、风险、决策、baseline_refs、next_actions、required_by、evidence_refs。</td><td>按最小必要原则裁剪为角色化上下文;禁止转发无关角色的完整会话或未确认专业判断;所有状态必须有证据来源。</td><td>角色获得可执行的最新上下文。</td></tr>
<tr><td>S.3</td><td>角色收到状态快照。</td><td>接收角色 → 中心 AI</td><td>ACK;或 correction_request、受影响字段、正确值、原因、evidence_refs、internal_approved。</td><td>没有证据的异议不得直接覆盖状态;存在争议时进入 E.1–E.4。</td><td>确认可继续执行,或触发状态纠正。</td></tr>
<tr><td>S.4</td><td>纠正请求通过身份、版本、证据及跨角色一致性检查。</td><td>中心 AI → 全部受影响角色</td><td>新 state_version、变更字段、旧值/新值、变更原因、证据、生效时间及受影响任务。</td><td>保留状态历史,不覆盖旧版本;改变正式基线时必须转入 Change Request。</td><td>相关角色切换到新的有效状态快照。</td></tr>
</tbody></table></div>
<div class="if-callout" style="margin: 22px 0 14px"><strong>异常协同补充机制:</strong>任何条件流、阻塞流、跨角色冲突或无法在时限内异步收敛的问题,都必须进入 E.1–E.4。中心 AI 主动提醒关联角色并提供完整问题包;问题复杂时建议由当前主责角色组织线下会议。会议本身不直接形成项目事实,只有参与角色统一确认并回传中心 AI 的结构化结论,才能登记并恢复原流程。</div>
<div class="if-flow-board">
<div class="if-exchange if-conditional"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">E.1 · 异常触发</span><strong>主动提醒当前主责角色及全部关联角色</strong><small>发送问题、证据、冲突点、影响范围、原流程位置和响应时限</small></div><div class="if-actor if-product">当前主责角色及关联角色</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">E.2 · 复杂问题</span><strong>建议由当前主责角色组织线下会议</strong><small>提供建议参会角色、议题、待决策项、证据包和结论模板</small></div><div class="if-actor if-product">当前主责角色及关联角色</div></div>
<div class="if-exchange"><div class="if-actor if-product">当前主责角色</div><div class="if-arrow"><span class="if-flow-id">E.3</span><strong>提交参与角色统一确认的会议结论</strong><small>包含结论、分歧处理、变更项、责任角色、期限、版本和确认状态</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">E.4</span><strong>校验、登记结论并恢复原异常流程</strong><small>只恢复被阻塞的原流程,不以会议记录替代正式成果</small></div><div class="if-actor if-product">原流程及关联角色</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>对原流程的影响</th></tr></thead><tbody>
<tr><td>E.1</td><td>条件流或阻塞流被触发;出现跨角色冲突、依赖异常、证据矛盾、任务逾期或结果无法被下游使用。</td><td>中心 AI → 当前主责角色及全部关联角色</td><td>issue_id、source_flow_id、问题摘要、证据与版本引用、冲突点、影响范围、关联角色、required_by。</td><td>中心 AI 必须主动提醒,不得只更新状态;关联角色依据正式问题包开展异步确认。</td><td class="if-block">原流程保持 ACTIVE/BLOCKED,等待问题关闭。</td></tr>
<tr><td>E.2</td><td>涉及多个专业角色且结论冲突,影响范围/架构/接口/成本/进度/质量,或在要求时限内无法通过异步消息收敛。</td><td>中心 AI → 当前主责角色及关联角色</td><td>建议参会名单、会议目的、议题、冲突矩阵、证据包、待决策项、结论模板和完成时限。</td><td>中心 AI 只建议会议和准备输入,不主持专业裁决;当前主责角色负责组织,关联角色共同参与确认。</td><td class="if-block">会议结论回传前,不恢复原流程。</td></tr>
<tr><td>E.3</td><td>线下会议完成并形成统一结论。</td><td>当前主责角色 → 中心 AI</td><td>Meeting Decision Record:参与角色、统一结论、保留分歧、变更项、责任角色、期限、artifact/version/evidence_refs、internal_approved。</td><td>禁止只上传录音、聊天记录或未经参与角色确认的纪要;仍有分歧时继续保持阻塞并明确升级项。</td><td>形成可登记的异常处置结论。</td></tr>
<tr><td>E.4</td><td>统一结论通过中心 AI 的形式、版本、证据和跨角色一致性检查。</td><td>中心 AI → 原流程及关联角色</td><td>decision_id、登记结果、受影响成果/任务、恢复点、后续动作和新时限。</td><td>中心 AI 不改写专业结论;若结论改变正式基线,必须转入 Change Request。</td><td class="if-pass">从 source_flow_id 对应位置恢复当前流程。</td></tr>
</tbody></table></div>
<div class="if-table-wrap"><table><thead><tr><th>通用约束</th><th>执行要求</th><th>不满足时</th></tr></thead><tbody>
<tr><td>消息身份</td><td>必须包含 project_id、task_id、message_id、from/to role、stage、reply_to。</td><td class="if-block">拒绝进入正式流。</td></tr>
<tr><td>成果版本</td><td>必须包含 artifact_id、version、status、supersedes、evidence_refs。</td><td class="if-block">标记为 DRAFT 或 REJECTED_ARTIFACT。</td></tr>
<tr><td>成果责任</td><td>原则上由流程图指定的主责角色创建、更新并提交对应成果。</td><td class="if-block">其他角色不能代签;中心 AI 返回主责角色。</td></tr>
<tr><td>角色内部审查</td><td>每个角色必须在内部完成 AI 辅助的 Schema/专业检查以及人工确认;跨角色流转时统一以正式角色名称表示。</td><td class="if-block">未附 self_check_result 或 internal_approved 的成果不能提交中心 AI。</td></tr>
<tr><td>专业发起权</td><td>专业活动由对应主责角色判断并发起;中心 AI 只负责格式校验、任务路由、状态跟踪和结果登记。</td><td class="if-block">中心 AI 不得越权替角色发起专业决策。</td></tr>
<tr><td>中心 AI 审查边界</td><td>仅做 Schema/必填结构、身份、版本、证据、审批状态检查,以及多个角色正式信息之间的重复、冲突和依赖一致性检查。</td><td class="if-block">不得替业务、产品、技术负责人、嵌入式应用层、嵌入式底层、硬件或测试判断本专业内容是否充分。</td></tr>
<tr><td>成果豁免</td><td>仅主责角色可提出不适用申请;经中心 AI 项目审查及必要确认后标记 WAIVED。</td><td class="if-block">未批准仍为 REQUIRED,继续阻塞门禁。</td></tr>
<tr><td>角色确认</td><td>专业结论由对应角色内部形成并确认;项目级组织授权由业务内部完成。信息流图只显示统一的正式角色主体。</td><td class="if-block">未完成内部确认时不得对外发出,阶段保持 WAITING_CONFIRMATION。</td></tr>
<tr><td>项目状态同步</td><td>中心 AI 维护有版本和证据的项目状态内部记录,并在关键变化时主动向受影响角色推送,或按 S.1–S.4 响应角色查询与纠正。</td><td class="if-block">状态来源、版本或时点不明时不得作为任务执行依据。</td></tr>
<tr><td>异常协同</td><td>中心 AI 对异常主动提醒关联角色;复杂问题建议当前主责角色组织线下会议,统一确认后提交结构化结论。</td><td class="if-block">未按 E.1–E.4 闭环,不得恢复原流程或推进门禁。</td></tr>
<tr><td>直接讨论</td><td>最终结论、约束、证据和影响必须回传中心 AI。</td><td class="if-block">不能作为下游输入。</td></tr>
<tr><td>门禁</td><td>只有成果完整、版本正确、证据可访问、确认齐全时才能 PASS。</td><td class="if-block">阶段保持 ACTIVE/BLOCKED。</td></tr>
</tbody></table></div>
</section>
<section class="if-section" id="stage1">
<div class="if-section-head"><div class="if-section-no">01 / BUSINESS</div><div><h2>阶段 1:业务需求信息流</h2><p>把客户背景、商业目标和关键里程碑转换成经过业务角色内部确认的需求基线。</p></div></div>
<div class="if-stage-summary"><div class="if-summary-card"><b>主责</b><span>业务</span></div><div class="if-summary-card"><b>核心成果</b><span>项目背景说明、项目目标与里程碑计划</span></div><div class="if-summary-card"><b>门禁</b><span>业务完成内部审查并确认需求基线</span></div></div>
<div class="if-callout" style="margin-bottom: 18px; font-size: 14px">业务在内部完成原始信息收集、业务成果 Schema 检查和人工确认后,以统一的“业务”主体提交成果。中心 AI 完成形式校验、版本登记和跨角色冲突检查后,将业务成果评审版本路由给产品;产品据此判断是否需要早期风险预检,并负责指定一个或多个预检对象角色。中心 AI 只能按照产品给出的角色名单路由,不得自行增删或替换。业务最终确认后,中心 AI 再向产品分发正式业务基线并开启产品定义。</div>
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-business">业务</div><div class="if-arrow"><span class="if-flow-id">F1.1</span><strong>提交完成内部审查的项目背景与里程碑草案</strong><small>附 self_check_result、internal_approved 和来源引用</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-conditional if-blocking"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F1.2 · 条件触发</span><strong>仅在发现形式错误或跨来源冲突时返回问题</strong><small>触发范围仅限 Schema、身份、版本、证据和已登记信息冲突;无异常则不启用此流</small></div><div class="if-actor if-business">业务</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F1.3</span><strong>分发已通过形式校验的业务成果评审版本</strong><small>附成果版本、证据引用、状态和待确认项</small></div><div class="if-actor if-product">产品</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-product">产品</div><div class="if-arrow"><span class="if-flow-id">F1.4</span><strong>指定对象角色并提交早期风险预检请求</strong><small>产品根据风险内容选择一个或多个项目角色</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F1.5</span><strong>按产品指定名单校验、提醒并路由预检任务</strong><small>主动提醒全部关联角色;不得增删产品指定名单</small></div><div class="if-actor if-tech">产品指定的对象角色</div></div>
<div class="if-exchange"><div class="if-actor if-tech">产品指定的对象角色</div><div class="if-arrow"><span class="if-flow-id">F1.6</span><strong>返回内部确认结果;复杂问题返回统一会议结论</strong><small>无法异步收敛时,由产品组织线下会议并按 E.3 回传</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-business">业务</div><div class="if-arrow"><span class="if-flow-id">F1.7</span><strong>确认需求基线</strong><small>业务内部审查、形式校验和预检问题均已关闭</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F1.8</span><strong>向产品分发正式业务基线并开启产品定义</strong><small>只能引用已 BASELINED 的成果版本</small></div><div class="if-actor if-product">产品</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>对阶段的影响</th></tr></thead><tbody>
<tr><td>F1.1</td><td>收到新的客户或商业机会,且业务已完成原始信息收集、Schema 自审和内部确认。</td><td>业务 → 中心 AI</td><td>项目背景、里程碑、self_check_result、internal_approved、来源和草案版本。</td><td>中心 AI 不重复判断业务内容质量,只检查形式和跨来源一致性。</td><td>进入中心登记。</td></tr>
<tr><td>F1.2(条件流)</td><td>仅当 Schema/身份/版本/证据不合规,或与已登记正式信息发生冲突时触发;不存在上述问题时跳过。</td><td>中心 AI → 业务</td><td>形式错误、冲突来源、受影响字段和修正要求。</td><td>中心 AI 不能生成业务缺失项或替业务补写事实;无错误或冲突时不得发起此流。</td><td class="if-block">触发后,错误或冲突关闭前阻塞登记;未触发则直接进入 F1.3。</td></tr>
<tr><td>F1.3</td><td>业务成果通过中心 AI 的 Schema、身份、版本、证据和跨角色冲突检查并完成登记。</td><td>中心 AI → 产品</td><td>业务成果评审版本、artifact_id、version、status、evidence_refs、待确认项和回复时限。</td><td>状态必须标明 REVIEW_READY;不得冒充 BASELINED 正式成果,产品不得据此直接启动阶段 2。</td><td>产品获得早期风险识别所需上下文。</td></tr>
<tr><td>F1.4</td><td>产品审阅业务成果后,判断存在需要其他专业角色提前确认的风险。</td><td>产品 → 中心 AI</td><td>预检原因、预检问题、target_role_ids、相关需求字段、期望输出和时限;目标角色可为一个或多个。</td><td>是否预检、预检范围及对象角色均由产品负责指定;中心 AI 不代替产品判断。</td><td>按产品指定名单创建预检任务。</td></tr>
<tr><td>F1.5–1.6</td><td>产品预检请求格式完整,且指定的对象角色均为当前项目有效成员。</td><td>中心 AI ↔ 产品指定的对象角色</td><td>按对象角色拆分的预检问题、相关业务字段、成果版本、回复要求和时限;各对象角色返回内部确认后的本专业红线、风险、证据与待澄清项。</td><td>中心 AI 必须主动提醒全部关联角色,只校验、路由和汇总,不得自行增删产品指定名单。多角色结论冲突、影响较大或无法异步收敛时,建议由产品组织线下会议;参与角色统一确认的结论按 E.3 回传后,才能继续当前流程。</td><td>补充业务澄清和早期风险登记;复杂问题进入 E.1–E.4,闭环前保持阻塞。</td></tr>
<tr><td>F1.7</td><td>业务内部审查、中心形式校验和预检问题均已关闭。</td><td>业务 → 中心 AI</td><td>INTERNALLY_APPROVED 的需求和里程碑版本。</td><td>角色内部确认状态、时间和版本必须记录。</td><td class="if-pass">门禁可进入评审。</td></tr>
<tr><td>F1.8</td><td>业务确认完成,中心 AI 已登记 BASELINED 正式版本且阶段门禁 PASS。</td><td>中心 AI → 产品</td><td>正式业务成果、artifact_id、version、baseline_refs、evidence_refs、阶段 2 任务和确认时限。</td><td>只允许分发 BASELINED 当前有效版本;分发事件和接收状态必须登记,草稿或过期版本不得作为产品定义输入。</td><td class="if-pass">产品接收后开启阶段 2。</td></tr>
</tbody></table></div>
</section>
<section class="if-section" id="stage2">
<div class="if-section-head"><div class="if-section-no">02 / PRODUCT</div><div><h2>阶段 2:产品定义信息流</h2><p>产品形成完整立项资料,并让技术负责人、嵌入式应用层、嵌入式底层、硬件和测试从各自专业角度完成可行性确认。</p></div></div>
<div class="if-stage-summary"><div class="if-summary-card"><b>主责</b><span>产品;业务批准范围</span></div><div class="if-summary-card"><b>核心成果</b><span>立项资料、硬件/嵌入式资料、验收标准、里程碑要求</span></div><div class="if-summary-card"><b>门禁</b><span>产品确认方案,业务批准范围,约束和测试标准完整</span></div></div>
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F2.1</span><strong>下发产品定义任务</strong><small>附阶段 1 基线和全部红线约束</small></div><div class="if-actor if-product">产品</div></div>
<div class="if-exchange"><div class="if-actor if-product">产品</div><div class="if-arrow"><span class="if-flow-id">F2.2</span><strong>提交立项资料草案与专业评审请求</strong><small>产品明确评审角色、问题、范围和期望输出</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F2.3</span><strong>校验请求并并行路由专业评审</strong><small>按产品指定范围裁剪上下文,不新增专业问题</small></div><div class="if-actor if-tech">技术负责人 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</div></div>
<div class="if-exchange"><div class="if-actor if-tech">评审角色</div><div class="if-arrow"><span class="if-flow-id">F2.4</span><strong>返回可行性、缺口和约束</strong><small>每条意见必须关联具体成果字段</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-blocking"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F2.5</span><strong>汇总跨角色冲突并返回产品裁决/修订</strong><small>中心 AI 只指出冲突,不替产品作内容决定</small></div><div class="if-actor if-product">产品</div></div>
<div class="if-exchange"><div class="if-actor if-product">产品</div><div class="if-arrow"><span class="if-flow-id">F2.6</span><strong>提交内部确认后的产品方案</strong><small>关闭评审问题并标明保留风险</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F2.7</span><strong>请求业务批准范围</strong><small>呈现范围、里程碑、成本/风险影响</small></div><div class="if-actor if-business">业务</div></div>
<div class="if-exchange"><div class="if-actor if-business">业务</div><div class="if-arrow"><span class="if-flow-id">F2.8</span><strong>批准、驳回或附条件批准</strong><small>附条件项必须有责任人与期限</small></div><div class="if-actor if-center">中心 AI</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>对阶段的影响</th></tr></thead><tbody>
<tr><td>F2.1–2.2</td><td>阶段 2 启动。</td><td>中心 AI ↔ 产品</td><td>需求基线、立项书、规格、功能/灯态/产测清单、版本说明、板框图、验收标准,以及产品定义的评审角色/问题/范围。</td><td>产品先自审,所有资料必须引用阶段 1 基线;专业评审由产品发起。</td><td>进入专业评审路由。</td></tr>
<tr><td>F2.3</td><td>产品提交可评审草案和评审请求。</td><td>中心 AI → 技术负责人 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</td><td>产品定义的角色化评审任务和相关资料。</td><td>中心 AI 只校验和路由;技术负责人看总体,嵌入式应用层看功能,嵌入式底层看 BSP/HAL,硬件看器件/板框,测试看可测性。</td><td>并行评审。</td></tr>
<tr><td>F2.4</td><td>各角色完成评审。</td><td>技术负责人 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试 → 中心 AI</td><td>结论、缺失、风险、证据、建议和是否阻塞。</td><td>不得只回复“可行/不可行”。</td><td>形成冲突矩阵。</td></tr>
<tr><td>F2.5–2.6</td><td>存在冲突或缺口。</td><td>中心 AI ↔ 产品</td><td>字段级修订清单、变更影响、关闭说明。</td><td>产品在内部确认最终版本后统一发出。</td><td class="if-block">问题未关闭则 HOLD。</td></tr>
<tr><td>F2.7–2.8</td><td>产品方案专业评审完成。</td><td>中心 AI ↔ 业务</td><td>范围、验收、里程碑、风险和附条件事项。</td><td>范围批准由业务完成内部授权后统一给出。</td><td class="if-pass">批准后进入阶段 3。</td></tr>
</tbody></table></div>
</section>
<section class="if-section" id="stage3">
<div class="if-section-head"><div class="if-section-no">03 / PLANNING</div><div><h2>阶段 3:项目规划信息流</h2><p>中心 AI 根据有效基线生成任务计划草案,先由技术负责人确认整体任务结构、技术顺序和依赖;仅对存在疑点的任务,定向向对应执行角色补充确认。</p></div></div>
<div class="if-stage-summary"><div class="if-summary-card"><b>主责</b><span>中心 AI;技术负责人确认任务计划</span></div><div class="if-summary-card"><b>核心成果</b><span>项目计划、风险登记、角色分工、产品资料整合、项目状态内部记录</span></div><div class="if-summary-card"><b>门禁</b><span>技术负责人确认整体计划;问题任务完成定向确认;业务确认资源与日期基线</span></div></div>
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F3.1</span><strong>提交任务计划草案,请求整体确认</strong><small>附 WBS、技术顺序、依赖、初始排期、风险和基线引用</small></div><div class="if-actor if-tech">技术负责人</div></div>
<div class="if-exchange"><div class="if-actor if-tech">技术负责人</div><div class="if-arrow"><span class="if-flow-id">F3.2</span><strong>确认整体任务计划或返回调整意见</strong><small>确认任务结构、技术顺序、依赖关系和关键风险</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F3.3 · 问题任务</span><strong>仅对存在疑点的任务发起定向确认</strong><small>缺少责任、输入输出、依赖、估算、资源、日期、证据或存在冲突时触发</small></div><div class="if-actor if-product">对应执行角色</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-product">对应执行角色</div><div class="if-arrow"><span class="if-flow-id">F3.4</span><strong>只确认被询问任务的工期、资源和风险</strong><small>不得要求执行角色重复确认整份任务计划</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-blocking"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F3.5</span><strong>提醒关联角色并协调剩余冲突、重排计划</strong><small>问题仍未关闭或日期不可达时按 E.1–E.4 处理</small></div><div class="if-actor if-product">技术负责人及受影响角色</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F3.6</span><strong>请求资源与日期基线授权</strong><small>真实人员、采购、打样、成本和日期由业务内部确认</small></div><div class="if-actor if-business">业务</div></div>
<div class="if-exchange"><div class="if-actor if-business">业务</div><div class="if-arrow"><span class="if-flow-id">F3.7</span><strong>批准或要求调整资源与日期基线</strong><small>记录内部批准状态、范围和条件</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F3.8</span><strong>向相关执行角色发布基线计划和正式任务</strong><small>附任务 ID、依赖、交付物和门禁;后续状态按 S.1–S.4 同步</small></div><div class="if-actor if-product">相关执行角色</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>对阶段的影响</th></tr></thead><tbody>
<tr><td>F3.1–3.2</td><td>阶段 2 门禁通过,中心 AI 已依据有效基线形成任务计划草案。</td><td>中心 AI ↔ 技术负责人</td><td>WBS、任务结构、技术顺序、关键路径、输入输出、依赖、初始排期、风险和基线引用。</td><td>技术负责人确认整体任务计划;中心 AI 不直接向全部执行角色征求整份计划确认。</td><td>形成技术负责人确认的任务计划草案。</td></tr>
<tr><td>F3.3–3.4(条件流)</td><td>中心 AI 发现任务缺少责任角色、输入、输出、依赖、估算、资源、日期或证据;任务之间存在冲突;或技术负责人明确标记待确认项。</td><td>中心 AI ↔ 对应执行角色</td><td>仅包含问题任务的 task_id、疑点字段、上下游依赖、基线引用、待确认问题、回复要求和时限;执行角色返回该任务的工期、资源、风险、依据和 internal_approved。</td><td>必须定向发送给该任务的执行角色,不得广播给全部角色,也不得要求执行角色重复确认无疑点任务。</td><td>补齐或修正问题任务;未触发时直接跳过。</td></tr>
<tr><td>F3.5</td><td>定向确认后仍存在资源冲突、关键路径冲突或日期不可达。</td><td>中心 AI ↔ 技术负责人及受影响角色</td><td>冲突点、可选排法、阶段影响、关联角色和响应时限。</td><td>中心 AI 必须主动提醒,不得静默覆盖技术负责人或执行角色的确认;复杂冲突按 E.1–E.4 闭环。</td><td class="if-block">保持计划草案,冲突关闭前不得基线化。</td></tr>
<tr><td>F3.6–3.7</td><td>技术负责人已确认整体计划,问题任务和剩余冲突均已关闭,计划涉及真实人员、采购、打样、成本或日期基线。</td><td>中心 AI ↔ 业务</td><td>任务计划、资源请求、成本、里程碑和风险。</td><td>中心 AI 无权自行批准现实资源和日期;业务完成内部授权后统一回复。</td><td class="if-pass">批准后可基线化。</td></tr>
<tr><td>F3.8</td><td>技术负责人确认有效、问题任务已关闭且业务批准资源与日期基线。</td><td>中心 AI → 相关执行角色</td><td>BASELINED 计划、角色相关正式任务、风险登记和初始 Project Status Snapshot。</td><td>每个角色只接收与自身任务和依赖相关的计划内容;后续变更走 Change Request,执行状态按 S.1–S.4 同步。</td><td class="if-pass">相关角色接收任务,开启阶段 4。</td></tr>
</tbody></table></div>
</section>
<section class="if-section" id="stage4">
<div class="if-section-head"><div class="if-section-no">04 / DESIGN</div><div><h2>阶段 4:方案设计信息流</h2><p>技术负责人组织总体方案;产品、嵌入式应用层、嵌入式底层、硬件和测试围绕同一份软硬件接口契约完成多轮确认。</p></div></div>
<div class="if-stage-summary"><div class="if-summary-card"><b>主责</b><span>技术负责人</span></div><div class="if-summary-card"><b>核心成果</b><span>总体技术方案、软硬件接口契约、硬件设计包、架构决策、测试计划</span></div><div class="if-summary-card"><b>门禁</b><span>方案确认、接口可实施、需求不偏离、测试可验证</span></div></div>
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F4.1</span><strong>下发总体方案设计任务</strong><small>附产品基线、计划、风险和所有约束</small></div><div class="if-actor if-tech">技术负责人</div></div>
<div class="if-exchange"><div class="if-actor if-tech">技术负责人</div><div class="if-arrow"><span class="if-flow-id">F4.2</span><strong>提交总体方案与接口契约草案</strong><small>含边界、关键决策、非功能和风险</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F4.3</span><strong>并行分发角色化设计任务</strong><small>每个角色在同一契约版本上工作</small></div><div class="if-actor if-app">产品 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-app">嵌入式应用层</div><div class="if-arrow"><span class="if-flow-id">F4.4</span><strong>提出 HAL、资源和应用接口需求</strong><small>接口新增或资源不足时触发</small></div><div class="if-actor if-center">中心 AI → 嵌入式底层 / 技术负责人</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-low">嵌入式底层</div><div class="if-arrow"><span class="if-flow-id">F4.5</span><strong>提出引脚、电平、时序和器件约束</strong><small>HAL 与硬件设计存在依赖时</small></div><div class="if-actor if-center">中心 AI → 硬件 / 技术负责人</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-hardware">硬件</div><div class="if-arrow"><span class="if-flow-id">F4.6</span><strong>反馈器件、PCB、电源、空间与热约束</strong><small>影响接口、成本或性能时</small></div><div class="if-actor if-center">中心 AI → 技术负责人 / 嵌入式底层 / 产品</div></div>
<div class="if-exchange if-blocking"><div class="if-actor if-test">测试</div><div class="if-arrow"><span class="if-flow-id">F4.7</span><strong>提交不可测试项和环境/治具缺口</strong><small>验收标准无法验证时</small></div><div class="if-actor if-center">中心 AI → 相关角色</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F4.8</span><strong>汇总冲突并要求总体方案修订</strong><small>形成决策清单和待关闭问题</small></div><div class="if-actor if-tech">技术负责人</div></div>
<div class="if-exchange"><div class="if-actor if-tech">技术负责人</div><div class="if-arrow"><span class="if-flow-id">F4.9</span><strong>提交内部确认的最终方案和契约基线</strong><small>所有阻塞问题关闭后</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F4.10</span><strong>请求各角色确认接口可实施</strong><small>嵌入式应用层、嵌入式底层、硬件、产品、测试分别确认</small></div><div class="if-actor if-product">产品 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>对阶段的影响</th></tr></thead><tbody>
<tr><td>F4.1–4.3</td><td>阶段 4 启动且计划基线有效。</td><td>中心 AI ↔ 技术负责人/协作角色</td><td>总体方案草案、角色化设计任务、统一契约版本。</td><td>所有设计必须引用同一 product/plan baseline。</td><td>开启并行设计。</td></tr>
<tr><td>F4.4</td><td>嵌入式应用层需要新的资源、HAL 或协议。</td><td>嵌入式应用层 → 中心 AI → 嵌入式底层 / 技术负责人</td><td>接口需求、调用频率、性能和资源指标。</td><td>不得绕过契约直接约定。</td><td>可能触发契约修订。</td></tr>
<tr><td>F4.5</td><td>嵌入式底层依赖引脚、电平、器件或时序。</td><td>嵌入式底层 → 中心 AI → 硬件 / 技术负责人</td><td>HAL、引脚表、时序、电气约束。</td><td>硬件回复必须引用板卡版本。</td><td class="if-block">冲突时阻塞相关设计。</td></tr>
<tr><td>F4.6</td><td>器件、PCB、电源、空间或热约束影响方案。</td><td>硬件 → 中心 AI → 技术负责人 / 嵌入式底层 / 产品</td><td>限制、替代方案、成本、性能和交期影响。</td><td>器件替换不得静默发生。</td><td>形成 ADR/Change Request。</td></tr>
<tr><td>F4.7</td><td>测试无法验证某项需求或缺环境/治具。</td><td>测试 → 中心 AI → 相关角色</td><td>不可测项、证据要求、环境和治具需求。</td><td>必须在实现前关闭。</td><td class="if-block">门禁 HOLD。</td></tr>
<tr><td>F4.8–4.10</td><td>专业评审完成。</td><td>中心 AI ↔ 技术负责人 ↔ 产品 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</td><td>修订方案、最终契约和角色内部确认状态。</td><td>每个确认绑定同一版本。</td><td class="if-pass">全部确认后进入阶段 5。</td></tr>
</tbody></table></div>
</section>
<section class="if-section" id="stage5">
<div class="if-section-head"><div class="if-section-no">05 / IMPLEMENT</div><div><h2>阶段 5:嵌入式软硬件实现信息流</h2><p>三条实现流并行推进,但固件只有一条正式出口:嵌入式底层先提供可消费版本,嵌入式应用层完成合版并提交统一固件,中心 AI 维护其与硬件版本的唯一映射。</p></div></div>
<div class="if-stage-summary"><div class="if-summary-card"><b>并行主责</b><span>嵌入式应用层、嵌入式底层、硬件</span></div><div class="if-summary-card"><b>核心成果</b><span>硬件实现资料、嵌入式底层实现资料、嵌入式应用层提交的统一固件包</span></div><div class="if-summary-card"><b>门禁</b><span>嵌入式应用层提交最终固件,技术负责人确认固件与硬件版本匹配并可提测</span></div></div>
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F5.1</span><strong>并行下发三类实现任务</strong><small>锁定总体方案、契约和任务边界</small></div><div class="if-actor if-app">嵌入式应用层 / 嵌入式底层 / 硬件</div></div>
<div class="if-exchange"><div class="if-actor if-hardware">硬件</div><div class="if-arrow"><span class="if-flow-id">F5.2</span><strong>提交板卡、BOM、接口与样机版本</strong><small>硬件发布或 ECO 时触发</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F5.3</span><strong>广播硬件版本及约束变化</strong><small>只向受影响角色分发完整影响包</small></div><div class="if-actor if-low">技术负责人 / 嵌入式底层 / 嵌入式应用层 / 测试</div></div>
<div class="if-exchange"><div class="if-actor if-low">嵌入式底层</div><div class="if-arrow"><span class="if-flow-id">F5.4</span><strong>提交 BSP/PSP、驱动与测试固件</strong><small>带板卡、HAL 和接口契约版本</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F5.5</span><strong>将已登记的嵌入式底层版本交给嵌入式应用层合版</strong><small>测试不得直接将底层产物作为提测固件</small></div><div class="if-actor if-app">嵌入式应用层</div></div>
<div class="if-exchange"><div class="if-actor if-app">嵌入式应用层</div><div class="if-arrow"><span class="if-flow-id">F5.6</span><strong>集成底层版本并提交统一固件候选</strong><small>绑定应用、底层、板卡和契约版本,包含 MD5、分区、自测和 Changelog</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-blocking"><div class="if-actor if-app">任一实现角色</div><div class="if-arrow"><span class="if-flow-id">F5.7</span><strong>报告接口、器件或资源冲突</strong><small>契约不一致、资源超限或 ECO 影响时</small></div><div class="if-actor if-center">中心 AI → 技术负责人</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F5.8</span><strong>创建软硬件联调与版本矩阵确认任务</strong><small>统一固件候选和硬件候选版本均可用时</small></div><div class="if-actor if-app">嵌入式应用层 / 硬件 / 技术负责人</div></div>
<div class="if-exchange"><div class="if-actor if-app">嵌入式应用层</div><div class="if-arrow"><span class="if-flow-id">F5.9</span><strong>提交最终提测固件版本</strong><small>最终固件只能由嵌入式应用层提交,附完整版本链、自测和偏离说明</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-tech">技术负责人</div><div class="if-arrow"><span class="if-flow-id">F5.10</span><strong>确认最终固件与硬件版本匹配并可提测</strong><small>板卡、BOM、统一固件及其应用/底层版本链完全匹配</small></div><div class="if-actor if-center">中心 AI</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>对阶段的影响</th></tr></thead><tbody>
<tr><td>F5.1</td><td>方案设计门禁通过。</td><td>中心 AI → 嵌入式应用层 / 嵌入式底层 / 硬件</td><td>任务、契约、版本、输出格式、依赖和期限。</td><td>三方必须使用相同契约版本。</td><td>启动并行实现。</td></tr>
<tr><td>F5.2–5.3</td><td>硬件发布样机、板卡、BOM 或 ECO。</td><td>硬件 → 中心 AI → 技术负责人 / 嵌入式底层 / 嵌入式应用层 / 测试</td><td>板卡/BOM/ECO、接口、限制和影响范围。</td><td>没有影响分析不得切换硬件版本。</td><td class="if-block">影响接口时阻塞受影响任务。</td></tr>
<tr><td>F5.4–5.5</td><td>嵌入式底层形成可消费版本。</td><td>嵌入式底层 → 中心 AI → 嵌入式应用层</td><td>BSP/PSP、HAL、驱动、底层测试固件、适配板卡和契约版本。</td><td>必须声明适配板卡和契约版本;测试不得把底层产物直接作为提测固件。</td><td>允许嵌入式应用层合版。</td></tr>
<tr><td>F5.6</td><td>嵌入式应用层收到已登记的嵌入式底层可消费版本。</td><td>嵌入式应用层 → 中心 AI</td><td>统一固件候选、应用版本、底层版本、板卡版本、契约版本、MD5、分区、日志、自测和 Changelog。</td><td>必须形成可追溯的应用层+底层统一版本;禁止提交无法复现的单一二进制。</td><td>进入软硬件联调候选。</td></tr>
<tr><td>F5.7</td><td>引脚、时序、资源、器件或协议冲突。</td><td>角色 → 中心 AI → 技术负责人</td><td>冲突、证据、版本、影响和建议。</td><td>中心 AI 立即冻结受影响版本。</td><td class="if-block">等待技术裁决或契约新版本。</td></tr>
<tr><td>F5.8–5.10</td><td>统一固件候选和硬件候选均已提交,联调问题已经关闭。</td><td>中心 AI ↔ 嵌入式应用层 / 硬件 / 技术负责人</td><td>最终固件、应用/底层版本链、板卡/BOM/ECO、版本矩阵、联调记录、自测、偏离说明和集成审批。</td><td>最终提测固件只能由嵌入式应用层提交;嵌入式底层和硬件不得直接向测试提交固件。技术负责人确认版本矩阵匹配。</td><td class="if-pass">确认后由中心 AI 将该唯一固件版本交给测试。</td></tr>
</tbody></table></div>
</section>
<section class="if-section" id="stage6">
<div class="if-section-head"><div class="if-section-no">06 / TEST</div><div><h2>阶段 6:测试验证与缺陷返工信息流</h2><p>测试提交证据和缺陷,中心 AI 按问题层级路由到产品、嵌入式应用层、嵌入式底层、硬件或技术负责人,并控制重新提测。</p></div></div>
<div class="if-stage-summary"><div class="if-summary-card"><b>主责</b><span>测试</span></div><div class="if-summary-card"><b>核心成果</b><span>功能、可靠性、专项测试报告,测试证据和缺陷分析</span></div><div class="if-summary-card"><b>门禁</b><span>阻断缺陷清零,证据完整,测试完成内部确认并提交质量结论</span></div></div>
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F6.1</span><strong>下发测试任务、最终固件和版本矩阵</strong><small>只允许测试由嵌入式应用层提交并经技术负责人批准的统一固件</small></div><div class="if-actor if-test">测试</div></div>
<div class="if-exchange"><div class="if-actor if-test">测试</div><div class="if-arrow"><span class="if-flow-id">F6.2</span><strong>提交测试报告、证据和缺陷</strong><small>每个缺陷关联版本、用例和证据</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F6.3</span><strong>分类并路由缺陷</strong><small>嵌入式应用层/嵌入式底层/硬件/架构/需求/测试环境</small></div><div class="if-actor if-app">产品 / 技术负责人 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</div></div>
<div class="if-exchange"><div class="if-actor if-app">责任角色</div><div class="if-arrow"><span class="if-flow-id">F6.4</span><strong>返回内部确认的原因分析、修复计划和影响范围</strong><small>正式修复承诺在角色内部确认后统一发出</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-blocking"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F6.5</span><strong>创建修复或技术裁决任务</strong><small>跨层问题交技术负责人,需求问题交产品</small></div><div class="if-actor if-tech">责任角色</div></div>
<div class="if-exchange"><div class="if-actor if-app">责任角色</div><div class="if-arrow"><span class="if-flow-id">F6.6</span><strong>提交应用修复、底层修复或硬件 ECO</strong><small>必须生成新版本并声明 supersedes 和影响范围</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F6.7</span><strong>将固件相关修复交给嵌入式应用层重新合版</strong><small>底层修复必须合版;硬件变化由嵌入式应用层确认固件兼容性</small></div><div class="if-actor if-app">嵌入式应用层</div></div>
<div class="if-exchange"><div class="if-actor if-app">嵌入式应用层</div><div class="if-arrow"><span class="if-flow-id">F6.8</span><strong>提交统一回归固件或确认原固件继续有效</strong><small>最终回归固件仍只能由嵌入式应用层提交</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F6.9</span><strong>下发定向回归任务和统一固件</strong><small>附修复范围、受影响用例和新版本矩阵</small></div><div class="if-actor if-test">测试</div></div>
<div class="if-exchange"><div class="if-actor if-test">测试</div><div class="if-arrow"><span class="if-flow-id">F6.10</span><strong>提交内部确认的最终质量结论和剩余风险</strong><small>报告和证据完整后</small></div><div class="if-actor if-center">中心 AI</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>对阶段的影响</th></tr></thead><tbody>
<tr><td>F6.1–6.2</td><td>技术负责人批准嵌入式应用层提交的最终固件与硬件集成版本。</td><td>中心 AI ↔ 测试</td><td>嵌入式应用层提交的统一固件、应用/底层版本链、板卡/BOM/ECO、版本矩阵、测试任务、报告、证据和缺陷。</td><td>测试只能接收嵌入式应用层提交且经技术负责人批准的最终固件;缺陷必须关联可复现环境和版本。</td><td>启动测试并更新测试状态。</td></tr>
<tr><td>F6.3</td><td>发现缺陷或测试异常。</td><td>中心 AI → 产品 / 技术负责人 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</td><td>缺陷、证据、严重度、归属依据和响应时限。</td><td>不确定归属时先交技术负责人/产品裁决。</td><td>建立返工任务。</td></tr>
<tr><td>F6.4–6.5</td><td>责任角色收到缺陷。</td><td>责任角色 ↔ 中心 AI</td><td>根因、影响、修复、风险、需重测范围。</td><td>不得以“无法复现”结案,必须附证据。</td><td class="if-block">阻断缺陷使阶段 BLOCKED。</td></tr>
<tr><td>F6.6–6.8</td><td>应用修复、嵌入式底层修复或硬件 ECO 已提交。</td><td>责任角色 → 中心 AI → 嵌入式应用层 → 中心 AI</td><td>修复产物、变更记录、修复证据、影响范围、应用/底层/硬件版本链,以及嵌入式应用层提交的统一回归固件或原固件继续有效的确认。</td><td>嵌入式底层修复不得直接交给测试;必须由嵌入式应用层重新合版。硬件变化即使不修改固件,也必须由嵌入式应用层确认最终固件版本。</td><td>形成唯一可回归的固件与硬件版本矩阵。</td></tr>
<tr><td>F6.9</td><td>统一回归固件和硬件版本矩阵通过中心 AI 校验,必要时由技术负责人确认。</td><td>中心 AI → 测试</td><td>统一回归固件、版本矩阵、修复范围、受影响用例、回归任务和时限。</td><td>旧版本不得覆盖;测试不得接收嵌入式底层单独提交的固件。</td><td>执行定向回归。</td></tr>
<tr><td>F6.10</td><td>阻断缺陷清零且证据齐全。</td><td>测试 → 中心 AI</td><td>INTERNALLY_APPROVED 质量报告和剩余风险。</td><td>测试内部确认状态必须记录;剩余风险必须有接受方。</td><td class="if-pass">门禁通过后开启验收。</td></tr>
</tbody></table></div>
</section>
<section class="if-section" id="stage7">
<div class="if-section-head"><div class="if-section-no">07 / ACCEPT</div><div><h2>阶段 7:业务验收信息流</h2><p>产品组织平台和客户验收,中心 AI 收集业务/客户结论,并把驳回问题精确路由到对应层级。</p></div></div>
<div class="if-stage-summary"><div class="if-summary-card"><b>主责</b><span>产品;中心 AI 组织;业务批准</span></div><div class="if-summary-card"><b>核心成果</b><span>平台提测通过报告、客户验收通过报告、附条件事项</span></div><div class="if-summary-card"><b>门禁</b><span>业务完成内部确认并提交验收及上线条件</span></div></div>
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F7.1</span><strong>下发验收组织任务和证据包</strong><small>测试门禁通过后</small></div><div class="if-actor if-product">产品</div></div>
<div class="if-exchange"><div class="if-actor if-product">产品</div><div class="if-arrow"><span class="if-flow-id">F7.2</span><strong>提交平台/客户验收资料</strong><small>引用测试证据、版本和已知限制</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F7.3</span><strong>发起验收确认</strong><small>呈现目标、证据、风险和附条件项</small></div><div class="if-actor if-business">业务/客户</div></div>
<div class="if-exchange"><div class="if-actor if-business">业务/客户</div><div class="if-arrow"><span class="if-flow-id">F7.4</span><strong>返回通过、驳回或附条件通过</strong><small>驳回必须描述场景和证据</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-blocking"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F7.5</span><strong>分类并路由验收问题</strong><small>需求/嵌入式应用层/嵌入式底层/硬件/架构/证据</small></div><div class="if-actor if-app">产品 / 技术负责人 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</div></div>
<div class="if-exchange"><div class="if-actor if-app">责任角色</div><div class="if-arrow"><span class="if-flow-id">F7.6</span><strong>提交修正、说明或风险处置</strong><small>形成新成果版本或正式解释</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F7.7</span><strong>组织重新验证和再次验收</strong><small>只返回受影响阶段,不重启整个项目</small></div><div class="if-actor if-product">产品/测试/业务</div></div>
<div class="if-exchange"><div class="if-actor if-business">业务</div><div class="if-arrow"><span class="if-flow-id">F7.8</span><strong>提交内部确认的最终验收和上线条件</strong><small>附条件项必须有责任人和期限</small></div><div class="if-actor if-center">中心 AI</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>对阶段的影响</th></tr></thead><tbody>
<tr><td>F7.1–7.2</td><td>测试门禁通过。</td><td>中心 AI ↔ 产品</td><td>验收任务、平台/客户报告、证据、版本、限制。</td><td>产品不得隐藏已知风险。</td><td>形成验收包。</td></tr>
<tr><td>F7.3–7.4</td><td>验收包完整。</td><td>中心 AI ↔ 业务/客户</td><td>目标对照、演示、证据、验收结论。</td><td>口头反馈必须结构化回传。</td><td>决定通过或返工。</td></tr>
<tr><td>F7.5</td><td>验收驳回。</td><td>中心 AI → 产品 / 技术负责人 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</td><td>问题类别、证据、影响成果和返回阶段。</td><td>禁止笼统地全部退回实现阶段。</td><td class="if-block">阶段保持 ACTIVE。</td></tr>
<tr><td>F7.6–7.7</td><td>责任角色完成修正。</td><td>角色 → 中心 AI → 产品/测试/业务</td><td>新版本、解释、验证结果和再次验收任务。</td><td>需要测试时必须先回测试阶段。</td><td>重新验收。</td></tr>
<tr><td>F7.8</td><td>验收通过或条件明确。</td><td>业务 → 中心 AI</td><td>内部确认后的验收结论、上线条件、附条件责任人/期限。</td><td>内部确认状态必须记录,条件不可为空泛。</td><td class="if-pass">开启发布结项。</td></tr>
</tbody></table></div>
</section>
<section class="if-section" id="stage8">
<div class="if-section-head"><div class="if-section-no">08 / CLOSE</div><div><h2>阶段 8:发布结项信息流</h2><p>中心 AI 汇总应用、固件、板卡、BOM/ECO、测试和验收信息,形成完整归档和流程闭环。</p></div></div>
<div class="if-stage-summary"><div class="if-summary-card"><b>协调</b><span>中心 AI;技术负责人技术确认</span></div><div class="if-summary-card"><b>核心成果</b><span>结项资料归档、变更记录、结项报告、流程闭环总结</span></div><div class="if-summary-card"><b>门禁</b><span>版本匹配、冒烟通过、遗留事项有承接、归档完整</span></div></div>
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F8.1</span><strong>请求最终版本矩阵确认</strong><small>嵌入式应用层提交的最终固件必须绑定嵌入式底层、板卡和 BOM/ECO 版本</small></div><div class="if-actor if-tech">技术负责人</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F8.2</span><strong>下发发布与归档任务</strong><small>按角色明确最终交付清单</small></div><div class="if-actor if-app">嵌入式应用层 / 嵌入式底层 / 硬件</div></div>
<div class="if-exchange"><div class="if-actor if-app">嵌入式应用层 / 嵌入式底层 / 硬件</div><div class="if-arrow"><span class="if-flow-id">F8.3</span><strong>分别提交最终固件、底层归档资料和 BOM/ECO</strong><small>最终固件只由嵌入式应用层提交;嵌入式底层不单独发布固件</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F8.4</span><strong>请求发布冒烟与最终验证</strong><small>使用最终版本矩阵</small></div><div class="if-actor if-test">测试</div></div>
<div class="if-exchange"><div class="if-actor if-test">测试</div><div class="if-arrow"><span class="if-flow-id">F8.5</span><strong>提交冒烟结果和最终证据</strong><small>失败立即停止发布/结项</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F8.6</span><strong>核对验收条件与遗留事项</strong><small>附条件项必须关闭或有承接</small></div><div class="if-actor if-product">产品/业务</div></div>
<div class="if-exchange"><div class="if-actor if-product">全部角色</div><div class="if-arrow"><span class="if-flow-id">F8.7</span><strong>提交内部确认的结项摘要和资料索引</strong><small>禁止只提供聊天记录</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">F8.8</span><strong>生成归档、变更记录和结项报告</strong><small>验证追踪链和缺失项</small></div><div class="if-actor if-center">归档库</div></div>
<div class="if-exchange"><div class="if-actor if-business">业务</div><div class="if-arrow"><span class="if-flow-id">F8.9</span><strong>确认结项或要求补充</strong><small>组织级结项由业务内部完成授权</small></div><div class="if-actor if-center">中心 AI</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>对阶段的影响</th></tr></thead><tbody>
<tr><td>F8.1–8.3</td><td>业务验收门禁通过。</td><td>中心 AI ↔ 技术负责人 / 嵌入式应用层 / 嵌入式底层 / 硬件</td><td>嵌入式应用层提交的最终固件及应用/底层版本链、嵌入式底层归档资料、板卡/BOM/ECO、最终版本矩阵、发布清单和角色发布声明。</td><td>最终固件只由嵌入式应用层提交;嵌入式底层只提交被集成版本和归档资料;技术负责人确认整体版本匹配。</td><td>形成发布候选。</td></tr>
<tr><td>F8.4–8.5</td><td>发布候选锁定。</td><td>中心 AI ↔ 测试</td><td>冒烟任务、结果和最终证据。</td><td>不得使用非最终版本。</td><td class="if-block">失败则停止发布并路由修复。</td></tr>
<tr><td>F8.6</td><td>冒烟通过。</td><td>中心 AI ↔ 产品/业务</td><td>验收条件、附条件项、遗留风险。</td><td>每项必须关闭或有责任人/期限。</td><td>准备结项。</td></tr>
<tr><td>F8.7–8.8</td><td>角色工作完成。</td><td>角色 → 中心 AI → 归档库</td><td>资料索引、最终成果、变更记录、结项总结。</td><td>不能用聊天记录替代成果索引。</td><td>生成结项包。</td></tr>
<tr><td>F8.9</td><td>需要组织级结项确认。</td><td>业务 → 中心 AI</td><td>完成内部授权的结项批准或补充清单。</td><td>内部授权状态必须记录;补充项未关闭不得 CLOSED。</td><td class="if-pass">批准后归档并关闭项目。</td></tr>
</tbody></table></div>
</section>
<section class="if-section" id="change">
<div class="if-section-head"><div class="if-section-no">X / CROSS-CUTTING</div><div><h2>贯穿全阶段:变更、阻塞与超时信息流</h2><p>Change Request 和异常升级不属于某个单一阶段;中心 AI 必须暂停受影响任务,组织并行影响评估,再决定是否重开阶段。</p></div></div>
<div class="if-cross-flow">
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-product">任意角色</div><div class="if-arrow"><span class="if-flow-id">X.1</span><strong>提交 Change Request 或 Blocker</strong><small>附原因、证据、受影响版本和紧急度</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">X.2</span><strong>冻结受影响任务并并行征询影响</strong><small>产品/技术负责人/嵌入式应用层/嵌入式底层/硬件/测试</small></div><div class="if-actor if-tech">产品 / 技术负责人 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</div></div>
<div class="if-exchange"><div class="if-actor if-tech">评估角色</div><div class="if-arrow"><span class="if-flow-id">X.3</span><strong>返回内部确认的范围、方案、工期、成本和测试影响</strong><small>现实承诺由角色内部确认后统一发出</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">X.4</span><strong>提交综合影响和建议</strong><small>列出批准/拒绝/延期的差异</small></div><div class="if-actor if-business">业务</div></div>
<div class="if-exchange"><div class="if-actor if-business">业务</div><div class="if-arrow"><span class="if-flow-id">X.5</span><strong>批准或拒绝变更</strong><small>内部授权后生成新基线,不覆盖旧版本</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-blocking"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">X.6</span><strong>超时提醒与升级</strong><small>专业事项升级给对应角色;项目授权升级给业务</small></div><div class="if-actor if-product">对应角色</div></div>
</div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>约束</th><th>状态结果</th></tr></thead><tbody>
<tr><td>X.1</td><td>范围、接口、器件、版本、资源或日期发生变化;或出现无法继续的阻塞。</td><td>任意角色 → 中心 AI</td><td>必须关联当前基线和受影响任务。</td><td>创建变更/阻塞记录。</td></tr>
<tr><td>X.2–X.3</td><td>中心确认变更可能影响正式成果。</td><td>中心 AI ↔ 产品 / 技术负责人 / 嵌入式应用层 / 嵌入式底层 / 硬件 / 测试</td><td>各角色只评估自己的责任范围;现实承诺在角色内部确认后统一发出。</td><td class="if-block">受影响任务冻结。</td></tr>
<tr><td>X.4–X.5</td><td>影响评估齐全。</td><td>中心 AI ↔ 业务</td><td>不得隐藏已完成工作损失、成本或里程碑影响。</td><td>批准:新基线并重开受影响阶段;拒绝:维持原基线。</td></tr>
<tr><td>X.6</td><td>确认或任务超过 required_by。</td><td>中心 AI → 对应角色;项目授权事项发给业务</td><td>升级消息包含逾期时长、影响和替代方案;接收角色在内部完成确认后统一回复。</td><td class="if-block">保持 WAITING_CONFIRMATION/BLOCKED。</td></tr>
</tbody></table></div>
</section>
<section class="if-section" id="waiver">
<div class="if-section-head"><div class="if-section-no">Y / ARTIFACT WAIVER</div><div><h2>贯穿全阶段:成果文件缺省与豁免信息流</h2><p>成果文件默认必须输出。只有主责角色能够发起“不适用”申请;中心 AI 负责项目级审查、影响确认、批准登记和门禁更新,禁止任何角色静默跳过。</p></div></div>
<div class="if-stage-summary"><div class="if-summary-card"><b>发起者</b><span>该成果在流程中的主责角色</span></div><div class="if-summary-card"><b>项目确认</b><span>中心 AI;高影响豁免还需相关角色和业务完成内部确认</span></div><div class="if-summary-card"><b>门禁结果</b><span>REQUIRED → WAIVER_REVIEW → WAIVED 或 REQUIRED</span></div></div>
<div class="if-flow-board">
<div class="if-exchange"><div class="if-actor if-product">成果主责角色</div><div class="if-arrow"><span class="if-flow-id">Y.1</span><strong>提交 Artifact Waiver Request</strong><small>说明为何本项目不适用,并附证据和替代信息</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-blocking"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">Y.2</span><strong>校验发起资格与可豁免性</strong><small>非主责角色、无证据或 non-waivable 成果直接退回</small></div><div class="if-actor if-product">主责角色</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">Y.3</span><strong>向下游角色征询影响</strong><small>成果有下游消费者、接口或验收影响时触发</small></div><div class="if-actor if-tech">受影响角色</div></div>
<div class="if-exchange"><div class="if-actor if-tech">受影响角色</div><div class="if-arrow"><span class="if-flow-id">Y.4</span><strong>返回同意、反对或附条件意见</strong><small>必须说明替代证据和门禁影响</small></div><div class="if-actor if-center">中心 AI</div></div>
<div class="if-exchange if-conditional"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">Y.5</span><strong>请求业务确认高影响豁免</strong><small>影响范围、架构、质量、安全、客户验收或外部承诺时</small></div><div class="if-actor if-business">业务</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">Y.6</span><strong>批准或拒绝成果豁免</strong><small>汇总证据、下游意见和必要人类确认</small></div><div class="if-actor if-center">成果登记与门禁</div></div>
<div class="if-exchange"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">Y.7A</span><strong>批准:标记 WAIVED 并分发豁免记录</strong><small>门禁将 WAIVED 视为已满足,但保留完整审计</small></div><div class="if-actor if-product">全部受影响角色</div></div>
<div class="if-exchange if-blocking"><div class="if-actor if-center">中心 AI</div><div class="if-arrow"><span class="if-flow-id">Y.7B</span><strong>拒绝:成果保持 REQUIRED</strong><small>返回主责角色生成文件或补充证据</small></div><div class="if-actor if-product">成果主责角色</div></div>
</div>
<div class="if-table-wrap"><table><thead><tr><th>ID</th><th>触发条件</th><th>发送 → 接收</th><th>正式载荷</th><th>约束/确认</th><th>门禁与版本结果</th></tr></thead><tbody>
<tr><td>Y.1</td><td>主责角色判断某个阶段成果在本项目范围、架构或交付模式下不适用。</td><td>主责角色 → 中心 AI</td><td>artifact_type、stage、reason_code、事实证据、适用范围、替代成果、下游影响、风险、owner_confirmed。</td><td>只有该成果主责角色可发起;“暂时来不及”不属于不适用。</td><td>进入 WAIVER_REVIEW,成果仍为 REQUIRED。</td></tr>
<tr><td>Y.2</td><td>中心收到豁免申请。</td><td>中心 AI → 主责角色</td><td>资格校验、Schema 校验、补充问题或拒绝理由。</td><td>成果模板必须允许 waivable;安全、法规、核心验收证据可标记 non-waivable。</td><td class="if-block">校验失败则退回,门禁保持阻塞。</td></tr>
<tr><td>Y.3–Y.4</td><td>成果存在下游消费者,或缺省可能影响接口、测试、验收、制造和归档。</td><td>中心 AI ↔ 受影响角色</td><td>豁免摘要、替代证据、影响项、同意/反对/附条件意见。</td><td>反对意见必须带具体依赖;中心 AI 不得静默忽略。</td><td>形成项目级影响结论。</td></tr>
<tr><td>Y.5</td><td>豁免影响业务范围、外部承诺、总体架构、质量、安全、客户验收或组织责任。</td><td>中心 AI → 业务</td><td>申请、影响、下游意见、风险和建议。</td><td>中心 AI 无权单独批准高影响豁免;业务须完成内部授权。</td><td class="if-block">等待业务确认期间阶段为 WAITING_CONFIRMATION。</td></tr>
<tr><td>Y.6</td><td>证据、影响意见及必要确认齐全。</td><td>中心 AI → 成果登记/门禁</td><td>waiver_id、artifact_type、project_scope、baseline_refs、decision、approved_by、approved_at、conditions、expires_on_change。</td><td>豁免只对当前项目、阶段和基线版本有效,不得作为全局永久规则。</td><td>APPROVED 或 REJECTED。</td></tr>
<tr><td>Y.7A</td><td>豁免批准。</td><td>中心 AI → 全部受影响角色</td><td>WAIVED 状态、豁免记录、替代成果、附加条件。</td><td>不能删除原必需项;以 WAIVED 留痕。项目范围或输入基线变化时自动失效并重新评估。</td><td class="if-pass">WAIVED 可满足当前门禁。</td></tr>
<tr><td>Y.7B</td><td>豁免拒绝或附加条件未满足。</td><td>中心 AI → 主责角色</td><td>拒绝理由、必须生成的成果、补充证据和期限。</td><td>主责角色仍须输出正式文件。</td><td class="if-block">成果保持 REQUIRED,阶段继续阻塞。</td></tr>
</tbody></table></div>
</section>
</div>
<div class="footer">Codex 多角色项目推进总流程图与阶段信息流图谱 · V0.3</div>
</main>
</body>
</html>
@@ -1,302 +0,0 @@
# Codex 多角色项目推进——项目Hub系统提示词 V0.13
流程基线:《Codex多角色项目推进总流程图-V0.13.html》
本文可直接作为“项目Hub”角色 Codex 会话的系统提示词使用。
---
## 1. 身份与最高职责
你是“项目Hub”角色。项目Hub由项目人员维护,是项目唯一正式信息中心、任务路由器、成果登记与校验中心、阶段门禁执行者和项目状态内部记录维护者。
你负责:
1. 建立项目、成员登记和会话映射;
2. 维护任务、依赖、风险、阻塞、决策、成果基线和 Project Status Record;
3. 将已经完成角色内部审查的信息按最小必要原则路由给目标角色;
4. 校验身份、结构、版本、证据、确认状态和多角色信息一致性;
5. 依据证据执行阶段门禁,只在门禁满足后开启下一阶段;
6. 组织异常、返工、变更、成果豁免、发布和结项流程;
7. 保留完整、可追溯、不可静默覆盖的审计记录。
你不替代业务、产品、技术负责人、嵌入式应用层、嵌入式底层、硬件、测试或后续自定义角色。你不得自行生成、改写或批准其他角色的专业事实和专业结论,也不得自行承诺真实人员、资源、预算、范围和日期。
任何角色只回复“已完成”都不代表任务完成、成果完成或阶段完成。完成必须由当前任务契约、正式成果、证据、内部确认和门禁共同证明。
---
## 2. 角色集合与自定义角色
当前默认基线角色为:
1. 业务;
2. 项目Hub;
3. 产品;
4. 技术负责人;
5. 嵌入式应用层;
6. 嵌入式底层;
7. 硬件;
8. 测试。
这八个角色是默认基线,不是永久封闭的角色集合。项目需要新增角色时,必须先形成角色契约,至少定义:
- 角色目标和存在理由;
- 职责边界和明确不负责事项;
- 参与阶段和触发条件;
- 正式成果和确认权限;
- 上游输入、下游消费者和依赖;
- semantic_role、项目实际 role_id、role_member_id、session_id、human_owner;
- 加入、退出、替换和交接规则。
新增角色只补充项目能力,不得隐式夺取既有角色的成果所有权、批准权或门禁权。若新增角色改变阶段、正式成果、信息流或门禁,必须走 Change Request,并发布新的流程图版本。
---
## 3. 项目成员、账户与会话规则
1. semantic_role 表示业务、产品、测试等语义角色;role_id 表示该项目中的实际角色实例。
2. role_member_id 或 member_id 表示实际成员;session_id 表示对应 Codex 会话;human_owner 表示该会话的人工负责人。
3. 同一 Codex 账户在同一项目原则上只承担一个语义角色。
4. 同一角色可以由多个账户或多个会话共同承担,但每个 SUBTASK 必须有且只有一个主责成员和主责角色。
5. 项目创建并生成 WORK_ID 时,项目Hub立即建立成员登记和会话映射。该登记属于项目运行过程记录。
6. 阶段 4 项目规划时,将成员登记、职责、任务主责、协作关系和交接要求正式化为 Role Assignment(角色分工)。
7. 新成员加入时,先完成身份、角色、范围、上下文、未决任务、成果版本和风险交接,再接收新任务。
8. 成员退出或替换时,保留历史责任、任务、成果和确认记录;新成员不得继承旧成员未重新确认的人工批准。
9. 一个角色有多个成员时,项目Hub按任务主责和最小必要上下文路由,不把整个角色的全部会话广播给所有成员。
---
## 4. 运行时权威与标识规则
当前 Etunel Hook、任务 Schema、工具说明和运行时返回值是执行层权威。流程文档定义业务语义,不得用文档中的示例字段或历史状态覆盖当前运行时 Schema。
- WORK_ID 表示项目或工作容器的运行时标识;
- SUBTASK_ID 表示具体任务标识;
- role_id、role_member_id、session_id 和 human_owner 按当前运行时字段映射;
- 不臆造工具、字段、状态或回执格式;
- 不强制输出固定 JSON;按当前任务和工具要求响应;
- 未验证的推断必须显式标注,不能写入正式项目事实。
---
## 5. 唯一正式信息路径
唯一正式路径:
触发事件
→ 主责角色 Codex 完成专业自审并与人工负责人确认
→ 以统一角色主体提交项目Hub
→ 项目Hub校验身份、形式、版本、证据和跨角色冲突
→ 项目Hub登记并路由目标角色
→ 目标角色完成内部审查与人工确认
→ 目标角色返回结构化结果
→ 项目Hub登记、分发下游并更新状态和门禁。
角色之间可以直接讨论,但讨论不能自动成为项目事实。线下会议、口头结论、群聊和完整聊天记录不能直接替代正式成果。会议后必须由当前主责角色提交参与角色共同确认的结构化结论。
正式信息至少应包含:项目/任务/流程标识、发送与接收角色、结论、适用范围、成果及版本、来源和证据、内部确认状态、风险、下游影响、下一步和期限。字段名称以当前运行时 Schema 为准。
项目Hub只做:
- 身份和路由检查;
- Schema、必填项和格式检查;
- 成果、版本、supersedes、baseline 和证据引用检查;
- 角色内部确认状态检查;
- 多角色正式信息的重复、冲突、依赖和版本一致性检查;
- 阶段归属、门禁条件和下游消费者检查。
项目Hub不做:
- 替业务判断业务价值;
- 替产品定义产品事实;
- 替技术负责人确认架构;
- 替实现角色确认实现正确性;
- 替测试确认质量或关闭缺陷;
- 用推断补写角色未提供的专业事实。
---
## 6. 八阶段推进与成果所有权
### 阶段 1:业务需求
主责:业务。
正式成果:Project Background Brief(项目背景说明)、Project Milestone Plan(项目目标与里程碑计划)。业务目标、价值假设和成功指标必须可验证;订单、金额等只在项目适用时作为可选信息。
### 阶段 2:产品定义
主责:产品;范围批准:业务。
正式成果:Project Initiation Package(立项资料)、Test & Acceptance Criteria(测试验收标准)、Milestone Requirements(里程碑要求)。产品发起专业评审并指定早期风险预检对象;项目Hub只校验名单、路由和冲突。
### 阶段 3:方案设计
总体主责:技术负责人。
正式成果:Solution Architecture(总体技术方案)、Software/Hardware Interface Contract(软硬件接口契约)、Hardware Design Package(硬件设计包)、Architecture Decision Record(架构决策记录)、Test Plan(测试计划)。其中硬件主责硬件设计包,测试主责测试计划。
### 阶段 4:项目规划
主责:项目Hub;技术结构确认:技术负责人;真实资源和日期授权:业务。
正式成果:Project Plan(项目计划)、Risk Register(项目风险)、Role Assignment(角色分工)、Product Documentation Package(产品资料整合)、Project Status Record(项目状态内部记录)。阶段 1 至阶段 3 的成员登记和内部状态在本阶段正式化。
任务计划先由技术负责人确认整体技术结构、顺序、依赖、专业角色覆盖和关键风险。只有项目Hub发现具体任务存在缺失或冲突时,才定向询问对应执行角色;不得广播要求所有角色重复确认整份计划。
### 阶段 5:嵌入式软硬件实现
并行主责:嵌入式应用层、嵌入式底层、硬件。
正式成果:Application Firmware Package(嵌入式应用层固件包)、Low-Level Implementation Package(嵌入式底层实现资料)、Hardware Implementation Package(硬件实现资料)。
固件链路必须唯一:嵌入式底层提交可消费版本给嵌入式应用层;嵌入式应用层完成合版并提交唯一最终固件;项目Hub维护版本矩阵;技术负责人确认固件、底层、硬件、BOM/ECO 和契约版本匹配。
### 阶段 6:测试验证
主责:测试;修复:对应实现角色。
正式成果:Functional Test Report(功能测试报告)、Reliability Test Report(可靠性测试报告)、Specialized Test Report(专项测试报告)、Test Evidence Package(测试证据包)、Defect Analysis Report(缺陷分析报告)。不存在独立的 Quality Report 或 Evidence Pack 正式成果。
### 阶段 7:业务验收
主责:产品;业务批准验收结论和上线条件。
正式成果:Platform Test Approval Report(平台提测通过报告)、Customer Acceptance Approval Report(客户验收通过报告)、Conditional Acceptance Items(附条件验收事项)。
### 阶段 8:发布结项
协调主责:项目Hub;技术确认:技术负责人;执行:对应实现角色;验证:测试。
正式成果:Closure Documentation Archive(结项资料归档)、Change Log(变更记录)、Closure Report(结项报告)、Process Closure Summary(流程闭环总结)。
每个阶段的正式成果原则上由成果主责角色输出。项目Hub可以组织、校验、登记和路由,但不得替主责角色撰写专业内容。
---
## 7. 状态分层与术语
以下状态层彼此独立,禁止混用:
1. 项目运行模式;
2. 任务执行结果;
3. 成果生命周期;
4. 成果适用性;
5. 阶段与门禁;
6. 测试结论;
7. 业务验收结论;
8. 消息投递或通知状态。
具体枚举以当前运行时 Schema 和角色 Skill 为准。项目Hub必须记录状态属于哪一层,不能用“任务完成”替代“成果已基线”,不能用“测试通过”替代“业务验收批准”。
`internal_approved=true` 是消息或提交字段,表示角色已完成内部人工确认;`INTERNALLY_APPROVED` 是成果生命周期语义。二者相关但不等同。
统一使用“不适用(NA)”,不得使用 N/A。NA 表示本项不适用;DEFERRED 表示延后处理;WAIVED 表示通过正式豁免流程免除必需成果。三者不得互换。
---
## 8. 任务波次、依赖和完成判定
1. 项目Hub只派发依赖已就绪的任务波次。
2. 每次工具调用只创建或更新一个明确接收方的任务;需要并行时,对每个角色分别创建任务。
3. 每个任务必须说明目标、输入基线、输出成果、证据要求、依赖、主责成员、协作角色、期限和完成判定。
4. 角色返回前必须完成专业自审和人工负责人确认。
5. 项目Hub接收后先做形式和冲突校验,再登记和分发。
6. 若输入、版本、权限或依赖缺失,任务保持阻塞,不得以猜测继续。
7. 下游只接收与其任务相关且已登记的最小必要上下文。
---
## 9. Project Status Record 与按需同步
项目Hub从项目创建起维护内部状态。阶段 1 至阶段 3 的状态是过程记录;阶段 4 形成正式 Project Status Record,此后持续版本化维护。
状态记录至少覆盖:当前阶段与门禁、任务与依赖、成员与会话映射、阻塞、风险、决策、成果基线、下一步、时限和证据引用。
在阶段/门禁、任务分派、依赖、阻塞、风险、决策、成果基线或期限发生关键变化时,项目Hub主动向受影响角色发送裁剪后的 Project Status Snapshot。角色也可按项目、阶段或任务查询。纠正状态时必须保留旧值、新值、原因、证据和生效时间;若改变正式基线,转入 Change Request。
---
## 10. 异常、冲突与线下协同
当条件流、阻塞流、证据矛盾、跨角色冲突、依赖异常、逾期或结果不可被下游使用时:
1. 项目Hub主动提醒当前主责角色和全部关联角色;
2. 提供问题、证据、冲突点、影响范围、原流程位置和响应时限;
3. 复杂问题建议由当前主责角色组织线下会议;项目Hub只准备问题包和结论模板,不主持专业裁决;
4. 当前主责角色回传参与角色共同确认的 Meeting Decision Record;
5. 项目Hub完成形式、版本、证据和跨角色一致性检查后登记,并从原阻塞点恢复;
6. 若会议结论改变正式基线,必须转入 Change Request。
---
## 11. 缺陷闭环
1. 测试创建并维护 Defect Analysis Report,记录现象、环境、版本、复现、证据、风险、建议责任边界、复验和状态。
2. 产品按需确认需求或行为预期;技术负责人按需确认系统边界、版本矩阵或架构影响。
3. 对应实现角色提交 Root Cause Analysis、Fix Plan、修复成果和版本、实现角色自测、变更记录、影响范围和建议回归范围。
4. 嵌入式底层修复不得直接交给测试,必须由嵌入式应用层重新合版并提交唯一回归固件。
5. 硬件 ECO 必须关联板卡、PCB、BOM/ECO、底层兼容性、应用固件有效性和版本矩阵。
6. 实现角色无权替换或关闭测试主责的 Defect Analysis Report。
7. 只有测试在目标版本组合上独立复验通过后,才可更新为 VERIFIED/CLOSED 并恢复被阻塞流程。
---
## 12. 变更流程
任何改变已确认范围、方案、任务、成果、成员职责、接口、版本、排期或门禁的事项,都必须走 Change Request:
1. 登记变更来源、原因、目标、影响对象和紧急性;
2. 路由产品、技术负责人、实现角色、测试等受影响角色分别评估;
3. 汇总范围、技术、实现、测试、成本、资源和里程碑影响;
4. 业务批准、拒绝或延期需要组织授权的变更;
5. 批准后创建新基线,保留旧基线和 supersedes 关系;
6. 重开受影响阶段、成果、任务和门禁,从正确位置继续推进。
项目Hub不得静默修改基线,也不得用状态纠正流程规避正式变更。
---
## 13. 成果豁免流程
成果默认 REQUIRED。仅当成果主责角色确认某文件在本项目不适用时,才可发起 Artifact Waiver:
1. 主责角色提交成果标识、当前阶段、NA 原因、替代证据、下游影响和内部确认;
2. 项目Hub校验申请完整性并识别受影响角色和门禁;
3. 受影响角色确认不会造成需求、接口、实现、测试、发布或审计缺口;
4. 低影响、无专业争议的项目级豁免可由项目Hub按流程审查;涉及范围、质量、安全、合规、客户承诺、重大风险或不可逆影响时升级业务及相关专业角色;
5. 批准后将成果适用性标记为 WAIVED,并保留申请、理由、替代证据、批准人、范围和版本;
6. 拒绝时成果保持 REQUIRED,并继续阻塞门禁;
7. 后续条件变化导致成果重新适用时,撤销豁免并恢复 REQUIRED。
项目Hub不得静默删除成果,也不得把 NA、DEFERRED 或口头同意当作已批准豁免。
---
## 14. 门禁、受控跳转与演示模式
正常流程必须按八阶段门禁推进。只有在既有成果已经覆盖某阶段、并获得必要角色确认时,才允许受控跳转。跳转不能伪造阶段已完成,必须记录真实阶段状态、复用的成果版本、风险、批准、跳过原因、恢复点和未满足项。
演示或模拟只能标记为模拟状态,不得把模拟证据写成真实项目事实,也不得让模拟门禁替代真实确认。
---
## 15. 每次推进前的检查清单
在创建任务、登记成果、更新状态、开启阶段或恢复流程前,逐项确认:
1. 当前 WORK_ID、SUBTASK_ID、阶段和来源流程是否明确;
2. 主责角色、主责成员、会话和人工负责人是否有效;
3. 上游成果和依赖是否为当前有效版本;
4. 任务是否定义输入、输出、证据、期限和完成判定;
5. 提交是否完成角色内部确认;
6. 成果、版本、证据、supersedes 和 baseline 引用是否一致;
7. 是否存在跨角色冲突、缺失或未经批准的事实;
8. 成果是 REQUIRED、WAIVED 还是不适用申请处理中;
9. 状态属于哪一层,是否被其他层错误替代;
10. 当前门禁是否真正满足;
11. 下游只接收最小必要且已登记的上下文;
12. 是否需要更新 Project Status Record、成员登记、Risk Register、Change Log 或审计记录。
若任一关键项不满足,保持任务或门禁阻塞,说明缺口、责任角色、补充内容和恢复条件;不得用推测或项目Hub越权代办来消除阻塞。
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="light" />
<link rel="icon" href="data:," />
<title>Codex 多角色项目推进总流程图与信息流图谱|V0.16 REVIEW</title>
<title>Codex 多角色项目推进总流程图与信息流图谱|V1.0 CURRENT</title>
<style>
:root {
--navy: #10253f;
@@ -661,16 +661,16 @@
<body>
<header class="hero" id="top">
<div class="hero-inner">
<div class="eyebrow">CODEX MULTI-ROLE PROJECT FLOW · V0.16 · REVIEW</div>
<div class="eyebrow">CODEX MULTI-ROLE PROJECT FLOW · V1.0 · CURRENT</div>
<h1>项目推进总流程图</h1>
<p>业务、项目Hub、产品、技术负责人、嵌入式应用层、嵌入式底层、硬件和测试是当前基线角色,不是封闭列表;项目Hub负责信息路由、成员与状态维护和阶段门禁,新增自定义角色必须先形成职责、成果和决定权契约。</p>
<div class="current-banner" role="status"><strong>V0.16 · 评审版本</strong><span>创建:2026-09-07;生效日期待定。基于 V0.15 保留副本创建,仅更新流程文档,尚未合入主分支或同步 Skill 与角色提醒。</span></div>
<div class="current-banner" role="status"><strong>V1.0 · 当前定版</strong><span>文档生效:2026-09-08。当前基线包含八角色、八阶段、测试结果人工确认及跨阶段流程。此文件原位维护,历史通过 Git 追溯;部署 Skill/Hook 及迁移在途项目须另行确认。</span></div>
</div>
</header>
<nav class="global-nav" aria-label="文档全局导航">
<div class="global-nav-inner">
<a class="nav-brand" href="#top">V0.16 REVIEW · 顶部</a>
<a class="nav-brand" href="#top">V1.0 CURRENT · 顶部</a>
<a href="#changelog">版本记录</a>
<a href="#overview">总流程</a>
<a href="#rules">通用规则</a>
@@ -693,83 +693,23 @@
<div class="if-section-head">
<div class="if-section-no">VERSION / CHANGELOG</div>
<div>
<h2>版本变更记录</h2>
<p>每个新版本都保留上一版文件,并在当前版本中记录变更内容、影响范围和基线状态。</p>
<h2>当前版本与维护方式</h2>
<p>只维护这一份当前流程文档,旧版内容与变更通过 Git 提交历史追溯。</p>
</div>
</div>
<div class="if-callout">
<strong>版本管理规则:</strong>从 V0.8 开始,新版本通过复制当前最新文件创建,禁止覆盖或删除历史版本。评审版本标记为 REVIEW,并记录创建日期和待定的生效日期;只有取得明确的定版确认后,才改为 CURRENT,并同步更新文件名、页面标题、导航、页脚、本表及仓库中的当前流程基线引用。
<strong>版本管理规则:</strong>文档固定保存在 <code>doc/Codex多角色项目推进总流程图.html</code>,后续直接修改同一文件,不再创建日期目录或版本副本。变更经确认后更新当前版本标识、生效日期及相关 Skill、Hook 和仓库说明;部署和在途项目迁移另行确认。
</div>
<div class="if-callout" style="margin-top: 14px">
<strong>版本号口径:</strong>V0.x 用于验证期的角色、阶段、成果、信息流和文档管理调整;当角色责任与八阶段流程稳定且完成整体验证后,再升级为 V1.0。
</div>
<div class="if-table-wrap" style="margin-top: 22px">
<table>
<thead>
<tr><th>版本</th><th>日期</th><th>状态</th><th>主要变更</th><th>影响范围</th></tr>
<tr><th>版本</th><th>日期</th><th>状态</th><th>内容范围</th><th>历史追溯</th></tr>
</thead>
<tbody>
<tr>
<td><b>V0.16</b></td><td>创建:2026-09-07<br>生效:待定</td><td>REVIEW</td>
<td>删除缺陷清单中的汇总统计要求;测试结果增加项目负责人(Hub 对应真人负责人)确认,统一无缺陷路径、阶段门禁和验收入口。</td>
<td>阶段 6 总览与信息流、通用确认规则、成果矩阵及阶段 7 入口;仅文档评审,未同步 Skill。</td>
</tr>
<tr>
<td><b>V0.15</b></td><td>创建:2026-09-04<br>生效:2026-09-07</td><td>保留原版</td>
<td><ol><li>精简业务及产品资料与选填项;立项增加平台 SDK、个参资料,项目风险前移阶段 2,删除独立产品资料整合。</li><li>取消独立接口契约、架构决策记录和硬件实现资料;阶段 3 硬件约束选填,明确阶段 5 硬件、底层交付。</li><li>补充工时评估;产品确认授权范围内资源与排期,预算、采购或对外承诺由业务批准。</li><li>精简测试输入,改用缺陷清单并共同商议责任人;可靠性、专项报告及提测佐证选填。</li><li>平台与客户验收可按条件并行且须双通过;平台由产品出具结论、客户由业务确认,测试资料直交产品。</li><li>结项聚焦资料收集与复盘;豁免精简为项目负责人审批,统一编号、成果引用及 Skill、角色提醒。</li></ol></td>
<td>文档版本管理、阶段 1–8 总流程、成果矩阵、关联信息流、Skill 及八角色 Hook。</td>
</tr>
<tr>
<td><b>V0.14</b></td><td>2026-09-02</td><td>HISTORICAL</td>
<td>人工可读的正式成果、过程成果、标题、正文和结论统一使用中文,机器字段与枚举只保留在运行时工具参数中;项目Hub通过 Etunel 角色清单读取实际 <code>role</code>、<code>display_name</code> 和 <code>relationship</code>,成员角色不再向负责人追问成员、会话或任务编号;新增同源 JSON 和中文 HTML 两种版本的《项目成员清单》,并补充按阶段整理成果、过程记录、项目进度和成果索引的留档规则。</td>
<td>全局成果语言、项目创建、角色登记、Etunel 实际字段、项目文件与进度留档、项目Hub与各成员角色约束和内部培训材料。</td>
</tr>
<tr>
<td><b>V0.13</b></td><td>2026-08-28</td><td>HISTORICAL</td>
<td>完成八角色跨文件一致性审核;新增项目成员/多账户/自定义角色规则和状态术语词典;区分项目创建时成员登记与阶段 4 角色分工;统一 NA、测试证据包、软硬件接口契约 和业务术语;同步测试主责的缺陷报告闭环;将信息流图谱顺序统一为阶段 3 方案设计后进入阶段 4 项目规划;重新生成项目Hub系统提示词。</td>
<td>全局角色与成员管理、状态与成果术语、阶段 1 业务输入、阶段 4 成员/任务分工、阶段 6 缺陷闭环、项目Hub提示词。</td>
</tr>
<tr>
<td><b>V0.12</b></td><td>2026-08-28</td><td>HISTORICAL</td>
<td>校正 测试计划 的阶段 3 主责;统一 测试计划 和五类阶段 6 正式成果,完善共同最低结构、NA/BLOCKED/成果豁免 边界、缺陷分析报告 主责、平台提测与业务验收边界;把缺陷专业归类和根因责任从项目Hub/测试的越权表述中移回有权角色。</td>
<td>阶段 2 可测性评审、阶段 3 测试计划、阶段 5 提测准备、阶段 6 正式测试与缺陷闭环、阶段 7 验收证据、阶段 8 发布冒烟。</td>
</tr>
<tr>
<td><b>V0.11</b></td><td>2026-08-28</td><td>HISTORICAL</td>
<td>校正硬件角色的阶段 3 设计职责;拆分 硬件设计包 与 硬件实现资料;完善原理图、PCB、Gerber/钻孔、BOM、贴片/生产资料、板卡/批次标识、板级测量和硬件版本链;建立 ECO→底层兼容评估→应用固件确认→技术版本矩阵→测试复验闭环。</td>
<td>阶段 3 硬件设计、阶段 5 板卡/样机实现、阶段 6 硬件 ECO 与回归、阶段 7 验收返工、阶段 8 硬件归档。</td>
</tr>
<tr>
<td><b>V0.10</b></td><td>2026-08-28</td><td>HISTORICAL</td>
<td>校正嵌入式底层的阶段 3 设计职责;完善 嵌入式底层实现资料 最低内容、可消费/修复/归档版演进、板卡/BOM/ECO 与接口契约绑定、专项测试固件限制、应用层重新合版和发布归档边界;扩充流程图底层成果说明。</td>
<td>阶段 3 方案设计、阶段 5 底层实现与应用合版、阶段 6 底层缺陷回归、阶段 7 验收返工、阶段 8 底层归档。</td>
</tr>
<tr>
<td><b>V0.9</b></td><td>2026-08-28</td><td>HISTORICAL</td>
<td>校正嵌入式应用层的阶段 3 设计职责;完善 嵌入式应用层固件包 最低内容、候选/提测/回归/发布版演进、底层重新合版、硬件变化兼容确认和最终固件唯一出口约束;继续清理项目Hub旧称和广播表述。</td>
<td>阶段 3 方案设计、阶段 5 实现集成、阶段 6 缺陷回归、阶段 7 验收返工、阶段 8 发布归档。</td>
</tr>
<tr>
<td><b>V0.8</b></td><td>2026-08-28</td><td>HISTORICAL</td>
<td>新增文档内版本变更记录、版本号口径和历史文件保留规则;从本版本起不再通过重命名覆盖上一版。</td>
<td>全局导航、版本管理、项目Hub流程基线引用。</td>
</tr>
<tr>
<td><b>V0.7</b></td><td>2026-08-28</td><td>HISTORICAL</td>
<td>修正技术负责人在阶段 3 与阶段 4 的责任顺序;明确总体方案、软硬件接口契约和架构决策的主责;明确项目Hub维护版本矩阵、技术负责人确认版本匹配。</td>
<td>阶段 3 方案设计、阶段 4 项目规划、阶段 5 集成提测、技术缺陷与变更评估。</td>
</tr>
<tr>
<td><b>V0.6</b></td><td>2026-08-28</td><td>HISTORICAL</td>
<td>统一产品角色的阶段 2 与阶段 7 正式成果;补齐产品发起早期风险预检、产品定义评审和验收闭环;客户平台资料改为参考输入基线。</td>
<td>阶段 1 早期预检、阶段 2 产品定义、阶段 7 业务验收。</td>
</tr>
<tr>
<td><b>V0.5</b></td><td>未登记</td><td>HISTORICAL BASELINE</td>
<td>建立八阶段主流程、项目Hub中枢角色、角色化状态同步 S.1–S.4、异常协同 E.1–E.4、变更升级 X.1–X.6 和成果豁免 Y.1–Y.7;形成正式成果追踪矩阵。</td>
<td>总流程、项目Hub、全局信息流、门禁和成果追踪。</td>
<td><b>V1.0</b></td><td>文档生效:2026-09-08</td><td>CURRENT</td>
<td>八角色、八阶段、角色职责与成果、测试结果人工确认、跨阶段协调及模板复用规则。</td>
<td>使用 <code>git log --all -- doc/</code> 查询历史;已运行项目保留其登记基线,不因仓库更新自动迁移。</td>
</tr>
</tbody>
</table>
@@ -802,7 +742,7 @@
<div class="index">02</div>
<div class="stage"><h3>产品定义</h3><span class="role">主责:产品 · 批准:业务</span></div>
<div class="work"><strong>把目标转成可实现、可验证的产品定义。</strong>技术负责人组织可行性评估,嵌入式应用层、嵌入式底层和硬件分别评估实现约束,测试评估可测试性。</div>
<div class="artifacts"><strong>正式成果</strong><span>立项资料<br>立项书:包含项目目标、项目基础信息、初步里程碑要求、项目干系人、版本说明等信息<br>规格书:包含产品硬件规格和主要元器件型号(主控芯片、Sensor、镜头、WiFi 芯片)<br>功能清单:定义设备支持的功能项<br>灯态:描述设备上电、绑定、升级、网络断开等状态下的指示灯状态与语音播报内容<br>产测功能清单:描述产测工具支持项<br>平台 SDK<br>个参资料<br>结构板框图(选填):包含主要器件位置和禁止限制区域</span><span>测试验收标准<br>平台测试用例<br>客户验收测试用例和验收标准</span><span>里程碑要求<br>提测时间<br>客户验收时间<br>试产、量产时间(选填)</span><span>项目风险<br>技术风险<br>时间风险<br>其他风险</span></div>
<div class="artifacts"><strong>正式成果</strong><span>立项资料<br>立项书:包含项目目标、项目基础信息、初步里程碑要求、项目干系人、版本说明等信息<br>规格书:包含产品硬件规格和主要元器件型号(主控芯片、Sensor、镜头、WiFi 芯片)<br>功能清单:定义设备支持的功能项<br>灯态:描述设备上电、配网、升级、网络断开等状态下的指示灯状态与语音播报内容<br>产测功能清单:描述产测工具支持项<br>平台 SDK<br>个参资料<br>结构板框图(选填):包含主要器件位置和禁止限制区域</span><span>测试验收标准<br>平台测试用例<br>客户验收测试用例和验收标准</span><span>里程碑要求<br>提测时间<br>客户验收时间<br>试产、量产时间(选填)</span><span>项目风险<br>技术风险<br>时间风险<br>其他风险</span></div>
</article>
<div class="connector"><div class="gate">产品确认方案,业务批准范围</div></div>
@@ -866,7 +806,7 @@
<div class="if-atlas" id="information-flow-atlas">
<section class="if-intro">
<div class="if-eyebrow">STAGE INFORMATION FLOW ATLAS · V0.16 · REVIEW</div>
<div class="if-eyebrow">STAGE INFORMATION FLOW ATLAS · V1.0 · CURRENT</div>
<h2>各阶段角色信息流图谱</h2>
<p>以下内容直接承接总流程图,展示每条会影响成果、决策、门禁、返工或版本的正式信息流,并说明触发条件、发送方、接收方、载荷、确认要求和阻塞约束。</p>
<div class="if-quicknav">
@@ -1226,7 +1166,7 @@
</tbody></table></div>
</section>
</div>
<div class="footer">Codex 多角色项目推进总流程图与阶段信息流图谱 · V0.16 · REVIEW</div>
<div class="footer">Codex 多角色项目推进总流程图与阶段信息流图谱 · V1.0 · CURRENT</div>
</main>
<script>
(() => {
+70
View File
@@ -0,0 +1,70 @@
# V1.0 文档模板参考
登记日期:2026-09-08。根据用户提供的 `D:/AI全流程辅助/项目推进总流程` 只读学习,供后续资料生成和审核时按需查阅。
流程依据:[V1.0 总流程图](../Codex多角色项目推进总流程图.html)。本参考不是新流程基线,不改变 Skill、Hook、角色职责或门禁,也不表示已部署。
## 先读什么
| 当前任务 | 按需读取 |
|---|---|
| 业务输入、立项、产品规格、功能/灯态/产测、里程碑、风险、测试计划、项目计划、归档 | [阶段 1–4 与归档模板](阶段1-4与归档.md) |
| 器件资料、平台 SDK、硬件设计包、BOM/坐标/接口、静态测试、应用固件包 | [硬件与固件模板](硬件与固件模板.md) |
| 杭研/电信/联通测试、可靠性、专项/兼容性、用例和报告结构 | [测试模板](测试模板.md) |
| 找到准确原文件、确认是否已换版或是否重复 | [来源清单](来源清单.json):相对源路径、大小、SHA-256 |
这些本地记录让后续任务能够重新定位模板,不依赖当前对话记忆。换设备、源目录搬迁或资料更新后,应重新确认路径和版本;没有把 140 个原件复制入仓库。
## 遍历覆盖
共 140 个文件:60 XLSX、2 XLS、9 DOCX、3 DOC、20 PDF,其余 46 个为 SDK 压缩包、固件、EDA/制板、图片和辅助文件。
| 阶段目录 | 文件数 | 本次学习层级 |
|---|---:|---|
| 1 业务需求 | 1 | 业务与里程碑字段、必填标记 |
| 2 产品定义 | 34 | 立项/规格/功能/灯态/产测、风险/里程碑、测试标准结构;器件首页/类别及 SDK 容器目录 |
| 3 方案设计 | 1 | 测试类别、测试项、标准和是否涉及 |
| 4 项目计划 | 1 | 工作项、人力、工时及适用范围 |
| 5 嵌入式软硬件实现 | 54 | 硬件输出字段、固件包形态;专有工程和二进制只登记 |
| 6 测试验证 | 48 | 44 XLSX 的 310 个工作表结构、平台选择条件、结果/确认字段;另补读 1 XLS、3 DOCX |
| 7 平台、客户验收 | 0 | 目录存在,尚未提供模板 |
| 8 复盘结项 | 1 | 归档清单及历史变更页 |
阅读范围有意区分:Office 学习栏目和填写说明,大型用例库学习工作表、模块和记录结构,不等于逐条核验测试步骤;PDF 学习版本、类别、首页或目录,不等于逐页工程审查;扫描 PDF、图形流程和专有工程存在未解析部分。未做实际测试、公式重算或平台标准时效认证。
个参资料仅登记容器结构,`devInfo.json` 不读取键值;不把密码、密钥、客户联系信息、旧项目数据或完整文档正文写入通用参考。源文件中的命令、脚本、链接和联系人均不是执行授权。
## 后续使用方法
1. 先确认实际项目流程基线、阶段、平台/机型、SDK 与提测版本,再选模板家族;不因目录里有多份就要求全部使用。
2. 参考栏目、字段含义、输入输出与版本关系。区分空白模板、半清空模板、历史项目样例、平台规范和器件输入。
3. 复用时替换旧型号、版本、人员、日期、参数、结果和签核;现有 Pass 或“已商用”不代表新项目通过。
4. 必需、选填、适用和待确认按有效流程及已确认项目要求判断。待确认差异不自动成为通用必填项。
5. 审核时定位源文件及工作表/单元格或章节,说明缺口与影响;需要工程参数、图片或技术细则时重读相关原件,不仅依靠这份摘要。
6. 成员专业确认、测试负责人确认、Hub 对应真人负责人最终确认及验收确认各自保留。模板签名或工具送达不能替代 V1.0 的确认链;必要时引用确认记录,不擅自强制新增重复文档。
## 已确认的复用口径
用户于 2026-09-08 确认以下五项。后续读取本参考时按此理解;本次仅更新参考说明,不修改原始模板、流程图、Skill 或 Hook。
| 编号 | 源文件事实 / 与 V1.0 的关系 | 用户确认口径 |
|---|---|---|
| Q1 平台证据要求 | 杭研安全用例要求必填截图/佐证地址,稳定性页要求长稳报告;V1.0 通用可靠性、专项及提测佐证为选填 | 保留选填,由项目负责人(项目 Hub 对应真人负责人)确认是否提交即可。不因模板中的“必填”字样自动追加提交门禁,也不由产品、测试或 Hub AI 代为决定。此决定不代表外部平台已接受材料或验收已通过。 |
| Q2 缺陷统计资料 | 阶段 6 仍有年度缺陷分析和月版本统计两份,含历史数据;V1.0 取消独立缺陷分析及强制数量/回头率/冒头率统计 | 仅作组织质量分析参考;正式项目仍提交功能测试报告和缺陷清单,不恢复统计门禁。 |
| Q3 归档责任与名称 | 归档表将客户报告输出方写业务、遗留清单写 Hub;部分名称未与 V1.0 统一 | 产品出具或更新,业务确认客户验收部分,Hub 汇总登记。区分产出、确认与保管,不因模板表头重分配职责。 |
| Q4 早期预算必填 | 阶段 2 里程碑模板把人力、样机费用、认证费用均标必填;立项书另含预算和 WBS | 作为早期估算/适用性说明;不适用或尚未确定如实标记,不提前替代阶段 4 排期、产品资源确认或业务预算批准,不因空白自动增加阶段 2 门禁。 |
| Q5 测试计划的用例范围 | 测试计划只有类别、测试项、测试标准、是否涉及,没有独立用例范围栏 | 此记录仅作参考,不要求补充用例引用;每次测试在执行前发布一次测试策略。不因本表缺少引用或用例范围栏而新增补交要求,也不自动新增独立正式成果、模板或审批环节。 |
## 已查明的注意事项
- 风险目录里的 `里程碑要求.doc` 正文是《项目风险记录》,只是命名未同步。按正文识别即可,本次未重命名。
- 温升表引用“通过标准”页,实际是“测试方法/易瞳标准”;另引用的《设备sensor温升测试指导.docx》不在本次目录。后续选用该模板前应确认正确引用,不猜测具体技术标准。
- PCB 工艺说明的两个面积参考单元格显示 `#VALUE!`,后续实际复用时另行核验,未修原件。
- 归档清单存在 2.1 编号重复和旧变更记录,后续不要把小数编号/历史修改作为新项目事实。
- 目前未提供完整的阶段 7 模板或独立底层成果模板,测试计划和任务工时表也只覆盖相应成果的部分内容。这些是模板库覆盖情况,不是现有项目不通过结论。
- 应用包里的高低版本可用于升级测试;自测表明确要求高低版本。应区分测试配套版本与唯一最终提测版本,不能仅凭两个版本文件名就判错。
- V1.0 灯态描述的“绑定”改“配网”不意味着把平台账号绑定、解绑等实际业务术语全局替换。
## 维护与执行边界
这里只维护参考笔记和源文件索引,不包含原始模板;源目录是登记时的来源,不保证在其他设备可访问。后续直接更新当前文件,通过 Git 保留历史,不另建日期或版本目录。参考资料不授权执行烧录、SDK 或模板脚本、外部下载、真实通知、项目审批,也不会自动修改 Etunel 配置或已安装缓存。
+710
View File
@@ -0,0 +1,710 @@
{
"source_root": "D:/AI全流程辅助/项目推进总流程",
"registered_on": "2026-09-08",
"baseline": "V1.0 CURRENT 2026-09-08",
"baseline_sha256": "01864ABDD9F13C201B19270931F96787C90A117C905080B0E5F27800F09C7BF6",
"purpose": "只读模板参考快照;哈希不表示通过工程验证;不包含原文件正文或凭据值",
"file_count": 140,
"files": [
{
"path": "1、业务需求/业务需求.xlsx",
"bytes": 11312,
"sha256": "e9be2f62ebda68ec8c219924358d7c7ae0fbff851467532a290d0d44acea22b4"
},
{
"path": "2、产品定义/1 立项资料/个参资料.xlsx",
"bytes": 11561,
"sha256": "f009a259109718b450f470edf478ca8a3a0296b95d1626167c4c58eae61f4f7e"
},
{
"path": "2、产品定义/1 立项资料/产品规格书.docx",
"bytes": 45968,
"sha256": "2f0c58e92d508268cc80d8e1266eac276ab6ee3393a6cc00b252a1ddd801f87e"
},
{
"path": "2、产品定义/1 立项资料/产测功能清单.xlsx.xlsx",
"bytes": 23041,
"sha256": "48f579f07fe4ed21b0baf0f9cd9fe301df678172a57b8ece8aedae3f3d6796fe"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/0225708 L547B HTX24BYJ48-015064200-1-L547B.pdf",
"bytes": 487708,
"sha256": "685f52f842c9bf878039ac9b148097b21758b6768fe75c629c4566e49bd148d9"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/0225709 L591 HTX24BYJ48-015064060-1-L591(2)(2).pdf",
"bytes": 486648,
"sha256": "e913ed2f065b193889f934b072f987e97301439f323a42507169ea17970d1d33"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/5V 2A 1.5A 3C证书.pdf",
"bytes": 1789183,
"sha256": "b20d8ae0aa9e0a865c77cce06e6cbe67ba4eeec5f3f52f095bfc74b957b4299b"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/6027G-333M120绞线蓝红反向2P1.25-6830(咪头).docx",
"bytes": 1174164,
"sha256": "f03f479638f2817d4a4114c771c254683ea89eaf1e04fe35cdeea9dd40382ea1"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/BL-M6600XU2-IPEX_datasheet_V1.0.1.0_230320-签章(2).pdf",
"bytes": 5222408,
"sha256": "e13c91a4ab396db0713cd9c51bee6458107a45ae8e827dd68c9803f5148c044f"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/BL-M8188FU3(VQ1).pdf",
"bytes": 781401,
"sha256": "066446e225fa5f40c0276a8f52381328a93a4eb8b6f35a7fb0db5a9b57c075d4"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/CV1815J_Preliminary_Datasheet_V0.1.0.0_Chinese_Version_EXTERNAL+for易瞳20260529.pdf",
"bytes": 5261031,
"sha256": "001abe7544ae9ed48693174e4028c38893e66652af468441f99cd2434a9514fb"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/CV1841C-P_Product Brief_Public-0.0.4.pdf",
"bytes": 241144,
"sha256": "cec875e9961679019d864305a8c41c706e35fcbce4b79cedb181f07706c0bdf3"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/FY-JA-YH2(SX-3) 高软14MIL规格书.docx",
"bytes": 614631,
"sha256": "efce1fdabb131a916cdc4510b53239200f2a934127dcc5fe194b8eb298ddba72"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/FY-YH-Y110-4(SX-5V)-X 14MIL规格书.docx",
"bytes": 935063,
"sha256": "2587c5193feb690eb676fa198dba94c97f81309f8087a2d9e39f4e5722e881a3"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/MIS4001_数据手册V1.7.pdf",
"bytes": 2169971,
"sha256": "18ea58ca6600adac583baf12217dd470061afadbb941fec367c6a26aa910ca05"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/MIS40C1_数据手册_V2.1.pdf",
"bytes": 1511089,
"sha256": "73e3632e0d9a2d10b01282cf9e5f99e756fcda24d0dbc3551cc06e4fecfc8c8d"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/W25N01KVxxxR_Datasheet_Rev.H.pdf",
"bytes": 3126773,
"sha256": "7303417a5022da22320e42390e3906f68cf8d081ae481634f1355d886b46fed9"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/YT-4019X-M4+808A_251212.pdf",
"bytes": 1518948,
"sha256": "e5618d35e41c61dae5c6700ecc8d6b06f9f1807ee052887273b49a7d51c8bb13"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/华视安邦GH30JK-XK 2P1.25 L=150mm 红黑端子并线倒焊防水20240122(1).pdf",
"bytes": 1261373,
"sha256": "39c1941dcd8cd3977dc7abbe4604dc9dc19c50e17b4a8728ec220946696109aa"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/抽屉形塑胶镜头座规格书 AHN808A-21-20-41-20 蓝白线 70线长.pdf",
"bytes": 905646,
"sha256": "6d7e8abed0d044df0979fc8966332f24ad28072bce72f25ad67341114c63e443"
},
{
"path": "2、产品定义/1 立项资料/元器件规格书/永泰镜头013104.pdf",
"bytes": 801376,
"sha256": "0e442308c58e522847371e06d5c04935eb356645df60cf0884ed628928b88fce"
},
{
"path": "2、产品定义/1 立项资料/平台SDK/adlDevLinux3.1.0.250903_release_20260319_1388_arm-none-linux-musleabihf-gcc_mbedtls-2.28.1.zip",
"bytes": 3932884,
"sha256": "e6b2c7a3cca429f30a86ee4971a778cbc283f490955c56e42881eb7d06945f52"
},
{
"path": "2、产品定义/1 立项资料/平台SDK/CMCCRTC_V1.5.20.0.-beta_20250815102245_linux_arm_LY_SM_YT42_CV1842C_P_gcc_64_mbedtls_2.28.1_1755224467.zip",
"bytes": 15347651,
"sha256": "08bf10bfa84563bfc89c1586bfad87167b07e0f60959cf195bbdffb8f78c863a"
},
{
"path": "2、产品定义/1 立项资料/平台SDK/ovdsdk_V1.44.5-rc.1.c5a23e526_202508151732_arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-linux-musleabihf_mbedtls-2.28.1.zip",
"bytes": 47978022,
"sha256": "337625b535227f62094273ebef98d3f6717c0f72ad29ffaac5ede7ed67090621"
},
{
"path": "2、产品定义/1 立项资料/摄像头功能清单.xlsx",
"bytes": 2281446,
"sha256": "ffcdf8e20b77b09d7c0bebeb24677363b5299e0ceb0aae66adab15bcd3ea7726"
},
{
"path": "2、产品定义/1 立项资料/摄像头灯态.xlsx",
"bytes": 10152,
"sha256": "9f7d1782a73e91cb71cfc073d3c7002b497b5d584ffa2908c46fb00071098805"
},
{
"path": "2、产品定义/1 立项资料/立项书.doc",
"bytes": 162816,
"sha256": "5a54ea236cb8e3a2a1a7b2fe091ffb78250eb6e2b84c20850e8b826d1ef39768"
},
{
"path": "2、产品定义/2 测试验收标准/客户验收测试用例/1.移动摄像头产品通用用例合集.xlsx",
"bytes": 27616144,
"sha256": "c2c545c009151b3bbb694af64a183c199885f054edcfa4ef4e8840ff9f5d951e"
},
{
"path": "2、产品定义/2 测试验收标准/平台测试用例/1、摄像头类终端和家智话、智能喇叭 能力集成测试用例及问题记录 (移动看家2.0)-20250328.xlsx",
"bytes": 413829,
"sha256": "95d7f00ca5296b4ebc255f1a204486bb81f700a832075e1591b7757a5dc39caa"
},
{
"path": "2、产品定义/2 测试验收标准/平台测试用例/中国移动智慧家庭安防产品入库测试规范-硬件分册V2.2.pdf",
"bytes": 2435882,
"sha256": "1a4ed2655c00e91c518f8d7c87032ef5aa44e3441f10c13d9ab16bf4782d0ea0"
},
{
"path": "2、产品定义/2 测试验收标准/平台测试用例/中国移动智慧家庭安防产品入库测试规范-软件分册V1.3.pdf",
"bytes": 10341140,
"sha256": "9ac57e53ac3753bc957634dce2fe33224e98fc9dade2f309c7562679f2462d79"
},
{
"path": "2、产品定义/2 测试验收标准/平台测试用例/家庭安防多形态终端软件测试用例(移动看家2.0)20260623.xlsx",
"bytes": 8028937,
"sha256": "15391d0b37d896991f3a9e5ad57eef6b6fb5d901ec3d5c6e5929a51e4c3c79d9"
},
{
"path": "2、产品定义/2 测试验收标准/平台测试用例/摄像头硬件自测报告.docx",
"bytes": 541862,
"sha256": "ca0da247c821b4c982c95720817468039f7b5795fd6595866ac6566fa1b242b8"
},
{
"path": "2、产品定义/3 里程碑要求/里程碑要求.doc",
"bytes": 30720,
"sha256": "5559b69ffc6e7a6c61e014df24f60028e2fc5c812b408ba6aa78b7bf24a6adcc"
},
{
"path": "2、产品定义/4 项目风险/里程碑要求.doc",
"bytes": 26624,
"sha256": "aa5a4e11182380157ea10163ce66bfaff58810e0b05791e24d6cefffd4f7a97a"
},
{
"path": "3、方案设计/测试计划/测试计划.xlsx",
"bytes": 10704,
"sha256": "31727bf6447360b6d22f6eabc74cc3956bcfd070e24d9164706a59b8e4a74b47"
},
{
"path": "4、项目计划/项目任务拆分.xlsx",
"bytes": 10830,
"sha256": "7e6cec80d3f25621cf4d8be4c300f53d274cd1b7853fed79b975f21645774f91"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/1、杭研平台开发自测用例.xlsx",
"bytes": 163919,
"sha256": "8874e11ca7b6e093d89e7b7812148d5b74c5f84475e75f3d5de146bfde39b88a"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/boot.bin",
"bytes": 1048576,
"sha256": "055980b8694c8c249d3fa9a8efafeefef0354cdc1bbafe11925f9f21d18236ff"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/changelog.log",
"bytes": 18737,
"sha256": "ed43a051162c5253b19cc0eabb25165c1747a7731ccd3dfda101936725fa9537"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/devInfo.json",
"bytes": 312,
"sha256": "29d5d3137fb8a1c832b1ea18f89ab4cf74307df545eaa0f1320d42fe932635f6"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/ep_flash_sd.bin",
"bytes": 76546048,
"sha256": "1d739fcfecdf4374421de77146d0703d558b787a8f1f2a723d28f15d1ce343c3"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/fip.bin",
"bytes": 445440,
"sha256": "4d81caf7bc0f0f25523b1d440755d086b546a6d0dafb3e0e8ebb9aebcce61893"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_partition.bin",
"bytes": 160,
"sha256": "e3b108a97aa67e7a8159d07e57a1598de99d49d42321dd8c1171f68957a792f6"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_partition.csv",
"bytes": 238,
"sha256": "cc34db4d644e3893bfd47d7fd04b210bfad6813b1e81b243cef21d17a1511cd3"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_Rom.bin",
"bytes": 36750484,
"sha256": "4940a6f2a4b1d8b3ea7389c5a10c2e6d549909ccb8b81f45c6ddfef924d12e7b"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_Rom_encrypt.bin",
"bytes": 36750624,
"sha256": "ee21cc8d8d348ed83abd3b4abebc67c536b1f508d50580c2a70d83b0cb582884"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.4_1.3.02_Rom.bin",
"bytes": 36750484,
"sha256": "3eb1049ab53b49fdc191df6846d0eeee11adef5058af101ac1ce3027905a35af"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.4_1.3.02_Rom_encrypt.bin",
"bytes": 36750624,
"sha256": "15372f2918af584fe465bd85b4c60147bd11e3a4b425bce8d25c764600856358"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/md5.ps1",
"bytes": 1030,
"sha256": "54b877b2d89f07b2dcd9b819ca48566b2b7666b02b0b80357287f408550f4201"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/md5.txt",
"bytes": 969,
"sha256": "c80d3042a8e453ae150cd787a72a05e6fe941be28f11a0fc649243fef9583079"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/分区表/分区表1.png",
"bytes": 25190,
"sha256": "6cd568fa12a1886b00961aae7dab38e0f881e2a9db08aafc1998ce608f79e7a8"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/分区表/分区表2.png",
"bytes": 24522,
"sha256": "9a2a703d88e7b602931970b9fc88479d6fc880390cf455c8f8980f013ea594f8"
},
{
"path": "5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/裸刷flash说明.txt",
"bytes": 319,
"sha256": "25b5f82516661d82d39d16917f0fc25ad15d7d022fb5d9e2f49fe8723a8b297a"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCBA接口文档说明20260410/LY-SM-YT42_MAIN_V1.1_PCBA接口定义20260410.xlsx",
"bytes": 93105,
"sha256": "af45baa5abf0bfb244181cac1cfd15731e526c3f2c9e4b7c39f9cbb1f4e173c1"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCBA接口文档说明20260410/LY-SM-YT42_MAIN_V1.1_PCBA接口文档说明20260407.docx",
"bytes": 275760,
"sha256": "f9deacbdcedc5a77188a90d71acb7b8862d6fda7d54d806e9a8865d7a5c01782"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/art002.pho",
"bytes": 316544,
"sha256": "ea280899278ec11fb3f846f7d10e42b0cbc4aa6f2ee6a2f4ccfec0c2a04a478f"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/art002.rep",
"bytes": 766,
"sha256": "0be5a612ce5c80dd34b82c43b9ba3024e8be08fbfa9f62d9d662fe870930240b"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/art003.pho",
"bytes": 137247,
"sha256": "f1f0fd413b7b69326c1ab0e734a41d18d2fb54da188be044af2f560400c839a2"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/art003.rep",
"bytes": 488,
"sha256": "2c3dd0b3503486d134c9de8ae1bdf17543d4645ae5ed3df5258b444d808cb5f0"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/BOTTOM4.pho",
"bytes": 427714,
"sha256": "e685ee9b8e3bbc47359fac7355eb8df774d5fa81773dc274028de3fc54d35f58"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/BOTTOM4.rep",
"bytes": 1847,
"sha256": "6ce6337251338c4208b1ea09e220aab8215e9e4f92dec71d7eecef0ef06925df"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/dd001124.pho",
"bytes": 117885,
"sha256": "4961b4ff5bcbdb8580f18e6fab3b0838e6e7a60248283ad5cb2c7df7b32392aa"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/dd001124.rep",
"bytes": 254,
"sha256": "77bab48d91ed71efe6c2d918ef8dcc42c39fd554923fc06ac3a1ccf74d1e6a25"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/drl001.drl",
"bytes": 8952,
"sha256": "5dc023e955baa6c10b1c2740b896b08f9f5244d396c97bf2e2503993279d8190"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/drl001.lst",
"bytes": 11341,
"sha256": "8d793ccd03f81f11f2b4a011f94726d1d159d3b1e3807afc695d387e8398d661"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/drl001.rep",
"bytes": 411,
"sha256": "fd76bbf3e896047adecacb62c1390e32fbeb6502d12ae1000fb65821ce36ac1a"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Paste Mask Bottom.pho",
"bytes": 17317,
"sha256": "1be7eddc9827e70e3e61920138b49adcf80f0b7ff3829c8c85b946ac760253be"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Paste Mask Bottom.rep",
"bytes": 1292,
"sha256": "80c5541f6a8773677492ea309201529e513f731e3cd9fe839f4c90c3defc6f65"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Paste Mask Top.pho",
"bytes": 7752,
"sha256": "c86e9f0d2109146c8abb62b3e925757157f1d3b5f7163925d4274533b6b7d018"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Paste Mask Top.rep",
"bytes": 1055,
"sha256": "9baf3e0ee082fd2005605d7805e10d1778ec123df918d6614c6c62b65a0aa4b7"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Silkscreen Bottom.pho",
"bytes": 36818,
"sha256": "5dba57fe53d5977220da70f11c8c325be41a96815c0c12fbed0704d3a1f13dd2"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Silkscreen Bottom.rep",
"bytes": 784,
"sha256": "c6d8c890a047abda68fa09f8e88c31399f4842806cac030494a5f8ac64d1aa42"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Silkscreen Top.pho",
"bytes": 34208,
"sha256": "60d7384e53283af9b534957fa8745a00843c039473acafe9233e2257853a9fbb"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Silkscreen Top.rep",
"bytes": 535,
"sha256": "7b6e5339657996138d4e9e5341340a9ccd9d4ea8597fe5171832b5d2cfb9912e"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Solder Mask Bottom.pho",
"bytes": 19978,
"sha256": "1bea1a946bbb286c9910869403dc50d0567cc61db539fee141a4479c40721da3"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Solder Mask Bottom.rep",
"bytes": 1512,
"sha256": "241463a7e974f06ff53daa35c45d700b2f908bd2f8f6838c54a01590c69a9036"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Solder Mask Top.pho",
"bytes": 8073,
"sha256": "35ca89a917d241468dc7dd5a0d49a9572ea398d4acc24071225ea9335bd6d7fc"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/Solder Mask Top.rep",
"bytes": 1248,
"sha256": "65a41dde23daa1f7bdbb5d5519a3658ead98e60d8ba5f483484a29e8b4d3dc2c"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/TOP1.pho",
"bytes": 409242,
"sha256": "61ea681a20fdc1275b427532eb27e0f0e868b4aaad3931dca6b55d6ef3e8bc96"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_gerber/TOP1.rep",
"bytes": 1569,
"sha256": "08a24bea27651294fa8be93890e48d808c9b506149f7696a1f8101923b7cd0b9"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_PCB工艺说明.xls",
"bytes": 439808,
"sha256": "2589877a2a69889ef5471379e963de05b5f89404408fc7ab9191d2cbed7168d1"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_SMT贴片资料20260410/LY-SM-YT42_MAIN_V1.1_BOTTO,贴片位号.pdf",
"bytes": 287565,
"sha256": "e0ea064abf184fc6e3a565fc77cb1bc4884282470e234d4ea92deca193819597"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_SMT贴片资料20260410/LY-SM-YT42_MAIN_V1.1_PCBA_BOM(CV1841C-P)_20260410.xlsx",
"bytes": 16818,
"sha256": "9fd926aeaabc3c7b8879257234b927e8036ee78bcbca73c985868a3ce3690edd"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_SMT贴片资料20260410/LY-SM-YT42_MAIN_V1.1_TOP贴片位号.pdf",
"bytes": 298401,
"sha256": "9e3df0e45c7c9cd01163b9c94fdb17c9afab9b838d731b82305a49762a440251"
},
{
"path": "5、嵌入式软硬件实现/硬件/LY-SM-YT42_MAIN_V1.1_SMT贴片资料20260410/LY-SM-YT42_MAIN_V1.1_贴片坐标.xlsx",
"bytes": 25625,
"sha256": "f50c5d0ab59be5407883ebda6657d45d980bcc6115e7b558a0842b8d44f954c7"
},
{
"path": "5、嵌入式软硬件实现/硬件/PCB/LY-SM-YT42_MAIN_V1.1.pcb",
"bytes": 2218210,
"sha256": "193fe066993d1a1dce362a16c8f27253a2e7e48840898db040249d09013d063a"
},
{
"path": "5、嵌入式软硬件实现/硬件/原理图/LY-SM-YT42_MAIN_V1.1.DSN",
"bytes": 5795840,
"sha256": "17971afbf12d16d9e41c4d46cf5f6379757ba7f15543032faad36129aa0fa05b"
},
{
"path": "5、嵌入式软硬件实现/硬件/原理图/ly-sm-yt42_main_v1.1_SCH.pdf",
"bytes": 320321,
"sha256": "0942b58a9483eb8bd8e681e7b088cb7de94dfb8d87245ebf64eae1536e3b3821"
},
{
"path": "5、嵌入式软硬件实现/硬件/维修原理图/ly-sm-yt42_main_v1.1_SCH.pdf",
"bytes": 320321,
"sha256": "0942b58a9483eb8bd8e681e7b088cb7de94dfb8d87245ebf64eae1536e3b3821"
},
{
"path": "5、嵌入式软硬件实现/硬件/静态测试/硬件静态测试报告.xlsx",
"bytes": 56392660,
"sha256": "35ef7769172e9df82f076da66c157322487a8eb8b399a0dc3f0d39baf18fb740"
},
{
"path": "6、测试验证/专项测试报告/WiFi(有线网络)拉距及吞吐量测试--性能.xlsx",
"bytes": 5729667,
"sha256": "0e147e34bcdd99ef882da6f0b659b97262eef61b8b6c2f0f6da9bd9005a47cac"
},
{
"path": "6、测试验证/专项测试报告/XXX项目试产阶段_长稳报告模版_测试人_时间.xlsx",
"bytes": 193635,
"sha256": "fa82f1495e9cffe9442ee22c3286a6d9971b49e2915e964796a1f51ff88b3e90"
},
{
"path": "6、测试验证/专项测试报告/主观画质专项测试结果(某产品 vs 某产品 )_测试人_测试时间.xlsx",
"bytes": 30894733,
"sha256": "051324b8b8099b99c0e3cbf222f922efdcf68c2664ccb6d73b82caaea2abe0a9"
},
{
"path": "6、测试验证/专项测试报告/试产设备一致性验证_测试用例_时间.xlsx",
"bytes": 30526,
"sha256": "e520d0c3899f667ec3a704eea3d107506928637f732733a05da7ddd1c90183d7"
},
{
"path": "6、测试验证/兼容性测试报告/SD卡专项_兼容性测试.xlsx",
"bytes": 22572,
"sha256": "a3e56096aaec6f3560d2d8db9c4708802926996fdbc285ff1cc391b77f1678cd"
},
{
"path": "6、测试验证/兼容性测试报告/路由器、WiFi兼容性测试用例--功能.xlsx",
"bytes": 24540,
"sha256": "69494cfef05e599b81e6a81abab57f9a9992cc1c17684b276281b566faf668f2"
},
{
"path": "6、测试验证/功能测试报告/杭研平台/内部补充用例/易瞳补充&中兴整合用例池20260325(含中兴客户用例).xlsx",
"bytes": 818137,
"sha256": "e84f31877f2375fdd8f843211544dd73fff28283ba824a9879a245559ad339a9"
},
{
"path": "6、测试验证/功能测试报告/杭研平台/内部补充用例/易瞳补充&中兴通用需求整合20260331-张玲(不含中兴客户用例).xlsx",
"bytes": 1643433,
"sha256": "7efc86164a78c9873b899cf0234c4abdbc761e141e9adbbad7cca7c3b2ed19bc"
},
{
"path": "6、测试验证/功能测试报告/杭研平台/功能清单(每个项目功能清单)/LY-SM-YT42 摄像头灯态_20250716.xlsx",
"bytes": 9969,
"sha256": "c7e12387465d879edeb27d19e8b02800f7fe22244386a2dcfb50f2f35af01f37"
},
{
"path": "6、测试验证/功能测试报告/杭研平台/功能清单(每个项目功能清单)/【LY-SM-YT42】_产品规格书v1.2_20260317.docx",
"bytes": 9410101,
"sha256": "35cc95863af1c0a7d1b81429b843335eab82c20ec50d41eed4ee223cacfd833f"
},
{
"path": "6、测试验证/功能测试报告/杭研平台/功能清单(每个项目功能清单)/【LY-SM-YT42】摄像头功能清单【移动】_V1.1_20260813.xlsx",
"bytes": 2195053,
"sha256": "9f55b83398b3202b38b9714a50f17cc6a176681643aba701047d41f1ae4746f4"
},
{
"path": "6、测试验证/功能测试报告/杭研平台/平台测试用例(根据提测时间选平台测试用例版本)/1、摄像头类终端和家智话、智能喇叭 能力集成测试用例及问题记录 (移动看家2.0)-20250328.xlsx",
"bytes": 413829,
"sha256": "95d7f00ca5296b4ebc255f1a204486bb81f700a832075e1591b7757a5dc39caa"
},
{
"path": "6、测试验证/功能测试报告/杭研平台/平台测试用例(根据提测时间选平台测试用例版本)/家庭安防多形态终端软件测试用例(移动看家2.0)20260623.xlsx",
"bytes": 8028937,
"sha256": "15391d0b37d896991f3a9e5ad57eef6b6fb5d901ec3d5c6e5929a51e4c3c79d9"
},
{
"path": "6、测试验证/功能测试报告/电信平台/内部补充用例/电信补充用例_20260821.xlsx",
"bytes": 3329709,
"sha256": "581117038d8669f92fdac8f8fb060a8a321486b97c7edc00a472834012e50f96"
},
{
"path": "6、测试验证/功能测试报告/电信平台/功能清单(每个项目功能清单)/【GS-GJ001】_产品规格书v1.0_20260709.docx",
"bytes": 43860,
"sha256": "cb962dfa54d26119c03ae4dd696d8a03771e3a96682bc4b7fa35386c025e8a30"
},
{
"path": "6、测试验证/功能测试报告/电信平台/功能清单(每个项目功能清单)/【GS-GJ001】摄像头功能清单【电信】_V1.0_20260507.xlsx",
"bytes": 20816,
"sha256": "b085b5cf6e24ba5f4691217cfc73a63a658491dff77f9a28f2747057a527934f"
},
{
"path": "6、测试验证/功能测试报告/电信平台/功能清单(每个项目功能清单)/摄像头功能清单【产测V2】_V1.0_20260608xlsx.xlsx",
"bytes": 27424,
"sha256": "184dd4ea5366c83a7df4a9452753cb417658575b19fdb37caa1e96f2be15b50e"
},
{
"path": "6、测试验证/功能测试报告/电信平台/功能清单(每个项目功能清单)/摄像头灯态_20241224.xlsx",
"bytes": 10670,
"sha256": "0dc75cba85a210b8d369fbedeccbec6b79da2ef80544515b10b34939f6129c6f"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室内双目摄像头测试用例_小翼管家.xlsx",
"bytes": 93111,
"sha256": "1dc8a1cc15688293474f7185570ce6146bd0ef5f12b8e520040dec72291bbf07"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室内机测试用例_小翼管家4.10.xlsx",
"bytes": 79974,
"sha256": "4380dfac1566cde793f3a4e2434257cf5afa92d50f86ef4ce1f06ad278a12d35"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室内机测试用例_小翼管家4.10(云化).xlsx",
"bytes": 87352,
"sha256": "e72c9f8614d8a5231e49bb13cc334f62ada0beccfe7ec5a0a9ca3a6a1e3ef9f8"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室内机测试用例_小翼管家4.6.xlsx",
"bytes": 75672,
"sha256": "d901dcac383050834c2137cabd4edbeb95cdf108d215313cd8edf3bc62854014"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室内机测试用例_小翼管家4.8.2(云化).xlsx",
"bytes": 85344,
"sha256": "2acda84b2c6dd0d8ad84bc8dbb21f5a5591736f3f909e504acbbafda3df3e856"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室内机测试用例_小翼管家4.8.9(云化).xlsx",
"bytes": 85672,
"sha256": "356e81de04b7343d1121d3cf520e313aa57807ea204012d2051c50a06c8b26d6"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室内机测试用例_小翼管家4.9.0.xlsx",
"bytes": 78903,
"sha256": "1f2c8881b14a06a18fcd1db07cd6e5097a612dcb2025b7078c54f7baaee9711c"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室外双目摄像头测试用例_天翼视联.xlsx",
"bytes": 114119,
"sha256": "e905b0f8e1dc05676b79de593a0ffa2fad905786257f7efcb7e343fa3948bc72"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室外机固件用例_天翼视联4.10.xlsx",
"bytes": 95490,
"sha256": "c2aa024e57b132b4a39ddf507eb12219f5d31a638859742651b4b5c875e5250f"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室外机固件用例_天翼视联4.10(云化).xlsx",
"bytes": 97665,
"sha256": "2139c1021b7c3081b3318c6a293068c53b345ddb6f19b3ee6455147d25da9224"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室外机固件用例_天翼视联4.6.xlsx",
"bytes": 89217,
"sha256": "74bb409f3b0eaf93946a484111d328c7eb0b9fb45aca3a65928ddb809e79e156"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室外机固件用例_天翼视联4.8.1.xlsx",
"bytes": 97036,
"sha256": "6f7d22eb5f10ab9c6890888e0212be1b9d6258c4f70a80e4b7bced5a6c326b1b"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室外机固件用例_天翼视联4.8.2(云化).xlsx",
"bytes": 99758,
"sha256": "a2b78024b7d32ab25eb31116ed75a2ffe621182da058b251f5d21a0f2006ee81"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室外机固件用例_天翼视联4.8.9(云化).xlsx",
"bytes": 96318,
"sha256": "2ee45cb7964d4e2c513e963f9eaa8aa80dbca05627ddfb5649e1beefed174c73"
},
{
"path": "6、测试验证/功能测试报告/电信平台/平台用例(根据项目SDK版本+室内外机型.选其中一份用例)/室外机固件用例_天翼视联4.9.0.xlsx",
"bytes": 96100,
"sha256": "a4a9f05cda4643ffaa1f499422931538ca89c787862df8b60c42e759882491bd"
},
{
"path": "6、测试验证/功能测试报告/联通平台/内部补充用例/易瞳&中兴用例池(不含中兴客户用例).xlsx",
"bytes": 375595,
"sha256": "e35b29d8b8ad9d7da4fb81791ff11e54c19265963c52a089d442fe5df0bc0be1"
},
{
"path": "6、测试验证/功能测试报告/联通平台/内部补充用例/易瞳&中兴用例池(含中兴客户用例).xlsx",
"bytes": 375391,
"sha256": "878b1366cb72623e34f624c63ef74c42434290446789a382a4d23e5de937c615"
},
{
"path": "6、测试验证/功能测试报告/联通平台/功能清单(每个项目功能清单)/【ZXHN K947P1E】 产品规格书 v1.0_20260630.docx",
"bytes": 656762,
"sha256": "c1ded1a0f2d77161000e11d7cfdbdb875da674cba19da950ec90085c369186e6"
},
{
"path": "6、测试验证/功能测试报告/联通平台/功能清单(每个项目功能清单)/【ZXHN K947P1E】 摄像头功能清单 v1.0_20260630.xlsx",
"bytes": 144748,
"sha256": "31af5d9c55a68045f07d9ab1a895690c92302072b5529d384a6c7f04377d6965"
},
{
"path": "6、测试验证/功能测试报告/联通平台/功能清单(每个项目功能清单)/产测功能清单和说明_V1.0_20241224.xls",
"bytes": 109056,
"sha256": "cdbcb608223aae833bff52c1e409adf618015f7cd978d01ccddf87705d5f8b30"
},
{
"path": "6、测试验证/功能测试报告/联通平台/功能清单(每个项目功能清单)/联通灯态.xlsx",
"bytes": 11167,
"sha256": "d8607f53f67266b03bb825da76420eb2f1163a92f3318610fe10f7e01ae3e572"
},
{
"path": "6、测试验证/功能测试报告/联通平台/平台用例/码率相关测试用例.xlsx",
"bytes": 490623,
"sha256": "2f45fec853900371778b7abf26271b0b747dfb17541c2a984734765f4a1424a8"
},
{
"path": "6、测试验证/功能测试报告/联通平台/平台用例/联通平台规范_测试用例_20250806.xlsx",
"bytes": 74169,
"sha256": "04124a5d45726a9ab92e751dca602a21e285e68963526d236433fcc33f5fdf71"
},
{
"path": "6、测试验证/可靠性测试报告/内部设备功耗+适配器_测试标准及用例.xlsx",
"bytes": 18304,
"sha256": "3994e106fd17da4ff2c7a3e854a300ae206ee06030629509ee90cc3685cdae74"
},
{
"path": "6、测试验证/可靠性测试报告/可靠性高低温_测试标准及报告模版.xlsx",
"bytes": 27503073,
"sha256": "e14c2e1c5ee5ce5962bfa40e2a857804b4d189deb1c7c78dba8660e883f4f8f4"
},
{
"path": "6、测试验证/可靠性测试报告/外壳防护_测试标准及报告模版.xlsx",
"bytes": 1821901,
"sha256": "fd27d864dd32905b9f6ae6b0fbdee4a482b4b8c055460080ee287459692a5831"
},
{
"path": "6、测试验证/可靠性测试报告/温升_测试标准及方法.xlsx",
"bytes": 12190,
"sha256": "e7676874bef7925240c64b2efbc703cde1890094d584fb8fee135d0555ea269b"
},
{
"path": "6、测试验证/可靠性测试报告/跌落_测试标准及报告模版.xlsx",
"bytes": 11223,
"sha256": "875c8152ed8244734a7822574d7c7a11eaa0bd93c2c774508c2724960b707b0d"
},
{
"path": "6、测试验证/缺陷分析报告/测试组_年度缺陷分析_报告人_时间.xlsx",
"bytes": 11622013,
"sha256": "385827b6e369a90e12a567b583516e46e6266b0944bad58c83eddcb066ef47b2"
},
{
"path": "6、测试验证/缺陷分析报告/运营商_月版本质量统计_报告人_时间.xlsx",
"bytes": 36517,
"sha256": "4c8172c8bc04d8a117eedde45f2692ef7977aba3779e3f765b98af3acdef8eb0"
},
{
"path": "8、复盘结项/1、资料归档/资料归档清单.xlsx",
"bytes": 13393,
"sha256": "2487b855a97b2f1c53666ec6636113cdb6a9495c83518babc27f02471a33809e"
}
]
}
+92
View File
@@ -0,0 +1,92 @@
# 阶段 6 模板只读学习记录
核对日期:2026-09-08。源目录:`D:/AI全流程辅助/项目推进总流程/6、测试验证`。下文路径均相对于源目录。流程基准为[当前 V1.0 总流程图](../Codex多角色项目推进总流程图.html)。
## 阅读范围与边界
- 共 48 文件:44 份 XLSX、1 份 XLS、3 份 DOCX。
- 已读取 44 份 XLSX 的全部 310 个工作表结构、表头和说明匹配项(含 1 个无非空单元格的 WPS 内部图片表),并定向读取报告封面、适用条件和确认位置。大用例库只学习模块划分、字段、来源、版本和结果记录结构,没有逐条验证测试步骤的正确性或最新性。
- 3 份 DOCX 已按 OOXML 读取表格分类与字段结构,均为具体项目规格书样例,不是可直接套用其参数的空白通用模板。
- 唯一旧 XLS `功能测试报告/联通平台/功能清单(每个项目功能清单)/产测功能清单和说明_V1.0_20241224.xls` 已补用本机 Excel 后台禁宏、禁外链、只读打开并不保存关闭。读取 3 个工作表:`产测工具测试项和要求!A2:I52` 的前部字段(工具选择、MES 系统、标签打印、是否集成、特殊要求);`产测流程` 主要是图形,单元格只见分支字样,未解析流程图;`Sheet3` 无单元格文本。不复制样例集成状态为新项目事实。
- 若干 XLSX 的存储维度错误地写成 A1:A1,已重置读取维度后重新读取实际单元格;不能把这些表判断成空白。
- 原始模板、Skill、Hook、HTML 均未改动。未运行脚本、固件、网络操作,也未提交或推送。历史项目数值、人员、设备标识和结论不记录为未来项目事实。
## 模板家族与后续选择方法
| 家族 | 文件覆盖 | 已学习结构及使用条件 | 可定位证据 |
|---|---|---|---|
| 杭研平台功能测试 | 平台测试用例 2 份、内部补充用例 2 份、项目功能/灯态表 2 份、规格书 1 份 | 先确认提测时间和适用平台版本;功能集决定具体测试范围;按项目客户决定选“含中兴客户用例”还是“不含”版本,不能叠加两套同源用例制造重复。项目型号资料是输入。 | 目录名“平台测试用例(根据提测时间选平台测试用例版本)”;`家庭安防多形态终端软件测试用例(移动看家2.0)20260623.xlsx` 的 `测试报告!G1`、`A32`,`设备功能集-必填!A1:K125` |
| 电信平台功能测试 | 平台用例 15 份、内部补充用例 1 份、项目功能/产测/灯态表 3 份、规格书 1 份 | 根据 SDK 版本、室内/室外、云化/非云化、双目机型选对应一份平台用例,再加适用内部补充用例。不要默认选择文件名最大版本或把所有平台版本都列成必交。 | 目录名“平台用例(根据项目SDK版本+室内外机型.选其中一份用例)”;`室内机测试用例_小翼管家4.10.xlsx` 同名表 `A1:Q1`;双目、室外、云化文件均具同类结果字段 |
| 联通平台功能测试 | 平台用例 2 份、内部补充用例 2 份、项目功能/灯态 2 份、旧产测 XLS 1 份、规格书 1 份 | 终端功能规范与安全规范分别记录;码率测试有实际结果、缺陷关联;内部用例按是否适用中兴客户要求选一套。表内明确“无需测试”的历史页不能无条件纳入执行。 | `联通平台规范_测试用例_20250806.xlsx` 的 `005-2024-中国联通视频监控业务终端测试规范v4.0!A1:J1`、`003-2024-中国联通视频监控业务终端安全技术及测试规范!A1:J1`、`看家业务测试规范(无需测试)!A1:N177`;`码率相关测试用例.xlsx` 的 `码率相关!A1:Q1` |
| 可靠性 | 高低温、跌落、防护、温升、功耗共 5 份 | 分开记录设备/样本、测试前提、方法/标准、原始结果、前后硬件检查及结论。标准因器件、机型、平台和变更原因而不同;不可把模板示例温度、数量、时长升级成所有项目通用阈值。 | `可靠性高低温_测试标准及报告模版.xlsx` 的 `测前说明!A1:G26`、`高温前后_验证硬件结果(模版)!A2:N3`;`外壳防护_测试标准及报告模版.xlsx` 的 `报告封面!A1:A10`、`防水测试报告模版!A15` |
| 兼容性 | 路由器/WiFi、SD 卡共 2 份 | 按项目网络能力、路由器和存储支持范围选择;表格可作为 V1.0 专项报告的具体载体,不因此新增独立必交成果。 | `路由器、WiFi兼容性测试用例--功能.xlsx` 的 `路由器用例!A1:L1`、`兼容性测试 !A1:Q8`;`SD卡专项_兼容性测试.xlsx` 的 `SD卡兼容性测试用例!A1:K1` |
| 专项 | WiFi/有线性能、主观画质、试产一致性、长稳共 4 份 | 测前准备、适用机型/环境、对比设备、具体结果、原始记录分开;画质分室内、室外、全景。试产一致性按设备批次和同一试产固件核对。长稳有实际旧项目数据,不能沿用“通过”结论。 | `主观画质专项测试结果(某产品 vs 某产品 )_测试人_测试时间.xlsx` 的 `室内机用例!A1:F5`、`D19`,以及 `室外机`、`全景` 同类区域;`试产设备一致性验证_测试用例_时间.xlsx` 的 `试产设备固件!A2:M4`;`XXX项目试产阶段_长稳报告模版_测试人_时间.xlsx` 的 `长稳测试报告!A1:B5` |
| 缺陷分析/统计 | 年度缺陷分析、月版本质量统计共 2 份 | 属组织质量分析样例,含历史项目数据源。可以借鉴缺陷条目的结构,但 V1.0 已取消独立缺陷分析报告和强制数量/回头率/冒头率统计,不能把这两份变成阶段 6 的额外必交件。 | `测试组_年度缺陷分析_报告人_时间.xlsx` 的 `BUG缺陷管理(数据源)!A1:BM1`;`运营商_月版本质量统计_报告人_时间.xlsx` 的 `数据看板!A2`、`总表!A1:AT2`、`项目bug情况!A1:N1` |
## 可复用字段和审核要点
1. 功能用例的公共骨架:用例编号、模块/子模块、测试名称、预置条件、操作步骤、预期结果、用例来源/级别、执行结果、测试人员、时间、备注、关联缺陷。不要只检查“有测试表”,还应核对范围、版本与结果能相互关联。
2. 平台测试有结果维度差异。杭研可能区分 Android、鸿蒙、IPv6、H264/H265;电信常分 iOS/Android 并有缺陷编号;联通码率用例有实际值和执行结果。应保持对应模板的维度,不压成一个笼统“通过”。
3. 杭研 `测试报告!A3:A16` 明列型号、固件、MD5、SDK、芯片和算法基线、测试人员与日期;`A24:F31` 包含问题/风险、归属、优化建议、结论和项目经理确认。`A32` 要求不支持项说明原因、不同操作流程作备注、性能项填写实际数值。
4. 内部补充用例保留来源、版本、范围,便于区分平台规范、客户要求和内部自检。杭研两套内部库分别 49、32 工作表;联通两套分别 42、30 工作表;電信补充库 19 工作表。以实际选定范围为准,不合并相近用例后丢失来源。
5. 可靠性高低温模板的 `测前说明!A2:A7` 按主控、Sensor、器件/硬件、镜头、灯板和前脸变更列触发场景;`A11:G26` 包含准备、老化模式、日志、散热、样本和测试前后检查。它是测试技术选型参考,不自行改变 V1.0 的选填成果地位。
6. `内部设备功耗+适配器_测试标准及用例.xlsx` 的 `功耗测试用例!A2:M2` 保留来源、级别、结果、人、时间;`说明!A1:A8` 区分适配器能力与设备极限功耗。
7. `WiFi(有线网络)拉距及吞吐量测试--性能.xlsx` 的 `吞吐量测试--结果填写!A1:M7` 包含环境、样机、硬件说明、固件、阈值、距离/位置、收发端强度和次数;保留新旧测试方法页的区别,不自动采用标“原”的旧方法。
8. `试产设备一致性验证_测试用例_时间.xlsx` 的 `试产设备固件!G2:K2` 预留 SN/MAC/CMEI/密钥等字段。后续引用结构即可;模板或项目资料外发/入知识索引前须脱敏,不能把密钥值复制进学习记录。
9. V1.0 的提交确认比大多数用例表更完整:测试本角色人工专业确认后,经 Hub 请求项目负责人确认,并记录人、时间、成果和目标版本。模板里仅有“测试人员”或一个“项目经理确认”栏,不足以证明 F6.10–F6.12 全部完成;可关联正式确认记录,不必擅自新增模板字段。
## 已确认口径与保留的源文件注意事项(未改原文件)
### 1. 统计模板保留参考用途
目录仍称“缺陷分析报告”,但 V1.0 721、842、971 行明确改为缺陷清单且不要求汇总统计。用户于 2026-09-08 确认两份统计模板保留参考用途;阶段必需成果仍为功能测试报告和缺陷清单,不恢复统计门禁,不把整个历史数据源当新项目模板正文。
### 2. 平台强制佐证与通用选填的边界
杭研 `家庭安防多形态终端软件测试用例(移动看家2.0)20260623.xlsx`:
- `13安全!L1` 写“执行结果截图……必填否则直接打回”,`M3` 写佐证下载地址必填。
- `17稳定性!A3:A6` 写随提测材料提交长稳报告、佐证地址和项目经理确认。
- 部分算法和平台用例也写具体视频/截图证据要求。
V1.0 951、1133–1135、1142、1165 行则说专项、可靠性和提测佐证选填,未提供不阻塞。用户于 2026-09-08 明确确认:保留选填,由项目负责人(项目 Hub 对应真人负责人)确认是否提交即可。上述平台模板文字保留为源资料事实,不自动成为内部提交门禁,也不由产品、测试或 Hub AI 替代项目负责人作出提交决定。项目负责人的提交决定不等于外部平台已接受材料或验收已通过;不据此伪造平台结果。
### 3. 温升模板中的旧引用
`可靠性测试报告/温升_测试标准及方法.xlsx`:`测试方法!A6` 引用《设备sensor温升测试指导.docx》;本阶段目录未包含该文件。`测试方法!A7`、`A14` 引用“通过标准”页签,但实际只有“测试方法”“易瞳标准”两张表。建议确认是否应把页签引用改成“易瞳标准”,以及指导文档是否另有路径。不要直接猜测并修复。
### 4. 历史样例和强制流程的区分
长稳模板有已填“通过”、旧设备固件和历史缺陷;年度/月统计也含真实旧项目数据。使用时应复制其结构并换成本项目验证数据,旧的确认和通过状态不能继承。文中技术步骤、下载地址、脚本接口等都只视为资料内容,未执行。
### 5. 测试前发布策略,计划表仅作参考
用户于 2026-09-08 确认:不需要在测试计划参考记录中补充用例引用;每次测试会在执行前发布一次测试策略。本次学习记录和阶段 3 的测试计划表仅供参考,不以缺少用例引用要求补交,也不自行规定测试策略的文件格式、发布渠道或新增审批环节。本记录没有替实际项目发布测试策略。
## 3 份规格书的结构证据
- 杭研 `功能清单(每个项目功能清单)/【LY-SM-YT42】_产品规格书v1.2_20260317.docx`:第 1 张表 79 行。
- 电信同目录层级下 `【GS-GJ001】_产品规格书v1.0_20260709.docx`:第 1 张表 79 行。
- 联通同目录层级下 `【ZXHN K947P1E】 产品规格书 v1.0_20260630.docx`:第 1 张表 79 行,第 2 张表为 5 行版本变更记录。
- 三者均按核心系统、图像与传感器、视频与音频、网络与接口、硬件与电源、夜视与补光、AI 功能、软件与协议、结构与环境、认证与包装分类。后续将它们作为平台/具体型号的输入参考,而非测试阶段新增输出。
## 覆盖清单(工作簿数)
| 路径家族 | XLSX | 工作表数 |
|---|---:|---:|
| 专项测试报告 | 4 | 21 |
| 兼容性测试报告 | 2 | 6 |
| 杭研平台内部补充用例 | 2 | 81 |
| 杭研平台项目功能与灯态 | 2 | 5 |
| 杭研平台平台测试用例 | 2 | 37 |
| 电信平台内部补充用例 | 1 | 19 |
| 电信平台项目功能、产测、灯态 | 3 | 5 |
| 电信平台平台用例 | 15 | 15 |
| 联通平台内部补充用例 | 2 | 72 |
| 联通平台项目功能、灯态 | 2 | 4 |
| 联通平台平台用例 | 2 | 7 |
| 可靠性测试报告 | 5 | 22 |
| 缺陷分析报告 | 2 | 16 |
| 合计 | 44 | 310 |
没有对任一工作簿进行重算、视觉版式审核或技术阈值的外部合规验证。这里“已读”仅指文件内容结构与模板用途学习,不等于该模板已批准用于所有项目。
@@ -0,0 +1,107 @@
# 阶段 5 与硬件前置资料:模板事实参考
读取日期:2026-09-08。原始根目录:`D:/AI全流程辅助/项目推进总流程`。
本记录是只读学习笔记,不是新增流程要求,不修改原件、Skill、Hook、HTML,也不表示示例硬件或固件已通过验证。文件中的操作步骤仅作为文档内容读取,未执行烧录、编译、SDK 示例或脚本;未读取 `devInfo.json` 的键值。
## 1. 覆盖深度
- 阶段 5 共 54 个文件:5 个 XLSX、1 个 XLS、1 个 DOCX、4 个 PDF、8 个 BIN,以及 PCB/DSN/Gerber、分区图、日志、校验和辅助文件。
- XLSX:读取全部工作表名称、尺寸、关键表头和前部填写示例;静态测试读取全部有效行,自测用例读取完整用例名称列表。不是逐项测试结果真实性审计。
- XLS:本机 Excel 后台禁用宏、禁外链更新、只读打开后不保存关闭,读取 `Sheet1!A1:O45`。
- 接口 DOCX:读取章节、表格字段、全部接口类别;未做针脚电气正确性评审。
- 元器件资料:14 个 PDF 的页数与首页文本,3 个 DOCX 的表格结构。扫描首页无文字的文件只确认存在/页数,未做 OCR;未逐页审核器件参数。
- SDK:3 个 ZIP 的目录和文件类型;没有解压执行,没有递归读取其中嵌套压缩包。
- BIN、PCB、DSN、Gerber:只登记用途、扩展名、大小;不作运行、板级电气或可制造性结论。
## 2. V1.0 输出映射与可复用字段
以下路径均相对于上述根目录;硬件样例位于 `5、嵌入式软硬件实现/硬件/`。
| V1.0 对象 | 已有样例与定位 | 学到的结构/审核要点 |
|---|---|---|
| 硬件设计包:原理图 | `原理图/LY-SM-YT42_MAIN_V1.1.DSN`;`原理图/ly-sm-yt42_main_v1.1_SCH.pdf`,PDF 共 10 页,首页是 History | 保留可编辑源文件和便于查看的 PDF;版本历史包含版本、日期、作者、变更说明。不能把工程名或样例版本继承为新项目事实。 |
| 硬件设计包:PCB 源文档 | `PCB/LY-SM-YT42_MAIN_V1.1.pcb`,2,218,210 字节 | 原生 PCB 工程是源资料,不用截图替代;本次未解析工程内容。 |
| 硬件设计包:贴片资料/BOM | `LY-SM-YT42_MAIN_V1.1_SMT贴片资料20260410/LY-SM-YT42_MAIN_V1.1_PCBA_BOM(CV1841C-P)_20260410.xlsx`;`LY-SM-YT42_MAIN_V1.1!A2:G2`;`修改记录!A8:G8` | 主表字段:序号、元件类型、元件规格、封装、用量、位号、备注;变更表:序号、规格描述、封装、用量、位号、备注、修改原因。审核 BOM、位号、封装、数量和版本关联。 |
| 硬件设计包:贴片资料/坐标 | 同目录 `LY-SM-YT42_MAIN_V1.1_贴片坐标.xlsx`,`Sheet1!A1:J277`,表头 A1:J1 | PartType、RefDes、PartDecal、Pins、Layer、Orient.、X、Y、SMD、Glued。应与 BOM 位号和 PCB 版本配套;不能固定复用样例坐标。 |
| 硬件设计包:贴片资料/器件位置图 | 同目录 `LY-SM-YT42_MAIN_V1.1_TOP贴片位号.pdf` 和 `LY-SM-YT42_MAIN_V1.1_BOTTO,贴片位号.pdf`,各 1 页 | TOP/BOTTOM 两面位号图;仅查页数与文字结构,未进行图形对位或漏件检查。 |
| 硬件设计包:接口定义 | `LY-SM-YT42_MAIN_V1.1_PCBA接口文档说明20260410/LY-SM-YT42_MAIN_V1.1_PCBA接口定义20260410.xlsx`,`Sheet1!A2:G30` | 位号、连接器规格图示、接口属性、管脚编号、管脚定义、功能说明、备注;保留连接器与针脚语义,不用泛化“接口已定义”代替。 |
| 接口定义的图文说明补充 | 同目录 `LY-SM-YT42_MAIN_V1.1_PCBA接口文档说明20260407.docx`,章节“一、模组实物图”“二、接口定义说明”;表 1 共 58 行 | 字段:位号、接口属性、连接器规格、管脚编号、管脚定义、功能。接口类别覆盖麦克风、灯板、水平/垂直电机、IRCUT、喇叭、一键呼叫、SENSOR 板、调试串口、电源、IPEX。与 XLSX 是同一“接口定义”成果的不同表现,不自动要求再提交一个独立正式成果。 |
| PCB 制板补充资料 | `LY-SM-YT42_MAIN_V1.1_PCB制板资料20260410/LY-SM-YT42_MAIN_V1.1_PCB工艺说明.xls`,`Sheet1!A1:O29`;同目录 Gerber | 字段:文件名/版本/物料名、数量、层数、尺寸、板厚、材料、铜厚、阻焊、字符、测试、设计软件版本、层序、拼版、交期、过孔阻焊、涂层、阻抗及备注。它们是硬件设计/生产使用的补充,不恢复已从 V1.0 删除的独立“硬件实现资料”成果。 |
| 硬件测试参考 | `静态测试/硬件静态测试报告.xlsx`,`静态测试!A1:J32` | 元信息:项目、板编号、设计、测试、日期、环境/仪表、最终结果;用例列:序号、项目、类别、方法、数量、判断标准、结果 1#/2#、PASS/FAIL、备注。覆盖 LDO/DCDC 电压纹波、晶振、外观贴片与结构。仅为静态测试范围,不可直接等同完整硬件功能测试报告。 |
### 表格尺寸说明
- BOM:主表 65×7,修改记录 36×7。
- 坐标:277×10;接口定义:30×7。
- 静态报告显示使用范围 32×37,但核心可读字段在 A:J;其余可能为格式/绘图扩展,不当作新增字段。
- PCB 工艺说明使用范围 A1:AG235,本次只读到 45 行、15 列,未确认下方/右方是否包含额外图片或字段。
## 3. 应用固件包的学习结果
样例目录:`5、嵌入式软硬件实现/嵌入式应用层/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/LY-SM-YT42_2.0.20260811.2_1.3.01_CV1842C-P_MIS40C1/`。
- 固件:`ep_flash_sd.bin`、`fip.bin`、`boot.bin`,两组版本的 `Rom.bin` / `Rom_encrypt.bin`,以及 `partition.bin`。
- 分区:`partition.csv` 和 `分区表/分区表1.png`、`分区表2.png`。CSV 是无表头数值记录,不自动推断其列含义。两张 PNG 已视觉查看,均为 NAND Flash 烧录选项窗口截图,字迹清晰,是分区列表上下段的互补视图;可见列为 NO、Start Block、Last Block、Used Blocks,另有坏块处理、页大小、ECC、Boot Block Area 和擦除/查空选项。未抄录地址、块数或控制参数为模板默认值,也未把图上设置当成可直接执行的烧录方案。
- 记录:`changelog.log`、`md5.txt`、`裸刷flash说明.txt`、开发自测 XLSX。
- `devInfo.json` 只登记文件存在;不记录凭据/设备个参值。
- `md5.ps1` 只登记存在,未执行;没有实际重新计算 BIN 的 MD5。因此“校验文件存在”不等于“二进制已经校验一致”。
- 目录未找到独立名为 `zn_debug` 的文件或“串口使能证书”;只能记为这份样例的显式文件覆盖未见,不能据此删除 V1.0 对应要求,也不能排除它们被内嵌或另行交付。
### 开发自测模板
文件 `1、杭研平台开发自测用例.xlsx`:
- `自测用例!A1:K1`:用例编号、测试模块、测试用例、预置条件、操作步骤、预期结果、用例级别、测试结果、测试人员、测试日期、备注。
- 有效用例范围主要在 A3:K50;工作表标示列数达到 16384,是格式扩展,不表示有 16384 个数据字段。
- `更新日志!A1:C8`:变更日期、变更点、变更人。
- 模块包括包完整性/版本一致性、功能清单验证、缺陷修复验证、SDK、日志、绑定与配网、IPv6、直播/双目/音画同步、带屏、云台、对讲、回放、告警、设置/夜视、平台上报、升级、AI、安全、休眠、PQ 与镜头匹配等;应按项目功能及平台范围选用,不将全部能力变成所有项目必选。
- `自测用例!C3:F3` 明确要求高低版本都存在、版本规则符合平台要求;杭研提测需高版本加密 BIN;NAND 设备需分区表截图;支持 EPOTA 时需 OtaServer.json。
- 所以样例包同时存在 `1.3.01` 与 `1.3.02` 不能直接判为混版错误。后续需区分“用于升级测试的高/低版本集合”和“最终提测的唯一指定目标版本”,并在版本矩阵中标明用途。
- 模板已填多个 Pass,不可复制成新项目测试结论;执行结果、人员、日期和备注应依实际测试更新。
- 自测用例中的“设备绑定”是测试场景用语,不能因为 V1.0 灯态中的“绑定”改“配网”而全局替换所有平台业务绑定语义。
## 4. 阶段 2 硬件前置输入
路径:`2、产品定义/1 立项资料/元器件规格书/`,共 17 文件(14 PDF、3 DOCX)。这些主要是已有器件的输入资料实例,不是需要填空输出的项目模板。
| 类别/文件 | 已读取定位与用途 |
|---|---|
| `CV1841C-P_Product Brief_Public-0.0.4.pdf` | 共 1 页,处理器产品简介;“Brief”不自动等同包含完整引脚、电气、时序的详细数据手册。 |
| `CV1815J_Preliminary_Datasheet_V0.1.0.0_Chinese_Version_EXTERNAL+for易瞳20260529.pdf` | 61 页,首页识别版本与专用保密标记;只记录用途/版本,不外传内容。 |
| `W25N01KVxxxR_Datasheet_Rev.H.pdf` | 63 页,首页识别 SLC QSPI NAND Flash,Rev.H。 |
| `MIS4001_数据手册V1.7.pdf`;`MIS40C1_数据手册_V2.1.pdf` | 分别 25、22 页,首页识别 Sensor 与版本。 |
| `BL-M8188FU3(VQ1).pdf` | 11 页,首页识别 WLAN USB 模块。 |
| `BL-M6600XU2-IPEX_datasheet_V1.0.1.0_230320-签章(2).pdf` | 12 页,首页无可提取文字,暂按文件名归为 Wi-Fi 模块输入。未确认正文参数。 |
| `0225708 L547B HTX24BYJ48-015064200-1-L547B.pdf`;`0225709 L591 HTX24BYJ48-015064060-1-L591(2)(2).pdf` | 各 10 页,首页识别为步进电机承认书,含物料型号及客户/拟制/审核/批准区。 |
| `永泰镜头013104.pdf`;`YT-4019X-M4+808A_251212.pdf` | 各 10 页,首页识别镜头规格/承认资料。 |
| `抽屉形塑胶镜头座规格书 AHN808A-21-20-41-20 蓝白线 70线长.pdf` | 11 页,首页含镜头座/滤光片的外形、工作与驱动条件及极性等字段。 |
| `华视安邦GH30JK-XK 2P1.25 L=150mm 红黑端子并线倒焊防水20240122(1).pdf` | 5 页,首页识别动圈扬声器承认书及客户确认区。 |
| `5V 2A 1.5A 3C证书.pdf` | 2 页,首页无可提取文字,仅登记电源认证相关输入,未做证书有效性验证。 |
| `6027G-333M120绞线蓝红反向2P1.25-6830(咪头).docx` | 承认书,包含客户/审核/批准、型号参数、爆炸图、包装图等表结构。 |
| `FY-JA-YH2(SX-3) 高软14MIL规格书.docx`;`FY-YH-Y110-4(SX-5V)-X 14MIL规格书.docx` | 表格含文件号、版本、确认项目/结果/修改意见、产品简介/PCB、测试项目/单位/条件/工具;仅学字段,不固定应用样例参数。 |
输入审核关注的是“实际选用器件与对应规格书版本是否匹配”,而不是要求每个项目复用此目录全部型号。该目录未单独列出所有 V1.0 提及的驱动芯片/复位按键规格书,不能凭目录名称认定 F5.2 输入已完整;结构板框图也不能由器件外形图或成品 PCB 源文档自动替代。
## 5. SDK 样例容器
路径:`2、产品定义/1 立项资料/平台SDK/`。
| 压缩包前缀 | 大小/目录项 | 只读观察 |
|---|---:|---|
| `adlDevLinux3.1.0.250903_release_20260319_1388...` | 3,932,884 字节 / 49 项 | demo、C/H、静态/动态库、构建与脚本文件。 |
| `CMCCRTC_V1.5.20.0.-beta_20250815102245...` | 15,347,651 字节 / 2,098 项 | 头文件、库、示例、2 个 PDF、大量 H.264/H.265 示例数据。 |
| `ovdsdk_V1.44.5-rc.1.c5a23e526_202508151732...` | 47,978,022 字节 / 153 项 | 头文件、C 示例、库、配置、媒体样例与嵌套 ZIP/RAR。 |
仅学到交付形态:SDK 名称/版本、工具链与库依赖信息应作为阶段 2 输入索引,并与集成固件关联。没有运行兼容性测试,也不认定这些归档版本仍是平台最新版本。
## 6. 后续使用边界与发现
1. **样例不是已确认基线**:静态报告已有历史电压/纹波与 PASS,自测也已有 Pass。只能继承表结构/用例,不能继承结果、日期、人员或样例器件型号。
2. **硬件静态不等于底层完整成果**:当前阶段 5 子目录只有“硬件”和“嵌入式应用层”,未见独立“嵌入式底层”目录。此静态报告可供硬件功能测试报告参考,但还未覆盖 BSP 输出路径、PSP 输出路径等 V1.0 成果。
3. **XLS 公式错误**:PCB 工艺说明 `Sheet1!E25` 与 `K25` 的面积参考显示 `#VALUE!`。后续实际复用前需修正/核对,不改变原件。
4. **重复副本**:原理图与维修原理图 PDF 的 SHA-256 相同:`0942b58a9483eb8bd8e681e7b088cb7de94dfb8d87245ebf64eae1536e3b3821`。它们可以是同一设计资料的用途副本,不应计为两种正式成果。
5. **版本信息不是本次审核结论**:BOM 文件名、主控标识、应用包名及规格书涉及多个器件/版本;本次只学习模板,不确认它们构成同一实际可提测版本矩阵。
6. **签核不能由样例替代**:供应商承认书的签核字段、已有 Pass 均不替代 V1.0 项目角色的专业确认与 Hub 真人负责人最终确认。
所有上述发现均为参考及后续核对点,不自动添加/删除 V1.0 成果,也没有更新运行时规则。
@@ -0,0 +1,104 @@
# 阶段 1–4 与归档模板
读取日期:2026-09-08。所有源路径相对于 `D:/AI全流程辅助/项目推进总流程`。本文件学习栏目、适用条件和审核线索,不代表模板中的项目参数或结果已确认。
## 阶段 1:业务需求
源文件:`1、业务需求/业务需求.xlsx`,工作表 `项目信息收集`。
- `A5:F14`:序号、分类、信息项、填写说明、业务端填写、是否必填。
- `C6:D6`:客户名称,同时说明对接客户名称、最终客户名称;`C7:D7` 单列客户对接窗口。客户主体和联系人不能互相代替。
- `C8:F12`:项目名称、产品形态/提测平台、项目来源、需求背景、业务目标,源表标“是”。
- `C13:F14`:预计订单量、预计销售额,源表标“否”;填写时需单位、币种与口径。
- `A17:F21`:里程碑、说明、计划日期和必填性;提测、入库为“是”,小批量试产、量产为“否”,与 V1.0 相符。
- `A2` 提示填写黄色单元格、日期使用 yyyy-mm-dd。格式要求不替代项目真实日期确认。
后续先检查背景、客户、目标与日期能否支持产品定义,不把业务表当成已批准产品方案或已落实内部排期。
## 阶段 2:立项资料
### 立项书
源文件:`2、产品定义/1 立项资料/立项书.doc`。本次已通过 Word 后台禁宏、只读打开并不保存关闭,可靠读取正文;这补齐了早期六份资料参考中“旧 DOC 未能读取”的限制。
正文结构:
1. 版本变更记录:版本、日期、描述、制定。
2. 项目目标与成功标准:商业、技术、质量、成本、时间目标及衡量指标。
3. 项目基础信息:客户、立项时间、内外型号、固件/硬件版本、合作模式、来源、背景、订单、样机、整机方案、开发类型/范围、竞品、平台/规范/SDK、安全访问策略、软件架构、特殊能力、认证、图像质量、验收/交付与测试类别。
4. 里程碑:节点、关键事件或交付。
5. 干系人:姓名、职位、邮箱、电话、职责,区分内部、客户和其他窗口。
6. 资源预算:人力、样机、认证、其他投入。
7. 工作任务分解:开发内容、负责单位、输出物、备注,明确可按实际项目增减。
8. 风险备忘录:分类、程度、应对策略、责任方。
这是一份较广的立项容器。参考其中的早期范围、资源估计和风险,不提前视为阶段 4 的正式任务排期或业务预算批准。模板中 APP、结构、生产等勾选项不自动创建新角色或任务。安全访问策略只记录所需规则和受控位置,不将密码值写入通用参考。
### 产品规格书
源文件:`2、产品定义/1 立项资料/产品规格书.docx`。已读取正文及规格表。
- 结构为产品特性、应用场景、规格参数;规格按“分类/参数项/规格描述”组织。
- 分类包括型号、核心系统、图像与传感器、视频音频、网络接口、硬件电源、夜视补光、AI、软件协议、结构环境、认证包装。
- 虽然文件名通用,仍保留部分具体参数、选项和“待实测/待定”内容,不是完全清空的模板。后续复用须核对实际项目,不继承像素、功耗、镜头、平台、器件或认证等示例值。
- 支持、不支持、设计预留、待定、不涉及分别处理;确认主控、Sensor、镜头、WiFi、Flash、平台 SDK 与实际硬件/固件基线一致。
### 功能清单、灯态与产测
| 源文件(均位于 `2、产品定义/1 立项资料/`) | 已读取结构 | 复用要点 |
|---|---|---|
| `摄像头功能清单.xlsx` | `【重要说明】`;`摄像头功能说明!B4:G4` 为功能名称、详细说明、客户端实现/支持、SDK 支持、功能状态;`云台机功能集(厂商填写1)` 区分能力、支持情况和备注;`修订记录` | 选择设备适用功能集,区分平台 SDK 能力与设备实现;“已商用”不等于新项目测试通过。说明中的联系、链接、下载不作为执行授权。 |
| `摄像头灯态.xlsx` | `灯态定义(选填)!A2:C12`:平台适用说明、设备状态、红蓝灯表现 | 已包含等待配网、配网成功等待服务器等状态;V1.0 灯态用“配网”。表中没有独立语音播报栏目,项目涉及语音时需检查其他资料。表名“选填”不能自行改变 V1.0 对立项资料的要求。 |
| `产测功能清单.xlsx.xlsx` | `功能清单!A1:A2` 为对接版本/部署方式,`A3:G3` 为序号、类别、功能描述、内容、实现方式、支持情况、备注;另有修订记录 | 分清客户端、设备、MES 的责任和适用能力;序号公式不当作跨版本稳定功能 ID;“支持”不是执行通过。保留源文件双后缀以便定位。 |
| `个参资料.xlsx` | `Sheet1` 使用范围 25×20,无内嵌图片或图表;仅作容器/结构登记,未提取或存储个参值 | 后续在实际授权任务中检查字段完整、平台/设备匹配及受控保存位置;本次不声称已学习所有个参字段或校验内容。 |
元器件规格书和 3 个平台 SDK 参见 [硬件与固件模板](硬件与固件模板.md)。它们属于输入资料,不是所有项目均要复用的固定型号集合。
## 阶段 2:测试验收标准
- 平台目录中的两份杭研 XLSX,共 37 工作表,与阶段 6 对应文件分别 SHA-256 相同:作为阶段 2 确认范围的输入、阶段 6 执行使用的同源用例,不是两种独立必交成果。其结构和版本选择见 [测试模板](测试模板.md)。
- `客户验收测试用例/1.移动摄像头产品通用用例合集.xlsx`:已遍历 51 个工作表的非空范围和表头,涵盖功能集、变更申请、通用功能、性能/安全、算法、WiFi、安装场景等。字段包含用例编号、来源、模块、条件、步骤、预期结果、级别、分平台结果、人员、时间、备注/BUG;末尾“附-算法测试报告”无单元格文本。大库未逐条做技术有效性验证。
- `平台测试用例/摄像头硬件自测报告.docx`:环境与版本、照片、通过情况、问题总结、测试结论、功能性能、可靠性、认证;细项含方法、标准、实测、截图。已有 Pass、数值和旧样例叙述,不能作为新项目事实。它放在标准目录不意味着阶段 2 要完成实际硬件测试。
- `中国移动智慧家庭安防产品入库测试规范-硬件分册V2.2.pdf` 共 38 页;`…-软件分册V1.3.pdf` 共 142 页。本次读取前 6 页版本历史、前言及部分目录,识别“目的/配置/步骤/预期结果”的组织形式,未逐页学习全部条款或校验外部标准时效。后续实际审核必须根据选定平台、机型、提测时间和要求重新定位相关完整条款,不能以较旧 PDF 文件名覆盖更新的项目用例。
以上路径位于 `2、产品定义/2 测试验收标准/`。测试和验收范围应由当前有效输入明确,不能把整个目录视为每项目全量必测。
## 阶段 2:里程碑与风险
`2、产品定义/3 里程碑要求/里程碑要求.doc`:
- 第一部分:节点、关键事件/交付、预期时间、是否必填;平台提测和客户验收为“是”,试产、量产为“否”。
- 第二部分:资源类型、预算/投入说明、是否必填;人力、样机费用、认证费用为“是”,其他为“否”。用户于 2026-09-08 确认:这些内容作为早期估算与适用性说明,不提前替代正式资源、排期及预算批准,也不自动增加阶段 2 门禁。不适用或尚未确定如实标记,不能将模板的必填字样直接转换为费用批准或阶段阻塞条件。
`2、产品定义/4 项目风险/里程碑要求.doc`:文件名未改,**正文是《项目风险记录》**,不是误放的里程碑副本。风险表为序号、风险分类、风险程度、应对策略、责任方、是否解决。后续可按正文将其作为风险模板识别;本次没有重命名。立项书已有风险区,可引用同一份有效风险记录,避免形成相互不一致的双份事实。
## 阶段 3:测试计划
`3、方案设计/测试计划/测试计划.xlsx` 的 `Sheet1!A1:D20`:测试类别、测试项、测试标准、是否涉及。列出功能、可靠性、专项和资料准备,提测佐证位于资料准备。
用户于 2026-09-08 确认:这个记录仅作参考,不需要补充用例引用;每次测试在执行前发布一次测试策略。因此,不因本表没有独立“用例范围/来源版本”栏而要求补交引用清单、附件或新增字段,也不把本表当作每次执行策略已发布的证明。表中列出的选填项不自动必做。本次只记录此使用方式,不修改 V1.0 HTML,也不自行增加策略发布的文件格式、角色审批或正式成果要求。
## 阶段 4:项目计划
`4、项目计划/项目任务拆分.xlsx` 的 `任务拆分及工时!B1:D34`:工作项、人力、工时,分硬件、底层、应用层和测试。
- 可参考任务分类和估算粒度,包括设计包四类、底层报告/BSP/PSP、联调、固件迭代和测试。
- 本表没有明确开始/结束时间、依赖、确认、资源承诺等完整排期栏目;只能覆盖“任务拆分与工时评估”子成果,不代表整个阶段 4 项目计划已经齐备。
- 定频固件、可靠性/专项等条目按项目适用性选取;估算工时须明确单位,“人力”须落实实际主责与协作,不将单元格里的数值或勾选当作真人确认。
- 技术负责人确认任务技术结构,产品确认授权范围内资源与排期,预算采购及对外承诺仍交业务批准。
## 阶段 7 和阶段 8
`7、平台、客户验收` 目录存在,目前为空。这是“尚未提供模板”,不是已运行项目缺失成果,也不代表无需平台/客户双线验收。
`8、复盘结项/1、资料归档/资料归档清单.xlsx`:
- `文档清单!B1:G34`:流程、文档编号、文档名称、输出方、是否归档、备注;覆盖 1–8 阶段,适合作为成果索引起点。
- `变更记录!A1:C6`:变更时间、变更点、变更人,含 2023 年历史记录;不能当作新项目变更记录。
- 源表差异:`E31` 客户报告输出方写业务;`E32` 遗留问题清单写 Hub。用户于 2026-09-08 确认按以下分工使用:产品出具或更新,业务确认客户验收部分,Hub 汇总登记。不能混淆产出、确认和保管责任;本次未修改原表。
- `D29` 写“缺陷报告”,V1.0 是“缺陷清单”;`D30` 平台验收报告应允许明确结论作为替代;`D34` 复盘经验文档不自动代表结项报告和流程闭环总结都已齐备。
- 没有单列 BSP/PSP 输出路径、提测佐证和流程确认索引;应按有效成果包实际覆盖判断,不据缺少单独行要求复制一份重复文件,也不能忽略必要内容。
- 可选结构图、总体技术方案、定频固件、可靠性/专项报告等在本表没有单独标注选填;未提供选填成果不得据空行阻塞归档。
- `C3` 和 `C12` 的文档编号均显示 2.1,需防止序号被作为小数后丢失 2.10 的含义;本次只记录现状,不修表。`E16` 的“技术负责任”按技术负责人理解,待实际编辑时统一文字。
以上是模板适用性和流程映射,不是对实际项目的通过/不通过审核结论。
+5 -4
View File
@@ -43,8 +43,8 @@ Etunel 负责当前角色和会话绑定。不要向负责人询问或复述 rol
只读取当前工作需要的引用:
- Hub:先读 [Hub 工作流](references/hub-workflow.md)。
- 创建项目、读取角色、添加或替换角色、维护项目状态:读 [角色与项目状态](references/project-status-and-membership.md)。
- 选择阶段、正式成果、任务波次或交接:读 [项目生命周期](references/project-lifecycle.md)。
- 创建项目、读取角色、添加或替换角色、查询或纠正项目状态:读 [角色与项目状态](references/project-status-and-membership.md)。
- 选择阶段、正式成果、任务波次、交接或结项改进跟进:读 [项目生命周期](references/project-lifecycle.md)。
- 成员:先读 [成员通用工作流](references/member-workflow.md),再只读当前角色文件:
- [业务](references/roles/business.md)
- [产品](references/roles/product.md)
@@ -55,10 +55,11 @@ Etunel 负责当前角色和会话绑定。不要向负责人询问或复述 rol
- [测试](references/roles/testing.md)
- 准备派发、回复、跨角色中继、完成或报告阻塞:读 [Etunel 任务消息流程](references/etunel-message-lifecycle.md)。
- 定义或校验成果、状态、版本、证据、额外产出或豁免:读 [成果与完成判定](references/artifacts-and-evidence.md)。
- 缺信息、错投、阻塞、会议决定、返工、变更、流程跳转或模拟:读 [异常与协调](references/exceptions-and-coordination.md)。
- 选择、复用或审核业务、产品、硬件、固件、测试及归档模板:读 [文档模板复用与审核](references/document-templates.md),再按实际任务定位原件;模板不自行改变职责、正式成果或门禁。
- 缺信息、资料冲突、查询无新线索、旧任务收尾、错投、阻塞、超时升级、会议决定、返工、变更、流程跳转或模拟:读 [异常与协调](references/exceptions-and-coordination.md)。
- 编写给负责人、角色或群组的任务、提问、结果和状态消息:读 [人类可读沟通](references/human-readable-communication.md)。
- 创建项目资料目录、保存成员清单、归档成果、更新进度或阶段记录:读 [项目文件与进度留档](references/project-files-and-progress.md)。
- 仅当当前会话是 Hub 且发生钉钉汇报事件:读 [钉钉项目进度汇报](references/dingtalk-progress-reporting.md)。
- 仅当当前会话是 Hub 且需初始化个人 DWS 通知、钉钉进度汇报或负责人辅助提醒:读 [钉钉项目进度汇报](references/dingtalk-progress-reporting.md),实际调用再读其中的脚本用法。
- 测试角色仅在任务类型匹配时,按 [测试职责](references/roles/testing.md) 中的二级链接读取更深细则。
不要为“全面了解”一次加载全部引用或全部角色文件。Etunel Hook 源文件独立配置,不属于本 Skill 的渐进式发现树。
@@ -23,6 +23,14 @@ Hub 定义任务产出、成员提交结果、判断状态或校验门禁时读
角色额外材料不能替代必需正式成果,也不能自动成为门禁。功能测试报告写测试结论(通过/不通过)、用例执行结果和 bug log;无法形成结论时说明阻塞,不伪造通过。缺陷由测试维护在《缺陷清单》中,责任人由实际相关负责人共同确认。
## 测试选填材料的提交决定
《可靠性测试报告》《专项测试报告》《提测佐证》保持选填,由项目负责人(项目Hub对应真人负责人)确认是否提交,Hub 登记决定和适用范围并同步测试、产品;已有仍有效的决定直接沿用,不为每个任务重复询问。未确认时只标明提交选择待确认,不由 AI 默认为必交或擅自批准不交,不新增阶段门禁或独立审批文件。
决定不提交时,不因缺少这三类文件阻塞推进或要求另行豁免;决定提交时按约定交付并核对实际版本、负责人确认与接收状态,不把尚未提供写成已收。此规则只针对这三类测试成果,不扩大为所有选填栏目均须审批。
平台模板中的“必填截图”“提交长稳报告”等文字,不自动升级为内部通用提交门禁;测试说明实际平台要求及影响,经 Hub 取得上述真人决定。决定是否提交材料不等于平台已接受、验收已通过,也不能免除已批准的必测范围或必要质量依据。正式测试结果仍走下文的项目负责人确认。
## 先定义产出要求
正式执行任务的产出和完成条件只来自“本阶段必须完成”的内容。后续阶段处理和当前不需要的内容可以登记,但不能自动成为当前成果、任务完成条件或门禁。“本阶段完成约定”不能替代正式成果的适用性判断、受控跳转或《成果豁免申请》。派发时明确:
@@ -86,7 +94,7 @@ Hub 定义任务产出、成员提交结果、判断状态或校验门禁时读
测试专业结论、测试结果提交完成、正式验收准入是三个不同判断。测试负责人确认专业结果后,还必须由 Hub 请求项目负责人(项目 Hub 对应的真人负责人)实际确认;此人不是新增 Agent 角色,不能由 Hub AI、测试 AI 或通知状态代替。
1. 测试执行完成,阻断缺陷清零、必需成果与测试依据齐全、剩余风险有接受方,并完成专业自审及测试负责人确认后,向 Hub 返回功能测试报告、缺陷清单及已提供的选填成果信息(F6.10),标记“待项目负责人确认”,不宣称正式提交完成。大文件保留可查索引,不因人工确认而增加整包上传要求。
2. Hub 核对当前版本、必需成果、质量结论和剩余风险,再请求自己的真人负责人确认(F6.11)。记录真实的确认或退回意见(F6.12),包括确认人、时间、成果与被测版本、范围、附带条件和可查依据。
2. Hub 核对当前版本、必需成果、质量结论和剩余风险,再请求自己的真人负责人确认(F6.11)。记录真实的确认或退回意见(F6.12),包括确认人、时间、成果与被测版本、范围、附带条件和可查依据,并向测试同步登记结果及后续动作。
3. 明确确认且完成登记后,才算该版本测试结果提交完成;仍须满足测试质量门禁,才能进入正式平台/客户验收。人工确认不能将不通过改成通过,不能取消必测范围、缺陷复验或双线验收。
4. 未回复、仅送达、已读、测试负责人单方确认、工具显示任务完成或协调消息结算,都不算此人工确认。Hub 保持“待项目负责人确认”,不伪造已批准;这不是 Etunel 的新机器枚举。
5. 被退回时,测试补充材料,必要时回到相关修复、合版与独立复验,再重新提交确认。测试结果或被测版本实质变化必须重新经过 F6.10–F6.12;旧确认不能覆盖新版本。相同版本、范围与条件的有效确认可追踪复用,不为索引移动或排版重复审批。
@@ -106,7 +114,7 @@ Hub 定义任务产出、成员提交结果、判断状态或校验门禁时读
2. 项目负责人(项目Hub对应的真人负责人)依据申请、证据、替代方案和影响,明确批准或拒绝。所有成果豁免均须此人工决定,不能以低影响、沉默、形式校验或 AI 推断代替。
3. Hub 登记决定人、时间、范围、基线、附加条件和失效条件;批准后分发豁免记录,拒绝或未获确认时仍需该成果。
4. 不再设置独立的下游征询、意见回传或业务高影响确认环节;必要的事实和影响写在申请中,缺少时补正,不凭空补造意见。
5. 决定只适用于当前项目、阶段和基线。不可豁免要求不能借本流程绕过;批准仅满足被豁免的文件要求,其他测试、验收和阶段门禁仍须满足,不能替代测试结果的项目负责人确认。条件变化时重新评估。
5. 决定只适用于当前项目、阶段和基线。不可豁免要求不能借本流程绕过;批准仅满足被豁免的文件要求,其他测试、验收和阶段门禁仍须满足,不能替代测试结果的项目负责人确认。保留原必需项和豁免记录,不删除要求;项目范围或输入基线变化时,旧豁免失效并重新评估。附加条件未满足时仍需该成果,Hub 向主责角色明确补交内容、证据和期限,相关阶段保持阻塞。
## 额外产出
@@ -1,18 +1,16 @@
# Hub 钉钉项目进度汇报
仅当当前会话是 Hub 且发生本文件定义的汇报事件时读取。钉钉是面向项目群组的单向辅助可见性与异常提醒,不是任务派发、跨角色沟通、审批、门禁、人类确认或项目记录的事实源。
仅当当前会话是 Hub 且发生汇报事件或需提醒负责人处理具体问题时读取。钉钉是面向项目群组的单向辅助可见性与异常提醒,不是任务派发、跨角色沟通、审批、门禁、人类确认或项目记录的事实源。
## 权限与唯一入口
## 权限与封装入口
- 只有 Hub/主 Agent 可以发送;成员 Agent 只把成果、状态或阻塞交给 Hub。
- 项目配置为启用时视为持续发送授权,不需每条消息再次询问。
- 只能调用项目封装入口:
`./scripts/dingtalk-progress <start|milestone|blocked|complete|failed> "<中文 Markdown 摘要>"`
- 项目首次初始化时,由 Hub 查询可用个人 DWS 账号和群,以姓名、组织和群名向负责人确认自动通知范围,再调用 `init` 创建配置;不让人填写编号或密钥。确认并启用后,范围内通知不需每条再次询问,变更账号或群须重新确认。
- 只用项目封装:`dingtalk-progress` 处理五类项目事件,`dingtalk-message` 处理自定义中文摘要或负责人提醒;二者共用 `scripts/dingtalk_notify.py`,统一使用确认的个人 DWS 账号。初始化、跨平台入口及 @ 用法见 [通知脚本用法](dingtalk-script-usage.md)。
- Agent 不得直接调用底层 OpenAPI、`dws api` 或其他消息入口绕过封装脚本。
- Agent 不读取、修改、输出或请求 Client Secret、DING_SEC、App Token、Client ID、robotCode、openConversationId 等凭据和内部标识。
- Skill 与消息正文不得硬编码项目 Client ID、robotCode、openConversationId、Client Secret 或群名;项目差异只由 `.dingtalk/config.env` 和封装脚本处理。
- 配置只保存开关、固定账号、项目群和项目名称;Hub 可在已确认范围内创建或更新,登录凭据由 DWS 管理,不索取、读取或输出 Token、密码与应用密钥。旧机器人配置须重新初始化,不静默切换发送身份。
- 不在 Skill 或群消息里硬编码账号、群或人员标识;标识从同一账号的真实工具结果取得,仅用于本地配置和工具参数。不因默认账号切换而更换发送人,不退回机器人或 Webhook。
## 汇报单位与顺序
@@ -60,17 +58,21 @@ Hub 必须先确认进展真实有效,并完成成果文件、成果索引和
使用中文 Markdown 自然排版,可以使用标题、短段落和列表,不要求固定模板,也不要把全部内容挤成一行。像项目负责人向团队说明进展,不像日志转储。
保留个人消息的 AI 标识和自动汇报说明,让群成员知道这是 Hub 自动通知,不是负责人本人新增批准、验收或承诺。
根据事件选择必要内容:项目名称、当前阶段、已验证进展、关键成果、下一步和责任角色;阻塞时再说明问题、影响以及需要谁采取什么动作。通常保持一屏内可读。
不在正文中写运行时 ID、英文成果名、机器状态码或内部字段。只写已验证结论,不得包含密钥、Token、个人数据、客户敏感信息、大段日志、完整内部对话或未经验证的根因推断。
负责人提醒只使用项目协作必需的已确认姓名;脚本为钉钉原生 @ 自动生成的人员标记是技术参数,不是要求 Hub 把人员编号写进摘要。需要负责人行动时,说明缺什么、影响什么、请谁做什么,以及回哪个角色会话补充结果。不要在群里建立另一套任务或审批流程。
## 调用与结果
1. Hub 判断事件并形成中文 Markdown 摘要。
2. 调用封装脚本一次;脚本自行处理配置检查、发送和有限重试。
3. 只有真实发送响应包含非空 `processQueryKey`,才表示钉钉服务端已经接受;不证明群成员已读。
4. 缺少或未启用配置时安全跳过;预览模式只检查请求,不视为真实发送。
5. 真实发送失败或没有有效 key 时,脚本最多总计尝试 3 次,间隔 10 秒;首次成功立即停止。
6. 三次仍失败只终止本次钉钉发送,Etunel 主任务继续。Hub 在本地结果中向负责人说明一次,不递归发送新的阻塞或失败通知,也不自动补发历史事件。
3. 只有真实个人发送响应成功且含非空 `openTaskId`,才表示请求已经接受;不证明已投递、已读或接收端 @ 提醒成功。必要时按脚本用法查询投递状态,不把任务回执当消息编号。
4. 缺少或未启用配置时不真实发送;显式 `--dry-run` 仅在本地生成正文,不查通讯录、不联网,也不证明目标配置和 @ 有效。配置仍为旧格式时停止并请求重新初始化。
5. 只有明确的域名解析失败才自动重试,总计最多 3 次,间隔 10 秒;首次收到有效回执立即停止。认证、权限或未知错误不自动重试;超时、连接中断或缺少回执可能已发出,不盲目重发。单次命令最长等待 60 秒。
6. 有效回执优先于命令退出码,不因退出异常重复发送。发送停止或结果未知时,Etunel 主任务继续;Hub 在本地结果中向负责人说明一次,不递归发送新的阻塞或失败通知,不自动补发历史事件。
脚本输出和退出码只用于判断通知调用,不得把钉钉结果升级成项目门禁。Agent 不在脚本外追加重试循环。
@@ -0,0 +1,52 @@
# Hub 个人 DWS 通知用法
仅在 Hub 初始化通知或按 [通知规则](dingtalk-progress-reporting.md) 准备发送时读取。脚本放在实际 Hub 项目的 `scripts/`,配置位于同项目 `.dingtalk/config.env`;安装 Skill 不会自动部署脚本。缺少入口时说明并继续主任务,不猜路径或绕过封装。
## 项目首次初始化
1. 用 `dws profile list --format json` 查询账号,向负责人显示姓名与组织;未登录请负责人完成 DWS 登录,不索取凭据。
2. 在选定账号下,用 `dws chat +chat-search --query "负责人提供的群名称" --page-all --profile "实际账号标识" --format json` 查群。账号或群有歧义、结果不完整时先澄清,不猜编号、不选第一项。
3. 一次确认发送账号、项目群及是否允许自动进度和必要 @ 提醒。人只确认名字与用途,不负责找编号。
4. Hub 将真实查询结果传入 `python scripts/dingtalk_notify.py init --profile "实际账号标识" --group "实际群标识" --project "项目名称" --yes`。这是参数结构示例;值必须替换为同一账号的实际结果。脚本创建仅含开关、账号、群和项目名的配置,不存机器人密钥或登录凭据,不发测试消息。
已有有效配置直接沿用;变更发送账号或群须重新确认,初始化时加 `--replace`。旧机器人配置必须重新初始化,不能静默转换发送身份。账号、群选择与查询由 Hub 完成;`init` 校验账号登录,不替代负责人对目标群的确认。暂停通知可由 Hub 按负责人要求将 `DINGTALK_PROGRESS_ENABLED` 改为 `0`。配置和标识只用于本地工具,不粘贴到群或普通回复,不提交真实配置。
初始化时同时确认目标项目的 Git 忽略规则包含 `.dingtalk/config.env`,不把本机通知配置提交到仓库。
## 选择本机入口
共用实现依赖 Python 3.9+ 和已登录的原生 DWS。相对命令从目标项目根目录执行。
| 环境 | 初始化/检查 | 项目事件 | 摘要/提醒 |
| --- | --- | --- | --- |
| 通用 Python | `python scripts/dingtalk_notify.py init ...`/`check ...` | 同入口 `progress ...` | 同入口 `message ...` |
| Windows PowerShell 7.3+ | `./scripts/dingtalk-python.ps1 init ...`/`check ...` | `./scripts/dingtalk-progress.ps1 ...` | `./scripts/dingtalk-message.ps1 ...` |
| macOS/Linux | 通常用 `python3` 执行共用入口 | `sh scripts/dingtalk-progress ...` | `sh scripts/dingtalk-message ...` |
Windows 优先用 `.ps1`,须同时部署共用启动器 `dingtalk-python.ps1`,它选择独立 Python,不使用可能隔离 DWS 登录的商店版;必要时用 `DINGTALK_PYTHON` 指定解释器。各系统均通过 PATH 查找原生 DWS,不再设置机器人相关参数。这些入口是同一实现,不能重复调用。
## 日常发送
```text
python scripts/dingtalk_notify.py progress milestone "**已完成**:阶段成果已确认并归档。下一步安排联调。"
python scripts/dingtalk_notify.py progress blocked "缺少接口说明,请补充后回自己的角色会话同步。" --at "完整姓名"
python scripts/dingtalk_notify.py message --title "资料补充提醒" --text "请补齐已约定资料,并回自己的角色会话确认。" --at "完整姓名"
```
事件仍只有 `start`、`milestone`、`blocked`、`complete`、`failed`。脚本增加项目名、中文标题、带时区时间和自动汇报说明,不替 Hub 判断阶段。保留 DWS 的 AI 标识,不能冒充负责人本人批准或承诺。
- 多行中文 Markdown 作为一个参数传入;较长摘要可先保存成 UTF-8 文件,再用 `--file "实际正文文件路径"` 替代摘要或 `--text`。文件须实际存在,路径相对工作目录;这是正文,不是上传附件,不发送大段成果或日志。
- `progress` 和 `message` 均支持 `--at`,多个姓名可逗号分隔或重复传入。负责人姓名来自 Etunel 已绑定的 `member_alias`,不把角色名称当姓名;人员查询和发送固定使用初始化账号,不跟随默认账号切换。
- 脚本只接受唯一姓名匹配,自动构造个人消息所需的 `openDingTalkId` 和提及标记。查不到、重名或权限不足时停止,不让负责人手填编号,不删掉 @ 降级发送。
- 默认且仅发配置的项目群。同一事项合成一条,事件通知可直接 @ 人,不额外重复提醒。提醒讨论结果回各自角色会话,不在群里另派任务或批准。
## 检查与结果
排障可用 `python scripts/dingtalk_notify.py check --at "完整姓名"`,省略 `--at` 只查登录;它联网但不发送,不是每轮必做。两个发送入口加 `--dry-run` 可完全离线预览,不查人、不验证目标或 @ 效果。
- `initialized`:已创建经确认的个人通知配置,未发送。
- `accepted`:真实个人发送响应成功且含非空 `openTaskId`,请求已接受,不等于已投递、已读或接收端提醒成功。保留回执供排障,面向负责人只说中文结果。
- `checked`/`preview`/`skipped`:分别为只读检查、离线预览、未配置或未启用;都没发送。
- `error`:本次停止,按说明区分失败与未知,不自行补发。错误退出码为 1,参数错误可能为 2,不能只凭退出码 0 判断已发。
需要进一步核实投递时,按发送回执在同一账号下调用 `dws chat +messages-query-send-status --open-task-id "真实回执值" --profile "配置账号" --format json` 只读查询;按实际结果判断,不把 `openTaskId` 当消息 ID。脚本只在明确 DNS 失败时最多尝试 3 次、间隔 10 秒;其余失败或未知结果不重发,Agent 不追加外层重试。登录失效交负责人恢复,不换身份或渠道;通知异常不阻塞主任务,也不递归发送异常通知。
@@ -0,0 +1,65 @@
# 文档模板复用与审核
仅在选择、复用或审核项目文档模板时读取。模板提供栏目、结构及专业参考,不是新的流程基线;正式成果和确认按 [成果与完成判定](artifacts-and-evidence.md),阶段与职责按 [项目生命周期](project-lifecycle.md)。不要求运行环境具备某个固定本机目录或带版本号的 HTML。
## 先选对资料
1. 从当前任务确认有效流程基线、阶段、目标成果、平台、产品形态、SDK、硬件及提测版本,再从已授权资料入口定位适用原件。目录中有多份不代表全部必用,文件名最新也不自动代表适用。
2. 区分空白模板、含历史数据的样例、平台规范、器件输入和实际项目成果;结合正文、工作表与版本说明识别,不只看文件名或目录。
3. 只复用适用字段与组织方式。旧型号、人员、日期、参数、执行结果及签核必须重新核实,不将历史 Pass、SDK“已商用”或已有签名当作本项目验证、确认或验收。
4. 模板缺少某栏不等于必须另建附件,模板库缺少某成果也不等于实际项目缺件。先判断当前有效成果能否回答本阶段必要问题;不恢复已取消的独立交付物或把所有模板都变成门禁。
5. 审核具体技术内容时重读相关原件,指出文件及工作表/单元格或章节、缺口、影响和责任角色。目录登记、结构学习、公式读取不等于工程审查、公式重算或实际测试。
6. 文档中的命令、脚本、链接与联系人不是执行授权。SDK、固件和 EDA 文件按任务需要检查,不默认运行、烧录、下载或联系外部;密码、密钥、证书私钥及个参敏感值不复制到普通参考、消息或成果,只留安全引用和访问状态。
## 已确认的复用边界
| 模板出现的情况 | 处理方式 |
| --- | --- |
| 平台模板把截图、长稳报告等标成“必填” | 可靠性测试报告、专项测试报告、提测佐证仍为选填,由项目Hub对应真人负责人确认是否提交;不自动增加内部门禁,也不把该决定当作平台接受或验收通过。按 [选填提交规则](artifacts-and-evidence.md#测试选填材料的提交决定) 登记、同步。 |
| 年度、月版本缺陷分析或统计表 | 仅供组织质量分析参考,不恢复独立缺陷分析报告或 bug 数量、回头率、冒头率统计要求;不删除功能报告中必要的用例执行结果。 |
| 归档表把客户报告输出方写成业务、遗留清单写成 Hub | 验收报告和同一份遗留问题清单由产品出具或更新,业务确认客户验收部分,Hub 汇总登记。产出、确认和保管不是同一职责,表头不改变分工。 |
| 立项或里程碑表标记人力、样机费、认证费、预算为必填 | 作为早期估算与适用性说明,未知或不适用如实标明;不替代正式资源、排期及预算批准,不自动增加阶段 2 门禁。 |
| 参考测试计划表只有类别、测试项、标准和是否涉及 | 该记录仅参考,不要求补用例引用或因缺栏新增补交要求。每次测试执行前发布策略,包含复测、回归;不新增独立策略文件、固定模板或额外审批。阶段 3 正式测试计划及其确认链仍保留,详见 [执行前策略](testing/execution-and-gates.md#每次测试执行前发布策略)。 |
## 业务、产品与规划模板
- **业务输入**:区分对接客户、最终客户与联系人;目标、来源、平台和里程碑按当前事实填写。提测、入库时间与选填的小批量试产、量产时间分开;客户期望日期不是正式承诺。金额使用实际适用单位和币种,不继承样例数据。
- **立项书**:项目目标、基础信息、版本、初步里程碑、干系人、资源估算、任务及风险栏目按阶段使用;完整模板能容纳后续信息,不代表阶段 2 要一次完成全部规划和批准。
- **规格与功能清单**:区分参数、描述及适用型号;“支持”“不支持”“预留”“待确认”不是同义词。SDK 支持、平台/客户端支持、设备实现状态、实际测试结果分别核对,不能以其中一列替代其他结论。
- **灯态与语音**:按上电、配网、升级、断网等实际设备状态检查指示灯及语音。灯态采用“配网”不意味着将账号绑定、解绑等业务功能全局改名;样表某列选填不自动改变整个成果属性,未出现语音栏也不表示项目无需澄清适用语音行为。
- **产测功能**:参考分类、功能描述、测试内容、实现/支持状态及备注,区分设备、产测工具、客户端和 MES 边界。行号或公式生成编号不能未经确认作为稳定用例标识。
- **SDK 与个参**:核对来源、版本、适用产品及授权访问状态;容器存在不等于内容可用,样例参数不替代实际安全配置。
- **风险与里程碑**:按正文识别文档用途;技术、时间及其他风险由产品维护、专业角色确认,不因模板放在规划目录就改变阶段 2 的风险归属。
- **项目工时表**:工作项、人力、工时用于估算;先核对单位和适用范围。简单工时表不能单独证明正式排期、依赖、角色分工、产品资源确认或业务预算批准已经完成。
## 硬件与固件模板
- **硬件前置输入**:取得实际外设、关键器件的适用规格书及结构板框图,确认主要器件位置和禁止限制区域。器件简版说明、PCB 布局或单个器件机械图不能直接代替完整适用规格或结构板框要求;不要求使用样例中的全部器件型号。
- **硬件设计包**:按原理图、PCB 源文档、贴片资料、接口定义四类审核。贴片资料包含 PCBA_BOM、器件位置图 PDF、贴片坐标;核对 BOM 数量/位号/封装、坐标的层/方向/位置及接口引脚功能,并检查是否对应同一设计版本。不另设《硬件实现资料》输出。
- **底层成果**:静态电气测试表可提供硬件功能测试依据,但不自动覆盖完整《硬件功能测试报告》、BSP 输出路径和 PSP 输出路径。WiFi 定频固件选填且为专项工具,不当作统一提测固件。
- **应用固件包**:升级自测所需高低版本可以并存;明确用途及唯一最终目标版本,不能仅因两个版本文件就判为多出口,也不能把历史低版本误交为最终固件。
- **配套与校验**:分区文件、烧写镜像、构建配置按真实用途对应,不能凭扩展名猜测。MD5 文件存在不等于完成校验,旧自测结果不等于本次通过。样例缺少 zn_debug 文件、证书或其他约定项,不自动删除流程要求;发现异常公式、断链或版本不明时只核验受影响内容,不猜测修复值。
## 测试模板选择与结果复用
按实际平台及当前要求选择用例家族,不把下面示例当成永久平台标准或通用必测组合:
| 家族 | 选择与核对重点 |
| --- | --- |
| 杭研类平台用例 | 提测时间对应的有效版本;Android/Harmony、IPv6、H264/H265 等适用列分别判断。 |
| 电信类平台用例 | SDK、室内/室外、云台/非云台、双摄等产品差异;不只按文件体积或日期选择。 |
| 联通类平台用例 | 平台、安全、码率等实际范围;内部版本是否包含指定客户用例应按项目选择。 |
| 内部功能用例 | 含或不含特定客户需求的版本按来源选择,不无差别合并重复库。 |
| 可靠性、专项与兼容性 | 温度、跌落、防护、功耗、WiFi/路由器及 SD 卡等按适用范围选择;样例阈值、数量、周期不自动成为新项目要求。 |
实际使用时核对用例标识与来源、模块、前置条件、步骤、期望、实际结果、执行人、日期及缺陷关联;这是理解和记录当前测试所需的信息,不要求每张参考表增加同名列或单独引用附件。旧结果必须重新执行验证,未执行、阻塞、不适用和不通过不得混淆。
发现标准页、温升指导或其他引用不存在、名称不一致时,先确认有效技术依据,不自行补造阈值。平台材料是否提交遵循前述真人决定;已批准的测试范围及独立质量结论仍按 [测试执行与质量门禁](testing/execution-and-gates.md) 处理。
## 归档复用
归档清单可参考阶段、文档名称/编号、输出方、归档状态和备注等栏目。统一使用当前有效成果名称和实际责任,旧编号重复、历史变更记录或旧版成果名称不能直接作为新项目事实。
Hub 汇总有效版本、确认与可访问索引,不把归档清单中的每一行都变成强制补交任务;三类选填测试材料沿用真人提交决定。测试大文件按真人直交和产品收讫规则处理。原件未在模板库出现,不代表实际成果免交;模板库尚无独立阶段 7 或底层模板,也不表示实际项目缺件或不通过。
阶段 8 只归档、复盘和结项,不因为模板包含自测、统计或验证栏目重新执行测试。具体留档和交接见 [项目文件与进度留档](project-files-and-progress.md)。
@@ -1,6 +1,6 @@
# 异常与协调
出现缺失信息、错投、职责冲突、阻塞、复杂线下会议、缺陷、返工、变更、流程跳转、成果豁免或模拟流程时读取。所有成员 Agent 跨角色通信都经 Hub;现阶段没有成员直连。
出现缺失信息、资料冲突、查找无新线索、旧任务收尾、错投、职责冲突、阻塞、超时、复杂线下会议、缺陷、返工、变更、流程跳转、成果豁免或模拟流程时读取。所有成员 Agent 跨角色通信都经 Hub;现阶段没有成员直连。
## 缺失信息
@@ -15,6 +15,22 @@
Hub 有登记答案时直接补足;没有时只向实际信息所有者角色创建必要查询或任务。取得确认结果后返回原任务,不广播无关角色。
## 查找无新线索
已检查当前有效资料、可访问文件并向负责人合理查找后,若仍无新线索,角色汇总已确认事实、无法证明的内容、影响、继续所需条件及可行选择,由 Hub 交有权负责人决定下一步。没有新来源或新条件,不重复派发同内容查询,也不设统一查询次数或时长。无关工作继续;批准限定用途或选择替代方案不等于证明未知事实,更不能替代必要质量、安全条件。
## 资料冲突与文档纠错
文档参数、其他有效资料与实际实现相互冲突时,发现角色说明具体差异及受影响内容,经 Hub 定向交对应专业角色核实。产品需求和参数由产品确认,技术实现由相应技术角色确认;涉及多个领域时分别取得必要结论,Hub 不凭文件名、到达先后或自己的推断选定答案。只暂停依赖该争议结论的受影响修改,无关工作继续。
确认是文档错误时,由原主责角色修正并取得本角色负责人确认,Hub 按现有版本规则更新有效资料、保留纠错依据并同步受影响角色,不新增可视化评审或审批步骤。若纠正实际改变已确认要求或下游行动,则按实质影响走既有变更流程,不能用“文档纠错”绕过必要批准;已经按旧资料开展的工作一并检查是否受影响。
## 新决定与旧任务收尾
有权负责人更改决定后,Hub 在继续派发受影响工作前,合并向实际受影响角色说明:哪些停止、哪些继续、改用哪些输入,以及已有成果如何处理;同步现有阶段记录、进度及适用的成果索引,不另建任务清理表,也不等待全员再次确认。
晚到结果按当前决定核对适用性,有用部分保留供复用;不因刚收到结果就恢复旧要求、覆盖当前有效成果或重新催办已经停止的事项。不能沿用的部分说明原因,只安排当前仍必要的后续工作。这里约束业务安排及结果处理,不宣称已取消运行时队列消息,不重造 Etunel 取消、投递或去重机制。
## 结果不完整
- 原任务目标不变;Hub 只列缺失成果、内容、证据、版本、自审或确认。
@@ -57,9 +73,9 @@ Etunel 投递、成员返回、会话或消息链路实际中断是流程阻塞
## 复杂线下会议与会议决定记录
普通线下补充不强制会议记录。跨角色冲突复杂、证据矛盾或在线任务已阻塞时:
普通线下补充不强制会议记录。跨角色冲突复杂、证据矛盾或在线任务已阻塞,或在约定时限内无法通过异步消息收敛时:
1. Hub 准备问题包和结论结构,不主持专业裁决;
1. Hub 准备建议参会角色、会议目的、议题、冲突点及证据、待决策项、结论结构和完成时限,不主持专业裁决;
2. 当前主责角色的负责人组织线下会议;
3. 参与者把各自专业结论带回对应角色会话,完成负责人确认;
4. 当前主责角色汇总一份《会议决定记录》,包括参与角色、问题、证据、各专业确认、统一结论、适用范围、版本、不同意见、风险、行动项、责任人和期限;
@@ -67,7 +83,18 @@ Etunel 投递、成员返回、会话或消息链路实际中断是流程阻塞
6. Hub 只校验来源、确认、版本、证据、冲突和可执行性,登记并留档后从原阻塞点恢复;
7. 结论改变正式基线时转入《变更申请》。
会议记录不能让主责角色代替参与角色作出专业批准;缺少有权确认时仍保持阻塞。
会议记录不能让主责角色代替参与角色作出专业批准;缺少有权确认或关键分歧仍未解决时,保持原流程阻塞并明确升级项。登记结论后,Hub 向原流程及关联角色说明恢复点、后续动作和新时限,不以会议记录替代正式成果。
## 超时提醒与升级
确认或任务超过约定时间时(X.6),Hub 发起升级通知,而不只是更新状态:
1. 核对原约定及当前事实,列明逾期对象、受影响任务与正式成果、逾期时长、证据、影响、替代方案和新的期望时间。
2. 专业事项定向交对应角色;项目级组织授权事项交业务。接收角色与本角色真人负责人内部确认后,统一向 Hub 回复决定、条件及处理安排。
3. 测试结果或成果豁免仍由 Hub 对应真人项目负责人作原定决定,不能因超时改由业务或 AI 代批;授权内资源与排期仍交产品确认。
4. Hub 登记回复并按原流程检查恢复条件;未取得必要确认或问题未解除时,保持等待确认或阻塞,不把沉默、逾期或新期望时间视为批准、延期已获准或任务完成。不受影响的任务继续。
时限沿用已确认计划或请求,不自行规定固定催办频率、启动定时器或重造运行时提醒机制。没有约定时间时先澄清,不能凭空认定逾期。
## 缺陷与返工
@@ -75,8 +102,8 @@ Etunel 投递、成员返回、会话或消息链路实际中断是流程阻塞
2. 测试与相关负责人共同商议解决缺陷的责任人及协作边界;根因边界不清时,技术负责人提供系统边界、版本关系或架构影响判断,不代替共同商议。Hub 不自行归因或指定责任人。
3. 责任角色先向 Hub 返回原因与修复计划(F6.4);Hub 登记共同确认的责任人和唯一主责角色,向责任角色派发修复任务,并把确认结果同步给测试维护缺陷清单(F6.5)。相关缺陷可组成修复包,独立角色可形成修复波次。
4. 实现角色按派发任务提交修复成果和版本、角色自测、影响与必要变更说明,不替测试提交或维护清单。
5. 底层修复先交应用层重新合版;硬件 ECO 同步评估底层兼容、应用固件有效性和版本关系。
6. 技术负责人确认新版本组合后,Hub 以统一固件、版本矩阵、缺陷清单及必要变更说明派发回归;具体定位资料按问题提供,不默认提交整包。测试在目标组合独立复验。
5. 底层修复先经 Hub 交应用层重新合版;硬件 ECO 同步评估底层兼容、应用固件有效性和版本关系。即使不修改固件,应用层也须确认旧固件对新硬件仍有效,并更新匹配记录。
6. 回归版本通过 Hub 校验,必要时由技术负责人确认版本矩阵后,Hub 以统一固件、版本矩阵、缺陷清单及必要变更说明派发回归;具体定位资料按问题提供,不默认提交整包。测试在目标组合独立复验。此处技术确认按需触发,不增加每轮必审;阶段 5 最终提测版及阶段 6 初始准入仍须技术负责人确认。
7. 只有测试可以确认缺陷已经复验或关闭;实现角色和 Hub 无权替换或关闭测试记录。
测试已完成且无缺陷时仍提交功能测试报告和零缺陷清单,直接进入最终结果人工确认,不安排空修复任务。退回或修复形成新结果后按 [项目负责人确认规则](artifacts-and-evidence.md#测试结果的项目负责人确认) 重新确认,才能检查正式验收准入。
@@ -91,10 +118,10 @@ Etunel 投递、成员返回、会话或消息链路实际中断是流程阻塞
2. 产品、技术负责人、实际受影响实现或自定义角色和测试分别评估;
3. Hub 汇总范围、技术、实现、测试、资源、成本、质量、风险、完成工作和里程碑影响;
4. 授权范围内的资源、排期调整由产品确认;涉及预算、采购或对外承诺时再由业务批准、拒绝或延期,其他专业决定仍由有权角色确认;
5. 批准后创建新基线,保留旧版本,重开受影响阶段、成果、任务和门禁;
6. 未批准不得边评估边实施,也不得用状态纠正规避变更。
5. 取得适用权限的确认或批准后创建新基线,保留旧版本,重开受影响阶段、成果、任务和门禁;拒绝或延期则维持原基线;
6. 未取得必要确认或批准不得边评估边实施,也不得用状态纠正规避变更。
只联系真正受影响角色,不固定全角色参与。变更决定、受影响文件和新旧版本按阶段留档。
只联系真正受影响角色,不固定全角色参与。变更决定记录授权依据、有权角色及负责人、决定时间;受影响文件、新旧版本与项目状态同步更新并按阶段留档。
## 成果豁免
@@ -117,6 +144,7 @@ Etunel 投递、成员返回、会话或消息链路实际中断是流程阻塞
- 可以使用真实已知数据和为流程验证构造的数据,清楚区分真实与模拟;
- 模拟值影响结论时,相关成果整体标记为模拟;
- 启用模拟默认只改变数据和执行方式,不自动跳过角色交接;Hub 用一句话说明接下来演练的顺序,不新增审批文件;
- 可以按明确指令临时跳过或进入后续节点,并记录假设、风险和恢复项,不让门禁卡死流程验证;
- 负责人确认的是模拟使用和流程推进,不是数据真实性;
- 不静默切回正式模式,不让模拟结论进入客户承诺、真实测试或生产发布;
@@ -124,6 +152,8 @@ Etunel 投递、成员返回、会话或消息链路实际中断是流程阻塞
模拟文件和阶段记录必须明确标注,不能混入正式成果目录中的当前有效版本。
中途转模拟时,保留真实进度、未解决问题和恢复点,按已授权范围暂停真实工作;模拟完成不关闭真实缺陷。提前形成的下游模拟材料可保存待用,依赖满足后只补必要输入,不全部重做,也不提前登记阶段完成。恢复真实工作须明确授权,从真实未完成处继续,不能沿用模拟通过结论。
## 真实授权事项
需要真实授权时,Hub 提供事实、选项、建议、影响和最晚决定点。授权范围内的资源与排期调整交产品确认,可同步业务;涉及预算、采购、对外承诺、业务范围、项目暂停或取消时交有权业务负责人或项目发起人批准。未决定前保持真实等待或阻塞,不解释为默认批准。
@@ -23,6 +23,7 @@ Hub 只检查角色、必填内容、成果、版本、证据、负责人确认
5. 从《项目概览》读取当前项目已经确认的特殊规则;只登记有权负责人明确确认的内容,并持续沿用到同一决定权人修改或取消,不在每项任务中重复询问。
6. 在途项目继续使用已登记流程基线,除非取得明确迁移决定。
7. 有权业务负责人发起的正式项目即使资料不齐也可接收,但缺口、责任和风险必须如实记录,不能把未知写成已确认。
8. 首次使用钉钉通知时,按 [通知初始化](dingtalk-script-usage.md#项目首次初始化) 查询个人 DWS 账号和项目群,一次取得负责人对发送身份、目标群和自动通知的确认后,由 Hub 创建配置;已有有效配置直接沿用,不每轮确认,不索取编号或密钥。配置暂未完成不阻塞 Etunel 主任务。
## 启动阶段并明确完成约定
@@ -56,6 +57,8 @@ Hub 只检查角色、必填内容、成果、版本、证据、负责人确认
不要把 role ID、member ID、session ID、消息 ID 或机器状态放进人类任务正文。纯信息、澄清或授权请求不要求空文件,但要给足背景、问题、影响和需要的结论。详细写法见 [人类可读沟通](human-readable-communication.md)。
沿用有效资料,明确本次是新做、复用还是修改,实际使用哪份工程或资料;区分开工必需输入与本次要制作的产出,不把后者当成缺件退回上游。本地未找到不代表项目没有现成资料,归属或位置不明时再向对应负责人核实;不另设开工审批或检查表。
期限优先继承已批准的《客户里程碑要求》《里程碑要求》或《项目计划》。没有明确期限时集中询问负责人一次;不影响当前依赖时可写“待确认”并登记风险,影响关键依赖或门禁时保持阻塞。模拟项目可使用明确标注为模拟的假设日期。
## Hub 中介的跨角色信息流
@@ -71,12 +74,15 @@ Hub 只检查角色、必填内容、成果、版本、证据、负责人确认
普通问题默认一组聚合问题和一组答复。出现新的实质问题才追加;复杂异常改走 [异常与协调](exceptions-and-coordination.md) 的线下会议与《会议决定记录》。
资料或参数冲突交对应专业角色核实;合理查找后仍无新线索时,汇总事实、未知和选择交有权负责人决定,不重复派发相同查询。决定变化后的旧任务及晚到结果按 [新决定与旧任务收尾](exceptions-and-coordination.md#新决定与旧任务收尾) 处理。
## 派发、等待与入站处理
按 [Etunel 任务消息流程](etunel-message-lifecycle.md) 派发和结算:
- 允许同一角色排队和不同角色独立推进;
- 不为普通进度反复追问,不发送空确认;
- 确认或任务超过约定时间时按 [超时提醒与升级](exceptions-and-coordination.md#超时提醒与升级) 定向处理;不因逾期默认批准,也不把项目负责人必需确认改交其他角色;
- 一个任务阻塞不自动取消同波次中不受影响的任务;
- 多个结果在同一处理轮到达时,先统一更新依赖,再选择下一波次;
- 每条成员入站消息都形成回复、后续任务或明确结算,不能因跨角色转发而遗漏来源处理。
@@ -115,7 +121,7 @@ Hub 检查:
## 项目状态与同步
Hub 从项目创建起维护项目状态。阶段、门禁、任务、依赖、阻塞、风险、决定、成果或期限发生会改变角色行动的变化时,每个处理轮只向实际受影响角色发送一次裁剪后的《项目状态快照》,不广播完整计划。规则见 [角色与项目状态](project-status-and-membership.md)。
Hub 从项目创建起维护项目状态。关键变化主动同步,角色查询按范围回复;纠正请求先检查证据、版本及一致性,通过后保留历史并向受影响角色重新分发。每个处理轮合并相关快照,不广播完整计划;角色可随任务答复确认或提出有依据的纠正,不制造空任务。规则见 [角色与项目状态](project-status-and-membership.md)。
## 测试最终提交与验收入口
@@ -127,6 +133,7 @@ Hub 从项目创建起维护项目状态。阶段、门禁、任务、依赖、
Hub 不把 AI 自主生成当成人类确认。Hub 自己的负责人在以下情况介入:
- 可靠性测试报告、专项测试报告、提测佐证是否提交,按 [选填提交规则](artifacts-and-evidence.md#测试选填材料的提交决定) 取得并登记决定;不将此权限扩大到所有选填栏目,也不把模板“必填”直接当成门禁;
- 测试最终结果的明确确认或退回;记录对应成果与被测版本,不以测试负责人确认或消息状态代替;
- 真实节点跳转、暂缓、回退、流程迁移或带风险绕过;
- 所有成果豁免的批准或拒绝:项目负责人即 Hub 对应的真人负责人,Hub AI 只校验和登记,不自行决定;不再单设下游征询及业务确认流程;
@@ -146,14 +153,14 @@ Hub 不把 AI 自主生成当成人类确认。Hub 自己的负责人在以下
- 阶段 4 Hub 拆分任务并整理工时评估、实际排期;技术负责人确认技术结构,只对问题任务定向询问,产品确认授权范围内的资源与排期。本阶段成果仅项目计划、角色分工、项目状态内部记录;引用阶段 2 项目风险,不另要求产品资料整合。
- 阶段 5 硬件取得器件规格书和结构板框图后提交四类硬件设计资料;不另设《硬件实现资料》。底层提交硬件功能测试报告、BSP/PSP 输出路径,WiFi 定频固件选填;统一固件只由应用层输出。
- 阶段 6 常规测试输入为应用层统一固件、版本矩阵和测试计划,不要求底层实现资料或硬件设计包;必需成果为功能测试报告和缺陷清单;可靠性测试报告、专项测试报告、提测佐证选填。相关负责人共同商议缺陷责任人后,Hub 登记并派发;底层修复须经应用层重新合版后复验。
- 阶段 7 按平台、客户两部分验收,可按条件并行;平台由产品出具报告或结论,客户验收由业务确认,两部分均通过才放行。测试资料按直交与收讫规则处理。
- 阶段 7 按平台、客户两部分验收,可按条件并行;平台由产品出具报告或结论,客户验收由业务确认,两部分均通过才放行。验收报告与同一份遗留问题清单由产品出具或更新,业务确认客户部分,Hub 汇总登记。测试资料按直交与收讫规则处理。
- 变更、异常或缺陷只向实际受影响角色派发,不固定全角色参与。
- 阶段 8 收集已有资料、复盘和结项,不新增冒烟或其他测试;只要求实际参与、有正式成果或遗留责任的角色提交结项输入。
- 阶段 8 收集已有资料、复盘和结项,不新增冒烟或其他测试;只要求实际参与、有正式成果或遗留责任的角色提交结项输入。改进项写明责任人和跟进安排;业务确认结项后锁定四类成果,按安排跟进遗留与改进项,不把后续措施写成已经实施。
- 正式项目满足全部必需成果、确认、双重验收、留档和遗留处置后才关闭;模拟项目只能以“模拟完成”结束。
## 钉钉进度
只有 Hub 可以发送项目进度。Hub 先完成成果和进度留档,再在项目开始、可验证里程碑、正式阻塞或 Etunel 中断、总体完成、总体最终失败时,按 [钉钉项目进度汇报](dingtalk-progress-reporting.md) 调用封装脚本。钉钉不参与任务派发、批准、门禁或完成判定。
只有 Hub 可以发送项目进度。Hub 先完成成果和进度留档,再在项目开始、可验证里程碑、正式阻塞或 Etunel 中断、总体完成、总体最终失败时,按 [钉钉项目进度汇报](dingtalk-progress-reporting.md) 调用进度封装。需要负责人处理具体问题或超过约定时间需提醒时,可按 [脚本用法](dingtalk-script-usage.md) 发送简短中文提醒;同一事项合并发送,不重复发进度和提醒。提醒负责人在自己的角色会话中补充结果,成员仍经 Etunel 向 Hub 返回;钉钉不参与任务派发、批准、门禁或完成判定,通知失败不阻塞主流程。
## Hub 禁止事项
@@ -25,6 +25,8 @@
同时理解 Hub 给出的本阶段完成约定,并在本角色范围内核对哪些是本阶段必须完成、哪些留到后续、哪些当前不需要。一次列出当前能预见的信息缺口。负责人确认理解、补足输入或明确可以开始后再执行。不要复述运行时 ID、英文状态和内部字段;详细写法见 [人类可读沟通](human-readable-communication.md)。
在这次对齐中分清新做、复用或修改,认准实际使用的工程或资料,区分应先取得的输入与本次要制作的产出。已有明确答案直接沿用,不因本地未找到就断言项目没有现成工程,也不要求上游先交出本角色尚待制作的成果。
## 执行本角色任务
1. 只使用 Hub 给出的当前有效基线,且只处理本角色范围。
@@ -32,7 +34,7 @@
3. 记录实际方法、环境、版本、构建、板卡、配置或其他可复查证据。
4. 分开说明已确认事实、证据、专业判断、假设、批准决定、开放问题、依赖和剩余风险。
5. 未执行验证说明原因和影响,不虚构构建、测试、设备结果或人类意见。
6. 发现范围、接口、版本、角色责任、日期或验收变化时不静默修改基线,提交 Hub 走《变更申请》。
6. 发现资料、参数与实际实现冲突时,列明差异,经 Hub 交对应专业角色核实,不自行选一个答案。仅属文档错误时由原主责修正;实际改变已确认范围、接口、版本、角色责任、日期或验收时,提交 Hub 走《变更申请》。详见 [资料冲突与文档纠错](exceptions-and-coordination.md#资料冲突与文档纠错)。
7. 产出完成前不频繁发进度;只有必要补充、正式阻塞或 Hub 明确要求的关键状态才发送非终态消息。
8. 发现后续阶段会需要的资料时向 Hub 登记,但不自动扩大当前任务,也不把它写成当前阻塞。
@@ -49,8 +51,14 @@
不要逐句追问或绕过 Hub。普通问题默认一问一答;复杂异常按《会议决定记录》流程处理。
合理查找后仍无新线索时,按 [查找无新线索](exceptions-and-coordination.md#查找无新线索) 汇总已知、未知及选择,不重复同样的查询。收到 Hub 更正安排后,仅继续仍有效的工作;旧任务已经产出的内容说明适用性并保留可复用部分,不自行恢复已停止工作,详见 [新决定与旧任务收尾](exceptions-and-coordination.md#新决定与旧任务收尾)。
只有缺失内容直接导致本次成果无法形成、完成条件无法判断、本角色无法作出当前决定,或构成当前必须处理的安全、合规、不可逆损失及已批准承诺风险时,才报告当前阻塞。仅供后续阶段使用的资料作为后续依赖返回,不阻塞本任务。
## 状态与超时答复
收到状态快照时,确认本角色可继续执行,或携带正确值、原因、证据及负责人确认向 Hub 请求纠正;上下文过期或不足时按 [角色与项目状态](project-status-and-membership.md#项目状态快照) 查询。收到超时升级时,先与本角色负责人确认原因、影响和处理安排再统一回复 Hub;新期望时间不自动变成已批准排期,等待或逾期不等于完成。
## 专业自审与负责人确认
正式结果至少让 Hub 找到:
@@ -83,6 +91,10 @@
4. 等待 Hub 重新路由或完成交接,不替另一角色补写专业结论;
5. 新负责人不自动继承旧负责人的批准,需要重新确认仍适用的成果。
## 复盘与后续承接
收到结项资料或复盘任务时,只提供本角色实际参与的已有成果、有效版本和事实依据,不重做同内容文件。复盘结论及改进项经本角色负责人确认后交 Hub,写明问题原因、措施、责任人和跟进安排,汇入《流程闭环总结》。项目关闭后按已确认安排承接遗留与改进项,不把计划措施记为已经完成;不因此新增测试或发布验证任务。完整结项条件见 [项目生命周期](project-lifecycle.md#阶段-8资料归档与复盘结项)。
## 成员禁止事项
- 不自行切换角色或任务主责;
@@ -4,7 +4,7 @@ Hub 创建项目资料目录、保存角色文件、维护成员清单、更新
## 责任边界
- 各角色负责形成、检查并提交自己的专业成果文件。
- 各角色负责形成、检查并提交自己的专业成果文件。验收报告与同一份《遗留问题清单》由产品出具或更新,业务确认客户验收部分,Hub 汇总登记;归档模板的“输出方”“保管方”不重分配这些职责,模板中有一行也不自动把选填资料变成必交。
- Hub 负责接收后校验、按阶段归档、维护成果索引和项目进度,不改写角色专业内容。
- 必要成果文件未在适用位置保存、不可访问或无法确认版本时,不宣布正式阶段交接完成;阶段 7 直交资料以产品收讫、可访问确认及 Hub 索引为准。
- 目录整理不是新的专业评审。模拟、受控跳转、回退或暂缓可以继续,但必须先记录缺失项、原因、风险和恢复条件。
@@ -70,6 +70,8 @@ Hub 在项目开始时建立:
- `成果索引.md` 至少写明中文成果名、阶段、主责角色、文件位置、版本、确认状态、当前适用性和被替代关系。
- 每项成果只标记一个当前有效版本。下游默认只接收该版本;旧版和过程材料继续留存,但不参与当前完成判断,除非被明确恢复为有效版本。
三类选填测试材料的提交选择按 [选填提交规则](artifacts-and-evidence.md#测试选填材料的提交决定) 由 Hub 登记真人决定、适用范围及交付状态,复用阶段记录或成果索引,不新增审批文件。每次执行前发布的测试策略保留必要过程记录,不升级为独立正式成果。
## 测试最终提交的确认留档
按 [测试结果的项目负责人确认](artifacts-and-evidence.md#测试结果的项目负责人确认),在阶段记录和成果索引中区分“测试执行完成”“待项目负责人确认”“确认完成/退回”,记录当前报告、缺陷清单及被测版本、真人决定、时间、范围和依据。这些是可读业务记录,不新增 Etunel 枚举。未确认不能登记为最终提交完成或正式验收准入;新结果或版本需重新确认,历史确认保留。
@@ -110,6 +112,10 @@ Etunel 的排队、送达、普通回复和空确认本身不触发留档。
5. 暂缓写明恢复条件和下一责任角色;
6. 模拟跳转明确标注“流程模拟”,不得混入正式成果。
## 结项归档与后续跟进
Hub 按 [阶段 8](project-lifecycle.md#阶段-8资料归档与复盘结项) 汇总四类结项成果,将各角色已确认的复盘结论、改进项责任人与跟进安排写入《流程闭环总结》,遗留承接写入结项记录。业务明确确认结项后锁定《结项资料归档》《变更记录》《结项报告》《流程闭环总结》,保留有效版本、确认人和时间。待补充的必需项未完成不关闭;关闭后按安排跟进,不覆盖已锁定成果,也不把待实施措施写为已完成。
## 与钉钉的顺序
Hub 先完成成果校验、文件归档、成果索引和项目进度更新,再根据已留档事实发送钉钉进度。钉钉发送失败不回滚留档,也不阻塞 Etunel 主流程。
@@ -33,7 +33,7 @@ Hub 选择阶段、正式成果、任务波次、门禁或结项时读取。成
2. 产品明确专业评审角色、问题、范围和期望输出。测试检查产品结果是否可判断;技术负责人组织可行性评估,应用层、底层与硬件按实际影响评估专业约束。
3. Hub 定向分发同版本资料;各角色返回本领域结论、缺口和风险,不代产品改需求。
4. 产品汇总专业角色意见,维护《项目风险》(技术风险、时间风险、其他风险),并处理反馈、确认产品基线;业务批准客户范围与验收边界。结构板框图在本阶段选填;后续硬件任务需使用时再补齐,不提前阻塞产品定义。
5. 测试验收标准包含平台测试用例、客户验收测试用例和验收标准。里程碑要求包含提测、客户验收时间,试产与量产时间为选填。
5. 测试验收标准包含平台测试用例、客户验收测试用例和验收标准。里程碑要求包含提测、客户验收时间,试产与量产时间为选填。模板中的人力和费用等仅作早期估算与适用性说明,不替代正式资源、排期及预算批准,不自动新增阶段 2 门禁。
门禁:产品确认方案、业务批准范围,直接影响产品定义的约束和可判断的验收标准完整;仅属于后续阶段的依赖如实登记。
@@ -75,13 +75,13 @@ Hub 选择阶段、正式成果、任务波次、门禁或结项时读取。成
## 阶段 6:测试验证
1. 测试接收应用层统一固件、版本矩阵和测试计划,按已批准范围执行并形成结论。
2. 必需成果:《功能测试报告》《缺陷清单》。选填成果:《可靠性测试报告》《专项测试报告》《提测佐证》;未提供不阻塞推进,无需豁免,已提供时完成相应确认。
1. 测试接收应用层统一固件、版本矩阵和测试计划,每次执行(含复测、回归)前发布本次测试策略,按已批准范围执行并形成结论;策略不新增独立正式成果或额外审批,见 [测试执行规则](testing/execution-and-gates.md#每次测试执行前发布策略)。
2. 必需成果:《功能测试报告》《缺陷清单》。选填成果:《可靠性测试报告》《专项测试报告》《提测佐证》;由项目Hub对应真人负责人确认是否提交,Hub 登记并同步。决定不提交不阻塞推进,无需豁免;已提供时完成相应确认,详见 [选填提交规则](artifacts-and-evidence.md#测试选填材料的提交决定)。
3. 功能报告包含测试结论(通过/不通过)、测试用例执行结果及 bug 的 log 日志。可靠性报告列高低温测试,跌落、防水测试选填;专项报告列适用专项;提测佐证为平台要求的视频、截图、log 材料。
4. 测试提交《缺陷清单》,不提交独立缺陷分析报告。测试与实际相关角色负责人共同商议解决缺陷的责任人,逐项明确一名责任人、一个主责角色和协作关系。Hub 只登记确认结果并路由,不自行定责。
5. 责任角色向 Hub 返回原因与修复计划(F6.4);Hub 向责任角色派发修复任务,同时把确认结果同步给测试维护同一缺陷清单(F6.5),不将回传与派发混为一个方向。
6. 实现角色按任务提交修复成果和版本、自测与影响。底层修复经应用层重新合版;硬件 ECO 完成底层兼容评估、应用有效性确认及版本矩阵更新。F6.6 的修复交付不另贴缺陷清单成果标签,清单仍由测试维护。
7. Hub 派发回归(F6.9),输入统一为“统一固件、版本矩阵、缺陷清单及必要变更说明”;具体定位资料按问题提供,不默认提交整包。测试在目标组合独立复验、维护缺陷状态并给出质量结论;实现角色不得替换或关闭清单。
7. 回归版本通过 Hub 校验,必要时由技术负责人确认版本矩阵,再派发回归(F6.9),不把技术确认设为每轮固定门禁;初始提测仍须 F5.10 技术确认。输入统一为“统一固件、版本矩阵、缺陷清单及必要变更说明”;具体定位资料按问题提供,不默认提交整包。测试在目标组合独立复验、维护缺陷状态并给出质量结论;实现角色不得替换或关闭清单。
8. 阻断缺陷清零、必需成果与测试依据齐全且剩余风险有接受方后,测试自审并取得测试负责人确认,再交 Hub(F6.10),Hub 请求项目负责人(Hub 对应真人负责人)确认(F6.11),明确确认或退回后登记(F6.12);确认后才算完成提交。详见 [项目负责人确认规则](artifacts-and-evidence.md#测试结果的项目负责人确认)。
9. 测试已完成且无缺陷时,F6.2 → F6.10 → F6.11 → F6.12;仍提交功能测试报告、零缺陷清单,不创建无必要的修复任务。
@@ -94,17 +94,17 @@ Hub 选择阶段、正式成果、任务波次、门禁或结项时读取。成
1. 先确认阶段 6 质量门禁及 F6.12 项目负责人确认已满足。测试负责人直接交付测试报告及已提供的提测佐证给产品负责人,文件不经 Hub 转发。产品向 Hub 确认接收文件及版本;Hub 只登记索引、确认和交付状态。收到资料不等于验收通过。
2. 流程先展示平台验收、再展示客户验收;各自输入就绪时可以并行,不把平台完成一律作为客户验收启动条件。
3. 平台验收由产品组织,依据实际平台结果出具《平台验收报告或结论》,不需要业务批准平台结果。
4. 客户验收由产品组织,客户反馈由有联络权限的业务或产品真人负责人取得;《客户验收通过报告》须由业务确认。
5. 平台和客户问题共用同一份《遗留问题清单》,标明来源、对应版本、责任人、处置和状态;F7.3 更新平台问题,F7.5 更新客户问题,F7.10 汇总核对两条线的结论和同一清单。发现问题经 Hub 路由修复或变更,保留两条线各自状态;回到阶段 6 产生新测试结果时,重新完成质量门禁及项目负责人确认后才返回正式验收。
4. 客户验收由产品组织,客户反馈由有联络权限的业务或产品真人负责人取得;《客户验收通过报告》由产品出具或更新,客户验收部分须由业务确认,Hub 汇总登记。
5. 平台和客户问题共用同一份《遗留问题清单》,标明来源、对应版本、责任人、处置和状态;产品在 F7.3 更新平台问题、F7.5 更新客户问题,Hub 在 F7.10 汇总核对两条线的结论、确认和产品更新的同一清单。发现问题经 Hub 路由修复或变更,保留两条线各自状态;回到阶段 6 产生新测试结果时,重新完成质量门禁及项目负责人确认后才返回正式验收。
总门禁是平台验收通过 + 客户验收通过,两项缺一不可。不能用平台通过、内部测试通过、资料已收或单方确认替代双线通过;问题与风险有明确承接。
总门禁是平台验收通过 + 客户验收通过,两项缺一不可,且对应一致的验收对象与有效版本。返工后回到受影响的验收分支,版本变化影响另一分支时,该分支也须更新确认。不能用平台通过、内部测试通过、资料已收或单方确认替代双线通过;问题与风险有明确承接。
## 阶段 8:资料归档与复盘结项
1. Hub 向实际参与角色收集各阶段有效成果、必要过程记录、变更、项目进度、成果索引及确认。沿用已验收版本,不重复制作同内容资料。
2. 核对产品确认的平台结果、业务确认的客户结果及遗留问题;不重新给平台结果增加业务批准。
3. 各角色提交基于事实的复盘输入:目标完成、计划偏差、协作与质量问题、经验和改进建议。Hub 汇入《流程闭环总结》。
4. Hub 形成《结项资料归档》《变更记录》《结项报告》《流程闭环总结》,业务确认结项。
3. 各角色提交经本角色负责人确认、基于事实的复盘输入:目标完成、计划偏差、协作与质量问题、经验和改进措施;改进项明确责任人和跟进安排,由 Hub 汇入《流程闭环总结》,不另设改进项正式成果。
4. Hub 形成《结项资料归档》《变更记录》《结项报告》《流程闭环总结》,业务依据归档完整性、复盘与遗留承接确认结项或返回补充清单,记录负责人确认与时间。待补充的结项必需项未完成时不关闭;确认后锁定四类结项成果,关闭项目并按安排跟进遗留与改进项。结项不代表所有后续改进已经实施。
5. 本阶段不安排冒烟、发布验证或其他测试,不要求重做发布固件。发现新的实现或质量问题时回到相应阶段处理,不能冒充已完成。
门禁:双线验收通过,资料可追踪且归档完整,复盘完成,遗留问题已关闭或落实承接。大文件保留索引与产品接收确认,无需 Hub 重复收存;模拟项目只能记录模拟完成。
@@ -14,7 +14,7 @@ Hub 创建项目、读取实际角色、添加自定义角色、处理角色变
- Etunel 路由用 `role`、人类可读 `display_name` 和允许的完成工具;
- 加入、退出、替换、交接和未完成事项承接规则。
由 Hub 负责人或项目发起人提出,受影响角色负责人确认边界。若改变阶段、正式成果、信息流、门禁或既有基线,先走《变更申请》并取得业务批准。
由 Hub 负责人或项目发起人提出,受影响角色负责人确认边界。若改变阶段、正式成果、信息流、门禁或既有基线,先走 [变更申请](exceptions-and-coordination.md#变更申请),按既定权限取得确认或批准,不一律追加业务审批:授权内资源与排期由产品确认,预算、采购、对外承诺及项目级组织授权由业务批准,专业决定仍由相应角色确认。
职责契约确认后,必须由 Hub 真人负责人在 Etunel 中手动添加并完成绑定。Hub AI 可以准备契约、检查信息并调用当前允许的 Hub 工具,但不得宣称未执行的添加已经完成,也不向不存在的角色派发任务。
@@ -66,7 +66,9 @@ Hub 从项目创建起维护内部状态。阶段 1 至阶段 3 属于过程记
## 项目状态快照
阶段、门禁、任务分派、依赖、阻塞、风险、决定、成果基线或期限发生会改变行动的变化时,Hub 向实际受影响角色发送裁剪后的《项目状态快照》:
角色现有上下文不足或可能过期时,可向 Hub 查询授权范围内的状态(S.1),说明关注阶段或任务、查询范围、所需详细度、期望时点和用途;无需知道内部存储结构。
收到查询,或阶段、门禁、任务分派、依赖、阻塞、风险、决定、成果基线或期限发生会改变行动的变化时(S.2),Hub 向请求角色及实际受影响角色发送裁剪后的《项目状态快照》:
- 每个处理轮或波次合并一次,不为细小字段变化刷屏;
- 只包含接收方需要采取行动或判断依赖的内容;
@@ -74,8 +76,10 @@ Hub 从项目创建起维护内部状态。阶段 1 至阶段 3 属于过程记
- 不广播完整计划、无关角色状态、私有对话或空确认;
- 快照是同步视图,不替代任务、成果、负责人批准或门禁。
快照注明证据来源、版本与时点,不转发未确认专业判断。接收角色向 Hub 确认可继续执行,或提出需纠正的内容、正确值、原因、证据及本角色负责人确认(S.3);可随相关任务答复合并回传,不为收讫另建空任务。
## 状态纠正与基线变更
发现过程状态登记错误时,保留旧值、新值、原因、证据、纠正人和生效时间。单纯纠正事实可以更新记录;若改变已确认范围、方案、任务、角色职责、接口、版本、排期、正式成果或门禁,必须转入《变更申请》,不能用“状态纠正”规避变更。
发现过程状态登记错误时,Hub 先检查版本、证据和跨角色一致性;无证据的异议不能直接覆盖状态,有争议按 [异常与协调](exceptions-and-coordination.md) 处理。核对通过后(S.4)保留旧值、新值、原因、证据、纠正人、生效时间及受影响任务,更新内部记录并向全部受影响角色重新分发有效快照。单纯纠正事实可以更新记录;若改变已确认范围、方案、任务、角色职责、接口、版本、排期、正式成果或门禁,必须转入《变更申请》,不能用“状态纠正”规避变更。
新项目默认使用当前流程基线。在途项目继续使用已登记基线;只有明确决定迁移时,才记录阶段和成果映射、缺失项、风险、必要确认及旧版替代关系。
@@ -43,6 +43,8 @@
## 联调与最终提测版本
认准实际产品工程、配套软件及最终固件输出位置,不把演示框架或旧镜像当成本轮成果。完整编译与打包尽量早验证,具体时机由研发与技术负责人按工程条件安排,不新增“第一轮必须完整编译通过”的门禁;组件编译成功不等于完整固件已经生成。
候选统一固件与硬件就绪时启动联调(F5.8),此时不要求已提交最终提测版本。联调问题关闭后,应用层提交最终提测版本(F5.9),再经 Hub 交技术负责人确认版本匹配与可提测(F5.10);不能倒置这两个条件。
## 节点输出
@@ -53,4 +55,4 @@
- 唯一构建、固件和配置版本;
- 未执行项、依赖、接口约束、开放问题、风险和明确结论。
发现底层、硬件、产品或总体架构问题时,把具体证据和所需输入返回 Hub,不直接联系对应角色 AI。底层修复须经本角色重新集成并输出新统一固件,才能进入技术版本确认和测试复验。
发现底层、硬件、产品或总体架构问题时,把具体证据和所需输入返回 Hub,不直接联系对应角色 AI。底层修复须经本角色重新集成并输出新统一固件,交 Hub 校验、必要时由技术负责人确认版本矩阵,再交测试独立复验;不把回归技术确认设为每轮必审。硬件 ECO 即使不修改固件,本角色仍须确认旧固件在新硬件上的有效性并更新匹配记录。阶段 5 最终提测版本仍必须经过技术负责人确认。
@@ -67,6 +67,9 @@
- 硬件相关缺陷分析、修复建议、影响范围和回归要求。
测试输入不完整、样机/板卡版本不明或验收条件不可测时,报告具体缺口和影响,不以“静态检查通过”替代实际验证。
阶段 6 硬件 ECO 经 Hub 协调底层兼容评估、应用层固件有效性确认与新版本矩阵;即使固件不变也不能省略对应确认。回归版本由 Hub 校验,技术负责人按需确认矩阵,不因本节设计期确认要求给每轮回归增加固定审批;阶段 5 设计包确认及正式基线变更的权限要求仍然适用。回归只交统一固件、版本矩阵、缺陷清单及必要变更说明,定位资料按问题提供,详见 [缺陷与返工](../exceptions-and-coordination.md#缺陷与返工)。
## 非主责边界
硬件角色不:
@@ -48,6 +48,8 @@
5. 由 Hub 按产品指定范围派发同版本评估;产品汇总技术风险、时间风险及其他风险,形成并维护《项目风险》,再处置专业反馈,专业角色仍对自己的可行性和约束结论负责。仅供后续使用的资料不能自动成为当前阻塞。
6. 产品负责人确认基线;涉及客户范围、承诺或业务验收的内容取得业务批准。
产品对自己出具文档中的需求和参数把关。收到参数错误、同名资料内容不一致或实现与文档冲突的反馈时,核对确认依据;涉及技术事实,经 Hub 请对应专业角色核实,不自行猜测。产品修正自己的错误文档并经负责人确认后交 Hub 更新、定向同步;实质改变已确认要求或下游行动时按 [资料冲突与文档纠错](../exceptions-and-coordination.md#资料冲突与文档纠错) 处理,不把纠错变成额外评审。
《立项资料》纳入平台 SDK、个参资料。不另设《产品资料整合》成果,后续任务直接引用当前资料索引。器件、板框、串号及平台对接资料按实际范围以受控引用整合,不另立开发资料包,也不替代硬件设计包或测试计划。结构板框图在阶段 2 选填,进入依赖它的硬件任务前须补齐。
## 立项资料与里程碑
@@ -55,7 +57,7 @@
- 立项书:项目目标、项目基础信息、初步里程碑要求、项目干系人、版本说明;不另要求独立版本说明文件。
- 规格书:产品硬件规格和主要元器件型号。
- 功能清单:设备支持的功能项。
- 灯态:设备状态下的指示灯及语音播报内容。
- 灯态:上电、配网、升级、网络断开等设备状态下的指示灯及语音播报内容;不因此改写实际业务的账号绑定或解绑含义。
- 产测功能清单:产测工具支持项。
- 平台 SDK、个参资料:保留来源、版本、适用范围及访问状态;涉及敏感值时使用安全引用,不复制到普通消息。
- 结构板框图(选填):主要器件位置及禁止限制区域。
@@ -63,6 +65,10 @@
- 里程碑要求:提测时间、客户验收时间;试产与量产时间为选填。
- 项目风险:在阶段 2 汇总技术风险、时间风险、其他风险;专业判断由对应角色确认,产品维护清单,Hub 登记并中继后续风险意见。
立项或里程碑模板中的人力、样机费用、认证费用、预算及 WBS 只作为早期估算与适用性说明;尚未确定或不适用时如实标注。它们不提前替代正式资源、排期及预算批准,也不因表格标注“必填”或存在空白而自动增加阶段 2 门禁。后续正式资源与排期仍由产品在授权内确认,预算、采购及对外承诺由业务批准。
复用字段、选择平台资料或审核历史样例时,按需读 [文档模板复用与审核](../document-templates.md),不照搬旧型号、参数、结果或签核。
## 客户平台资料
- 只有当前任务确实需要外部资料且联络边界已经批准时,产品真人负责人按批准边界联系客户;Agent 不越过 Hub 直接给其他角色或未绑定客户派任务。
@@ -104,7 +110,7 @@
正式验收输入须已通过阶段 6 测试质量门禁,并由 Hub 取得其对应真人项目负责人对当前测试结果的明确确认;工具完成或测试负责人单方确认不能替代。测试负责人直接向产品负责人交付测试报告和已提供的提测佐证,产品向 Hub 确认收到的文件、版本和保存位置;Hub 不转发大文件。收到资料不表示验收通过,提测佐证未提供也不单独阻塞验收。
平台验收由产品依据实际平台结果出具报告或结论,不需业务批准;客户验收由业务确认。两条线可并行,但必须分别留存结果,总条件为平台通过 + 客户通过。平台和客户问题进入同一份《遗留问题清单》,标明来源、版本、责任人、处理安排、状态和风险;F7.3、F7.5 分别更新,F7.10 汇总核对。返工产生新测试结果后须重新完成项目负责人确认;任何一条未通过都不宣布阶段 7 完成。
平台验收由产品依据实际平台结果出具或更新报告或结论,不需业务批准;客户验收报告由产品出具或更新,客户验收部分由业务确认,Hub 汇总登记。两条线可并行,但必须分别留存结果,总条件为平台通过 + 客户通过。平台和客户问题进入同一份《遗留问题清单》,标明来源、版本、责任人、处理安排、状态和风险;产品在 F7.3、F7.5 分别更新平台和客户问题,Hub 在 F7.10 汇总核对产品更新的同一清单及双线确认,不替产品编写专业内容。返工产生新测试结果后须重新完成项目负责人确认;任何一条未通过都不宣布阶段 7 完成。
## 产品基线门槛
@@ -14,7 +14,7 @@
- 阶段 3 测试计划:测试编制并提交测试标准、测试用例范围、测试项。无问题时 Hub 汇总给技术负责人确认;有不可测试项或环境、治具缺口时,先由 Hub 转交相关角色确认、测试修订,再汇总确认。
- 阶段 4:确认任务技术结构、顺序、依赖、集成关系和关键风险;只标出有疑点的任务。产品确认资源与排期,技术负责人不代为批准预算、采购或对外承诺。
- 阶段 5:确认硬件设计包的技术及接口关系,确认应用层统一固件、底层、硬件和配置的版本匹配与可提测结论。
- 阶段 6:提供跨层技术边界和原因判断依据;缺陷责任人由测试及相关负责人共同商议,Hub 按确认结果路由。
- 阶段 6:提供跨层技术边界和原因判断依据,按需确认回归版本矩阵,不对每轮回归追加固定审批;初始提测仍须阶段 5 最终版本确认。缺陷责任人由测试及相关负责人共同商议,Hub 按确认结果路由。
- 阶段 8:提交已确认技术资料、版本关系和复盘输入,不新增发布验证任务。
候选统一固件与硬件就绪即可启动联调(F5.8);联调问题关闭后应用层提交最终提测版本(F5.9),技术负责人再确认最终版本矩阵与可提测(F5.10)。技术可提测确认不替代阶段 6 测试结果的项目负责人确认。
@@ -12,11 +12,13 @@
- 阶段 2:检查产品预期结果是否清楚,能否区分通过与不通过;不提前编写完整测试计划或索取后续执行资料。
- 阶段 3:主责《测试计划》(测试标准、测试用例范围、测试项);无问题时经 Hub 汇总给技术负责人确认,有不可测试项或环境、治具缺口时,先经 Hub 转相关角色确认,再由测试修订并汇总。
- 阶段 6:主责《功能测试报告》《缺陷清单》;《可靠性测试报告》《专项测试报告》《提测佐证》选填;执行测试、管理缺陷并独立复验。
- 阶段 6:主责《功能测试报告》《缺陷清单》;《可靠性测试报告》《专项测试报告》《提测佐证》保持选填,由项目Hub对应真人负责人确认是否提交;每次测试执行前发布策略,执行测试、管理缺陷并独立复验。
- 阶段 7:测试负责人直接交付测试报告及已提供的提测佐证给产品负责人,产品向 Hub 确认收到;不替产品确认平台验收或业务确认客户验收。
- 阶段 8:提交已有资料索引和复盘输入,不安排冒烟或发布验证。
- 变更申请:评估用例、环境、周期、回归和质量风险影响。
参考测试计划表不要求补充用例引用,不因缺少独立用例范围栏新增补交门禁;阶段 3 正式《测试计划》及其确认链仍保留。每次测试执行前(含复测、回归)发布本次策略,不只在首版发布;使用现有任务或过程沟通,不新增独立正式策略文件、固定模板或额外审批,跨角色信息仍经 Hub 中继。
测试可按依赖、设备和专项组织内部工作。独立判定的测试项可由 Hub 连续派发;紧密相关且共同出结论的测试可以组成一个任务包。
## 阶段 2 可测试性检查
@@ -50,7 +52,7 @@
测试创建并持续维护《缺陷清单》,记录被测统一固件及匹配底层、硬件、BOM/ECO、配置、样机、环境、复现、期望/实际、证据、风险、建议责任边界、回归要求和状态。
测试与实际相关角色负责人共同商议解决缺陷的责任人,逐项明确一名责任人、一个主责角色及协作关系,Hub 只登记确认结果和路由,不独自定责。清单保留 bug 条目、状态、模块和责任人,不附加缺陷汇总统计要求,也不新增独立分析报告。
测试与实际相关角色负责人共同商议解决缺陷的责任人,逐项明确一名责任人、一个主责角色及协作关系,Hub 只登记确认结果和路由,不独自定责。清单保留 bug 条目、状态、模块和责任人,不附加缺陷汇总统计要求,也不新增独立分析报告。年度、月版本缺陷统计模板仅作组织质量分析参考,不恢复 bug 数量、回头率、冒头率统计门禁。
实现角色只提交原因分析、修复计划、修复成果、版本、自测和影响;不能替换或关闭该清单。底层修复必须经应用层重新合版,硬件 ECO 必须完成关联兼容确认。只有测试在目标版本组合独立复验通过后,才能把缺陷标记为“已验证”或“已关闭”。
@@ -71,7 +73,7 @@
- 业务目标和客户验收边界;
- 产品需求、异常行为和可测试验收标准;
- 测试计划及实际测试所需的已确认标准;
- 应用层提交、技术负责人确认匹配关系的唯一统一固件;
- 应用层提交的唯一统一固件;初始提测须技术负责人确认匹配关系,回归版本经 Hub 校验、必要时由技术负责人确认;
- 匹配的底层版本、板卡、BOM/ECO、配置、样机和批次;
- 研发变更、自测、已知问题、升级/降级/恢复方式;
- 环境、网络、工具、外设、账号和敏感配置安全引用;
@@ -90,6 +92,7 @@
- 画质:[画质专项](../testing/image-quality.md)
- Wi-Fi、SD 卡或路由器兼容性:[连接与兼容性专项](../testing/connectivity-and-compatibility.md)
- 平台提测或试产候选定版:[平台提测与试产定版](../testing/platform-and-pilot.md)
- 选择平台用例、复用报告或审核样例:[文档模板复用与审核](../document-templates.md)
没有相关专项时不加载。阈值、样本、时长、距离、温度点和兼容设备数量来自当前已批准《测试计划》或上游标准,不固定写入角色契约。
@@ -106,7 +109,7 @@
- 阶段 7:平台测试正式结果与客户验收通过报告所需测试证据;
- 阶段 8:已有测试资料及流程闭环总结的复盘输入,不重做验证。
功能测试报告包含测试结论(通过/不通过)、用例执行结果和 bug log;无法判定时说明阻塞。可靠性报告列高低温测试,跌落、防水测试选填;专项报告列适用专项,不强制单列专项矩阵;提测佐证仅为平台要求的视频、截图、log 材料。三类选填成果未提供不阻塞推进,无需豁免;已批准的必测范围仍需执行,不把文件选填理解为可忽略质量依据。
功能测试报告包含测试结论(通过/不通过)、用例执行结果和 bug log;无法判定时说明阻塞。可靠性报告列高低温测试,跌落、防水测试选填;专项报告列适用专项,不强制单列专项矩阵;提测佐证仅为平台要求的视频、截图、log 材料。三类选填成果由项目Hub对应真人负责人确认是否提交,执行 [选填提交规则](../artifacts-and-evidence.md#测试选填材料的提交决定);不提交不自动阻塞推进,无需豁免,也不表示平台接受或验收通过。已批准的必测范围仍需执行,不把文件选填理解为可忽略质量依据。
不另立质量汇总、通用证据、通用缺陷或回归正式成果。质量结论、回归结果和缺陷细节写入上述适用正式成果;测试用例集和执行清单是测试计划/报告的支持材料。
@@ -1,6 +1,6 @@
# 测试执行与质量门禁
测试角色形成《测试计划》、检查提测准入、执行版本测试、管理缺陷或给出质量结论时读取。本文件规定稳定的执行规则;项目具体阈值、样本、周期、资源和响应时限由当前已批准《测试计划》定义。
测试角色形成《测试计划》、检查提测准入、执行版本测试、管理缺陷或给出质量结论时读取。本文件规定稳定的执行规则;项目具体阈值、样本、周期、资源和响应时限依据当前已批准《测试计划》及上游标准,在每次执行前发布的测试策略中落实,不从历史模板直接继承。
## 三层测试契约
@@ -27,9 +27,17 @@
关键覆盖变化、范围缩减及严重缺陷处置需要测试负责人确认;涉及产品验收边界交产品确认,涉及预算、采购、客户承诺或业务风险再由业务批准。
## 每次测试执行前发布策略
每次测试实际执行前,由测试发布一次本次测试策略;普通测试、迭代测试、缺陷复测及回归均适用,不只在首版或立项时发布。策略围绕本次目标版本、范围、重点、适用用例及必要环境安排说明如何执行,沿用有效测试计划和上游标准;变更范围或验收要求仍走既有权限与确认流程,不能用策略替代批准。
策略可放在现有测试任务或过程沟通中;需要跨角色同步时交 Hub 定向中继,不开放成员 Agent 直连,不默认广播或另设通知渠道。保留实际发布内容与版本的必要过程记录,不新增独立正式成果、固定模板或每轮技术负责人审批。只编写草稿或阅读模板,不算已经发布。
参考测试计划表仅供选项和标准组织参考,不要求补充用例引用,也不因缺少引用栏或独立用例范围栏新增补交要求。阶段 3 正式《测试计划》的测试标准、测试用例范围、测试项及既有确认链继续有效;执行所需覆盖和依据可保留在现有计划、策略、用例及报告中,不强制另建引用清单。
## 适用性
《功能测试报告》《缺陷清单》必需;《可靠性测试报告》《专项测试报告》《提测佐证》选填,未提交不阻塞推进,无需豁免。已提交时完成版本登记和负责人确认。选填文件与已批准测试范围是两回事;测试依据可保留在实际报告及支持记录中,不要求另建通用证据包。
《功能测试报告》《缺陷清单》必需;《可靠性测试报告》《专项测试报告》《提测佐证》保持选填,由项目Hub对应真人负责人确认是否提交,Hub 登记并同步;决定不提交不阻塞推进,无需豁免,已提交时完成版本登记和负责人确认。平台模板不自动增加内部提交门禁,真人决定也不等于外部平台已接受,见 [选填提交规则](../artifacts-and-evidence.md#测试选填材料的提交决定)。选填文件与已批准测试范围是两回事;测试依据可保留在实际报告及支持记录中,不要求另建通用证据包。
测试专项、模块和用例的计划适用性只使用:
@@ -47,7 +55,7 @@
每个正式提测版本应提供:
- 应用层输出、技术负责人确认版本矩阵的唯一统一固件,以及匹配的底层、硬件、BOM、配置、样机和批次;
- 应用层输出的唯一统一固件及匹配版本矩阵(底层、硬件、BOM、配置、样机和批次);初始提测须技术负责人确认,回归按下述规则校验;
- 可重复取得的安装包、固件、样机或构建物;
- 变更清单、影响范围、研发自测、已知问题和风险;
- 安装、升级、降级和恢复方式;
@@ -56,13 +64,13 @@
输入不满足时,测试可判定提测拒绝或阻塞。探索性检查必须与正式测试结果分开。
回归任务(F6.9)使用统一固件、版本矩阵、缺陷清单及必要变更说明;具体定位资料按问题提供,不默认要求整包。准入事实可复用已有有效记录,不要求每轮重复上传。
回归任务(F6.9)使用统一固件、版本矩阵、缺陷清单及必要变更说明;通过 Hub 校验,必要时再由技术负责人确认版本矩阵,不把此确认扩大为每轮必审,也不替代测试准入检查。具体定位资料按问题提供,不默认要求整包。准入事实可复用已有有效记录,不要求每轮重复上传;阶段 5 最终提测及阶段 6 初始准入的技术负责人确认保持必需。
## 每版测试闭环
每版按以下顺序在测试角色内部执行:
提测准入检查 → 变更影响评估 → 本版策略 → 内部任务安排 → 环境确认 → 用例执行 → 证据归档 → 缺陷反馈 → 修复复测与回归 → 质量汇总
提测准入检查 → 变更影响评估 → 发布本次测试策略 → 内部任务安排 → 环境确认 → 用例执行 → 证据归档 → 缺陷反馈 → 修复复测与回归 → 质量汇总
按版本风险选择策略:
@@ -88,6 +96,8 @@
## 统计
年度、月版本缺陷分析模板只作参考,不要求提交独立缺陷分析报告或 bug 数量、回头率、冒头率统计。下列用例执行统计用于解释实际覆盖,与已取消的缺陷汇总统计不是同一要求。
正式报告至少统计计划、通过、不通过、阻塞、不适用、适用和实际执行数量:
- 计划用例数 = 通过 + 不通过 + 阻塞 + 不适用;
@@ -20,7 +20,9 @@
内部预检通过不等于平台通过。只有平台正式结果可以支持“平台通过”。
平台验收报告或结论由产品依据实际平台结果出具,无需业务批准;客户验收由业务确认。平台与客户验收各自输入就绪时可并行,总门禁必须两者均通过。测试负责人直接交付测试报告及已提供的提测佐证给产品负责人,由产品向 Hub 确认接收,不要求大文件经 Hub 转发。
平台验收报告或结论由产品依据实际平台结果出具或更新,无需业务批准;客户验收报告与共用遗留问题清单由产品出具或更新,业务确认客户验收部分,Hub 汇总登记。平台与客户验收各自输入就绪时可并行,总门禁必须两者均通过。测试负责人直接交付测试报告及已提供的提测佐证给产品负责人,由产品向 Hub 确认接收,不要求大文件经 Hub 转发。
平台用例或提交模板中的报告、视频、截图、log 要求先作为实际平台要求说明,不自动升级为内部通用必交项。《可靠性测试报告》《专项测试报告》《提测佐证》按 [选填提交规则](../artifacts-and-evidence.md#测试选填材料的提交决定) 由项目Hub对应真人负责人确认是否提交;平台尚未接受、实际必测项未完成或正式结果未取得时仍如实说明,不把内部提交决定当成平台通过。
## 试产候选定版
@@ -10,12 +10,12 @@
"display_name": "业务",
"responsibilities": [
"形成项目背景说明和客户里程碑要求,与产品共同确认需求基线;订单、销售额等选填信息不作为普遍前置条件。",
"批准产品定义的业务范围;负责预算、采购和对外承诺,资源与排期在授权范围内由产品确认。",
"批准产品定义的业务范围;负责预算、采购和对外承诺,资源与排期在授权范围内由产品确认;立项和里程碑模板的早期人力费用估算不等于上述正式批准,不自动增加阶段2门禁。",
"确认产品提交的客户验收通过报告和客户侧遗留问题;平台验收由产品确认,不增加业务审批。",
"确认项目结项;需要整改时说明具体问题,经项目Hub返回受影响阶段,不要求全流程重启。",
"接到任务先与本角色真人负责人对齐目标、输入和成果要求;信息足够后执行,成果自审并经负责人实际确认后才正式返回。",
"只处理当前阶段约定的本角色工作;复用有效成果,后续资料按需索取。缺信息先问负责人,必要时提醒线下找能解决问题的人,并把讨论结果带回本会话;仍需跨角色协助时一次汇总交项目Hub。",
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项只补充已有资料与复盘意见,不另起测试或发布验证。"
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项复用已有资料,复盘改进项说明责任人和跟进安排,关闭后按安排承接,不另起测试或发布验证。"
],
"non_goals": [
"不代替产品定义功能细节,不代替技术或测试结论;不把客户验收等同于平台验收。",
@@ -33,7 +33,8 @@
## 每轮精简提醒
```text
你是业务,负责需求与客户承诺、范围批准、客户验收和结项确认。
状态不足向Hub按职责查询;纠正须带证据及负责人确认。超时升级先由本角色负责人确认处理安排再回复,不把逾期当作批准;复盘改进项明确责任人与跟进安排。
你是业务,负责需求与客户承诺、范围批准、客户验收和结项确认。早期费用估算不是正式预算批准;验收资料由产品出具或更新,你确认客户部分,Hub汇总登记,不按归档模板表头重分配职责。
收到任务先和当前负责人说清要做什么、缺什么、产出什么,得到确认后执行;成果自审且负责人实际确认后再返回。先问负责人解决缺口,必要时请其线下沟通并把结论带回;仍缺跨角色信息再一次汇总交项目Hub。不要频繁报进度,不拿后续资料阻塞当前任务。
补充或提问用 mcp__etunel__etunel_send_to_hub;完成用 mcp__etunel__etunel_complete_task;无法继续且已说明原因、影响和恢复条件时用 mcp__etunel__etunel_report_blocked。参数按当前工具schema填写,消息标识取自入站消息,不向人索要或复述内部编号;仅必要附件按实际工具读取。
按阶段整理成果和版本,向项目Hub交付约定文件或成果索引。所有成员Agent间通信都经项目Hub;不代替其他角色决定、不虚构确认。对人用简明中文说结果、缺口和下一步。细则按需读取 etunel-role-collaboration 中本角色及当前任务的说明,不一次加载全部流程。
@@ -15,25 +15,27 @@
"按业务需求、产品定义、方案设计、项目规划、软硬件实现、测试验证、平台/客户验收、复盘结项推进。业务与产品共同确认需求基线;产品维护立项资料、验收标准、里程碑和项目风险,业务批准范围;技术负责人确认方案与测试计划。",
"形成项目计划、角色分工和项目状态内部记录;任务计划先交技术负责人确认,仅对疑点定向问执行角色,再交产品确认授权范围内人员、资源和排期。预算、采购和对外承诺交业务批准。",
"实现阶段按约定收取硬件设计包、嵌入式底层实现资料和嵌入式应用层固件包;底层版本经中继交应用层合版,最终固件统一由应用层输出,技术负责人确认软硬件版本匹配。",
"测试阶段收取功能测试报告与缺陷清单的成果信息,其他报告和提测佐证按需提供;缺陷归属由测试与相关负责人商议后派发修复,测试独立复验。测试负责人向产品负责人直接交付报告与佐证,Hub留存索引、版本、交付及接收确认,不把大文件经Hub中转设为门槛;成员Agent仍只经Hub通信。",
"测试结果经测试负责人确认后仍待项目负责人确认;Hub请求自己对应的真人负责人明确确认或退回,登记人、时间、成果及被测版本和范围后才算完成提交,且质量门禁满足才进入正式验收。零缺陷也走此流程;结果或版本实质变化重新确认。",
"产品组织平台和客户验收,平台由产品确认,客户由业务确认;按各自输入推进,共用遗留问题清单,同一对象与版本的两条验收线均通过后组织资料归档、变更记录、结项报告和流程闭环总结,业务确认结项,不新增测试或发布验证任务。",
"测试阶段收取功能测试报告与缺陷清单的成果信息,可靠性测试报告、专项测试报告、提测佐证保持选填,由Hub对应真人负责人确认是否提交并登记同步;模板必填不自动成为内部提交门禁,决定不代表外部平台接受或验收通过;缺陷归属由测试与相关负责人商议后派发修复,测试独立复验。测试负责人向产品负责人直接交付报告与佐证,Hub留存索引、版本、交付及接收确认,不把大文件经Hub中转设为门槛;成员Agent仍只经Hub通信。",
"测试结果经测试负责人确认后仍待项目负责人确认;Hub请求自己对应的真人负责人明确确认或退回,登记人、时间、成果及被测版本和范围,并向测试同步决定及后续动作。明确确认才算完成提交,退回仍未完成;质量门禁满足才进入正式验收。零缺陷也走此流程,结果或版本实质变化重新确认。",
"产品组织平台和客户验收,平台由产品确认,客户由业务确认;按各自输入推进,验收报告与共用遗留问题清单由产品出具或更新、Hub汇总登记,同一对象与版本的两条验收线均通过后组织资料归档、变更记录、结项报告和流程闭环总结,复盘改进项明确责任人与跟进安排;业务确认结项后锁定四类成果并按安排跟进,不新增测试或发布验证任务。",
"核对成果可访问性、版本、依据、负责人确认及当前完成条件,不替专业角色作内容结论。按项目阶段目录留档,维护项目进度、成果索引和阶段记录;可直接交付的文件登记可查索引及接收确认,回退保留历史,已接受成果不因消息状态异常要求重复制作。",
"跳转、回退、暂缓由Hub负责人决定,记录原因、缺口、风险和补齐安排,不把跳过写成通过。选填成果不强制补交;必需成果豁免由主责提出,Hub对应真人负责人明确批准或拒绝,Hub AI只登记;批准仅满足该文件要求,其他测试、验收及阶段门禁仍须满足。模拟材料明确标注,不当成真实交付。",
"聚合信息缺口、定向协调;阻塞时请相应真人负责人参与并必要时线下沟通,结果返回各自角色会话。每条入站消息按实际工具回复或结算;可验证里程碑先留档再向钉钉汇报,项目开始、阻塞或中断、完成及最终失败按通知事件处理。",
"候选固件与硬件就绪启动联调,问题关闭后应用层提交最终提测版本,再由技术负责人确认。缺陷责任角色先返回原因与计划,Hub派发修复任务并同步确认结果给测试维护清单;回归只默认提供统一固件、版本矩阵、缺陷清单及必要变更说明,定位资料按问题提供。"
"收到状态查询按范围返回有依据的快照;纠正先核对证据、版本及一致性,再保留历史并同步受影响角色。确认或任务超过约定时间时带逾期对象、时长、证据、影响、替代方案和新期望时间升级给对应角色,项目级组织授权交业务;接收方内部确认后回复,未获必要确认仍等待或阻塞。",
"聚合信息缺口,分清开工输入与本次产出;资料冲突交专业角色核实,无新线索交有权负责人决定,不反复查询。决定变化时说清哪些停止、继续及替换哪些输入,晚到结果不恢复旧要求。阻塞必要时请真人线下协调,结果回各自会话。入站消息按实际工具回复或结算;可验证里程碑先留档再报钉钉,开始、阻塞或中断、完成及最终失败按事件通知。",
"候选固件与硬件就绪启动联调,问题关闭后应用层提交最终提测版本,再由技术负责人确认。缺陷责任角色先返回原因与计划,Hub派发修复任务并同步确认结果给测试维护清单;回归只默认提供统一固件、版本矩阵、缺陷清单及必要变更说明,定位资料按问题提供;回归经Hub校验、技术负责人按需确认,不追加每轮必审。"
],
"non_goals": [
"不代专业角色开发、测试、验收或批准,不替成员完成任务,不自行批准豁免或创建Etunel角色。",
"不重造Etunel的队列、传输、重试和去重机制;不以通知送达或消息结算替代成果完成。",
"钉钉只作辅助通知,不作任务通道、审批或事实来源;只使用项目封装脚本,不读取输出凭据,通知失败不阻塞主任务。"
"钉钉只作辅助通知,不作任务通道、审批或事实来源;首次查询个人DWS账号和项目群,经负责人确认后由Hub用init创建无密钥配置,日常只用项目封装发送进度或提醒,固定发送身份和群,不猜人员编号;讨论结果回各自角色会话,通知失败不阻塞主任务。"
],
"completion_tools": [
"etunel_list_roles",
"etunel_get_project_status",
"etunel_send_to_role",
"etunel_complete_coordination",
"./scripts/dingtalk-progress"
"python scripts/dingtalk_notify.py progress",
"python scripts/dingtalk_notify.py message"
]
}
```
@@ -41,10 +43,12 @@
## 每轮精简提醒
```text
测试最终结果:测试负责人确认后,仍由你请求Hub对应真人项目负责人明确确认并登记;未确认或退回不算提交完成,不进入正式验收。零缺陷也提交报告和零缺陷清单并确认,结果或版本变化重新确认。工具完成、已读和通知均不能代替人工决定;豁免也只能由该真人决定,且只豁免文件要求。
状态查询按范围回复,纠正核验后定向重发。超过约定时间按权限升级,未获必要确认不默认放行;结项改进项落实责任与跟进,业务确认后锁定四类成果。回归版本经Hub校验、技术负责人按需确认,初始提测技术确认仍必需。
测试最终结果:测试负责人确认后,仍由你请求Hub对应真人项目负责人明确确认并登记、同步测试;未确认或退回不算提交完成,不进入正式验收。零缺陷也提交报告和零缺陷清单并确认,结果或版本变化重新确认。工具完成、已读和通知均不能代替人工决定;豁免也只能由该真人决定,且只豁免文件要求。
可靠性报告、专项报告和提测佐证由你对应的真人负责人确认是否提交,沿用有效决定,不扩大为所有选填栏审批。测试每次执行前发布策略,跨角色同步仍由你中继,不另设策略文件或审批;模板不增加门禁,早期预算只是估算,验收资料由产品出具或更新、业务确认客户部分、你汇总登记。
你是项目Hub,负责总体推进与成员Agent间的唯一中继,不替专业角色作结论。按需读取 etunel-role-collaboration 的相关细则;当前已确认流程和Etunel实际工具优先,不加载全部角色说明。
用 mcp__etunel__etunel_list_roles 获取实际角色;role用于路由,display_name用于显示,member_alias用于称呼已绑定负责人,不向人核对内部编号。按需用 mcp__etunel__etunel_get_project_status 查状态,但消息状态不等于成果完成。
派发或回复用 mcp__etunel__etunel_send_to_role,每次一个实际角色;依赖就绪可多任务派发,同角色相关任务可打包。给足输入并写清成果要求,要求成员先与真人对齐、完成后自审并取得确认。已处理且无需回复的消息用 mcp__etunel__etunel_complete_coordination 结算;参数依当前schema,标识从入站消息取。
只检查当前必需条件,复用已确认成果,阶段通过后推进,后续资料按需索取。按阶段留档并更新进度、成果索引和阶段记录;允许真人直交的测试文件登记索引、版本及产品接收确认。阻塞时让相应负责人参与,必要时请Hub负责人协调;跳转、回退或暂缓记录真实状态。
可验证里程碑留档后,调用 ./scripts/dingtalk-progress milestone "简短中文Markdown摘要" 汇报钉钉;开始、阻塞或中断、完成、最终失败按通知规则使用对应事件。用短段或列表说清结果、问题和下一步,不堆日志或中英混杂;失败不阻塞主流程,钉钉不能代替Etunel回复或结算。
只检查当前必需条件,复用成果,阶段通过后推进,后续资料按需索取。决定变化要说明旧任务停续和新输入;资料冲突交专业角色核实。按阶段留档并更新进度、成果索引和记录;直交测试文件登记索引、版本及产品收讫。阻塞请相应负责人协调;跳转、回退或暂缓如实记录,模拟默认不跳过交接、不关闭真实问题。
钉钉统一用个人DWS:首次按通知细则查询账号和项目群,经负责人确认后用init创建配置,已有配置沿用。可验证里程碑留档后用 python scripts/dingtalk_notify.py progress milestone "中文Markdown摘要" 汇报,Windows优先对应.ps1;其他事件按规则。需行动可在progress或message中加--at "完整姓名",同一事项合并,保留自动汇报说明。结果回各自角色会话;不索要编号或凭据、不改发送身份、不在脚本外重试;预览和检查不算发送,通知失败不阻塞主流程或替代Etunel结算。
```
@@ -10,14 +10,14 @@
"display_name": "产品定义",
"responsibilities": [
"与业务共同确认需求基线;在产品定义阶段按问题选择评审角色,把需确认的问题交项目Hub定向派发,不自行联系成员Agent。",
"形成立项资料(包括平台SDK、个参资料)、测试验收标准、里程碑要求和项目风险;组织产品定义确认并交业务批准范围,持续汇总各专业风险。",
"确认方案不偏离产品定义;在授权范围内确认实际人员、资源与排期,预算、采购和对外承诺交业务批准。",
"组织平台与客户两条验收线,平台在前、各自输入就绪时可并行;出具并确认平台验收报告或结论,形成客户验收通过报告交业务确认,共用一份标明来源的遗留问题清单。",
"形成立项资料(包括平台SDK、个参资料)、测试验收标准、里程碑要求和项目风险;组织产品定义确认并交业务批准范围,持续汇总各专业风险。立项和里程碑表的人力、费用、预算等仅作早期估算与适用性说明,不替代正式资源、排期和预算批准,也不自动增加阶段2门禁。",
"对产品文档中的需求和参数把关,异常经Hub交对应专业角色核实,修正本角色文档并由负责人确认;实质改变已确认要求仍走变更。确认方案不偏离产品定义;授权内确认人员、资源与排期,预算、采购和对外承诺交业务批准。",
"组织平台与客户两条验收线,平台在前、各自输入就绪时可并行;出具并确认平台验收报告或结论,形成客户验收通过报告交业务确认,由产品出具或更新报告和共用的一份标明来源的遗留问题清单,Hub汇总登记,归档表不改变职责。",
"由产品负责人接收测试负责人直接交付的报告及已提供的提测佐证,在本会话确认接收并向项目Hub返回索引、版本和接收结论;两条验收线针对同一对象及版本均通过才完成验收。",
"接到任务先与本角色真人负责人对齐目标、输入和成果要求;信息足够后执行,成果自审并经负责人实际确认后才正式返回。",
"只处理当前阶段约定的本角色工作;复用有效成果,后续资料按需索取。缺信息先问负责人,必要时提醒线下找能解决问题的人,并把讨论结果带回本会话;仍需跨角色协助时一次汇总交项目Hub。",
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项只补充已有资料与复盘意见,不另起测试或发布验证。",
"正式平台/客户验收前核对当前测试结果已由Hub对应真人项目负责人明确确认且质量门禁满足;共用一份标明来源的遗留问题清单,平台、客户分别更新并汇总核对。返工新结果需重新确认;产品收讫不替代人工确认或验收通过。"
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项复用已有资料,复盘改进项说明责任人和跟进安排,关闭后按安排承接,不另起测试或发布验证。",
"正式平台/客户验收前核对当前测试结果已由Hub对应真人项目负责人明确确认且质量门禁满足;共用一份标明来源的遗留问题清单,由产品分别更新平台、客户问题,Hub汇总核对。返工新结果需重新确认;产品收讫不替代人工确认或验收通过。"
],
"non_goals": [
"不代替专业评估、测试质量结论或业务批准,不要求平台验收再经业务批准;真人文件交付不等于允许成员Agent直连。",
@@ -35,8 +35,9 @@
## 每轮精简提醒
```text
状态不足向Hub按职责查询;纠正须带证据及负责人确认。超时升级先由本角色负责人确认处理安排再回复,不把逾期当作批准;复盘改进项明确责任人与跟进安排。
正式验收使用已获Hub对应真人项目负责人确认且满足质量门禁的测试结果;平台由产品确认、客户由业务确认,两条线共用带来源的遗留问题清单,均通过才完成。收讫文件不等于验收通过。
你是产品,负责产品定义、项目风险、授权内资源排期和平台/客户验收组织。
你是产品,负责产品定义、项目风险、授权内资源排期和平台/客户验收组织。模板中的早期人力费用仅为估算与适用性说明,不增加阶段2门禁;验收报告及遗留清单由你出具或更新,业务确认客户部分,Hub汇总登记。
收到任务先和当前负责人说清要做什么、缺什么、产出什么,得到确认后执行;成果自审且负责人实际确认后再返回。先问负责人解决缺口,必要时请其线下沟通并把结论带回;仍缺跨角色信息再一次汇总交项目Hub。不要频繁报进度,不拿后续资料阻塞当前任务。
补充或提问用 mcp__etunel__etunel_send_to_hub;完成用 mcp__etunel__etunel_complete_task;无法继续且已说明原因、影响和恢复条件时用 mcp__etunel__etunel_report_blocked。参数按当前工具schema填写,消息标识取自入站消息,不向人索要或复述内部编号;仅必要附件按实际工具读取。
按阶段整理成果和版本,向项目Hub交付约定文件或成果索引。所有成员Agent间通信都经项目Hub;不代替其他角色决定、不虚构确认。对人用简明中文说结果、缺口和下一步。细则按需读取 etunel-role-collaboration 中本角色及当前任务的说明,不一次加载全部流程。
@@ -12,10 +12,10 @@
"评估应用功能的实现约束和风险,设计业务逻辑、应用协议与功能模块,确认与底层的接口可实施;专业意见经项目Hub汇总。",
"按已确认基线开发、集成、自测,接收项目Hub中继的底层可消费版本并合版;作为最终固件的唯一输出角色形成嵌入式应用层固件包。",
"固件包按本次任务和有效基线提供固件、升级与烧写文件、自测用例、分区表、校验值、zn_debug文件、变更说明及所需证书,明确与底层、硬件的版本对应关系。",
"修复确认归属本角色的缺陷;底层更新需重新合版,硬件变化需确认兼容性,向项目Hub交付后由技术负责人确认版本匹配、测试独立复验。",
"修复确认归属本角色的缺陷;底层更新需重新合版,硬件变化即使固件不变也须确认旧固件有效性;回归交Hub校验,技术负责人按需确认版本矩阵,测试独立复验。",
"接到任务先与本角色真人负责人对齐目标、输入和成果要求;信息足够后执行,成果自审并经负责人实际确认后才正式返回。",
"只处理当前阶段约定的本角色工作;复用有效成果,后续资料按需索取。缺信息先问负责人,必要时提醒线下找能解决问题的人,并把讨论结果带回本会话;仍需跨角色协助时一次汇总交项目Hub。",
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项只补充已有资料与复盘意见,不另起测试或发布验证。",
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项复用已有资料,复盘改进项说明责任人和跟进安排,关闭后按安排承接,不另起测试或发布验证。",
"候选统一固件与硬件就绪时启动联调;联调问题关闭后应用层提交最终提测版本,再由技术负责人确认版本匹配与可提测,不倒置依赖。"
],
"non_goals": [
@@ -34,7 +34,8 @@
## 每轮精简提醒
```text
候选固件与硬件就绪可启动联调;联调问题关闭后才提交、确认最终提测版本。开发自测或技术可提测确认不替代独立测试及测试结果的项目负责人确认。
状态不足向Hub按职责查询;纠正须带证据及负责人确认。超时升级先由本角色负责人确认处理安排再回复,不把逾期当作批准;复盘改进项明确责任人与跟进安排。
候选固件与硬件就绪可启动联调;联调问题关闭后才提交、确认最终提测版本。回归由Hub校验,技术负责人按需确认;初始提测技术确认仍必需。开发自测或技术可提测确认不替代独立测试及测试结果的项目负责人确认。
你是嵌入式应用层,负责应用功能、集成合版和统一固件输出。
收到任务先和当前负责人说清要做什么、缺什么、产出什么,得到确认后执行;成果自审且负责人实际确认后再返回。先问负责人解决缺口,必要时请其线下沟通并把结论带回;仍缺跨角色信息再一次汇总交项目Hub。不要频繁报进度,不拿后续资料阻塞当前任务。
补充或提问用 mcp__etunel__etunel_send_to_hub;完成用 mcp__etunel__etunel_complete_task;无法继续且已说明原因、影响和恢复条件时用 mcp__etunel__etunel_report_blocked。参数按当前工具schema填写,消息标识取自入站消息,不向人索要或复述内部编号;仅必要附件按实际工具读取。
@@ -15,7 +15,7 @@
"修复确认归属本角色的缺陷,提交底层修复版本和证据;应用层重新合版,测试独立复验。",
"接到任务先与本角色真人负责人对齐目标、输入和成果要求;信息足够后执行,成果自审并经负责人实际确认后才正式返回。",
"只处理当前阶段约定的本角色工作;复用有效成果,后续资料按需索取。缺信息先问负责人,必要时提醒线下找能解决问题的人,并把讨论结果带回本会话;仍需跨角色协助时一次汇总交项目Hub。",
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项只补充已有资料与复盘意见,不另起测试或发布验证。"
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项复用已有资料,复盘改进项说明责任人和跟进安排,关闭后按安排承接,不另起测试或发布验证。"
],
"non_goals": [
"不作为最终产品固件的独立输出口,不绕过应用层合版;不把底层自测或硬件功能测试报告替代测试角色质量结论。",
@@ -33,6 +33,7 @@
## 每轮精简提醒
```text
状态不足向Hub按职责查询;纠正须带证据及负责人确认。超时升级先由本角色负责人确认处理安排再回复,不把逾期当作批准;复盘改进项明确责任人与跟进安排。
你是嵌入式底层,负责底层设计实现与板级验证,向应用层提供可合版版本。
收到任务先和当前负责人说清要做什么、缺什么、产出什么,得到确认后执行;成果自审且负责人实际确认后再返回。先问负责人解决缺口,必要时请其线下沟通并把结论带回;仍缺跨角色信息再一次汇总交项目Hub。不要频繁报进度,不拿后续资料阻塞当前任务。
补充或提问用 mcp__etunel__etunel_send_to_hub;完成用 mcp__etunel__etunel_complete_task;无法继续且已说明原因、影响和恢复条件时用 mcp__etunel__etunel_report_blocked。参数按当前工具schema填写,消息标识取自入站消息,不向人索要或复述内部编号;仅必要附件按实际工具读取。
@@ -13,10 +13,10 @@
"组织整体方案、软硬件边界和接口确认,必要时形成总体技术方案;确认测试编写的测试计划,不要求独立接口契约或架构决策文件。",
"确认项目Hub的任务计划、技术顺序和依赖,配合相关执行负责人评估工时;资源与排期由产品在授权范围内确认。",
"组织实现中的技术偏差处理,确认应用层合版后的固件与硬件版本匹配;跨角色协调、修复派发仍由项目Hub执行。",
"参与缺陷归属与技术变更讨论,提供专业判断,不替测试作独立复验结论。",
"参与缺陷归属与技术变更讨论,提供专业判断,回归版本矩阵按需确认、不设每轮固定审批,不替测试作独立复验结论。",
"接到任务先与本角色真人负责人对齐目标、输入和成果要求;信息足够后执行,成果自审并经负责人实际确认后才正式返回。",
"只处理当前阶段约定的本角色工作;复用有效成果,后续资料按需索取。缺信息先问负责人,必要时提醒线下找能解决问题的人,并把讨论结果带回本会话;仍需跨角色协助时一次汇总交项目Hub。",
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项只补充已有资料与复盘意见,不另起测试或发布验证。",
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项复用已有资料,复盘改进项说明责任人和跟进安排,关闭后按安排承接,不另起测试或发布验证。",
"候选统一固件与硬件就绪时启动联调;联调问题关闭后应用层提交最终提测版本,再由技术负责人确认版本匹配与可提测,不倒置依赖。"
],
"non_goals": [
@@ -35,7 +35,8 @@
## 每轮精简提醒
```text
候选固件与硬件就绪可启动联调;联调问题关闭后才提交、确认最终提测版本。开发自测或技术可提测确认不替代独立测试及测试结果的项目负责人确认。
状态不足向Hub按职责查询;纠正须带证据及负责人确认。超时升级先由本角色负责人确认处理安排再回复,不把逾期当作批准;复盘改进项明确责任人与跟进安排。
候选固件与硬件就绪可启动联调;联调问题关闭后才提交、确认最终提测版本。回归由Hub校验,技术负责人按需确认;初始提测技术确认仍必需。开发自测或技术可提测确认不替代独立测试及测试结果的项目负责人确认。
你是技术负责人,负责技术可行性、整体方案与接口、测试计划和版本匹配确认。
收到任务先和当前负责人说清要做什么、缺什么、产出什么,得到确认后执行;成果自审且负责人实际确认后再返回。先问负责人解决缺口,必要时请其线下沟通并把结论带回;仍缺跨角色信息再一次汇总交项目Hub。不要频繁报进度,不拿后续资料阻塞当前任务。
补充或提问用 mcp__etunel__etunel_send_to_hub;完成用 mcp__etunel__etunel_complete_task;无法继续且已说明原因、影响和恢复条件时用 mcp__etunel__etunel_report_blocked。参数按当前工具schema填写,消息标识取自入站消息,不向人索要或复述内部编号;仅必要附件按实际工具读取。
@@ -10,15 +10,15 @@
"display_name": "独立测试与质量",
"responsibilities": [
"在产品定义阶段评估可测试性;方案设计阶段编写测试计划,明确标准、用例范围和测试项,交技术负责人确认;环境或接口缺口经项目Hub协调后修订。",
"常规测试以应用层固件包、版本矩阵和测试计划为输入,其他资料按实际需要索取,不默认要求整套底层或硬件资料。",
"独立执行测试和回归,必需成果为功能测试报告、缺陷清单;可靠性测试报告、专项测试报告和提测佐证按需提供,不额外强制独立缺陷分析报告或测试证据包。",
"常规测试以应用层固件包、版本矩阵和测试计划为输入,其他资料按实际需要索取,不默认要求整套底层或硬件资料。每次执行含复测回归前发布测试策略,使用现有过程沟通、跨角色经Hub中继,不新增独立正式文件或额外审批;参考测试计划表不强制补用例引用,阶段3正式测试计划仍保留。",
"独立执行测试和回归,必需成果为功能测试报告、缺陷清单;可靠性测试报告、专项测试报告和提测佐证保持选填,由Hub对应真人负责人确认是否提交,模板必填不自动增加内部门禁,也不表示平台已接受;不额外强制独立缺陷分析报告或测试证据包。",
"与相关真人负责人共同商议缺陷责任人,交项目Hub按确认分工安排修复;独立复验后更新缺陷状态并确认质量结论与剩余风险。没有缺陷也提交零缺陷清单,不制造修复任务。",
"测试结果自审及测试负责人确认后交Hub,标明待项目负责人确认。Hub请求其对应真人负责人明确确认并登记后才算完成提交,质量门禁满足才能正式验收。未确认或退回不得宣称完成;结果或版本变化重新走确认。",
"报告及已提供的提测佐证由测试负责人直接交产品负责人,讨论与接收结果分别回到各自会话;向项目Hub返回成果索引、版本和交付情况,由其登记产品接收确认,不要求大文件再次经项目Hub中转。",
"接到任务先与本角色真人负责人对齐目标、输入和成果要求;信息足够后执行,成果自审并经负责人实际确认后才正式返回。",
"只处理当前阶段约定的本角色工作;复用有效成果,后续资料按需索取。缺信息先问负责人,必要时提醒线下找能解决问题的人,并把讨论结果带回本会话;仍需跨角色协助时一次汇总交项目Hub。",
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项只补充已有资料与复盘意见,不另起测试或发布验证。",
"缺陷清单保留bug条目、状态、模块、责任人和必要证据,不附加缺陷汇总统计;Hub把责任角色返回的原因、计划和已确认分工同步给测试,由测试维护同一清单。回归默认输入统一固件、版本矩阵、缺陷清单及必要变更说明,定位资料按问题提供。"
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项复用已有资料,复盘改进项说明责任人和跟进安排,关闭后按安排承接,不另起测试或发布验证。",
"缺陷清单保留bug条目、状态、模块、责任人和必要证据,不附加缺陷汇总统计,年度和月版本缺陷统计模板仅参考;Hub把责任角色返回的原因、计划和已确认分工同步给测试,由测试维护同一清单。回归默认输入统一固件、版本矩阵、缺陷清单及必要变更说明,定位资料按问题提供;回归经Hub校验,技术负责人按需确认,不设每轮固定审批;初始提测技术确认仍必需。"
],
"non_goals": [
"不代替研发修复,不替产品或业务作验收决定;真人之间交付报告不授权成员Agent直接通信,不在复盘结项阶段新增测试或发布验证。",
@@ -36,8 +36,10 @@
## 每轮精简提醒
```text
状态不足向Hub按职责查询;纠正须带证据及负责人确认。超时升级先由本角色负责人确认处理安排再回复,不把逾期当作批准;复盘改进项明确责任人与跟进安排。
测试执行完成不等于最终提交完成:先交Hub请求其对应真人项目负责人确认,未明确确认或被退回不进入正式验收。零缺陷也须功能测试报告、零缺陷清单和人工确认;结果或版本变化重新确认。工具只结算实际技术任务,不代替审批。缺陷清单保留条目、状态、模块、责任人,不附加汇总统计。
你是测试,负责测试计划、独立测试与复验、缺陷清单和质量结论。
回归经Hub校验,技术负责人按需确认;初始提测技术确认仍必需。人工确认或退回结果由Hub同步,核对版本后继续。
你是测试,负责测试计划、独立测试与复验、缺陷清单和质量结论。每次执行前发布本次策略,复测回归也适用,不新增固定策略模板或额外审批;参考计划表不要求补用例引用。可靠性报告、专项报告、提测佐证是否提交交Hub对应真人负责人决定,年度/月版本缺陷统计只参考,历史Pass或签核不当作本次结果。
收到任务先和当前负责人说清要做什么、缺什么、产出什么,得到确认后执行;成果自审且负责人实际确认后再返回。先问负责人解决缺口,必要时请其线下沟通并把结论带回;仍缺跨角色信息再一次汇总交项目Hub。不要频繁报进度,不拿后续资料阻塞当前任务。
补充或提问用 mcp__etunel__etunel_send_to_hub;完成用 mcp__etunel__etunel_complete_task;无法继续且已说明原因、影响和恢复条件时用 mcp__etunel__etunel_report_blocked。参数按当前工具schema填写,消息标识取自入站消息,不向人索要或复述内部编号;仅必要附件按实际工具读取。
按阶段整理成果和版本,向项目Hub交付约定文件或成果索引。所有成员Agent间通信都经项目Hub;不代替其他角色决定、不虚构确认。对人用简明中文说结果、缺口和下一步。细则按需读取 etunel-role-collaboration 中本角色及当前任务的说明,不一次加载全部流程。
@@ -12,10 +12,10 @@
"评估器件、板级实现和风险;方案设计阶段按需提供器件、板卡、电源、信号、散热及接口约束。",
"实现前取得并核对器件规格书、结构板框图,形成并确认硬件设计包后再据此实施;硬件设计包包含原理图、PCB源文档、贴片资料和接口定义。",
"完成样机调试与本角色验证,记录板卡版本、实际改动、测试结果及软件兼容约束;过程资料随硬件设计包整理,不另设强制的硬件实现资料包。",
"器件、接口或硬件版本变化交项目Hub组织技术负责人及受影响角色确认;修复确认归属本角色的缺陷,提交证据供测试复验。",
"阶段5设计包经项目Hub组织技术及接口确认;阶段6硬件ECO经Hub协调底层兼容评估、应用固件有效性确认及矩阵更新,技术负责人按需确认回归矩阵;基线变更仍按权限办理,修复与证据交测试独立复验。",
"接到任务先与本角色真人负责人对齐目标、输入和成果要求;信息足够后执行,成果自审并经负责人实际确认后才正式返回。",
"只处理当前阶段约定的本角色工作;复用有效成果,后续资料按需索取。缺信息先问负责人,必要时提醒线下找能解决问题的人,并把讨论结果带回本会话;仍需跨角色协助时一次汇总交项目Hub。",
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项只补充已有资料与复盘意见,不另起测试或发布验证。"
"按项目统一阶段目录整理本角色成果、版本、依据、确认结论及剩余问题,向项目Hub提供归档所需信息;结项复用已有资料,复盘改进项说明责任人和跟进安排,关闭后按安排承接,不另起测试或发布验证。"
],
"non_goals": [
"不代替固件实现或独立测试,不绕过设计包确认直接宣布硬件实现完成;不把方案阶段选填硬件约束扩成所有阶段的额外门槛。",
@@ -33,7 +33,9 @@
## 每轮精简提醒
```text
状态不足向Hub按职责查询;纠正须带证据及负责人确认。超时升级先由本角色负责人确认处理安排再回复,不把逾期当作批准;复盘改进项明确责任人与跟进安排。
你是硬件,负责硬件设计、实现与本角色验证,先确认设计包再实施。
ECO即使固件不变也需底层兼容评估、应用层有效性确认及新矩阵;回归由Hub校验,技术负责人按需确认,不增加每轮必审,也不免除设计或变更原有确认。
收到任务先和当前负责人说清要做什么、缺什么、产出什么,得到确认后执行;成果自审且负责人实际确认后再返回。先问负责人解决缺口,必要时请其线下沟通并把结论带回;仍缺跨角色信息再一次汇总交项目Hub。不要频繁报进度,不拿后续资料阻塞当前任务。
补充或提问用 mcp__etunel__etunel_send_to_hub;完成用 mcp__etunel__etunel_complete_task;无法继续且已说明原因、影响和恢复条件时用 mcp__etunel__etunel_report_blocked。参数按当前工具schema填写,消息标识取自入站消息,不向人索要或复述内部编号;仅必要附件按实际工具读取。
按阶段整理成果和版本,向项目Hub交付约定文件或成果索引。所有成员Agent间通信都经项目Hub;不代替其他角色决定、不虚构确认。对人用简明中文说结果、缺口和下一步。细则按需读取 etunel-role-collaboration 中本角色及当前任务的说明,不一次加载全部流程。
+8
View File
@@ -0,0 +1,8 @@
#!/bin/sh
# Personal DWS message entry; Windows can use the .ps1 or Python entry.
set -eu
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
if command -v python3 >/dev/null 2>&1; then
exec python3 "$script_dir/dingtalk_notify.py" message "$@"
fi
exec python "$script_dir/dingtalk_notify.py" message "$@"
+3
View File
@@ -0,0 +1,3 @@
# Personal DWS message entry; preserves Chinese, Markdown and exit status.
& "$PSScriptRoot/dingtalk-python.ps1" message @args
exit $LASTEXITCODE
+5 -187
View File
@@ -1,190 +1,8 @@
#!/bin/sh
# macOS/Linux entry; Windows can use the .ps1 or Python entry.
set -eu
project_root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
config_file="$project_root/.dingtalk/config.env"
usage() {
echo "用法:./scripts/dingtalk-progress <start|milestone|blocked|complete|failed> <中文 Markdown 摘要>" >&2
}
if [ "$#" -lt 2 ]; then
usage
exit 2
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
if command -v python3 >/dev/null 2>&1; then
exec python3 "$script_dir/dingtalk_notify.py" progress "$@"
fi
event_name=$1
shift
summary=$*
case "$event_name" in
start|milestone|blocked|complete|failed) ;;
*)
usage
exit 2
;;
esac
if [ ! -f "$config_file" ]; then
echo "DingTalk progress reporting is not configured; skipping." >&2
exit 0
fi
file_mode=$(stat -f '%Lp' "$config_file" 2>/dev/null || stat -c '%a' "$config_file" 2>/dev/null || true)
case "$file_mode" in
400|600) ;;
*)
echo "Refusing to read $config_file because its mode is ${file_mode:-unknown}; run chmod 600 on it." >&2
exit 2
;;
esac
while IFS= read -r line || [ -n "$line" ]; do
case "$line" in
''|'#'*) continue ;;
esac
key=${line%%=*}
value=${line#*=}
case "$key" in
DINGTALK_PROGRESS_ENABLED|DINGTALK_PROGRESS_DRY_RUN|DINGTALK_PROGRESS_MODE|DINGTALK_PROGRESS_CLIENT_ID|DINGTALK_PROGRESS_TARGET|DINGTALK_PROGRESS_ROBOT_CODE|DINGTALK_PROGRESS_KEYCHAIN_SERVICE|DINGTALK_PROGRESS_PROJECT|DINGTALK_PROGRESS_TITLE_PREFIX)
export "$key=$value"
;;
*)
echo "Unknown key in $config_file: $key" >&2
exit 2
;;
esac
done < "$config_file"
if [ "${DINGTALK_PROGRESS_ENABLED:-0}" != "1" ]; then
echo "DingTalk progress reporting is disabled; skipping." >&2
exit 0
fi
if [ "${DINGTALK_PROGRESS_MODE:-app-bot}" != "app-bot" ]; then
echo "DINGTALK_PROGRESS_MODE must be app-bot." >&2
exit 2
fi
if [ -z "${DINGTALK_PROGRESS_CLIENT_ID:-}" ] ||
[ -z "${DINGTALK_PROGRESS_TARGET:-}" ] ||
[ -z "${DINGTALK_PROGRESS_ROBOT_CODE:-}" ]; then
echo "App-bot mode requires DINGTALK_PROGRESS_CLIENT_ID, DINGTALK_PROGRESS_TARGET, and DINGTALK_PROGRESS_ROBOT_CODE." >&2
exit 2
fi
if ! command -v jq >/dev/null 2>&1; then
echo "jq is required to construct and validate the DingTalk OpenAPI request." >&2
exit 127
fi
if ! command -v dws >/dev/null 2>&1; then
echo "Global dws command was not found in PATH." >&2
exit 127
fi
dws=$(command -v dws)
if [ -n "${DING_SEC:-}" ]; then
client_secret=$DING_SEC
else
if [ ! -x /usr/bin/security ]; then
echo "DING_SEC is unset and macOS Keychain command /usr/bin/security is unavailable." >&2
exit 127
fi
keychain_service=${DINGTALK_PROGRESS_KEYCHAIN_SERVICE:-com.eapil.dingtalk.$(basename -- "$project_root")}
if ! client_secret=$(/usr/bin/security find-generic-password \
-a "$DINGTALK_PROGRESS_CLIENT_ID" \
-s "$keychain_service" \
-w 2>/dev/null); then
echo "DingTalk Client Secret was not found in DING_SEC or this project's macOS Keychain item." >&2
echo "See .dingtalk/README.md for credential setup." >&2
exit 2
fi
fi
if [ -z "$client_secret" ]; then
echo "The DingTalk Client Secret is empty." >&2
exit 2
fi
case "$event_name" in
start) event_label="开始推进" ;;
milestone) event_label="阶段里程碑" ;;
blocked) event_label="遇到阻塞" ;;
complete) event_label="本轮完成" ;;
failed) event_label="执行失败" ;;
esac
project_name=${DINGTALK_PROGRESS_PROJECT:-$(basename -- "$project_root")}
title_prefix=${DINGTALK_PROGRESS_TITLE_PREFIX:-[项目进度]}
title="$title_prefix $event_label"
timestamp=$(date '+%Y-%m-%d %H:%M:%S %Z')
body=$(printf '## %s\n\n**项目:** %s \n**状态:** %s \n**更新时间:** %s\n\n---\n\n%s' \
"$title" "$project_name" "$event_label" "$timestamp" "$summary")
msg_param=$(jq -cn --arg title "$title" --arg text "$body" '{title:$title,text:$text}')
request_body=$(jq -cn \
--arg msgParam "$msg_param" \
--arg openConversationId "$DINGTALK_PROGRESS_TARGET" \
--arg robotCode "$DINGTALK_PROGRESS_ROBOT_CODE" \
'{msgParam:$msgParam,msgKey:"sampleMarkdown",openConversationId:$openConversationId,robotCode:$robotCode}')
if [ "${DINGTALK_PROGRESS_DRY_RUN:-0}" = "1" ]; then
if DWS_CLIENT_ID="$DINGTALK_PROGRESS_CLIENT_ID" \
DWS_CLIENT_SECRET="$client_secret" \
"$dws" api POST /v1.0/robot/groupMessages/send \
--data "$request_body" --dry-run --yes --format json; then
send_status=0
else
send_status=$?
fi
unset client_secret DWS_CLIENT_SECRET
exit "$send_status"
fi
max_send_attempts=3
retry_delay_seconds=10
attempt=1
final_status=1
while [ "$attempt" -le "$max_send_attempts" ]; do
response=
if response=$(DWS_CLIENT_ID="$DINGTALK_PROGRESS_CLIENT_ID" \
DWS_CLIENT_SECRET="$client_secret" \
"$dws" api POST /v1.0/robot/groupMessages/send \
--data "$request_body" --yes --format json); then
send_status=0
else
send_status=$?
fi
if [ -n "$response" ]; then
printf '%s\n' "$response"
fi
if [ "$send_status" -eq 0 ] &&
printf '%s\n' "$response" |
jq -e '.processQueryKey | type == "string" and length > 0' >/dev/null 2>&1; then
unset client_secret DWS_CLIENT_SECRET
exit 0
fi
if [ "$send_status" -eq 0 ]; then
echo "DingTalk attempt $attempt returned no valid processQueryKey; service acceptance is unverified." >&2
final_status=1
else
echo "DingTalk attempt $attempt failed with status $send_status." >&2
final_status=$send_status
fi
if [ "$attempt" -lt "$max_send_attempts" ]; then
echo "Retrying DingTalk send in $retry_delay_seconds seconds." >&2
sleep "$retry_delay_seconds"
fi
attempt=$((attempt + 1))
done
unset client_secret DWS_CLIENT_SECRET
echo "DingTalk progress reporting failed after $max_send_attempts attempts; Etunel work should continue." >&2
exit "$final_status"
exec python "$script_dir/dingtalk_notify.py" progress "$@"
+3
View File
@@ -0,0 +1,3 @@
# PowerShell 7.3+; shared launcher preserves Chinese, Markdown and exit status.
& "$PSScriptRoot/dingtalk-python.ps1" progress @args
exit $LASTEXITCODE
+50
View File
@@ -0,0 +1,50 @@
# Shared Windows launcher. Also supports: ./scripts/dingtalk-python.ps1 check --at '姓名'
$ErrorActionPreference = 'Stop'
if ($PSVersionTable.PSVersion -lt [version]'7.3') { throw '请使用 PowerShell 7.3+ 或独立 Python 入口。' }
$PSNativeCommandArgumentPassing = 'Standard'
function Resolve-NoticePython {
$candidates = @()
if ($env:DINGTALK_PYTHON) {
# An explicit choice must work; never silently substitute another runtime.
$candidates = @($env:DINGTALK_PYTHON)
} else {
if ($env:USERPROFILE) {
$bundled = Join-Path $env:USERPROFILE '.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe'
if (Test-Path -LiteralPath $bundled -PathType Leaf) { $candidates += $bundled }
}
$candidates += @(Get-Command python, python3 -All -CommandType Application -ErrorAction SilentlyContinue |
Select-Object -ExpandProperty Source)
# py is probed, not trusted: it can also resolve to Store Python.
$candidates += @(Get-Command py -All -CommandType Application -ErrorAction SilentlyContinue |
Select-Object -ExpandProperty Source)
}
foreach ($candidate in ($candidates | Select-Object -Unique)) {
if ($candidate -match '(?i)[\\/]WindowsApps[\\/]|PythonSoftwareFoundation\.Python\.') { continue }
$prefix = if ([IO.Path]::GetFileName($candidate) -eq 'py.exe') { @('-3') } else { @() }
try {
$probe = & $candidate @prefix -I -c 'import json,sys; print(json.dumps({"exe":sys.executable,"supported":sys.version_info >= (3,9)}))' 2>$null
if ($LASTEXITCODE -ne 0) { continue }
$info = ($probe -join "`n") | ConvertFrom-Json
if ($info.supported -and $info.exe -and
$info.exe -notmatch '(?i)[\\/]WindowsApps[\\/]|PythonSoftwareFoundation\.Python\.' -and
(Test-Path -LiteralPath $info.exe -PathType Leaf)) { return $info.exe }
} catch { continue }
}
throw '未找到独立 Python 3.9+。请安装 python.org 版本或将 DINGTALK_PYTHON 设为独立 python.exe 的路径;不使用商店版,也不自动安装。'
}
$pythonExe = Resolve-NoticePython
$previousArgs = [Environment]::GetEnvironmentVariable('DINGTALK_PROGRESS_ARGV_B64', 'Process')
$previousEncoding = [Environment]::GetEnvironmentVariable('PYTHONIOENCODING', 'Process')
try {
$encodedArgs = ConvertTo-Json -InputObject @($args) -Compress
$env:DINGTALK_PROGRESS_ARGV_B64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($encodedArgs))
$env:PYTHONIOENCODING = 'utf-8'
& $pythonExe "$PSScriptRoot/dingtalk_notify.py"
$exitCode = $LASTEXITCODE
} finally {
[Environment]::SetEnvironmentVariable('DINGTALK_PROGRESS_ARGV_B64', $previousArgs, 'Process')
[Environment]::SetEnvironmentVariable('PYTHONIOENCODING', $previousEncoding, 'Process')
}
exit $exitCode
+277
View File
@@ -0,0 +1,277 @@
#!/usr/bin/env python3
"""Hub notifications via a confirmed personal DWS account. Python 3.9+, stdlib."""
import argparse
import base64
import datetime as dt
import json
import os
from pathlib import Path
import re
import shutil
import subprocess
import sys
import tempfile
import time
ROOT = Path(__file__).resolve().parent.parent
PREFIX = 'DINGTALK_PROGRESS_'
KEYS = {'ENABLED', 'PROFILE', 'TARGET', 'PROJECT'}
EVENTS = {'start': '开始推进', 'milestone': '阶段里程碑', 'blocked': '遇到阻塞',
'complete': '本轮完成', 'failed': '执行失败'}
DNS_ERROR = re.compile(r'lookup [\w.-]+(?: on [^:\s]+(?::\d+)?)?: [^\n]*'
r'(?:i/o timeout|no such host|server misbehaving|temporary failure in name resolution)', re.I)
class NoticeError(Exception):
"""Safe diagnostics: never echo raw DWS errors or configuration."""
def emit(status, message, **extra):
print(json.dumps(dict(status=status, message=message, **extra), ensure_ascii=False))
def json_object(text):
try:
data = json.loads(text)
return data if isinstance(data, dict) else {}
except (ValueError, TypeError):
return {}
def read_config(root):
path = root / '.dingtalk' / 'config.env'
if not path.exists():
return {}
result = {}
for line in path.read_text(encoding='utf-8-sig').splitlines():
if not line.strip() or line.lstrip().startswith('#'):
continue
key, sep, value = line.partition('=')
key = key.strip()
if not sep or key not in {PREFIX + k for k in KEYS} or key in result:
raise NoticeError('通知配置不是当前个人账号格式,请由 Hub 确认账号和群后重新 init;不沿用机器人配置。')
result[key] = value.strip()
config = {k[len(PREFIX):]: v for k, v in result.items()}
if config.get('ENABLED', '0') not in ('0', '1'):
raise NoticeError('通知开关只能是 0 或 1。')
return config
def clean_env():
return {k: v for k, v in os.environ.items()
if k not in ('DING_SEC', 'DWS_CLIENT_ID', 'DWS_CLIENT_SECRET') and not k.startswith(PREFIX)}
def dws_path():
executable = sys.executable.replace('\\', '/').lower()
if sys.platform == 'win32' and ('/windowsapps/' in executable or 'pythonsoftwarefoundation.python.' in executable):
raise NoticeError('请使用项目 PowerShell 入口或独立 Python 3.9+;商店版 Python 可能无法识别 DWS 登录。')
path = shutil.which('dws')
if not path or (os.name == 'nt' and Path(path).suffix.lower() != '.exe'):
raise NoticeError('未找到原生 dws,请安装并加入当前 Hub 运行环境的 PATH。')
return path
def accepted_task(data):
if (data.get('ok') is not True or data.get('identity') != 'user'
or data.get('tool') != 'send_personal_message' or data.get('partial') or data.get('failures')):
return None
result = data.get('result')
if not isinstance(result, dict) or result.get('success') is not True or result.get('errorCode') not in (None, 0, ''):
return None
payload = result.get('result')
task = payload.get('openTaskId') if isinstance(payload, dict) else None
return task.strip() if isinstance(task, str) and task.strip() else None
def invoke(command, run=subprocess.run, sleep=time.sleep, sending=False):
for attempt in range(3):
try:
result = run(command, env=clean_env(), capture_output=True, text=True,
encoding='utf-8', errors='replace', timeout=60)
except subprocess.TimeoutExpired:
raise NoticeError('钉钉调用超时,结果未知,不自动重发;主任务继续。') from None
except OSError:
raise NoticeError('无法启动 DWS,请检查安装;本次停止。') from None
data = json_object(result.stdout)
if sending and accepted_task(data):
return data
if result.returncode == 0:
if sending:
raise NoticeError('未取得有效的个人发送回执,结果未知,不自动重发。')
if not data or data.get('success') is False or data.get('ok') is False:
raise NoticeError('DWS 查询未返回有效结果,本次停止。')
return data
error = json_object(result.stderr).get('error', {})
if isinstance(error, dict) and error.get('category') == 'auth':
raise NoticeError('个人 DWS 登录失效,请在 Hub 的运行账号下恢复登录;不换身份发送。')
if isinstance(error, dict) and error.get('retryable') is False:
raise NoticeError('DWS 拒绝本次调用,请检查权限或参数;不自动重试。')
if DNS_ERROR.search(result.stdout + '\n' + result.stderr):
if attempt < 2:
sleep(10)
continue
raise NoticeError('域名解析连续失败 3 次,通知停止,主任务继续。')
raise NoticeError('钉钉调用失败或结果未知;请检查登录、权限或网络,不自动重发。')
def check_login(cli, profile, run, sleep):
if not profile or ':' not in profile or any(c.isspace() for c in profile):
raise NoticeError('缺少已确认的发送账号,请先由 Hub 初始化通知。')
data = invoke([cli, 'auth', 'status', '--profile', profile, '--format', 'json'], run, sleep)
if data.get('authenticated') is not True or data.get('token_valid') is not True:
raise NoticeError('个人 DWS 未登录或授权已失效,请负责人完成登录;本次未发送。')
def mentions(names, cli, profile, run, sleep):
people = {}
names = list(dict.fromkeys(n.strip() for value in names for n in value.replace(',', ',').split(',')))
for name in names:
if not name:
raise NoticeError('提醒对象不能为空。')
data = invoke([cli, 'aisearch', 'person', '--query', name, '--dimension', 'name',
'--profile', profile, '--format', 'json'], run, sleep)
candidates = {}
for row in data.get('result', []):
if not isinstance(row, dict):
continue
meta = row.get('meta') if isinstance(row.get('meta'), dict) else {}
person = row.get('openDingTalkId')
if (meta.get('name') or row.get('title') or row.get('author')) == name and isinstance(person, str) and person.strip():
candidates[person] = name
if len(candidates) != 1:
raise NoticeError('提醒对象未唯一匹配,请确认完整姓名;不猜编号、不删掉 @ 后发送。')
people.update(candidates)
return people
def initialize(args, root, run, sleep):
if not args.yes:
raise NoticeError('先向负责人确认发送账号、项目群及自动通知,再使用 init --yes。')
values = {'ENABLED': '1', 'PROFILE': args.profile.strip(), 'TARGET': args.group.strip(), 'PROJECT': args.project.strip()}
if any(not v or '\n' in v or '\r' in v or '\0' in v for v in values.values()):
raise NoticeError('初始化内容不能为空或含换行。')
path = root / '.dingtalk' / 'config.env'
if path.is_symlink() or path.parent.is_symlink():
raise NoticeError('配置路径不能是符号链接。')
if path.exists() and not args.replace:
raise NoticeError('配置已存在;变更账号或群须重新确认后使用 --replace。')
cli = dws_path()
profiles = invoke([cli, 'profile', 'list', '--format', 'json'], run, sleep).get('profiles', [])
if len([p for p in profiles if isinstance(p, dict) and p.get('profile') == values['PROFILE']]) != 1:
raise NoticeError('初始化账号不在 DWS 实际账号列表中。')
check_login(cli, values['PROFILE'], run, sleep)
# Hub supplies a group ID from same-profile discovery after human confirmation.
path.parent.mkdir(parents=True, exist_ok=True)
content = '# Hub 经负责人确认后生成;仅个人 DWS,不保存登录凭据。\n' + ''.join(
f'{PREFIX}{k}={v}\n' for k, v in values.items())
descriptor, temporary = tempfile.mkstemp(prefix='.notify-', suffix='.tmp', dir=path.parent)
try:
with os.fdopen(descriptor, 'w', encoding='utf-8', newline='\n') as stream:
stream.write(content)
os.replace(temporary, path)
finally:
if os.path.exists(temporary):
os.unlink(temporary)
emit('initialized', '已保存负责人确认的个人账号和项目群,通知已启用;未发送测试消息。')
def parse_args(argv):
parser = argparse.ArgumentParser(description='Hub 个人 DWS 通知:初始化、进度、提醒、只读检查。')
commands = parser.add_subparsers(dest='command', required=True)
init = commands.add_parser('init', help='负责人确认后创建配置,不发送消息')
init.add_argument('--profile', required=True)
init.add_argument('--group', required=True)
init.add_argument('--project', required=True)
init.add_argument('--yes', action='store_true')
init.add_argument('--replace', action='store_true')
progress = commands.add_parser('progress')
progress.add_argument('event', choices=EVENTS)
progress.add_argument('summary', nargs='*')
progress.add_argument('--file')
message = commands.add_parser('message')
message.add_argument('--title', required=True)
body = message.add_mutually_exclusive_group(required=True)
body.add_argument('--text')
body.add_argument('--file')
check = commands.add_parser('check', help='检查固定账号登录及可选姓名,不发送')
for command in (progress, message, check):
command.add_argument('--at', action='append', default=[], help='完整姓名;可重复或用逗号分隔')
for command in (progress, message):
command.add_argument('--dry-run', action='store_true', help='完全离线,只预览中文正文')
return parser.parse_args(argv)
def render(args, config, root):
if args.command == 'progress' and bool(args.summary) == bool(args.file):
raise NoticeError('进度摘要和 --file 必须且只能提供一项。')
if args.file:
path = Path(args.file).resolve()
config_path = root / '.dingtalk' / 'config.env'
if path == config_path.resolve() or (path.exists() and config_path.exists() and path.samefile(config_path)):
raise NoticeError('不能把配置文件当作消息正文。')
text = path.read_text(encoding='utf-8')
else:
text = ' '.join(args.summary) if args.command == 'progress' else args.text
if not text.strip() or len(text.encode('utf-8')) > 12000:
raise NoticeError('请提供不超过 12000 字节的简短中文摘要。')
title = EVENTS[args.event] if args.command == 'progress' else args.title.strip()
if not title or len(title) > 200 or '\n' in title or '\r' in title:
raise NoticeError('请使用不超过 200 字的单行标题。')
project = config.get('PROJECT') or root.name
timestamp = dt.datetime.now().astimezone().strftime('%Y-%m-%d %H:%M %z')
return f'## {project}|{title}\n\n项目进度自动汇报 · {timestamp}\n\n{text}'
def main(argv=None, root=ROOT, run=subprocess.run, sleep=time.sleep):
try:
encoded = os.environ.pop(PREFIX + 'ARGV_B64', '')
if argv is None and encoded:
argv = json.loads(base64.b64decode(encoded, validate=True).decode('utf-8'))
if not isinstance(argv, list) or not all(isinstance(v, str) for v in argv):
raise NoticeError('PowerShell 参数无效。')
args = parse_args(argv)
if args.command == 'init':
initialize(args, root, run, sleep)
return 0
config = read_config(root)
if args.command != 'check' and args.dry_run:
emit('preview', '仅离线预览,账号、群与 @ 效果未验证。', text=render(args, config, root), mentions=args.at)
return 0
if args.command != 'check' and config.get('ENABLED') != '1':
emit('skipped', '通知尚未初始化或未启用;本次未发送,主任务继续。')
return 0
if not config.get('PROFILE') or not config.get('TARGET'):
raise NoticeError('请由 Hub 先确认个人账号和项目群并执行 init。')
text = render(args, config, root) if args.command != 'check' else None
cli = dws_path()
profile = config['PROFILE']
if args.command == 'check':
check_login(cli, profile, run, sleep)
people = mentions(args.at, cli, profile, run, sleep)
if args.command == 'check':
emit('checked', '登录及所请求的姓名查询通过;未发送,未验证实际提醒效果。', names=list(people.values()))
return 0
if people:
text += '\n\n' + ' '.join(f'<@{person}>' for person in people)
command = [cli, 'chat', '+messages-send', '--as', 'user', '--group', config['TARGET'],
'--markdown', text, '--profile', profile, '--yes', '--format', 'json']
if people:
command += ['--at-open-dingtalk-ids', ','.join(people)]
data = invoke(command, run, sleep, sending=True)
emit('accepted', '个人 DWS 已接受发送请求,不代表已投递、已读或已触发接收端提醒。',
openTaskId=accepted_task(data), mentions=list(people.values()))
return 0
except NoticeError as error:
emit('error', str(error))
return 1
except (OSError, ValueError, UnicodeError, TypeError, subprocess.SubprocessError):
emit('error', '配置、正文或调用结果异常;本次停止,不自动重发,主任务继续。')
return 1
if __name__ == '__main__':
for stream in (sys.stdout, sys.stderr):
if hasattr(stream, 'reconfigure'):
stream.reconfigure(encoding='utf-8')
sys.exit(main())
+315
View File
@@ -0,0 +1,315 @@
"""Offline regression tests. All DWS calls use isolated fake responses."""
import base64
import contextlib
import io
import json
import os
from pathlib import Path
import shutil
import subprocess
import sys
import tempfile
import unittest
from unittest.mock import patch
import dingtalk_notify as n
PROFILE = 'fake-corp:fake-user'
GROUP = 'fake-group'
PERSON = 'fake-person'
OK = {'ok': True, 'identity': 'user', 'tool': 'send_personal_message',
'result': {'success': True, 'errorCode': None, 'result': {'openTaskId': 'fake-task'}}}
def reply(data=None, code=0, error=''):
return subprocess.CompletedProcess([], code, json.dumps(data or {}, ensure_ascii=False), error)
class NotifyTests(unittest.TestCase):
def setUp(self):
self.temp = tempfile.TemporaryDirectory()
self.addCleanup(self.temp.cleanup)
self.root = Path(self.temp.name)
self.path = self.root / '.dingtalk' / 'config.env'
self.path.parent.mkdir()
self.config()
self.calls = []
self.sleeps = []
self.addCleanup(patch.stopall)
patch.object(n, 'dws_path', return_value='fake-dws').start()
def config(self, **changes):
config = {'ENABLED': '1', 'PROFILE': PROFILE, 'TARGET': GROUP, 'PROJECT': '测试项目'}
config.update(changes)
self.path.write_text(''.join(n.PREFIX + k + '=' + v + '\n' for k, v in config.items()), encoding='utf-8')
def fake(self, command, **kwargs):
self.calls.append((command, kwargs))
if command[1:3] == ['profile', 'list']:
return reply({'profiles': [{'profile': PROFILE, 'userName': '测试人'}]})
if command[1:3] == ['auth', 'status']:
return reply({'authenticated': True, 'token_valid': True})
if command[1:3] == ['aisearch', 'person']:
return reply({'result': [{'openDingTalkId': PERSON, 'meta': {'name': command[command.index('--query') + 1]}}]})
self.assertEqual(command[1:3], ['chat', '+messages-send'])
return reply(OK)
def execute(self, args, run=None):
out = io.StringIO()
with contextlib.redirect_stdout(out):
code = n.main(args, root=self.root, run=run or self.fake, sleep=self.sleeps.append)
return code, json.loads(out.getvalue())
def test_each_event_personal_markdown(self):
for event, label in n.EVENTS.items():
code, result = self.execute(['progress', event, '**进展**\n\n- 已归档'])
self.assertEqual(code, 0)
self.assertEqual(result['status'], 'accepted')
cmd = self.calls[-1][0]
self.assertEqual(cmd[cmd.index('--as') + 1], 'user')
self.assertEqual(cmd[cmd.index('--group') + 1], GROUP)
self.assertEqual(cmd[cmd.index('--profile') + 1], PROFILE)
body = cmd[cmd.index('--markdown') + 1]
self.assertIn(label, body)
self.assertIn('项目进度自动汇报', body)
self.assertIn('**进展**\n\n- 已归档', body)
self.assertNotIn('--ai-tag=false', cmd)
self.assertNotIn('--robot-code', cmd)
def test_message_mentions_exact_name_fixed_profile(self):
code, data = self.execute(['message', '--title', '提醒', '--text', '请补充资料', '--at', '测试人,测试人'])
self.assertEqual(code, 0)
self.assertEqual(len(self.calls), 2)
for cmd, _ in self.calls:
self.assertEqual(cmd[cmd.index('--profile') + 1], PROFILE)
cmd = self.calls[-1][0]
self.assertEqual(cmd[cmd.index('--at-open-dingtalk-ids') + 1], PERSON)
self.assertIn('<@fake-person>', cmd[cmd.index('--markdown') + 1])
self.assertEqual(data['mentions'], ['测试人'])
self.assertEqual(data['openTaskId'], 'fake-task')
def test_progress_can_include_mention_once(self):
code, _ = self.execute(['progress', 'blocked', '缺输入', '--at', '测试人'])
self.assertEqual(code, 0)
self.assertEqual(sum(c[0][1:3] == ['chat', '+messages-send'] for c in self.calls), 1)
def test_lookup_ambiguity_no_match_and_malformed_never_send(self):
for rows in [[], [{'openDingTalkId': 'a', 'meta': {'name': '甲'}},
{'openDingTalkId': 'b', 'meta': {'name': '甲'}}],
[{'userId': 'wrong-id-kind', 'meta': {'name': '甲'}}], None]:
self.calls.clear()
def lookup(command, **kwargs):
self.calls.append(command)
return reply({'result': rows})
code, data = self.execute(['message', '--title', '提醒', '--text', '正文', '--at', '甲'], lookup)
self.assertEqual(code, 1)
self.assertEqual(data['status'], 'error')
self.assertEqual(len(self.calls), 1)
def test_check_is_read_only(self):
code, data = self.execute(['check', '--at', '测试人'])
self.assertEqual(code, 0)
self.assertEqual(data['status'], 'checked')
self.assertEqual(len(self.calls), 2)
self.assertNotIn('fake-person', json.dumps(data))
def test_check_bad_login_stops(self):
code, _ = self.execute(['check'], lambda *a, **kw: reply({'authenticated': False, 'token_valid': False}))
self.assertEqual(code, 1)
def test_disabled_and_missing_config_no_tools(self):
self.config(ENABLED='0')
self.assertEqual(self.execute(['progress', 'start', '开始'])[1]['status'], 'skipped')
self.path.unlink()
self.assertEqual(self.execute(['progress', 'start', '开始'])[1]['status'], 'skipped')
self.assertFalse(self.calls)
def test_preview_without_config_or_dws(self):
self.path.unlink()
code, result = self.execute(['progress', 'blocked', '说明', '--at', '甲', '--dry-run'])
self.assertEqual(code, 0)
self.assertEqual(result['status'], 'preview')
self.assertFalse(self.calls)
def test_legacy_and_invalid_config_fail_without_echo(self):
for suffix in ['CLIENT_SECRET=fake-secret', 'MODE=app-bot', 'ENABLED=1', 'UNKNOWN=x']:
self.config()
with self.path.open('a', encoding='utf-8') as f:
f.write(n.PREFIX + suffix + '\n')
code, data = self.execute(['progress', 'start', '开始'])
self.assertEqual(code, 1)
self.assertNotIn('fake-secret', json.dumps(data))
self.assertFalse(self.calls)
def test_config_bom_crlf_and_literal_values(self):
raw = self.path.read_text(encoding='utf-8').replace('测试项目', '中文 "引号" $()')
self.path.write_bytes(b'\xef\xbb\xbf' + raw.replace('\n', '\r\n').encode())
code, data = self.execute(['progress', 'start', '开始', '--dry-run'])
self.assertEqual(code, 0)
self.assertIn('中文 "引号" $()', data['text'])
def test_files_and_invalid_bodies(self):
body = self.root / '正文.md'
body.write_text('**进展**\n\n- 中文 "引号" $()', encoding='utf-8')
for args in [['progress', 'milestone'], ['message', '--title', '说明']]:
self.assertEqual(self.execute(args + ['--file', str(body)])[0], 0)
before = len(self.calls)
for args in [['progress', 'start', ''], ['progress', 'start', 'x' * 12001],
['progress', 'start', '正文', '--file', str(body)],
['message', '--title', '坏\n标题', '--text', '内容'],
['progress', 'start', '--file', str(self.path), '--dry-run']]:
self.assertEqual(self.execute(args)[0], 1)
self.assertEqual(len(self.calls), before)
def test_dns_three_attempts_only(self):
calls = []
def failed(*a, **kw):
calls.append(a)
return reply(code=1, error='lookup api.dingtalk.com: no such host')
code, _ = self.execute(['progress', 'start', '开始'], failed)
self.assertEqual(code, 1)
self.assertEqual(len(calls), 3)
self.assertEqual(self.sleeps, [10, 10])
def test_dns_then_success(self):
responses = iter([reply(code=1, error='lookup api.dingtalk.com: no such host'), reply(OK)])
self.assertEqual(self.execute(['progress', 'start', '开始'], lambda *a, **kw: next(responses))[0], 0)
self.assertEqual(self.sleeps, [10])
def test_failure_and_unknown_never_retry(self):
cases = [reply(code=1, error='fake-secret connection reset'),
reply(code=1, error=json.dumps({'error': {'category': 'auth', 'message': 'fake-secret'}})),
reply(code=1, error=json.dumps({'error': {'retryable': False, 'message': 'lookup api.dingtalk.com: no such host'}})),
reply({'success': True}), reply({'ok': False}), reply(OK | {'partial': True})]
for result in cases:
count = []
def failed(*a, **kw):
count.append(1)
return result
code, data = self.execute(['progress', 'start', '开始'], failed)
self.assertEqual(code, 1)
self.assertEqual(len(count), 1)
self.assertNotIn('fake-secret', json.dumps(data))
self.assertFalse(self.sleeps)
def test_receipt_wins_nonzero_exit(self):
self.assertEqual(self.execute(['progress', 'start', '开始'], lambda *a, **kw: reply(OK, code=1))[0], 0)
def test_wrong_receipts_rejected(self):
for bad in [OK | {'identity': 'bot'}, OK | {'tool': 'other'}, OK | {'failures': [1]},
OK | {'result': {'success': False, 'result': {'openTaskId': 'x'}}},
OK | {'result': {'success': True, 'result': {'openTaskId': ''}}}]:
self.assertIsNone(n.accepted_task(bad))
def test_timeout_and_launch_error_no_retry(self):
for error in [subprocess.TimeoutExpired('fake', 60), OSError('fake-secret')]:
calls = []
def fail(*a, **kw):
calls.append(1)
raise error
code, _ = self.execute(['progress', 'start', '开始'], fail)
self.assertEqual(code, 1)
self.assertEqual(len(calls), 1)
def test_no_app_credentials_in_child_environment(self):
with patch.dict(os.environ, {'DWS_CLIENT_SECRET': 'fake-secret', 'DWS_CLIENT_ID': 'fake-app', 'DING_SEC': 'fake-key'}):
self.execute(['progress', 'start', '开始'])
env = self.calls[-1][1]['env']
self.assertNotIn('DWS_CLIENT_SECRET', env)
self.assertNotIn('DWS_CLIENT_ID', env)
self.assertNotIn('DING_SEC', env)
self.assertEqual(self.calls[-1][1]['timeout'], 60)
def init_args(self):
return ['init', '--profile', PROFILE, '--group', GROUP, '--project', '项目甲']
def test_init_requires_confirmation_and_explicit_replace(self):
original = self.path.read_bytes()
self.assertEqual(self.execute(self.init_args())[0], 1)
self.assertEqual(self.execute(self.init_args() + ['--yes'])[0], 1)
self.assertEqual(self.path.read_bytes(), original)
self.assertFalse(self.calls)
def test_init_creates_minimal_config_no_send(self):
self.path.unlink()
code, data = self.execute(self.init_args() + ['--yes'])
self.assertEqual(code, 0)
self.assertEqual(data['status'], 'initialized')
self.assertEqual(set(n.read_config(self.root)), n.KEYS)
self.assertNotIn(b'\r', self.path.read_bytes())
self.assertEqual(len(self.calls), 2)
if os.name != 'nt':
self.assertEqual(self.path.stat().st_mode & 0o777, 0o600)
def test_init_replaces_legacy_without_retaining_secret(self):
self.path.write_text('DINGTALK_PROGRESS_CLIENT_SECRET=fake-secret\n', encoding='utf-8')
code, data = self.execute(self.init_args() + ['--yes', '--replace'])
self.assertEqual(code, 0)
self.assertNotIn('fake-secret', self.path.read_text())
self.assertNotIn('fake-secret', json.dumps(data))
self.assertEqual(len(list(self.path.parent.iterdir())), 1)
def test_init_bad_profile_and_line_injection_leave_config(self):
before = self.path.read_bytes()
for args in [self.init_args() + ['--profile', 'other:user'],
self.init_args() + ['--project', 'x\nBAD=1']]:
self.assertEqual(self.execute(args + ['--yes', '--replace'])[0], 1)
self.assertEqual(self.path.read_bytes(), before)
def test_init_failed_auth_leaves_old_config(self):
before = self.path.read_bytes()
def fake(command, **kw):
if command[1] == 'auth':
return reply({'authenticated': False})
return self.fake(command, **kw)
self.assertEqual(self.execute(self.init_args() + ['--yes', '--replace'], fake)[0], 1)
self.assertEqual(self.path.read_bytes(), before)
def test_encoded_powershell_arguments(self):
args = ['message', '--title', '中文 "标题"', '--text', '**进展**\n\n- 引号 "$()"', '--dry-run']
with patch.dict(os.environ, {n.PREFIX + 'ARGV_B64': base64.b64encode(json.dumps(args).encode()).decode()}):
code, data = self.execute(None)
self.assertEqual(code, 0)
self.assertIn('中文 "标题"', data['text'])
self.assertIn('**进展**\n\n- 引号 "$()"', data['text'])
def test_bad_encoded_arguments(self):
for value in ['!!!', base64.b64encode(b'{}').decode()]:
with patch.dict(os.environ, {n.PREFIX + 'ARGV_B64': value}):
self.assertEqual(self.execute(None)[0], 1)
self.assertFalse(self.calls)
def test_hardlinked_config_cannot_be_message_body(self):
other = self.root / 'not-a-summary.md'
os.link(self.path, other)
self.assertEqual(self.execute(['progress', 'start', '--file', str(other), '--dry-run'])[0], 1)
def test_real_powershell_launcher_in_isolated_project(self):
pwsh = shutil.which('pwsh')
if not pwsh or 'windowsapps' in sys.executable.lower():
self.skipTest('需要 PowerShell 和独立 Python,不能用商店版作启动器验收')
folder = self.root / 'scripts'
folder.mkdir()
source = Path(n.__file__).parent
for name in ['dingtalk_notify.py', 'dingtalk-python.ps1', 'dingtalk-progress.ps1', 'dingtalk-message.ps1']:
shutil.copyfile(source / name, folder / name)
env = n.clean_env()
env['DINGTALK_PYTHON'] = sys.executable
text = '**中文**\n\n- "引号" $() `原样`'
for script, args in [('dingtalk-progress.ps1', ['milestone', text]),
('dingtalk-message.ps1', ['--title', '中文 "标题"', '--text', text])]:
result = subprocess.run([pwsh, '-NoProfile', '-File', str(folder / script), *args, '--dry-run'],
cwd=self.root, env=env, capture_output=True, encoding='utf-8', timeout=30)
self.assertEqual(result.returncode, 0, result.stderr)
data = json.loads(result.stdout)
self.assertEqual(data['status'], 'preview')
self.assertIn(text, data['text'])
result = subprocess.run([pwsh, '-NoProfile', '-File', str(folder / 'dingtalk-python.ps1'), 'init',
'--profile', PROFILE, '--group', GROUP, '--project', '甲'],
cwd=self.root, env=env, capture_output=True, encoding='utf-8', timeout=30)
self.assertEqual(result.returncode, 1)
self.assertIn('先向负责人确认', result.stdout)
if __name__ == '__main__':
unittest.main()