2026-07-20 22:05:55 +08:00
|
|
|
|
# 执行进度记录
|
|
|
|
|
|
|
|
|
|
|
|
> 本文件只追加记录任务执行、验证、阻塞和关键决策。当前目录、当前命令和下一任务以 [docs/current-state.md](docs/current-state.md) 为准。
|
|
|
|
|
|
|
|
|
|
|
|
## 记录格式
|
|
|
|
|
|
|
|
|
|
|
|
```markdown
|
|
|
|
|
|
## 【YYYY-MM-DD】T-【编号】 【任务名】
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:【DONE / BLOCKED / PARTIAL】
|
|
|
|
|
|
- 变更:【文件或模块】
|
|
|
|
|
|
- 验证:【真实命令和结果】
|
|
|
|
|
|
- 阻塞:【原因与决策人】
|
|
|
|
|
|
- 决策:【本轮确定的取舍】
|
|
|
|
|
|
- 下一步:【任务 ID 或待确认事项】
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 执行记录
|
|
|
|
|
|
|
|
|
|
|
|
## 【2026-07-20】T-000 建立 Harness Coding 文档基线
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DONE
|
|
|
|
|
|
- 变更:创建仓库级 agent 入口、V1/V2 需求、技术栈、架构、任务看板、模块合约、当前状态和实施计划文档。
|
|
|
|
|
|
- 验证:`./init.ps1` 已通过:Python 3.8.10 可导入 OpenCV、NumPy、Ultralytics 8.3.205 与 PyQt5,且 `python -m compileall -q demo` 退出码 0;`demo/best.pt` 被识别为 `pose`、`kpt_shape=[17, 3]`、类别 `person`;20 个 Markdown 文档的本地链接均可解析,实施计划没有占位标记。全局 `pip check` 的其他项目冲突不作为本项目验收;`init.ps1` 检查实际依赖并对非零退出码失败。
|
|
|
|
|
|
- 阻塞:无代码 blocker;V1 依赖清单、RTSP 实流录像和现场验收录像尚未创建。
|
|
|
|
|
|
- 决策:`demo/` 作为旧基线保留;V1 使用 Python + PyQt5 + OpenCV + Ultralytics;V2 使用 Go,且必须以 V1 的录像回归集和 ONNX 一致性测试为迁移门槛。
|
|
|
|
|
|
- 下一步:T-101。
|
2026-07-20 22:24:38 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-20】DESIGN UI/UX 客户演示原型规格
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:PARTIAL
|
|
|
|
|
|
- 变更:创建 `docs/ui/silver-pose-ui-ux-spec.md`,定义离线 HTML 原型的正常监控、确认摔倒、连接异常状态、布局、视觉令牌、键盘操作和无障碍验收条件。
|
|
|
|
|
|
- 验证:`./init.ps1` 通过;规格共 98 行,未发现 `TBD`、`TODO` 或 `REPLACE` 占位符,`git diff --check` 通过。
|
|
|
|
|
|
- 阻塞:等待用户审阅已提交的规格;未生成 HTML,未变更 `demo/`、`v1/` 或任务看板状态。
|
|
|
|
|
|
- 决策:原型为单页、无网络依赖的视觉与交互演示,使用虚构摄像头和事件数据,不表现为真实 RTSP 或模型推理。
|
|
|
|
|
|
- 下一步:用户确认规格后,创建 `docs/ui/silver-pose-v1-prototype.html` 并执行离线交互验收。
|
2026-07-20 22:39:52 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-20】DESIGN 离线 HTML UI/UX 原型
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DONE
|
|
|
|
|
|
- 可视化验证:使用本机 Chrome 无界面模式实际渲染 1280 × 800、900 × 900、600 × 1000 三种窗口截图;宽屏与窄屏截图已人工检查,主操作可见,窄屏下右栏纵向重排,未见横向溢出。Chrome 对 file 页面返回非零退出码,但三张 PNG 均实际生成,故以文件与画面结果作为结论。
|
|
|
|
|
|
- 变更:创建 docs/ui/silver-pose-v1-prototype.html 和实施计划 docs/ui/2026-07-20-html-prototype-plan.md。原型可在单页中通过按钮或数字键 1、2、3 切换正常监控、确认摔倒和连接异常;包含 16:9 模拟姿态画面、红色确认状态、一次性演示弹窗、报警/截图证据、最近事件、窄窗口重排、键盘焦点和屏幕阅读器状态提示。
|
|
|
|
|
|
- 验证:Node.js 22 解析唯一内联脚本,并确认三种状态按钮、弹窗、确认按钮、aria-live 与 1007/640/600 epx 响应式断点存在,输出 prototype static validation passed;敏感与网络边界扫描未发现凭证、模型路径或网络行为标记;./init.ps1 通过。
|
|
|
|
|
|
- 阻塞:无。该文件是离线视觉原型,已做静态和无界面浏览器布局验证,但不表示实时 RTSP、模型推理、声音播放或截图保存已实现。
|
|
|
|
|
|
- 决策:原型采用单窗口深色控制台布局,以同一画面状态切换展示客户关心的“正常不报警、确认后完整报警闭环、断流不误报”三种结果。
|
|
|
|
|
|
- 下一步:T-101;HTML 原型可作为后续 T-201 PyQt 界面实现的视觉与交互参考。
|
2026-07-20 22:50:57 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-20】DESIGN 顶部 Tab 与设置原型修订
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DONE
|
|
|
|
|
|
- 变更:更新需求、页面导航、架构、T-201 验收、UI 规格和实施计划;将 HTML 原型改为顶部双 Tab。实时监控 Tab 保留姿态与报警演示;设置 Tab 显示来源环境变量就绪、模型只读信息、六项非敏感事件或重连参数、草稿版本与保存/重置操作。
|
|
|
|
|
|
- 验证:基线 ./init.ps1 通过;Node.js 22 解析唯一内联脚本,并检查 tablist、tab、tabpanel、设置表单、保存操作、运行配置版本、配置草稿控制器和三档响应式断点;敏感与网络边界扫描未发现凭证、模型路径或网络行为标记。Chrome 无界面模式实际渲染 1280 宽监控页、1280/900/600 宽设置页;宽屏与 600 宽截图已人工检查,未见横向溢出。
|
|
|
|
|
|
- 阻塞:无。设置页只模拟草稿编辑和保存反馈,不会写入本地配置,也不会热改监控中的运行配置。
|
|
|
|
|
|
- 决策:V1 固定采用顶部双 Tab,而非左侧导航;两个静态目的地不会挤压实时视频。设置草稿在下一次开始监控时才成为新的运行配置,事件工件继续追溯实际运行版本。
|
|
|
|
|
|
- 下一步:T-101;后续 T-201 按此交互和配置快照边界实现 PyQt 界面。
|
2026-07-20 22:57:37 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-20】DESIGN 浅色 Windows 主题规范
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DONE
|
|
|
|
|
|
- 变更:更新 UI 规格、页面规则、编码规则和原型实施计划。正式默认主题设为浅灰蓝页面背景与白色卡片;红色只表示确认摔倒事件、对应弹窗和事件证据。正常、疑似、连接异常、保存与校验改用绿色、琥珀色、灰蓝或标准主色,并保留文字和图标提示。
|
|
|
|
|
|
- 验证:./init.ps1 通过;已核对 UI 规格、页面规则和编码规则中的主题语义一致。
|
|
|
|
|
|
- 阻塞:按本轮用户范围未修改 HTML。现有 HTML 为深色历史原型,不能作为正式色彩实现来源,需在后续单独重绘。
|
|
|
|
|
|
- 决策:后续 PyQt T-201 与任何新的 HTML 原型必须以浅色 Windows 主题规范为准,不得将红色用于非确认摔倒场景。
|
|
|
|
|
|
- 下一步:等待用户授权,将 docs/ui/silver-pose-v1-prototype.html 重绘为浅色主题。
|
2026-07-20 23:06:54 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-20】DESIGN 浅色 Windows HTML 原型修订
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DONE
|
|
|
|
|
|
- 变更:新增 `docs/ui/silver-pose-v2-prototype.html` 作为独立离线原型。它使用浅灰蓝页面背景、白色卡片和集中 CSS 令牌;红色只用于确认摔倒、告警弹窗和事件证据。保留顶部双 Tab、正常/确认/断流三种状态、一次性告警弹窗、设置草稿及下一次启动生效边界;未改动历史深色 v1 原型。
|
|
|
|
|
|
- 验证:Node.js 22 已解析唯一内联脚本,并检查状态控件、Tab、弹窗、三个响应式断点及浅色主题令牌;隐私与网络边界扫描未发现凭证、模型路径或网络行为;`./init.ps1` 通过。Chrome 无界面模式实际渲染了正常、确认摔倒、连接异常、900 宽设置和 600 宽设置画面;确认摔倒显示红色弹窗,连接异常不显示红色告警,窄宽度为纵向重排。
|
|
|
|
|
|
- 阻塞:无。原型不连接真实摄像头、模型、声音或文件系统;截图路径和事件均为演示数据。
|
|
|
|
|
|
- 决策:文件名中的 v2 仅表示 HTML 视觉修订,不启动 Go V2,也不改变 V1 验收和 ONNX 一致性门槛。
|
|
|
|
|
|
- 下一步:T-101;后续 T-201 以 v2 HTML 和 UI/UX 规格实现 PyQt 浅色 Windows 界面。
|
2026-07-21 09:42:55 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-21】T-101 创建 V1 包、依赖清单、示例配置和忽略规则
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DOING
|
|
|
|
|
|
- 变更:任务已从 TODO 落为 DOING;尚未创建 V1 生产代码。
|
|
|
|
|
|
- 验证:`./init.ps1` 已通过。`python -m pytest v1/tests -v` 当前以 `v1/tests` 不存在退出,这是 T-101 建立 pytest 基线前的预期初始失败。
|
|
|
|
|
|
- 阻塞:无。
|
|
|
|
|
|
- 决策:`init.ps1` 保持无副作用的依赖检查与基线验证,不自动安装包;`requirements.txt` 将作为显式、可复现的安装清单。
|
|
|
|
|
|
- 下一步:先写配置加载与敏感值拒绝的失败测试,再实现最小配置接口。
|
2026-07-21 09:45:42 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-21】T-101 创建 V1 包、依赖清单、示例配置和忽略规则(完成)
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DONE
|
|
|
|
|
|
- 变更:新增 `v1` 包、经验证的 `config.py`、仅含环境变量名的公开配置示例、与当前环境一致的 `requirements.txt` 和两项 pytest 配置测试;新增 `.gitignore`,忽略本地配置、事件工件、私有录像和模型导出物。`init.ps1` 现在运行 V1 测试但不自动安装依赖。
|
|
|
|
|
|
- 验证:先运行 `python -m pytest v1/tests/test_config.py -v`,确认因缺少 `v1.config` 产生预期导入失败;实现后 `./init.ps1` 和 `python -m pytest v1/tests -v` 均通过(2 passed),`python -m compileall -q v1 demo` 通过。公开配置的地址/凭证扫描无匹配,`git check-ignore` 已确认本地配置、事件工件、`.pt` 与 `.onnx` 工件被忽略。
|
|
|
|
|
|
- 阻塞:无。
|
|
|
|
|
|
- 决策:配置只允许 `rtsp_url_env` 指向运行环境变量,拒绝内嵌来源地址;确认窗口限制为 1–3 秒。公开示例使用 64 位全零哈希占位,T-103 必须替换为受控模型真实哈希后才可加载模型。
|
|
|
|
|
|
- 下一步:T-102,先建立录像回放和错误来源的失败测试。
|
2026-07-21 09:46:18 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-21】T-102 实现可重连的视频源与录像回放适配器
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DOING
|
|
|
|
|
|
- 变更:任务已从 TODO 落为 DOING;尚未创建视频源生产代码。
|
|
|
|
|
|
- 验证:继承 T-101 的 `./init.ps1` 基线通过记录;本任务将先以可控假捕获器建立单元测试,再以本地演示录像作 smoke 验收。
|
|
|
|
|
|
- 阻塞:无。
|
|
|
|
|
|
- 决策:视频源只返回帧、单调时间戳和来源状态;读取失败、EOF 和重连绝不生成虚构人员或摔倒事件。
|
|
|
|
|
|
- 下一步:写入时间戳单调、错误来源和有界重连的失败测试。
|
2026-07-21 09:49:28 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-21】T-102 实现可重连的视频源与录像回放适配器(完成)
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DONE
|
|
|
|
|
|
- 变更:新增 `v1/video_source.py`,定义 `FramePacket` 与 `connected`、`retrying`、`error`、`eof`、`closed` 来源状态。录像优先读取容器时间戳,负首帧或倒退值回退到帧序号/FPS;可重连来源采用有界指数退避,所有非连接状态返回空帧且不携带事件信息。
|
|
|
|
|
|
- 验证:先运行 `python -m pytest v1/tests/test_video_source.py -v`,确认因缺少 `v1.video_source` 导入失败;实现后视频源测试 4 passed,完整 V1 测试在本轮最后一次运行时为 6 passed。`demo/1.mp4` 只读 smoke 成功读取首两帧,时间戳为 0.000000 与 0.033333 秒;`python -m compileall -q v1 demo` 通过。
|
|
|
|
|
|
- 阻塞:无。
|
|
|
|
|
|
- 决策:来源失败只表达来源状态,绝不以空帧、EOF 或重连触发人员更新或摔倒事件;本地录像测试使用临时生成的 AVI,避免将客户视频或样例录像作为 pytest 夹具。
|
|
|
|
|
|
- 下一步:T-103,先写模型来源和 17 点 Pose 输出的失败测试。
|
2026-07-21 09:49:44 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-21】T-103 实现 Pose 适配器与模型来源校验
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DOING
|
|
|
|
|
|
- 变更:任务已从 TODO 落为 DOING;尚未创建 Pose 生产代码。
|
|
|
|
|
|
- 验证:继承 T-102 的 `./init.ps1` 与 6 项 V1 测试通过记录;本任务将先用不依赖真实权重的假 YOLO 结果建立 17 点解析测试,再执行只读模型 smoke。
|
|
|
|
|
|
- 阻塞:无。
|
|
|
|
|
|
- 决策:构造适配器时必须校验模型 SHA-256、任务为 pose、类别为 person、关键点形状为 17×3;不把任何输出命名为摔倒概率。
|
|
|
|
|
|
- 下一步:写入模型来源错误与 person Pose 输出形状的失败测试。
|
2026-07-21 09:53:03 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-21】T-103 实现 Pose 适配器与模型来源校验(完成)
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DONE
|
|
|
|
|
|
- 变更:新增 `v1/pose.py`,以 SHA-256 锁定模型来源,要求任务为 pose、存在 person 类且关键点形状严格为 17×3;输出不含跟踪 ID 的 `PersonPose`(box、box 置信度、17 个三元关键点)。
|
|
|
|
|
|
- 验证:先运行 `python -m pytest v1/tests/test_pose.py -v`,确认因缺少 `v1.pose` 导入失败;实现后 Pose 测试 3 passed,完整 V1 测试在本轮最后一次运行时为 9 passed。对 `demo/best.pt` 的只读 smoke 使用实际 SHA-256 加载模型,并从 `demo/1.mp4` 首帧得到 2 名人员、每人 17 点;`python -m compileall -q v1 demo` 通过。
|
|
|
|
|
|
- 阻塞:无。
|
|
|
|
|
|
- 决策:模型输出绝不称为摔倒概率;人员 ID 由 T-104 在 Pose 输出之后分配,模型不匹配或结果形状损坏时必须显式报错而不是继续推理。
|
|
|
|
|
|
- 下一步:T-104,先写缺失下肢关键点拒绝和水平姿态只作为证据的失败测试。
|
2026-07-21 09:53:29 +08:00
|
|
|
|
|
|
|
|
|
|
## 【2026-07-21】T-104 实现人员跟踪与姿态质量门控
|
|
|
|
|
|
|
|
|
|
|
|
- 状态:DOING
|
|
|
|
|
|
- 变更:任务已从 TODO 落为 DOING;尚未创建跟踪或证据生产代码。
|
|
|
|
|
|
- 验证:继承 T-103 的 `./init.ps1`、9 项 V1 测试和真实模型 smoke 通过记录;本任务将先建立相邻帧 ID 稳定性、缺失下肢点拒绝和水平几何仅作为证据的失败测试。
|
|
|
|
|
|
- 阻塞:无。
|
|
|
|
|
|
- 决策:质量与证据模块只能返回质量/几何事实,不能返回报警或直接创建事件;空帧和低质量姿态不可推进倒地候选。
|
|
|
|
|
|
- 下一步:写入 T-104 的失败测试。
|