Skip to content

Latest commit

 

History

History
755 lines (670 loc) · 109 KB

code-map.md

File metadata and controls

755 lines (670 loc) · 109 KB

代码与验证入口地图

日期:2026-11-04

本文说明代码从哪里进入、运行时如何组织、证据由哪条测试产生,以及修改时应 同时更新哪些文档。当前能力结论只看 项目当前状态,未完成事项只看 项目 Backlog。完整文档分类和新鲜度规则见 文档导航。

二进制checkpoint与普通/托管旧程序保护入口为 run_binary_checkpoint_admission.py, 范围与兼容固件构建分层见证据。

FlashLight的EN边沿/虚拟定时器在0045-unit-flashlight-aw3641.patch;0046-unit-flashlight-route-lifecycle.patch从真实GPIO OUT_SEL提交撤销旧资格/计时来源,0046历史MMIO→内部状态正负回归在platform/tests/test_unit_flashlight_route_patch.py,创建期fixture门禁在unit_runtime.input_values、实际白灯反馈在unit-visual-mappings.js。严格base/CAS门禁在FirmwareStore._explicit_uiflow_base/create;包容量在ProgramPackageStore及serve.py --max-program-packages。对应分层证据包含固件loader诊断、失败attempt、八会话、默认mounted Web与独立完整矩阵。0047在GPIO控制器/RTC aux建立pad commit观察;run_flashlight_route_probe.py以四host UIFlow-live原厂constructor/API/Run替换验证cold low,test_flashlight_unit_web.mjs可回放actual QOM状态,见四host证据。动态S1/PWM/OEN/IOMUX、实时Web和物理光电/热仍独立。

单一事实源

问题 权威入口
一页了解代码阅读顺序、成熟度和下一步 工程交接总览
文档应从哪里读、哪些是历史页 文档导航与新鲜度规则
当前设备、样本、缺口、Task 和测试规模快照 自动项目快照
现在到底支持什么 devices/catalog.source.json、platform/peripherals/catalog.json、最新测试与 项目当前状态
还有什么没做 项目 Backlog
Device Service 如何调用 Device Service API 与 OpenAPI
外部 Agent 如何提交 Python、配置 Unit 和取证 UIFlow 源码到 Unit 会话
UIFlow2 双主机接口、SDK 候选修正与实际行为审计 tests/uiflow2/api_sweep/、patches/uiflow2-api/ 与 审计证据
单 lease 设备验收标准 统一设备运行时契约
固件如何规范化和拒绝 固件清单与 WebBurner 导入
已知模拟器运行时缺口和关闭条件 运行时模型缺口登记
网络如何隔离和取证 网络模拟方案、网络诊断 lane
Core2 如何进入 QEMU 内部 HCI relay Core2 native HCI backend
代码入口和证据目录 本文

旧的启动排障、渲染分析和计划文档保留为历史证据,不应覆盖上述当前状态。

代码目录

维护约束从根 AGENTS.md 开始,按改动区域继续阅读: Python 服务工具、浏览器与模型、 设备登记、运行时测试、 补丁及文档。这些指引保存稳定流程, 不承担另一份能力表或执行队列。

目录 职责 是否产品入口
platform/tools/ Device Service、固件导入/审查、网络策略、存储、QEMU profile 和目录生成 是
platform/tests/ 平台单元/契约测试与浏览器 upload/SHA256 Node 测试;test_docs_*_contract.py 分域防止文档和 API 漂移 是
platform/peripherals/ 芯片模型登记、运行时 coverage、设备/模型模板和完成门禁 是
platform/units/ 外接 Unit 官方芯片/协议、主机物理口接线和独立 runtime 状态 是
platform/qemu/ QEMU machine、runtime profile、资产和 blocker 注册表 是
patches/ 可重放的 QEMU/板级补丁源;总索引见 patches/README.md,精确顺序见各子目录 是
tests/ 测试分层、evidence 命名和 Agent 功能测试路由;入口见 tests/README.md 是
tests/uiflow2/ 外设、UI、统一运行时、Core2 无线和证据包 是
tests/network/ namespace、DNS、TLS、错误密码、worker continuity 和 Core2 网络夹具;总索引见 tests/network/README.md 是
tests/firmware/ FirmwareManifest、静态审查、文件系统、NVS、Core2 PSRAM/flash-IPC 探针和跨厂商运行时证据 是
devices/ 源设备清单、生成后的设备档案、固件来源和说明 是
platform/web/ 设备目录、Live session、WebBurner、输入和 3D 外壳 是
platform/runtime/wasm/ 固定版本的第三方 esp-emu 运行时资产 仅 Tab5/诊断后端
records/ 仓内历史调查快照;不代表当前状态 否,历史证据
.work/ 本地 QEMU、ROM、工具链、固件和缓存,不提交 否,运行时资产

代码和文档发生冲突时,优先级是:本次实测 evidence 与同 commit 生成物 > 源 catalog/profile/API 契约 > project-status.md > 专题说明 > 历史文档。

代码域

顶层工具按职责归为五组;同一组内部可以复用,跨组调用应通过明确的 JSON、 CLI、HTTP 或测试契约,而不是导入对方的内部实现细节。

代码域 模块 入口 / 输出
服务与生命周期 serve.py、device_service.py、device_service_runtime.py、device_service_specs.py、worker_registry.py、worker_directory.py、worker_queue.py、worker_auth.py、worker_discovery.py、worker_discovery_seed.py、transport_security.py、worker_agent.py、storage_policy.py /api/v1、session/evidence、运行时参数与脱敏 helper、设备规格/profile 解析、本地 worker lifecycle、远程注册目录、持久任务队列、worker HMAC、multicast/unicast discovery、HTTPS/mTLS、SIGHUP TLS/token rotation、executor、GC
固件输入与审查 fetch_firmware.py、firmware_manifest.py、firmware_analysis.py、firmware_filesystems.py、firmware_static_review.py、nvs_image.py、user_firmware_matrix.py、user_firmware_expectations.schema.json 公开固件下载、manifest、sdkconfig detected / image-signature observed capability、Secure Boot v2 结构/数学验证、包内 eFuse 摘要与 anti-rollback version 对照、静态/SBOM/文件系统、NVS/SD fixture、SHA-bound UI/headless/network-first 审查预期和批量运行
网络策略与取证 network_policy.py、network_egress.py、network_fabric.py、network_sandbox.py、network_lane.py、pcap_summary.py、qemu_network_preflight.py namespace、nftables、双 guest L2、DNS/CNAME/TLS、pcap 摘要
运行时与设备登记 qemu_profiles.py、peripheral_catalog.py、peripheral_inventory.py、runtime_coverage.py、runtime_interfaces.py、xtensa_elf_symbols.py machine/profile、外设契约、coverage、QOM/输入接口、ELF 符号
BLE/发布工具 ble_probe.py、hci_stream.py、generate_catalog.py、export_bundle.py 外部 peer、H4 分包、生成的设备目录和可移植资产包

platform/tools/*.py 是服务侧共享实现;tests/uiflow2/、tests/network/ 和 tests/firmware/ 是运行时/契约验证入口。若只改文档,不重启 platform/.cache/service;若改服务代码,按 部署与运行时资产 重启匹配进程。

平台工具完整清单

下表中的 platform/tools/*.py 都由文档测试检查,新增顶层工具时 platform/tests/test_docs_index_contract.py 会要求同步本页。

路径 职责 主要调用方
platform/tools/serve.py HTTP/静态页面入口和 /api/v1 路由 ./start.sh、浏览器、Agent
platform/tools/check_pr_scope.py 对新增Git对象检查源码PR体积与raw evidence预算,包含已删除历史对象 CI、源码PR收尾
platform/tools/device_service.py lease、会话、运行时、证据和生命周期主编排 serve.py、测试、固件矩阵
platform/tools/device_service_errors.py Device Service 的稳定 ServiceError code/message/status/extra 与 HTTP payload device_service.py 及 parser 模块
platform/tools/device_service_network.py 无状态 network policy 与 CNAME 请求解析,保持 Device Service 错误码和绑定语义 device_service.py 兼容 re-export、network tests
platform/tools/device_service_network_execution.py 无状态 esp-emu network execution 请求解析,保持 profile/port/ELF/I2C 契约 device_service.py 兼容 re-export、network-execution tests
platform/tools/device_service_qemu_wifi.py QEMU WiFi open/WPA2 解析与 runtime-env projection device_service.py 兼容 re-export、QEMU WiFi tests
platform/tools/device_service_execution_parsing.py 无状态 storage/NVS execution request 解析,保持 artifact、字段和 partition-label 契约 device_service.py 兼容 re-export、execution parser tests
platform/tools/device_service_parsing.py 无状态 integer/size/pcap/SHA256 解析与校验 device_service.py 请求入口
platform/tools/device_service_runtime.py 无状态 QEMU PSRAM 策略、runtime/firmware PSRAM mismatch 和私有 runtime env 脱敏 device_service.py 兼容 re-export、service tests
platform/tools/device_service_specs.py 设备 catalog/matrix/profile 解析、QEMU backend 路径和 runtime profile 选择 device_service.py 兼容 re-export、device-spec tests
platform/tools/guest_console.py QEMU UART socket 单写日志、双向有界传输、流控等待与断流报告 同 guest UIFlow2 程序接口
platform/tools/uiflow_runtime.py guest raw REPL/raw-paste 传输、编译执行及增量状态标记;不在 host 执行用户代码 Device Service program、协议测试
platform/tools/program_revisions.py 完整 Python 文件快照的不可变身份、完整性校验与有界存储 program 执行记录与 evidence
platform/tools/program_packages.py 完整源码、字节码依赖与资源的不可变文件包;规范路径、内容哈希和有界磁盘存储 files/revision_id program请求、公共checkpoint、包证据
platform/tools/preview_service.py 稳定Preview/同guest Run协调、串行UART、latest-wins、实际prompt取消与输入/帧身份门禁 authenticated Preview HTTP、宿主并发负控
platform/tools/preview_store.py SQLite WAL/FULL短事务ledger、幂等原收据、generation和不可复活状态转换、revision pins Preview协调器、retention
platform/tools/preview_retention.py ledger/managed磁盘历史/运行中引用扫描与删除代际门禁;未知分配及损坏元数据fail closed Device Service cache/history/manual/bulk清理
platform/tools/micropython_repl.py 单 owner 的有限 raw REPL RPC、raw-paste credit、双 EOF 与错误恢复门禁;不 soft reset guest 文件传输与读回
platform/tools/uiflow_package_runtime.py guest 文件暂存、逐文件 SHA/size 读回、发布与工作目录/托管模块切换 同 guest 文件包部署
platform/tools/mpy_bytecode.py 固定官方 v6 容器与指令边界的有界静态检查,递归拒绝 native;非 VM 类型验证或沙箱 .mpy 依赖准入、负控测试
platform/tools/frame_cache.py QEMU预览显式按需single-flight/TTL样本、采集身份和失效门禁;默认fresh取证不进入缓存 preview_frame、条件GET与Live sessions
platform/tools/unit_runtime.py 外接 Unit 目录、物理口准入、输入范围与同 guest QOM 读回;不在 Python 执行芯片协议 Device Service、Unit panel、契约检查
platform/tools/unit_adc_fixture.py 绑定已知应用字节的合成 S3 ADC eFuse 校准与独立数值 oracle;不访问物理硬件 Angle/Light 测试、会话 eFuse fixture 与证据
platform/tools/sync_visual_models.py 从固定公开模型 commit 显式导入运行源码、许可、Three.js 依赖与 hash 清单;38 主机目录和 visual-only 差集由导入生成,未确认贴位资产按精确 SHA 排除 外壳更新、来源复核;新增主机计划
platform/tests/test_cardputer_zero_rj45.mjs issue #75:旧几何负控、RJ45 阶梯内壁间隙 raycast 与三角度 WebGL 近景;仅模型验证
platform/tools/worker_registry.py 本地 worker identity、独占锁、generation、heartbeat、lease、drain/resume 和重启分类 Device Service、worker 测试
platform/tools/worker_directory.py 远程 worker 持久目录、identity/generation 冲突、heartbeat/drain/stop、capability 和有界结果元数据 Device Service、worker directory 测试
platform/tools/worker_queue.py 持久 job queue、idempotency、capability matching、claim/lease/heartbeat、超时重试、terminal result 和 worker 失联回收 Device Service、worker queue 测试
platform/tools/evidence_store.py worker/job/lease 绑定、内容寻址 ZIP、响应丢失幂等、容量和保留期、跨重启 metadata/content evidence store 单测、真实 HTTP worker evidence 测试
platform/tools/worker_auth.py 严格 token-file 读取、master token 派生 worker key、时间戳/nonce HMAC、body/path identity binding 和 replay cache Device Service、worker agent、auth 测试
platform/tools/worker_agent.py HTTP-only worker executor:持久 generation、可达 endpoint 注册、按剩余预算限时的 reconnect/re-register、heartbeat、network/409 lease fence、中央 claim/result、bounded evidence delay,可选独立 runtime API 负责 session、evidence 和 stop worker CLI、executor/restart/partition/fencing 测试
platform/tools/worker_discovery.py HMAC-authenticated IPv4 multicast beacon、routable unicast seed fetch、TTL/clock validation、token rotation-aware announcer 和 worker discovery client serve.py、worker_agent.py、discovery tests
platform/tools/worker_discovery_seed.py 独立 unicast seed HTTP service;每次请求重新读取 token 并返回当前 signed beacon cross-subnet worker bootstrap、deployment
platform/tools/transport_security.py TLS 1.2+ server/client context、服务端证书校验、可选 client CA 和 mTLS 客户端证书 serve.py、worker_agent.py、TLS tests
platform/tools/storage_policy.py 历史、Flash 和缓存保留/回收策略 Device Service
platform/tools/xtensa_elf_symbols.py 从 ELF32 LE Xtensa 符号表严格解析 Core2 native-VHCI 调用地址和 native-HCI hook/HLI 地址 Device Service、Core2 runners
platform/tools/fetch_firmware.py 查询、校验、下载和缓存公开 M5Burner 固件 本地准备、固件矩阵
platform/tools/firmware_manifest.py merged/segmented/ZIP/WebBurner 导入和 manifest CLI、Device Service
platform/tools/firmware_analysis.py ESP image、分区、应用描述和静态镜像分析 manifest、矩阵
platform/tools/firmware_filesystems.py LittleFS、FAT12/16/32 与 SPIFFS 只读清单、LUT/对象页校验、哈希和 SPDX manifest
platform/tools/firmware_static_review.py 脱敏 URL/凭据/高熵审查、SBOM 摘要 manifest
platform/tools/legacy_device_config.py 严格识别 classic UIFlow deviceCfg 的 config partition,并仅在 session Flash 副本中应用 SSID/password Device Service Core2 qemu-wifi、legacy config tests
platform/tools/user_firmware_matrix.py 热门公开固件的 SHA-bound UI/headless/network-first Device Service 批量仿真;可加载 session-isolated NVS fixture 回归操作员
platform/tools/user_firmware_expectations.schema.json review expectation v1 的 JSON Schema;绑定 device/firmware/SHA,禁止明文 WiFi 密码 matrix、审查工具
platform/tools/nvs_image.py 确定性 NVSv2 namespace/string fixture 生成器 Device Service、firmware probes
platform/tools/network_policy.py isolation/egress/DNS/TLS/pcap 策略校验 Device Service
platform/tools/network_egress.py 精确 IPv4/IPv6 地址/协议/端口、双栈 veth/route/NAT、IPv6 neighbor control 和清理 Device Service、隔离测试
platform/tools/network_fabric.py private namespace、双 TAP/bridge DHCP primitive 和双 guest QEMU socket L2 switch lab-fabric runner、CI
platform/tools/network_sandbox.py Linux private net/mount namespace、controlled DNS A/AAAA、exact/domain/CNAME answer binding、严格 Host authority 和 bounded CNAME chain 隔离 runner、worker
platform/tools/network_lane.py esp-emu 网络诊断与 SoftAP provisioning lane CLI、Device Service
platform/tools/unified_http_guestfwd.py QEMU user-net guestfwd 的 per-connection HTTP fixture;避免并发 session 共享宿主 18089 端口 Device Service、Core2 concurrent runner
platform/tools/pcap_summary.py pcap flow/DNS/DHCP/ARP 和 payload hash 摘要 Device Service、测试
platform/tools/ble_runtime_limits.py BLE reconnect、reconnect delay、hold、unified peer write settle 和 session-readiness-bound peer scan 的共享上限,以及按 cycle/delay 计算的 readiness workload 预算 Device Service、BLE probe、Core2 runner
platform/tools/ble_probe.py 外部 BLE peer、scan/connect/GATT 验证,以及同一 peer process 内的多轮 disconnect/reconnect unified/BLE runners
platform/tools/hci_stream.py H4 HCI command/event/ACL 分包工具 BLE runners、测试
platform/tools/qemu_network_preflight.py 检查 QEMU user-net/网络后端能力 部署和测试
platform/tools/qemu_accel.py Core2 deterministic TCG、bounded 128 MiB translation buffer、默认固定 icount shift=5 和默认 10 us per-vCPU fairness cap;M5_CORE2_ICOUNT_SHIFT 接受 auto/0-10,M5_CORE2_ICOUNT_MAX_PERCPU_NS=0 可关闭 cap,其他值限 1000-1000000000 Device Service、Core2 runners、回归测试
platform/tools/qemu_profiles.py 检查/查询 machine、profile、runtime 和资产;--check 同时拒绝 profile/catalog 的生成日期及验证日期/状态漂移 CI、设备中心
platform/tools/peripheral_catalog.py 检查设备硬件需求、模型、blocker 和覆盖 CI
platform/tools/peripheral_inventory.py 生成设备中心可消费的外设/控制清单 serve.py、设备页
platform/tools/runtime_coverage.py 检查 simulated 模型到设备级运行证据的映射 CI
platform/tools/runtime_interfaces.py 从 evidence/case 生成 QOM、输入和文件接口 设备中心
platform/tools/project_snapshot.py 从设备、profile、外设、固件 evidence、Backlog、文档新鲜度表和全量 Markdown 清单生成并校验项目快照;分别标记权威页与委派文档的旧复核日期 CI、交接、文档维护
platform/tools/generate_catalog.py 从源 catalog 生成设备 JSON/README 发布与 CI
platform/tools/export_bundle.py 导出可移植设备/运行时资产包 部署
platform/tools/build_public_site.py 显式白名单导出 Pages 静态资源、项目子路径、站点配置及纯视觉目录;不自动部署 公众入口与 URL/下载契约测试;架构边界见浏览器调研
platform/tools/bootstrap_browser_runtime.py 固定 esp32sim 源码与 lockfile 构建 WASM,校验 ROM 来源、许可和 SHA,生成可审计 runtime manifest test_bootstrap_browser_runtime.py;构建产物仅存 ignored cache / 静态导出
platform/tools/bootstrap_qemu_browser_runtime.py、scripts/qemu-wasm-build/ 固定 C/QEMU、Emscripten 及依赖完整源码构建和对应源码归档;生产者路径映射、依赖策略与分发扫描,默认不打包 ROM/固件 test_bootstrap_qemu_browser_runtime.py;Pages 部署
scripts/browser-littlefs/、platform/web/public-demo-firmware.js 浏览器下载官方基底后本地组合固定 LVGL/PIR 示例,精确 SHA 和原文件保留校验 test_browser_littlefs_build.py、test_browser_littlefs.mjs
platform/web/public-qemu-runtime.js、public-qemu-instance.js、public-qemu-engine.js、public-coi.js 工作台生命周期与本地记录、同源 iframe 首次 one-port gate、module engine Worker 持有原 factory/MEMFS/直接 UART/QMP/嵌套 pthread,以及 Pages 隔离 test_public_qemu_runtime.mjs、test_public_qemu_instance.mjs、test_public_qemu_wrapper.mjs、test_public_qemu_entry.mjs;真实 guest 为 opt-in test_public_qemu_guest.mjs、test_public_qemu_board_guest.mjs
platform/web/qemu-browser-profiles.json、public-qemu-profiles.js 逐板 ROM、Flash/eFuse、物理帧坐标、输入与公开/候选准入;完整固件 SHA 绑定执行时钟,不能从 compiled 或原生结果继承公开准入 test_public_qemu_profiles.mjs、test_public_qemu_board_guest.mjs
platform/web/public-qemu-frame.js、QEMU WASM 0014/0015 真实显示 surface 的共享快照及序列防撕裂;SDK poll 的宿主线程等待,保留客体时钟 test_public_qemu_frame.mjs、test_wasm_poll_wait_patch.py、tests/browser-qemu/poll_wait/
tests/browser-qemu/board_display/、platform/web/public-qemu-probe-firmware.js 各板固定 boot/main 与实际 VFS 的本地组合、逐文件读回、原文件/VFS 外保留和完整 Flash SHA;源码与官方 API pins 见目录 README test_public_qemu_probe_firmware.mjs、test_public_qemu_board_guest.mjs
platform/tests/fixtures/browser_epd_quality_oracles.json、tests/browser-qemu/board_display/epd_oracle.py 原 QUALITY 驱动产生的 palette/marker/count bit 空间抖色规则,绑定 guest/驱动/编译控制器源 SHA epd_oracle.py --check 只验推导;实际 EPD 帧与输入由 test_public_qemu_board_guest.mjs 另验
platform/tests/test_public_qemu_admitted_boards.mjs 串行执行本次导出中每个公开板型与 CoreS3 两种示例,失败阻止 Pages 发布 .github/workflows/public-site.yml;性能另由 test_public_qemu_performance.mjs 量测
platform/tests/public_qemu_pixel_observer.mjs 显式 await 实际 canvas 观察;先取单份完整 RGBA,再异步计算两个 ROI SHA,并核对输入后的序号与时间边界 test_public_qemu_pixel_observer.mjs 与 test_public_qemu_pixel_observer_browser.mjs 只验证 host oracle;真实固件画面由 test_public_qemu_guest.mjs 独立验证
platform/web/public.js、public.css、public-config.js、public-firmware.js 公众工作台、URL 设备选择、固件下载/取消/SHA 与项目路径;浏览器方向更新按 owner 重绘保留的真实帧,不生成新帧或序号 test_public_config.mjs、test_public_workbench_browser.mjs、test_public_qemu_entry.mjs
platform/web/public-browser-runtime.js、browser-profiles.json 独立 Worker/WASM browser backend、真实 RGB565 LE 帧与输入;不继承 native 或 Unit 准入 test_public_browser_runtime.mjs;opt-in test_public_browser_guest.mjs 运行官方固件
platform/web/public-service.js、public-session-controller.js 可选服务桥接、owned session 输入/帧/串口、证据与保留历史停止、失败重试 test_public_session_controller.mjs、test_public_service_idempotency.mjs;opt-in真实丢收据回归 test_public_session_recovery_service.mjs
platform/web/public-verified-assets.js 按显式 SHA/长度缓存不可变运行资源,独立 buffer 所有权及有界编译 Module 复用;不复用客体内存或运行中 Flash test_public_verified_assets.mjs、test_public_qemu_instance.mjs
platform/tests/benchmark_emulator_firmware.mjs、emulator_performance_summary.mjs、derive_emulator_benchmark.mjs 同完整 BIN、浏览器与输入的本项目/对照性能观测及统一派生统计;原始状态与展示插值分开 调用和边界见 基准说明;采集/退出成功不等于动作目标通过
platform/tests/test_public_native_performance.mjs 独立 Device Service 的同固件页面取帧前后对照、真实输入和停止历史 显式 --execute 与独立 runtime/ROM 路径;原始材料写入 ignored storage
platform/tests/test_gpio_wasm_transactions_patch.py、WASM 0027 锁定源重放、真实 GPIO C 的 IRQ/callback/计时边界及负控 不依赖本地构建缓存;实际浏览器准入独立运行
tests/browser-qemu/typed_helpers/、WASM 0024/0025 全局 icount no-op 消除与 WASM32 typed helper ABI 控制;不替代真实 guest 验收 test_xtensa_wallclock_noop_yield_patch.py、该目录的真实 Emscripten/libffi 对照

patches/qemu-wasm-probe/保存独立于原生 bootstrap 的 C/QEMU 宿主回移及依赖适配, 公开浏览器构建只使用源码 lock 明确选择的补丁; 研究说明记录固定源码、完整构建、浏览器CLI/QMP 证据及无固件退出修正,不属于现有native bootstrap或browser固件准入。 scripts/qemu-wasm-browser/提供研究用可见session传输; tests/browser-qemu/cores3_lvgl_pir/固定真实固件fixture。 CoreS3证据分别记录浏览器CPU、 LVGL/触摸/PIR与停止重开;0009修主CPU jump的C栈恢复,0010提供显式离线慢时钟,0012将浏览器stdio QMP绑定已有main-loop context(无OOB)。后续共享帧/host等待及显式正常时钟 SDK 候选见本轮证据;stock SDK 第一层 C Timer coalescing、触摸延迟与其它异常路径仍开放。 独立Fiber/SjLj最小C对照见tests/browser-qemu/fiber_sjlj/,固定guest源码见 tests/browser-qemu/cores3_lvgl_pir/;均为显式opt-in,不纳普通CI执行。

浏览器执行与工作台渲染分开:public-qemu-instance.js 只接受直接父窗口、 同源且恰好一个 MessagePort 的首次连接,将端口交给 public-qemu-engine.js module DedicatedWorker。原 Emscripten factory、 MEMFS、直接 UART 字符设备、QMP 和嵌套 pthread 在 engine 内执行,DOM 与 3D 留在工作台。初始化还要等 QMP query-status running 和匹配固件的 guest ready marker,不能从 QMP greeting 提前开始帧轮询。 test_public_qemu_instance.mjs 检查端口独占、原 UART UTF-8 与帧解析隔离、 待处理 QMP 在 dispose 时撤销,以及初始化期间 dispose 后无迟到 ready/error; 这些 JS factory/ABI fixture 不执行客体。

清理区分三层:QMP quit 后的 guest exit code 与嵌套 pthread 计数;engine dispose 确认、端口关闭和 owner closing 通知;浏览器实际观察到的 Worker close。 通知仅是退出意图,确认时 engine 仍活着。逐板真实验收延后 iframe DOM 移除,独立 观察一个 engine 和五个嵌套 pthread 均已关闭后才真正移除 iframe;不能把 owner 布尔值或 iframe 移除当成同一证明。初始化/错误/pagehide 的 terminate() 兜底仍存在,成功 门禁要求 fallback termination 为零。实现与复现流程见 Pages 部署。

逐板 fixture 映射如下;本轮 10 板/11 例的公开准入身份见文末有界证据,正式部署另验。

板型 tests/browser-qemu/ 下源码 输入与画面门禁
CoreS3 cores3_lvgl_pir/;cores3_lvgl_wallclock/candidate_lvgl_loop.py 原始程序 stock-reference 与独立 SDK 调度候选分别验证 LVGL、触摸与 PIR;stock-div8 仅保留为旧 UI selector
Core2 board_display/main.py、core2_boot.py 原 console 和 M5.Touch,S3 UART boot 不适用
AtomS3R、StickS3 board_display/main.py、boot.py 原 M5.BtnA、完整 8×8 红/绿标记;AtomS3R 两行偏移另列校准边界
StopWatch board_display/stopwatch_main.py 原触摸、圆屏内标记;逻辑 468×468、可见 466×466 与 offset/crop 分别核对
StamPLC board_display/main.py rotation 1、240×135、原 M5.BtnA
StackChan board_display/main.py rotation 1、320×240、屏幕触摸,不涵盖 Si12T 机身触摸
PaperColor board_display/papercolor_main.py 400×600、原 Spectra 6 QUALITY EPD、M5.BtnA
PaperMono board_display/papermono_main.py 480×800、原 SSD1677 四灰 QUALITY EPD、官方 raw-point hitbox workaround
Cardputer-ADV board_display/cardputer_adv_main.py;tests/firmware/cardputer_input_orientation/ 原 KeyboardI2C/TCA8418 FIFO;56 物理键、55 直接 PC code、修饰键别名与 Fn 方向键和弦

PaperMono 的固定示例保留原逻辑坐标输出,正点 raw (240,650,1,0) 与 logical (90,400) 同场记录,负点 (240,400) 不得改变计数/计数区像素; release 明确使用缓存按下坐标。它没有修复 stock logical calibration。 独立 SDK offset 候选只有 host C++ 证明,未构建/运行候选固件。 StopWatch 不可从触摸 count 推定校准完成,也不可按假定比例换算原驱动坐标。 Cardputer-ADV 的 56 个模型键要求原 FIFO 位置、按下/松开和真实帧变化; PC 直接 code、左右 modifier、Esc/Delete 与四方向 Fn 和弦分别断言实际 物理键位。轮询 IRQ handler 不证明 GPIO interrupt delivery;EPD 门禁逐像素检查原驱动 QUALITY 抖色 palette、marker 与 count bit 的固定空间规则,直方图不能替代;计数字符 ROI 变化不证明精确字形。 StackChan 用户跳舞 Flash 使用 platform/tests/test_stackchan_dance_user_firmware.mjs,要求真实 UART1 SCS present/goal 位移、QOM、3D 与 DOM 同源;当前该 SHA 使用 normal-clock、 原 TCI 的 one-insn-per-tb 模式,并强制校验 0027 runtime patch 身份。 旧 div6 的历史结果不能替代本轮验证。 完整固定源码与边界见 逐板说明。

CoreS3 原始参考 Flash 78961297e751ec9c743b4cdf89cc2c137e7e2c801dda3ead9df2ea45d59fbd3f 由精确 firmware variant 选择正常时钟 divisor 1、原 TCI 的 one-insn-per-tb 及 0027 patch 约束;它没有替换原始 main.py。stock-div8 是兼容的 UI 选项值,正式 case 名为 stock-reference,不能据旧名字推断慢时钟。 未知 CoreS3 固件仍走原 base divisor 8,独立 SDK 调度候选不被合并为原始程序。 逐次导出的完整浏览器门禁需独立结束并审核,不能由此入口说明预授 PASS。

public.js 将 native RGB565 同时送入原始屏幕与 model-shell.js 纹理。 test_public_qemu_board_guest.mjs 在输入前后等待模型 frame sequence 与 native frame 相等,并由 viewer render 事件观察对应序列,再全像素核对转换后的 纹理缓冲区(含声明的 native raster rotation)。这比只看到 frameSeq 递增多一层 render 顺序证据,仍不等同于 GPU 像素或光学/硬件验证。

方向 QOM 与共享帧分别轮询;browser-only applyBrowserPresentation 在 active owner 下可重绘 controller.lastFrame 的原像素,保留原 frame sequence,避免 静止画面等待不存在的下一帧。它不写控制器、不 emit 新 guest frame,native service 不调用该呈现回调。Cardputer 门禁只读 fresh QOM、cached orientation、 native/canvas 尺寸与模型角度,要求自然收敛到 guest ready 的逻辑方向;不通过 赋值方向、额外 screendump 或放宽尺寸 oracle 使断言通过。

CoreS3 的像素完成门禁由 public_qemu_pixel_observer.mjs 显式等待实际异步 观察结果,两个 ROI 必须来自同一次完整 canvas snapshot,并满足真实输入后的 sequence/time 边界。首次匹配对象直接保留;Promise truthiness、回调或固定 check(true) 均不能替代实际像素。host 正负控不构成设备画面完成证据。

Unit 集成的其他入口:platform/web/unit-visual-mappings.js 与 unit-panel.js 负责控件和模型读回;tests/units/run_service_cases.py、 run_sensor_cases.py、run_control_cases.py、run_io_cases.py 分组执行 Device Service 固件探针;run_live_unit_batch.py 验证同guest多Unit连续程序, run_frame_preview.py 与 platform/tests/test_frame_preview.mjs 分别验证实际预览和浏览器异步隔离。 preview-client.js由SessionVisual、ProgramPanel与UnitPanel共享,用权威Preview/Run查询、generation/epoch及冻结context协调输入、完整包编辑、续租/取消/关闭和Run帧;test_preview_client.mjs与面板fixture属于宿主/浏览器证据,实际链路由显式opt-in的test_live_preview_service_browser.mjs另验。 DeviceService.create/get_program_revision提供完整package公共保存/查询;DeviceSession.run_program按引用读取且不重建revision。test_program_revision_api.py区分宿主HTTP/准入与guest部署,run_live_package.py --revision-references以8787实际会话验证原文件包路径;新接口不等于Preview/Run协调器。serial_read按offset seek读取有界窗口,任意byte切片的UTF-8 replace解码边界保持。 test_model_shell.mjs及model_shell_probe_helpers.mjs以有界context/PNG decode核固定vendor、全部printed-artwork种类和公开LED/joint输出;默认配置、census、明确变体和真实guest证据分别标记,不从新增视觉壳子继承Unit协议准入。 arrayLedFeedback在默认无binding时只映射全N灯同色,非对称/不可用状态撤回旧颜色并标unknown;test_uniform_unit_led_feedback.mjs核真实mounted材质与销毁/失败fixture,test_live_uniform_led_service_browser.mjs经可见session核原I2C/RMT驱动、同VM四阶段与默认网页反馈。device_service._public_device的program_features显式发布入口/字节码/namespace/清理边界;固定源码与真实guest研究不等于二进制入口已实现。 scroll_protocol_probe.py/run_live_scroll.py经同guest原ScrollUnit与raw I2C验证Scroll限定协议;test_live_scroll_service_browser.mjs验证真实Web按键、RGB灯与屏幕,test_scroll_visual_mapping.mjs另做无guest的可信pointer/零回声/销毁fixture。0043-unit-scroll-controller.patch为独立部分C模型;RGB队列、回绕、bootloader/持久化与机械角度不能继承PASS。证据见Scroll。 0044-unit-2relay-gpio.patch在独立冷构建中添加U131双GPIO pad观察与下拉,两个通道各自计数且只读;relay2_preview_probe.py和test_live_relay2_preview_service_browser.mjs核官方驱动原字节、同VM七Run、主机输入/两灯、帧和历史清理。preview_controls_probe.py和test_live_preview_controls_service_browser.mjs核HUB控制组的托管Web输入、全灯同色、包保留编辑和取消恢复;二者默认离线,显式execute才调用8787。证据和失败层级见本块索引。 0087-unit-hard-reset-output-boundary.patch给共享GPIO reset增加reset observer,顺序为复位route/level→Unit基线/计数清零→正常line listener;test_unit_hard_reset_patch.py编译实际reset helper并保留高→reset低负控,run_relay_reset_probe.py以AtomS3R同固件fixed/pre-fix验证单Relay和双通道。只覆盖数字GPIO transition,不表示机械触点、负载、电气或其它Unit reset,见hard-reset证据。 0048-unit-servos8-joystick2-nfc.patch在经典/S3 Unit runtime 中加入 StickS3 servo8-hat@0x36、CoreS3 8servos@0x25、Joystick2 0x63/0x64 和 ST25R3916 NFC 0x50 的控制器可见寄存器/事务路径。 unit_runtime.py负责 Hat2/PORT.B/HUB 地址冲突准入;session QOM 暴露角度、 模式、轴、按钮、ID/事务计数。该路径不建立舵机运动、RF、电气或机械 PASS。 ModelDeviceShell.installAssemblyCamera/fitAssembly只包装该实例公开fit/resize与render(dt),按主机/Unit/线缆world bounds构图;test_model_camera_fit.mjs保留旧窄屏与长RAF阻塞负控、四断点、用户视角与无回声回归,不修改共享vendor。 scripts/bootstrap-unit-runtime.py 和 patches/qemu-unit-runtime/README.md 固定公开源码、依赖与补丁顺序; platform/tests/test_unit_runtime.py 校验冻结 schema、拓扑和输入准入,以及历史证据索引结构; tests/units/verify_historical_runtime_evidence.py 显式取得完整旧归档后, 通过 _unit_host_control_evidence.py 核对控制类/Web证据契约:原始 准备字段、精确附件接线、同guest数据面、直接PID、原生帧和实际停止历史。 _unit_host_sensor_evidence.py 独立核对 sensor/Web 契约:原初始化负控、两组 实际逐字段 POST 后的新鲜串口、adapter/完整 VFS、冻结源与 exact Git baseline 重建、三路非原子帧和停止历史;人工可读性另绑原始 review。 旧主机探针的双观察者契约仍单独保留,功能通过与显示可读性分开记录。 AtomS3R/StickS3/StopWatch 的五款控制类入口是 tests/units/prepare_host_controls.py、run_host_control_cases.py 与 host_controls_probe/:前者按实际参考分区离线打包,后者默认离线核对当前 依赖/工具链和准备产物,只有显式 --execute 才经 Device Service 与真实 Web 运行原控制类断言。命令见 tests/units/README.md; test_host_control_preparation.py 保护来源漂移与执行前拒绝边界。 六类 I2C sensor 对应 prepare_host_sensors.py、run_host_sensor_cases.py 与 host_sensors_probe/;test_host_sensor_preparation.py 与 test_host_sensor_execution.py 保护离线准备、准入、来源和实际输入窗口。 十二款 IO 对应 prepare_host_io.py、run_host_io_cases.py 与 host_io_probe/;准备采用实际 reference VFS 和原 IO 驱动/流程,执行默认 离线预检,只在显式执行时经真实 Web/Device Service 运行原断言。Python 3.12 ABI、精确来源冻结、ADC blocker、默认 IR/Buzzer 与显式 custom 边界及 root 独占 API 规则见 Unit 测试入口说明。Thermal 仍走 独立 sensor 路径;test_host_io_preparation.py、test_host_io_execution.py 保护准备/执行门禁,不把离线结果升级为功能 PASS。 tests/units/test_sensor_evidence.py 校验传感器证据故障边界。脚本或构建成功 不等于完整 Unit 功能 PASS;结果链接到项目状态和验证台账。

tests/units/run_web_cases.py 通过可选 web_ui_bridge.py 和 platform/tests/unit_web_bridge.mjs 将同一批 guest probe 的正向输入交给真实 产品控件,并保存实际 HTTP、DOM、模型与 PID/binary 证据;负向 API 路径单列。 tests/units/check_batch_evidence.py 使用显式选择清单核对全部 Unit 的 controller、live browser 和 bridge contract 三层,逐项校验 ZIP 与原工件 hash,区分直接 PID 与间接 generation、原驱动与 custom guest,不自动挑选 最新的成功尝试。test_batch_evidence.py 覆盖错配、缺件和输入覆盖拒绝。

tests/units/run_web_recovery.py 与 platform/tests/test_live_unit_recovery.mjs 在一个可见 Button 会话中对实际 产品页面延迟模型加载并丢弃一次松开请求,核对画面保留、实际控制器状态、 guest GPIO 串口、自动松开补偿及正常手势无额外 POST。测试只改变网络交付时序, 不替换 guest 或输入/读回数据;结果需要独立 evidence,不继承批次功能结论。 platform/tests/test_frontend_recovery.mjs 在 CI 中检查异步 owner、异常清理与 松开补偿的确定性故障边界;内存 API/DOM fixture 不作为实际会话证据。

platform/web/unit-annotations.js 在交互画布外显示静态 Unit 的实时读数, 以实际 sensor anchor 与同号标签关联。数值需同时满足冻结 session 定义、 live 响应、guest-QOM 单元来源、running/available 和字段范围;不从 pending 输入或目录默认值补数值。test_unit_annotation_contract.mjs 在 CI 中验证来源、 方向、范围及可选读数异常不影响输入确认。tests/units/run_annotation_cases.py 和 platform/tests/unit_annotation_bridge.mjs 复用原 service/sensor/io guest, 仅 --execute 才创建可见会话,核对实际 HTTP/控制器/DOM、停止前 ZIP 和终态 清值;默认 preflight 不创建会话。几何部件绑定覆盖与读数展示是独立层级。 tests/units/annotation_contract.py 约束十二款 rail 的阶段、单位、原 guest 读数、严格输入 POST 与新鲜度;Light 首次 false 的无操作必须有真实先前 GET。 Buzzer 的定时零必须先于后续手动写入;显式 custom wrapper 适配位于 patches/uiflow2-unit-buzzer/,默认原驱动与补丁结果分开记录。

tests/units/prepare_host_sensors.py、run_host_sensor_cases.py 和 host_sensors_probe/ 是三主机六传感器的准备/执行边界。完整 VFS、原驱动、 初始化/负控/采样链和实际配置逐项绑定;未准入组合在任何 API 前拒绝, 离线产物不扩展运行时或硬件结论。

platform/web/unit-assembly-layout.js 只为已检查的 CoreS3 单层紧凑 HUB 装配 提供外观布局,使用公开 unitFrame/cable API、真实尺寸与端口坐标;不改总线、 输入或厂商模型几何。adapter 对可选布局失败隔离,范围外保持原 pose。 所有新浏览器/执行冻结清单纳入该依赖,历史源冻结保持原样。 unit_web_bridge.mjs 的长卡片取图使用有界 CDP document clip,避免元素截图 二次滚动造成 sticky 导航遮挡;真实标题命中、完整 PNG 与旧实现负控分别核对。

测试入口归属

入口 负责范围 何时运行
platform/tests/ Python API/契约与 Node SHA256/upload client 测试 每次代码改动
platform/tests/test_docs_*_contract.py 文档契约分域:test_docs_index_contract.py、test_docs_current_state_contract.py、test_docs_core2_runtime_contract.py、test_docs_firmware_security_contract.py、test_docs_network_worker_contract.py;兼容入口为 test_docs_consistency.py;退役说法由 fixtures/stale_doc_claims.json 数据化 文档、当前状态、Backlog、API 或 evidence 口径变化
platform/tools/project_snapshot.py --check 校验自动项目快照是否与 catalog/profile/evidence/Backlog 同步 状态、设备或 Task 变化后
platform/tests/test_ble_probe.py Bumble no-response HCI compatibility 回归 ble_probe.py controller compatibility 改动
platform/tests/test_ble_runtime_limits.py reconnect cycle/delay 上限与 workload-aware readiness 预算 BLE 长任务预算或参数范围改动
platform/tests/test_core2_hci_ack_observability.py 绑定 0010 aggregate/summary/trace 哈希,校验首条 ACK 为空、response→HLI 顺序及“host trace time 不是 guest 虚拟时间”的文档/元数据口径 Core2 ACK 根因、trace 证据或当前状态描述改动
tests/uiflow2/run_device_matrix.py 设备首帧、输入、烧录和板型 smoke 设备/固件 profile 改动
tests/uiflow2/run_profile_ui_test.py 单 profile UI 回归开发 显示/输入改动
tests/uiflow2/run_peripheral_matrix.py 控制器/总线/驱动/API 外设数据面 外设改动、里程碑全矩阵
tests/uiflow2/unified_*/ 单 guest board + WiFi + BLE 设备切片 unified profile 或共享 radio 改动
tests/uiflow2/core2_native_hci/run_service_5x.py 在首个 lease 前冻结 firmware/ELF/QEMU 哈希,通过真实 Device Service API 租用 core2-native-hci,支持 hold、reconnect、并发 batches、startup stagger 和 session-overlap 证据,低频采样 host RSS;失败时保留 partial evidence 并汇总 aggregate FAIL。文件名保留历史 5x 以维持 evidence/复现路径稳定,实际已参数化为任意 attempts/concurrency Core2 native-HCI、extended-run/soak/reconnect/concurrency、Device Service profile 或 ELF hook 改动
tests/uiflow2/core2_native_hci/run_service_teardown.py 在 BLE/HTTP companion 仍活跃时 DELETE session,验证 stopped、无错误、companion terminate、QEMU/BLE PID reap、worker lease release,并连续创建下一 session 验证恢复 Core2 stop/teardown、companion cleanup、worker lease lifecycle 改动
tests/network/ namespace、DNS/TLS、精确 egress、DHCP renewal、radio/AP 重连、双 guest lab fabric 和 worker-local QEMU 网络策略/运行时改动
tests/network/dns_cname_chain/ Controlled resolver 的 2-hop chain、A/AAAA chain encoding、CNAME query、NXDOMAIN、非法图与 8 跳边界 network_sandbox.py resolver/CNAME 策略改动
tests/network/cname_guest_lifecycle/ 三个独立 Device Service lease 的同一 guest CNAME→A→HTTP、denied-name/port、pcap、namespace cleanup 与 startup failure 诊断 CNAME guest lifecycle、network evidence ZIP 或 namespace teardown 改动
tests/network/wrong_password/ ESP-IDF 错误密码拒绝、重试、no-DHCP/no-HTTP 负向门禁和脱敏 evidence network_lane.py 错误密码 profile 改动
tests/firmware/evidence-*.json 固件导入、静态 review、LittleFS/FAT/SPIFFS/NVS capability 证据 manifest/filesystem/NVS/capability 改动
tests/firmware/security_preflight/run_test.py 用 synthetic Secure Boot v2 image、sdkconfig、eFuse summary 和篡改 aggregate 对照 Device Service security preflight;任何已声明 enabled 但 profile 未建模的链均 fail closed security fields、Secure Boot/Flash Encryption preflight 或 schema enum 改动
tests/firmware/unknown_required_capability/run_test.py 对同一 public StickS3 SHA 同时跑 merged/WebBurner baseline、unknown required 和 unknown optional;验证 required 未知时 CLI/import fail closed,optional 仅 warning capability policy、Manifest importer 或 WebBurner capability 输入改动
tests/firmware/manifest_policy/run_test.py 验证根 capabilities/required/optional 必填、数组边界、signed-image status understatement、eFuse enum、key mismatch 和 secure-version rollback 都 fail closed Manifest schema、capability policy 或 Security preflight 改动
tests/firmware/webburner_import_policy/run_test.py、platform/tests/test_webburner_import_policy_evidence.py 验证 ZIP path 归一/casefold/symlink、文件/目录父子冲突、manifest/sdkconfig/eFuse/flasher/SBOM 唯一性、sdkconfig 明确优先级和多 build SoC 选择都 fail closed WebBurner/ZIP importer、资源发现或 build 选择改动
tests/firmware/openai_nvs_precondition/ 对照空 NVS、Open/WPA2 正确密码和错误密码,绑定 NVS overlay、EAPOL/CCMP、DHCP/DNS/TCP 与 pcap NVS fixture、generic S3 qemu-wifi、S3 WPA2 或该样本分类改动
tests/firmware/core2_flash_ipc/run_test.py 通过独立 Device Service lease 执行 ESP-IDF CPU1 partition reads;默认校验已知 image/ELF SHA,按 first boot 分类 PASS、interrupt-WDT、spinlock assert,并保存 serial/evidence hash Core2 flash/IPC、timer/WDT、flash-cache/DPORT 或 RUNTIME-03 探针改动
tests/cardputer_zero/ 独立 Linux ARM64 后端 CardputerZero 改动
platform/tests/test_worker_registry.py worker 状态转换、独占锁、重启 abandoned lease 和 recent result worker 生命周期改动
platform/tests/test_worker_directory.py 远程 worker 注册、持久化、generation、stale/drain/stop、容量和结果元数据契约 /api/v1/workers 或 worker_directory.py 改动
platform/tests/test_worker_queue.py job submit/replay、capability、lease、expiry、retry、result/cancel、worker supervisor 和 schema 校验 /api/v1/jobs 或 worker_queue.py 改动
platform/tests/test_worker_auth.py path 分类、签名、body tamper、时间窗、generation key 和 nonce replay worker_auth.py 或 handler auth 改动
platform/tests/test_worker_agent.py generation 持久化、job 执行、evidence 保存、失败清理、control restart 重注册/同 lease result、409/network blackhole 后 bounded runtime stop 与 stale result suppression,以及 control/runtime API 请求平面分离 worker_agent.py 或 executor 协议改动
platform/tests/test_worker_discovery.py signed beacon、错误 token/group、过期、URL/包上限、真实 multicast loopback、unicast seed、redirect rejection 和 token verification worker_discovery.py、seed service 或 discovery CLI 改动
tests/network/worker_discovery_seed/ 两个 subnet、IPv4 forwarding、masquerade、multicast isolation、unicast seed、错误/旧 token、rotation 和 cleanup cross-subnet discovery 改动
tests/network/worker_partition_fencing/ worker→control blackhole、bounded heartbeat、OS process 与真实 worker-local QEMU PID stop/reap、lease expiry/requeue 和 retry completion heartbeat/reconnect、lease ownership 或 runtime cleanup 改动
tests/network/worker_cross_netns/ 两个 veth 连接 namespace 中的 Bearer+HMAC control plane,以及 worker-local Device Service、StickS3 QEMU、artifact/firmware、evidence、QEMU reap 和 cleanup worker control/runtime plane、本地 QEMU executor 或 cleanup 改动
tests/network/worker_cross_container/ 两个独立 Docker 容器、user-defined bridge、central queue/directory、worker-local runtime/QEMU、terminal evidence 和容器/网络 cleanup cross-container worker executor、Docker image、bridge 或 runtime asset binding 改动
platform/tests/test_transport_security.py 真实 HTTPS、mTLS 客户端证书、未知服务端证书拒绝和 TLS 参数校验 transport_security.py、serve.py 或 worker_agent.py TLS 改动

run_profile_ui_test.py、run_peripheral_matrix.py 和直接 QEMU 启动是仓库 回归开发入口;Agent 触发的普通固件功能测试必须走 Device Service,避免产生 不可观察、不可保留的临时结果。

当前代码组织债务

静态盘点显示生产代码中没有未处理的 TODO/FIXME/HACK,主要债务是文件边界 和测试体积。会随提交变化的模块行数由 自动项目快照生成,本页不再手写。

位置 现象 处理原则
platform/tools/device_service.py 三个 session class、DeviceService、ArtifactStore、FirmwareStore 和主体请求编排仍集中;Core2 并发 evidence 绑定该文件 SHA 按 SVC-03 继续移存储、runtime adapter、evidence 和 history;任何改变 tool hash 的步骤都要配套重跑受影响证据
platform/tools/device_service_errors.py、device_service_parsing.py、device_service_execution_parsing.py、device_service_network_execution.py、device_service_qemu_wifi.py、device_service_runtime.py、device_service_specs.py ServiceError、基础/execution/network parser、QEMU WiFi security/env、QEMU/runtime 内存策略、私有 env 脱敏和设备规格/profile 选择已独立;device_service.py 保留同名 re-export 行为、错误码、返回结构和 public symbol identity 分别由对应边界测试锁定;后续只继续移动无状态边界,不改变 API payload
platform/tests/test_device_service.py 大型 service 契约测试,覆盖多个生命周期和数据面 跟随后续 service 模块拆分,不先做无语义的测试改名
tests/uiflow2/run_peripheral_matrix.py 大型 case 注册、输入和断言集合 case registry、输入注入和断言可拆;每个设备 probe 仍保留设备本地证据
tests/uiflow2/unified_*/ S3/C6 与 Core2 radio profiles 有相似的 board/WiFi/BLE 外壳 先抽无设备语义的 transport/evidence helper;不要用一个万能 probe 吞掉设备差异

device_service_network.py 现在承接 network policy 与 CNAME 请求解析; device_service_execution_parsing.py 承接 storage/NVS execution 请求; device_service_network_execution.py 承接 esp-emu network execution 请求; device_service_qemu_wifi.py 承接 QEMU WiFi security 与 env projection; device_service_specs.py 承接 catalog/matrix/profile 和设备规格选择, device_service.py 只保留 same-object re-export。下一步仍按 SVC-03 拆分其余请求解析与 runtime/store/evidence 边界。

这些是维护成本,不是当前功能失败。没有 API 契约测试和同路径 evidence 保护时,不做跨文件大重构。

SVC-03 的目标不是一次搬空 device_service.py,而是按可回滚边界拆:

  1. 已锁定 ServiceError.payload()、首批 parser 行为和 public re-export;
  2. 已提取首批 parser、QEMU/runtime 内存策略、私有 env 脱敏和设备规格/profile 加载;继续提取其余请求解析与运行参数构造;
  3. content-addressed firmware/artifact store 与 resumable upload;
  4. session repository、状态机和历史恢复;
  5. QEMU、esp-emu/Tab5、network runtime adapters;
  6. serial/frame/QOM/audio/network evidence collector;
  7. HTTP handler 与 orchestration facade。

每一步先保留现有 /api/v1、session JSON、evidence ZIP 和 stopped-session 恢复契约,再迁移一个边界;禁止在同一变更里同时改 API、存储布局和运行时。

运行链路

Device Service

HTTP / browser
  -> platform/tools/serve.py
  -> platform/tools/device_service.py
       -> worker_registry.py (local process)
       -> worker_directory.py (remote registrations)
       -> worker_queue.py (durable job/lease state)
       <- worker_agent.py (HTTP-only executor)
       <- worker_discovery.py (signed control URL)
       -> device/session catalog
       -> FirmwareStore
       -> DeviceSession / NetworkDeviceSession / Tab5DeviceSession
       -> QEMU or esp-emu process
       -> serial / framebuffer / QMP / QOM / network evidence
       -> retained session directory and evidence ZIP

关键模块:

路径 职责
platform/tools/serve.py HTTP 服务、静态页面和 /api/v1 路由入口
platform/tools/device_service.py lease、artifact/firmware 存储、可恢复 chunk upload、会话生命周期、QEMU/esp-emu 编排、证据包
platform/tools/uiflow_source.py 将获准 UIFlow2 reference 的真实 LittleFS VFS 叠加 caller Python,重新挂载核对持久字节、保留原文件并记录源码/镜像/工具链 provenance;不在宿主执行 guest 代码
platform/tools/worker_registry.py 单 worker 的持久化 heartbeat、generation、租约和 drain 状态机
platform/tools/worker_directory.py 远程 worker 持久注册表、identity/generation 校验、stale/drain/stop 和有界结果索引
platform/tools/worker_queue.py 持久任务、幂等提交、能力匹配、worker lease、超时重试和 terminal result
platform/tools/worker_auth.py worker-specific HMAC key derivation、request signature、timestamp 和 replay 防护
platform/tools/worker_agent.py 独立 HTTP executor、中央 worker/job heartbeat、可选 worker-local runtime 的 session/evidence/stop 和 result 回报
platform/tools/worker_discovery.py active-token HMAC multicast beacon、过期/来源校验和无硬编码 URL 的 worker bootstrap
platform/tools/storage_policy.py 会话历史、Flash 保留与缓存 GC
platform/tools/qemu_profiles.py QEMU profile、machine、runtime 和资产检查;验证日期/状态必须与设备目录一致
platform/tools/agent_skills.py 通用/AIFlow 专用 skill 的分发白名单、独立相对链接检查、确定性 ZIP 与 SHA256 清单;入口见 skills 指南
platform/web/ 设备目录、会话观察和浏览器设备外壳

device_service.py 仍是主要编排热区。修改时应先锁定对外 API 和会话状态机, 用平台单元测试保护,再拆内部模块;不要把尚未验证的控制器逻辑移到 Python 设备服务层。

固件输入

M5Burner / WebBurner / ESP-IDF / merged / segmented
  -> platform/web/firmware.html (optional browser path)
  -> firmware_manifest.py
  -> normalized flash + manifest.json
  -> optional resumable /api/v1/artifact-uploads/<id>/chunks
  -> POST /api/v1/firmware/import or /api/v1/firmware (kind=manifest)
  -> capability/security preflight
  -> session
路径 职责
platform/tools/fetch_firmware.py 公开 M5Burner 固件查询、校验、下载与缓存
platform/tools/firmware_analysis.py ESP image、分区、应用描述和静态镜像分析
platform/tools/firmware_filesystems.py LittleFS 挂载、FAT12/16/32 与 SPIFFS 只读解析、文件哈希、敏感路径脱敏和 SPDX 提取
platform/tools/firmware_manifest.py ZIP/目录导入、sparse 补齐、content-stable manifest_id、sdkconfig detected、低置信度 image-signature observed、Secure Boot v2/eFuse 摘要与 anti-rollback version 对照;known/unknown required capability mismatch fail closed,unknown optional 保持 warning;security aggregate 不能被 sdkconfig、signed/invalid image 或 eFuse 的 enabled 证据 understate
platform/tools/firmware_static_review.py URL/凭据/高熵脱敏审查与 SBOM 摘要
platform/tools/firmware_manifest.schema.json 版本化 manifest schema
platform/tools/runtime_acl.py 外部 operator policy 解析、设备/操作 allowlist、入口点与 guest package 路径 ACL、policy hash 和 fail-closed 决策
platform/tools/user_firmware_matrix.py 通过 Device Service 批量运行热门公开固件
platform/tools/user_firmware_expectations.schema.json UI/headless/network-first review expectation v1 schema
platform/tools/nvs_image.py 生成确定性 NVSv2 namespace/string 配置 fixture
platform/tools/legacy_device_config.py 校验 classic UIFlow deviceCfg schema、长度和 checksum,只更新匹配的 config partition
tests/firmware/ FirmwareManifest、静态审查、文件系统、NVS/OpenAI、Core2 PSRAM/flash-IPC 专用探针和跨厂商运行时 evidence
platform/tools/generate_catalog.py 从 catalog.source.json 生成目录、设备 JSON 和 README
platform/web/firmware.html、firmware.js、firmware-report.js、firmware-upload.js、sha256.js 浏览器 WebBurner 包上传、流式 SHA256、重试/取消/刷新恢复、manifest 导入、sdkconfig/image capability 来源与 warning 展示

网络与 BLE

路径 职责
platform/tools/network_policy.py isolation、egress、controlled DNS、exact Host/domain suffix 和 pcap 策略
platform/tools/network_egress.py 有界 IPv4/IPv6 地址或 CIDR/协议/端口、nftables、per-session 双栈 veth/NAT、IPv6 neighbor control 和清理
platform/tools/network_fabric.py private namespace、双 guest QEMU socket switch、DHCP reservation、TAP/bridge primitive
platform/tools/network_sandbox.py Linux net/mount namespace、controlled A/AAAA + label-boundary domain suffix resolver、exact/domain/CNAME explicit answer binding、严格 Host authority、lab-only 无路由、allowlist nft 执行和 fail-closed 启动
platform/tools/network_lane.py esp-emu 诊断/Provisioning 网络 lane
platform/tools/pcap_summary.py flow、DNS、DHCP message/transaction/renewal、ARP、egress scope 和 payload hash
platform/tools/ble_probe.py 外部 BLE peer / GATT 验证;默认一轮,可要求同一 peer 进程连续多轮
platform/tools/hci_stream.py H4 command/event/ACL 分包
platform/tools/runtime_interfaces.py 对外汇总设备、外设和运行时可注入接口
tests/uiflow2/core2_native_vhci/ stock Core2 VHCI→Bumble GATT runner
tests/uiflow2/core2_native_hci/ QEMU native-HCI transport、无 GDB H2C/C2H、完整 GATT、Device Service repeated lease 和 evidence 生成
tests/uiflow2/core2_radio_probe/native_vhci_bridge.py legacy/diagnostic GDB H2C/C2H bridge;不是新调用首选,更不能作为稳定生产证明
tests/network/tls_allowlist/ 测试 CA、namespace-local HTTPS gateway、Host 允许/拒绝和 pcap 断言
tests/network/idf_dhcp_renewal/ ESP-IDF netifapi_dhcp_renew()、Device Service 和 pcap renewal 断言
tests/network/lab_fabric/ 两台 StickS3 QEMU guest 的 DHCP、guest TCP、双侧 pcap、宿主隔离和 TAP/bridge primitive
tests/network/worker_lifecycle/ 真实 StickS3 QEMU lease 的 heartbeat、drain、resume、强杀清理和下一代 abandoned lease 分类
tests/network/ 隔离、错误密码、有界 CIDR/dual-stack egress、domain-set、radio/AP 丢失重连和 Core2 网络夹具

QEMU 主路径必须在同一个 guest 内同时具备板级外设、网络和 HCI/BT 数据面。 runtime=network 只用于诊断,不能和另一条 QEMU 板级结果拼成整机 PASS。

运行时优先级

层级 入口 用途 结论边界
产品验收 runtime=qemu-unified + *-unified profile 单 lease、单 guest 的 board/WiFi/BLE/evidence 当前 S3/C6 和 Core2 core2-native-hci 的主路径
兼容无线 qemu-wifi、qemu-ble 旧 profile 和单选无线诊断 qemu-ble 不应作为新调用默认值
网络诊断 runtime=network / network_lane.py WiFi/BLE blocker、SoftAP、DNS/TCP/UDP/HCI 没有同 guest 板级结论
Tab5 例外 esp-emulator-native P4 rom/ELF、显示、触摸和 ESP-Hosted partial,不是完整 P4 外设模型
历史实验 无服务入口的临时 QEMU worktree、旧 evidence 根因调查 不能写成当前产品能力

设备契约与 QEMU

路径 职责
devices/catalog.source.json 设备源清单;当前数量由自动项目快照读取
devices/catalog.json 生成后的展示/API 清单
platform/peripherals/catalog.json 芯片模型、总线、地址、QOM、注入和数据面
platform/peripherals/runtime-coverage.json 模型到设备级测试证据的映射
platform/qemu/profiles.json machine 与 runtime profile
patches/ 可提交的 QEMU/板级补丁源
.work/ 本机不可提交的 QEMU、ROM、工具链和运行时缓存

修改设备或外设后,至少同步源清单、生成目录、外设契约、runtime coverage、 profile、设备级测试和文档;生成目录不得手改成与源清单和校验器不同的状态。

验证入口

下表是“源码/测试/证据在什么位置”的索引,不是当前验证快照。表中的 PASS 比例、轮次、资源数值和哈希都只属于所链接的 evidence;新运行应先更新 validation-ledger.md 和 evidence,不要求逐行改本表。只有入口、补丁或测试 路径变化时才改这里。

层级 命令或入口 能证明什么
平台单元/契约 platform/tests/ 解析、目录一致性、API、manifest、网络策略和文档契约
外设矩阵 tests/uiflow2/run_peripheral_matrix.py 控制器/总线/驱动/API 的数据面
单设备统一运行时 tests/uiflow2/unified_* 单 QEMU guest 的板级、WiFi 和 HCI BLE
Core2 stock VHCI BLE(legacy diagnostic) tests/uiflow2/core2_native_vhci/run_test.py --symbol-source pinned ELF 固定地址下验证 GDB/API boundary 交互;单次通过和 1/2 repeated lease 只用于诊断,不是稳定主路径
Core2 unified native-VHCI(legacy diagnostic) qemu-unified/profile=core2-native-vhci;tests/uiflow2/unified_core2/run_test.py --ble-transport native-vhci 保留兼容和根因对照;GDB 仍控制暂停/注入/return
Core2 native HCI HCI-1 patches/qemu-core2-native-hci/;tests/uiflow2/core2_native_hci/test_transport.py QEMU H4 chardev framing、bounded queue、overflow、peer lifecycle、counters 和 clean shutdown PASS
Core2 guest H2C HCI-2 tests/uiflow2/core2_native_hci/test_guest_h2c.py 不启动 GDB,从真实 VHCI shared memory 捕获 stock HCI Reset 01030c00 并转发 peer
Core2 C2H callback HCI-3a tests/uiflow2/core2_native_hci/test_guest_h2c.py --enable-c2h 诊断性单包路径:从 ELF 分配 guest buffer,调用注册的 notify_host_recv 和 send-available;Reset Complete 后 guest 发出下一条 H2C,targeted 5/5;不能扩展为产品 C2H 后端
Core2 HLI event HCI-3b patches/qemu-core2-native-hci/0002-esp32-native-hci-hli-event.patch;tests/uiflow2/core2_native_hci/test_hli_event.py;evidence-2026-10-24-hli-event-5x.json 池分配真实 Reset Complete 经 event 13 和 ble_transport_to_hs_evt_impl 交付;guest 从 01030c00 前进到 01011000,连续 5/5
Core2 full HCI/GATT HCI-3b patches/qemu-core2-native-hci/0003-*.patch、0004-*.patch、0005-*.patch;tests/uiflow2/core2_native_hci/run_full.py;evidence-2026-10-24-hli-api-gatt-5x.json 无 GDB HLI/API-boundary H2C 完成外部 NUS GATT 5/5;trace 证明旧 24-byte ATT PDU 在默认 MTU 23 被 L2CAP 拒绝,合法 17-byte PDU 命中 ATT/Python/notify/Bumble ACK。post-pass teardown EIO 单独记录
Core2 native HCI HCI-4 qemu-unified/profile=core2-native-hci;tests/uiflow2/core2_native_hci/run_service_5x.py;evidence-2026-10-24-hci4-service-5x.json 五个独立 /api/v1 lease 均通过 frame、27 节点 QOM、WiFi/公网、外部 NUS GATT、pcap 和 evidence ZIP;gdb_bridge=false;新 runner 在首 lease 前冻结资产哈希并在结束时拒绝静默资产漂移
Core2 extended-run failure history run_service_5x.py --hold-seconds;evidence-2026-10-24-extended-run-fail.json 历史 PC=0、semphr_give_wrapper 和 Cache-error 失败保留;被 halt-gated 修复证据取代
Core2 extended-run CORE2-02 0005-*.patch;run_service_5x.py --hold-seconds 10;evidence-2026-10-24-hci4-halted-gate-5x.json 两批独立 5×10s hold 合计 10/10;每轮 frame/QOM/WiFi/公网/NUS GATT/pcap/evidence 与 HLI health 全部 PASS
Core2 60-second hold run_service_5x.py --hold-seconds 60;evidence-2026-10-24-hci4-hold60-3x.json 3 个独立 lease 3/3;BLE peer 正常关闭后设备保持 running,HLI errors 与队列深度为零
Core2 120-second hold run_service_5x.py --hold-seconds 120;evidence-2026-10-24-hci4-hold120-2x.json 2 个独立 lease 2/2;每轮 frame/QOM、WiFi、公网、NUS GATT、pcap、evidence 和 HLI health 均 PASS,peer-close queue-full 尾态单独分类
Core2 active-BLE 120-second hold run_service_5x.py --hold-seconds 120 + network.ble_linger_seconds=180;evidence-2026-10-24-hci4-active-ble-hold120-2x.json 2 个独立 lease 2/2;peer 在 hold 完成时仍连接,peer-closed=0、TX queue 和 last error 均为 0
Core2 active-BLE 600-second hold run_service_5x.py --hold-seconds 600 + ble_runtime_limits.py;evidence-2026-10-24-hci4-active-ble-hold600-2x.json 2 个独立 lease 2/2;peer 在 600 秒结束时仍连接,HLI 45/45、peer-closed=0、TX queue 和 last error 均为 0
Core2 active-BLE 7200-second diagnostic hold run_service_5x.py --hold-seconds 7200;evidence-2026-10-24-hci4-active-ble-hold7200-diagnostic.json WiFi/公网/GATT/frame/pcap 保持两小时且 HLI health 正常;QEMU 在 run 中被重编,旧 runner 未冻结启动哈希,因此仅 DIAGNOSTIC_PASS;新 runner 已加入输入哈希绑定与 RSS 采样
Core2 artifact-bound 7200-second hold(历史未限容) run_service_5x.py --hold-seconds 7200;evidence-2026-10-24-hci4-active-ble-hold7200-artifact-bound-1x.json firmware/ELF/QEMU 在首 lease 前冻结且无运行期漂移;frame/QOM、WiFi、公网、GATT、pcap、HLI 45/45 与清理 PASS。QEMU host RSS 744160→1202176 KiB,后续归因到未限容 TCG translation buffer
Core2 bounded TCG memory platform/tools/qemu_accel.py;run_service_5x.py --hold-seconds 120;evidence-2026-10-24-hci4-tb128-hold120-1x.json tb-size=128 后 120 秒 WiFi/公网/GATT/frame/pcap/HLI 全 PASS;RSS 323600→323584 KiB、phys footprint 214016→196608 KiB;最终 7200 秒限容门禁独立保留
Core2 final bounded 7200-second hold run_service_5x.py --hold-seconds 7200 --attempts 1;evidence-2026-10-25-hci4-active-ble-hold7200-tb128-artifact-bound-1x.json 1/1 artifact-bound lease;bounded_tcg_cache、frame/QOM、WiFi/公网、active NUS GATT、pcap、HLI 45/45、active peer、evidence 和 cleanup 全 PASS;240 个资源采样 RSS 323536→252992 KiB、phys footprint 250880→188416 KiB,输入与工具哈希无漂移
Core2 PSRAM/QOM and bank switch device_service.qemu_runtime_memory();0030-core2-eight-mib-psram.patch;tests/firmware/core2_psram_himem/ CLI -m 0 与 QOM-effective 8 MiB 分开记录;普通 DRAM1 heap 保持 4 MiB,upper-bank esp_himem MMU remap 3/3 PASS;物理 cache/PSRAM 仍为 NOT RUN
Core2 flash/IPC timer diagnostic tests/firmware/core2_flash_ipc/;run_test.py;evidence-2026-10-26-core2-flash-ipc-wdt.json;evidence-2026-10-26-core2-ccompare-equal-deadline.json;0033-esp32-s32c1i-trace.patch 与 0034-xtensa-ccompare-equal-deadline.patch 最小 probe 捕获到 ISR 写入 CCOMPARE == CCOUNT 后旧 QEMU 安排 2^32 ticks;0034 只把相等期限安排到下一 cycle,trace 开/关和 shift=5/auto 对照通过首启动门禁。早期 4096-byte 局部 buffer 放在 4096-byte task stack 导致错误断言,证据已明确撤销;通过率、哈希和逐轮分类只看 evidence/验证台账
Core2 stateful SSI/QIO include/hw/ssi/ssi.h、hw/ssi/ssi.c、hw/block/m25p80.c、hw/ssi/esp32_spi.c;0036-ssi-transfer-buf.patch;evidence-2026-10-26-core2-ssi-transfer-buf.json 新增可选 byte-buffer SSI 接口;m25p80 只在 STATE_READ 批量读取并保留 CS/command/address/dummy/wrap 状态,ESP32 SPI 只在 receive-only data phase 使用。批量字节等价与 Core2 UIFlow2 设备组通过;normal-WDT startup 后续由 0095 单独关闭。该补丁仍是数据面优化,不关闭 setup/REPL 或任意应用路径
Core2 unified handoff timeline include/hw/misc/esp32_handoff_trace.h、cross-core、DPORT、TIMG、UART、ESP32 SPI;0037-esp32-handoff-trace.patch;tests/firmware/core2_handoff_trace/ 默认关闭的 M5SW_ESP32_HANDOFF_TRACE 统一记录 virtual time、CPU、guest PC 与四个事件值;timeout/int/reset 始终记录,常规事件可采样。早期 normal-WDT 配置观察到最后 feed 后 800 ms timeout,WDT-disabled sample=1024 与 trace-off Serial 相同;该 800 ms 现象已在三次当前 liveness 配置中标记为未复现而不是当前根因。audit_elf_bin_mapping.py 证明 local UIFlow2 v2.5.3 ELF 在三个 CPU0 采样地址上与 public legacy v1.15.4 BIN 字节不一致。0037 关闭“缺少统一时间轴”前置条件,后续 normal-WDT startup 由 0095 闭环
Core2 exact-time handoff freeze hw/misc/esp32_dport.c;0038-esp32-handoff-pause.patch;M5SW_ESP32_HANDOFF_PAUSE_NS;evidence-2026-10-26-core2-handoff-pause.json 在指定 QEMU virtual time 输出 pause marker 后 SIGSTOP。14.800 s 早窗口无固定 PC;15.301 s 晚窗口 CPU0 0x40087980 / CPU1 0x40084484,BIN 源码形态匹配 Flash block/cache handshake。不启用 PC sampling,不改变 WDT/controller;仍未证明具体未返回操作
Core2 exact-time state sweep and phase profile 0039-esp32-handoff-state-dump.patch;run_pause_sweep.py;evidence-2026-10-26-core2-handoff-state-sweep.json;evidence-2026-10-29-core2-preboot-phase-profile/summary.json pause 前直接记录 CPU、DCACHE handoff flag、DPORT cache control、cache-sync、SSI 和 cross-core counters;PAUSE_ACTION=exit 允许每个独立 lease 采一个 virtual-time 点。--capture-frame 在状态快照后 SIGCONT 并立即 QMP screendump;--pc-sample-ns、--uart-trace 和 phase_profile 把 PC 热点、串口虚拟时间及采样 SSI command event 绑定到同一 evidence。早期 14.8/15.3/15.9 s 中 CPU0 等待与 CPU1 变化并存;最新 80 s WDT-off profile 已知 SSI transaction/RX 聚合总数和 108 个采样 begin event,但没有全量 command/length 直方图,不能把采样外推成“约十万次 64-byte read”或把立即切核控制写成修复
Core2 IPC/flash handoff stack attribution run_pause_sweep.py --trace-sample;M5SW_ESP32_HANDOFF_STACK_WORDS;M5SW_ESP32_HANDOFF_OBJECT_WORDS;evidence 同一 normal-WDT 17.2 s 三次 freeze 的 CPU0 均位于 0x40087980..8e flash block wait,稳定栈匹配 spi_flash_op_block_func/ipc_task source shape;CPU1 在 IPC 与启动调度路径间变化。--trace-sample 1 的 2 秒控制将 13 对 begin/end 绑定为同步 0 ns,阻止把 1024 分频后的不同事务误配成 0.4 秒事务。名称仍是 BIN-bound source-shape,不冒充 exact ELF
Core2 flash handoff episode budget target/xtensa/op_helper.c、target/xtensa/translate.c;0089-xtensa-handoff-pc-trace-io-boundary.patch;run_pc_trace.py;evidence 默认关闭的 BIN-bound PC trace 现在在匹配 PC 前调用 translator_io_start() 并用 can_do_io fail-safe,消除 deterministic -icount 的 Bad icount read。两次 normal-WDT 运行将四个 setter 配对为 block wait、ready→complete、complete→下一次 block 等阶段;reset 前约 12.6k 个正常 handoff,block wait 累计约占 57%,单次最大小于 6.8 ms,否定单个长 handshake deadlock。仍是诊断工具,不改变 guest/wdt/peripheral 行为
Core2 per-vCPU icount fairness budget platform/tools/qemu_accel.py;accel/tcg/icount-common.c、accel/tcg/tcg-accel-ops-icount.c;0090-icount-percpu-fairness-cap.patch;run_pc_trace.py --ipc-phases;evidence Core2 deterministic 双 vCPU 默认把每个 round-robin slice 限制为 10 us,可用 M5_CORE2_ICOUNT_MAX_PERCPU_NS=0 关闭。同 trace A/B 将 CPU1 initiator can_start→IPC return 从 563.7 us 降到 56.2 us、peer block wait 从 728.4 us 降到 184.7 us。它只修复调度公平性;后续 0095 才关闭 normal-WDT reset
Core2 TIMG watchdog feed rescheduling hw/timer/esp32_timg.c;0091-esp32-timg-feed-reschedule.patch;test_esp32_timg_wdt_reschedule_patch.py;evidence watchdog arm 从 timer_mod_anticipate_ns() 改为 timer_mod_ns(),使成功 WDTFEED 能替换可能更早的后续 stage deadline,同时不关闭 WDT 或修改 timeout/config。该里程碑的 15.56 s stage-1 reset 后续由 0095 关闭;本 patch 仍只负责 timer replacement 语义
Core2 WiFi IRQ cache handoff gate hw/misc/esp32_dport.c、hw/xtensa/esp32_intc.c、hw/xtensa/esp32.c;0092-esp32-wifi-irq-cache-gate.patch;test_core2_wifi_irq_cache_gate_patch.py;evidence DPORT 将每个 CPU 的 instruction-cache-ready 状态送入 INTMATRIX;cache disabled 时只暂存 WiFi MAC level,恢复后重放。cross-core、timer 和 cache-illegal source 不受门控。同固件不再出现 cached ISR access;该里程碑后续的 normal-WDT reset 由 0095 关闭,setup/REPL 和完整应用仍另验
Core2 classic WiFi station timing/data hw/misc/esp32_wifi_ap.c、hw/misc/esp32_wifi.c、hw/misc/esp32_wlan_packet.c;0093-esp32-classic-wifi-virtual-time.patch、0094-esp32-classic-wifi-station-data.patch;test_core2_classic_wifi_runtime_patches.py;device_service.apply_qemu_wifi_environment;evidence beacon/inject/802.11 timestamp 使用 virtual time;station 的 association、DHCP request/reply 和双向 host data 统一走 Ethernet/slirp,收到 DHCP reply 后进入 STA_ASSOCIATED。Service 的 SSID/password/auth 同时传给 classic 与 S3 WiFi NIC。该里程碑后的 legacy normal-WDT reset 已由 0095 关闭
Core2 legacy WiFi stub menu path .work/runtime03-wifi-stub-assets/;run_pause_sweep.py;evidence 只把 wifiWebCfg.config_by_web 替换为返回 true 的 guest stub,不修改 panel/DMA/QOM 输入;同一 legacy firmware 在 WDT-off 诊断 lane 到达完整 App/Flow/Setup 菜单帧(76,760 nonblack、417 colors)。后续真实 deviceCfg 与 normal-WDT 路径由 0095 记录到 API Key/Wi-Fi Connect 页面;REPL 与任意用户应用仍 OPEN
Core2 handoff setter PC trace 0040-xtensa-handoff-pc-trace.patch;run_pc_trace.py;evidence-2026-10-26-core2-handoff-pc-trace.json 默认关闭的 M5SW_XTENSA_PC_TRACE 只记录显式 BIN-bound PC。complete/can-start set/clear 四个 setter 在首轮 reset 前各命中约 4,377 次,stage-0 WDT 首次 timeout 为 5.913935 s、reset 为 15.914787 s;证明 cache handoff 反复完成,不再支持简单永久 deadlock。该 trace 默认关闭且不绑定 ELF 符号名
Core2 legacy status/CAS correlation include/hw/misc/esp32_handoff_trace.h、hw/misc/esp32_dport.c、hw/ssi/esp32_spi.c、target/xtensa/op_helper.c、target/xtensa/translate.c;0075-esp32-legacy-status-cas-correlation.patch;test_core2_legacy_status_cas.py;evidence 默认关闭的诊断记录 RDSR 状态、前序 0xBB/64、cache delta、PS/IRQ 和有界 s32c1i caller/lock/old-owner/holder-PC。20 秒 WDT-off 控制证明 status bit0 与 illegal cache read 均为 0,主要预算位于 scheduler/list 锁竞争;normal-WDT 与 failed-CAS slice-yield 都在约 17.249 秒触发同一 stage-1 reset。BIN-bound PC 不冒充 legacy 符号
Core2 contended-CAS episodes include/hw/misc/esp32_handoff_trace.h、hw/misc/esp32_dport.c、target/xtensa/op_helper.c;0086-esp32-legacy-cas-episode-profile.patch;run_pause_sweep.py、test_core2_legacy_status_cas.py;evidence 默认关闭 trace 按 CPU/lock 聚合跨核 CAS 的 attempt、duration 和 gap,no-I/O TB 中跳过不安全时钟采样。BIN 控制流与 public IDF 3.3.5 匹配到 xTaskQueueMutex、xTaskIncrementTick、vTaskSwitchContext 和 queue mux;failed-CAS yield 在 10 秒减少 task-queue 等待,但 15 秒时等待转移到 queue mux,WDT reset 不变。名称仅为 source-structure 匹配,不改变 guest 锁语义或默认调度
Core2 contended-CAS RR attribution accel/tcg/tcg-accel-ops-rr.c、include/sysemu/cpu-timers.h、target/xtensa/op_helper.c;0088-xtensa-contended-cas-fair-yield.patch;test_core2_legacy_status_cas.py;evidence 默认关闭;真实跨核 failed S32C1I 退出当前 slice,并把下一个单线程 RR quantum 从 100 ms 缩到 1 ms。同 binary 5 秒 A/B 将 CAS/contended/episode time 从 1,070,625/984,964/2.240 s 降到 91,465/2,702/1.018 s,SSI 0x05/0xBB 数量近似不变。它证明调度放大器,不单独关闭 normal-WDT;该 reset 后续由 0095 修复
Core2 WDT liveness run_wdt_liveness.py;evidence-2026-10-26-core2-wdt-liveness-3x.json;test_core2_wdt_liveness.py 三次独立 18 秒运行关闭 PC trace、启用 TIMG verbose trace:TG0 stage-0 在约 5.91 s 被 mask,TG0 stage-1 在约 15.91 s 触发首次 reset;TG1 完成 6,618-6,807 次 feed,最大相邻间隔 8.478-10.410 ms,最后 feed 距 reset 1.779-4.271 ms,0 次 TG1 timeout,且 stage-0 后没有 TG0 feed/reconfigure/protect 写入。当前分类为 BOOTLOADER_TG0_STAGE1_RESET_WITH_TG1_LIVE;历史 800 ms gap 记为 NOT_REPRODUCED
Core2 WDT-off late state 0041-esp32-handoff-register-stack-dump.patch;run_pause_sweep.py --disable-wdt;evidence-2026-10-26-core2-wdt-off-late-state.json;test_core2_wdt_off_late_state.py 默认关闭的 M5SW_ESP32_HANDOFF_STACK_WORDS 增加 A0-A15、PS、对象指针和最多 64-word stack dump。45/120 秒独立 lease 均停在 CPU0 0x4026306e waiti idle、CPU1 0x40100049 spin;Flash/SSI 活动约 44 秒结束。BIN-bound 分析确认 A2 是 lv_disp_buf_t、A2+24 是 flushing=1,A10 是 display driver、A10+28 是空 wait_cb
Core2 LVGL/SPI completion diagnostic 0042-esp32-spi-trans-done-irq-diagnostic.patch;evidence-2026-10-26-core2-lvgl-spi-wait.json;test_core2_wdt_off_late_state.py 补 SPI_SLAVE.TRANS_DONE/TRANS_INTEN 与 SPI IRQ level,并增加 bounded object-word dump。0x40100010 绑定为 LVGL lv_refr_vdb_flush,display flush_cb=0x40174758 在 WDT-off 中执行,但 completion 0x40174884/lv_disp_flush_ready 未出现。normal-WDT reset 后续由 0095 关闭;display completion 仍是独立诊断项
Core2 pending SPI IRQ remap 0064-esp32-intmatrix-pending-irq-remap.patch;tests/firmware/core2_spi_irq_remap/;test_core2_intmatrix_pending_remap_patch.py 保存 INTMATRIX 输入 level,在 source/mapping 变化时重算 CPU outputs,并把 SPI IRQ 绑定到 TRANS_DONE && TRANS_INTEN;独立 guest probe pre-fix timeout、fixed 3/3 PASS。该 patch 只关闭通用 completion 子缺口;后续 normal-WDT startup 由 0095 闭环,任意 display/application completion 仍单独验证
Core2 high-priority DPORT handoff 0065-xtensa-high-priority-irq-cooperative-yield.patch;Unit bootstrap forward port qemu-unit-runtime/0003;target/xtensa/;accel/tcg/tcg-accel-ops-icount.c;test_xtensa_high_priority_irq_cooperative.py 记录每 CPU 的 level-4/5 handler;handler 在 memw 发布 start 后、sender 在 retw end 路径协作让出;RFI/reset 清 active。guest 指令、virtual time 和 IRQ level 不变;五轮首启动到同一 5 s early-state 边界并越过旧固定双 PC
Core2 classic ESP32 RMT 0066-esp32-classic-rmt-legacy.patch;Unit bootstrap forward port qemu-unit-runtime/0004;hw/m5stopwatch/m5_rmt_classic.c;hw/xtensa/esp32.c;test_esp32_classic_rmt_patch.py 替换未实现 region;模型 8 channel、寄存器/2 KiB RMTMEM、mem_size、memory TX、threshold、TX_END、INTMATRIX 47 和有界 capture。legacy Neopixel 初始化不再报 translator OSError,trace 捕获 channel 7 × 49 symbols;不证明 GPIO waveform/电气时序
Core2 legacy timing/cross-core diagnostic hw/misc/esp32_crosscore_int.c、hw/misc/esp32_dport.c、target/xtensa/;0035-esp32-timg-wdt-int-ena.patch;0095-esp32-legacy-wdt-level-delivery.patch;evidence-2026-10-26-core2-qio-crosscore-diagnostic.json 0035 是保留的历史 masked-status 尝试;0095 指出 legacy IDF 的 task WDT 依赖 WDTCONFIG0.LEVEL_INT_EN 而不写 INT_ENA.WDT,因此只让 WDT level line 在 level enable 时跟随 raw,同时保持 INT_ST 和其他 TIMG source 的 mask 语义。三次 normal-WDT Device Service 运行越过原 stage-1 reset 并稳定到 guest virtual 300 秒以上
Core2 legacy shared I2C bus hw/m5stopwatch/m5core2.c;0031-core2-shared-board-i2c.patch;M5SW_I2C_CTRL_TRACE=1;evidence-2026-10-25-core2-shared-board-i2c.json Port trace 证明旧固件在 controller 0 上访问 AXP/RTC;两个 controller 现共享 GPIO21/22 板级 bus,0x34/0x51/INA 0x40 均 ACK,原 I2C error 消失。后续 interrupt-WDT 与 black frame 仍为 OPEN;现有 Core2 UIFlow2 设备组保持通过
Core2 legacy WDT timing hw/timer/esp32_timg.c;0032-esp32-timg-wdt-trace.patch;M5SW_TIMG_TRACE=1;evidence-2026-10-25-core2-wdt-timing.json 默认单会话可持续 feed;并发 lease 会出现 CPU/PC 不固定的 interrupt-WDT。thread=single、thread=multi 和 icount shift=0/5 均不能稳定修复,thread/icount 对照还暴露 TG hardware reset。当前调查点是长同步启动阶段与虚拟时间/宿主调度的组合;数量和哈希只查 evidence/验证台账
Core2 guest PSRAM sustained stress tests/uiflow2/unified_core2/main.py;run_service_5x.py --require-psram;evidence-2026-10-25-core2-psram-sustained-8m-3x120.json 3 个独立 120 秒 lease 各完成 35 次 1 MiB 全缓冲校验(累计 105 MiB),同时执行 30 次受控 HTTP、10 次公网 recheck 并保持 active BLE/frame/QOM/pcap;QOM 8 MiB,物理 cache timing 不在结论内
Core2 guest PSRAM 600-second stress run_service_5x.py --require-psram --hold-seconds 600 --attempts 1;evidence-2026-10-25-core2-psram-sustained-1x600.json;pcap summary 单 lease 600 秒完成 179 次 1 MiB 全缓冲校验(约 179 MiB)、51 次受控 HTTP、18 次公网 recheck;active BLE/HLI/bounded TCG/frame/QOM/912-packet pcap/evidence/cleanup PASS;物理边界不变
Core2 concurrent unified leases run_service_5x.py --attempts 2/3/4/5/6/8 --concurrency 2/3/4/5/6/8 --stagger-seconds 0/30 --hold-seconds 60/120;unified_http_guestfwd.py;qemu_accel.py 固定 shift=5;0007 valid-queue gate;0008 guest event/ACL preallocation;0009 8/4 expanded reserve;0010 ACK-state observability;二至八实例 focused tests;2026-10-30 九实例容量边界 当前服务容量内的并发门禁覆盖双实例到八实例,包含零错峰和错峰、固定 shift=5/BLE-first、PSRAM、WiFi/公网、GATT、frame/QOM、pcap、HLI health 和失败 control。当前 tool hash 的两批 2x60s 为 4/4 PASS,网络重检最多三次且 PSRAM/network error 分字段。九实例两次 9/9 后出现一次 8/9 NimBLE ACK panic,runner 和默认 capacity 均保持 8。具体批次、通过率、资源数值和 transient 只查验证台账与 evidence;当前宿主负载下的八实例 cold-start 重绑、持续吞吐和其他 teardown 不继承
Core2 same-guest reconnect ble_runtime_limits.py:reconnect_workload_timeout_seconds;run_service_5x.py --ble-reconnect-cycles 20/30/60/120/121;ble_probe.py --reconnect-cycles;test_ble_probe.py;test_ble_runtime_limits.py;test_device_service.py;0006-esp32-native-hci-observability.patch;20/30/60/120 轮、两个 121 harness failure 和 121 three-lease PASS evidence 3 个独立 stock-firmware lease 各完成 20、30、60、120 轮;120 轮每 lease HLI 3377/3377、events 2297、ACLs 1080;参数范围 1–121,122 拒绝。修复固定 readiness 预算和 reconnect-only accelerator 采样后,3 个独立 lease 均完成 121/121,同 firmware/ELF/QEMU/工具哈希
Core2 evidence binding run_service_5x.py:tool_hashes;qemu_accel.py;ble_runtime_limits.py;五/六/八实例 focused tests;test_qemu_accel.py;test_docs_core2_runtime_contract.py runner 在首 lease 前记录工具哈希,运行期对 firmware/ELF/QEMU 做漂移检查;每轮同时断言 bounded tb-size=128 和实际 icount shift=5。五/六/八实例证据还锁定原始 JSON SHA;八实例 control 绑定旧 runner hash,证明阈值是唯一变更。该机制只绑定本轮实现,不替代设备功能或物理等价证据
GDMA external memory + full matrix tests/uiflow2/evidence-2026-10-24-gdma-external-memory-matrix.json AES/GDMA 外部内存修复后 67/67、274/274,全部首轮无重试
Dual-guest WiFi + latest full matrix tests/uiflow2/evidence-2026-10-24-dual-guest-fabric-matrix.json patch 0028 后 67/67、274/274;Cardputer-ADV 键盘 settle 加固后所有 case 首轮 PASS
S3 WPA2-PSK data plane patches/qemu-m5stack-peripherals/0029-esp32s3-wpa2-psk-data-plane.patch;tests/firmware/openai_nvs_precondition/run_test.py;tests/uiflow2/evidence-2026-10-25-s3-wpa2-regression.json WPA2 RSN、M1-M4、正确/错误密码、CCMP RX、eFuse/NIC MAC 绑定和 unicast DHCP;三组 Device Service session 均绑定同一 OpenAI BIN SHA,AtomS3R/StickS3/CoreS3 定向矩阵 15/15 PASS
Firmware redacted review tests/firmware/evidence-2026-10-23-static-review.json URL/访问凭据脱敏、高熵块指纹、SBOM 和真实公开固件 round-trip
Firmware license policy tests/firmware/evidence-2026-10-24-license-policy.json 声明来源汇总、allowlist/denylist、REVIEW/REJECTED 边界;不是完整源码扫描或法律意见
Filesystem inventory tests/firmware/evidence-2026-10-24-filesystem-inventory.json StickS3 sys/vfs LittleFS 文件、大小、哈希和分区摘要
FAT inventory tests/firmware/evidence-2026-10-24-fat-inventory.json 合成 FAT12/16/32、LFN、循环链、多簇哈希、敏感路径、erased partition 与真实 PaperColor FAT12 样本
SPIFFS inventory tests/firmware/evidence-2026-10-24-spiffs-inventory.json 8 个声明配置的自包含多索引样本、LUT mismatch/随机损坏负例、ESP-IDF canonical spiffsgen.py 镜像和 manifest 脱敏
Resumable artifact upload tests/firmware/evidence-2026-10-24-streaming-artifact-upload.json; DeviceServiceUnitTests.test_streamed_*; DeviceServiceHttpTests.test_streamed_artifact_http_upload 连续 offset、per-chunk/final hash、失败 append 回滚、resume、abort 和 abandoned staging GC
WebBurner browser intake platform/web/firmware.html; platform/tests/test_firmware_upload.mjs; tests/firmware/evidence-2026-10-24-webburner-ui.json 9.44 MiB / 3 chunk、浏览器 SHA256、进度重试、刷新续接、取消清理和 WebBurner ZIP → manifest import
Manifest 公共样本/WebBurner firmware_manifest.py;test_firmware_manifest.py;evidence-2026-10-24-public-manifest-web-conformance.json 同一公开固件的 merged 与 WebBurner 输入规范化到同一 artifact hash;camera-on-StickS3 结构化拒绝;安全证据分层和 HTTP import PASS
WebBurner part integrity firmware_manifest.py:_web_part_integrity;firmware_manifest.schema.json;webburner_part_integrity/run_test.py;evidence-2026-10-25-webburner-part-integrity.json parts[] 可选 size/SHA-256/SHA-1/MD5 流式复算;mismatch、非法 digest、冲突声明或未知 integrity 字段在规范化前拒绝;成功 manifest 记录算法集合和 weak-digest 标志,不声称签名或发布者认证
Image capability observation tests/firmware/image_capability_observation/run_test.py;unknown_required_capability/run_test.py;test_unknown_required_capability_evidence.py;test_firmware_manifest.py;evidence-2026-10-25-image-capability-observation.json;evidence-2026-10-26-unknown-required-capability-fail-closed.json 无 sdkconfig 的公开 StickS3 Weather 镜像观察到 wifi/display;required wifi PASS,required camera 仍结构化拒绝;未知 required capability 在 merged/WebBurner 两条路径均 fail closed,未知 optional 仅 warning;observed entry 固定 low-confidence,不冒充运行态能力使用
Public artifact refresh invariant user_firmware_matrix.py:download_candidates;test_user_firmware_matrix.py;firmware-manifest.md 每个 matrix run 重新解析公开版本并 force=True 下载;同 firmware/version ID 的缓存不能证明当前 CDN 内容;新 SHA 必须重新执行 Device Service 才能继承功能结论
SD media fixture platform/tools/sd_image.py;test_sd_image.py;Device Service storage.sd_image_artifact_id 纯 Python 生成确定性 FAT32+MBR 或 FAT16 superfloppy raw image;Device Service 拒绝无 SD 模型的设备,校验 512-byte 对齐,复制到 session 后重新哈希并以 writable if=sd 挂载
NVS partition fixture platform/tools/nvs_image.py;test_nvs_image.py;Device Service nvs.image_artifact_id 生成与 ESP-IDF generator 逐字节一致的 NVSv2 namespace/string 数据;服务按固件分区表校验 label/offset/size,只覆盖 session Flash 副本并记录 base/effective SHA
Core2 legacy deviceCfg WiFi fixture platform/tools/legacy_device_config.py;test_legacy_device_config.py;Device Service legacy_wifi_config_applied 只接受 Core2 qemu-wifi 的完整 legacy config schema/checksum;只改 session Flash 副本,记录 hashed SSID/base/effective SHA,不记录明文密码;其他固件逐字节不变
OpenAI first-boot NVS precondition tests/firmware/openai_nvs_precondition/run_test.py;evidence-2026-10-25-openai-nvs-precondition.json 公开 BIN 的 NVS 全空;Open 与正确 WPA2-PSK 都完成关联、DHCP、api.openai.com DNS 与 TCP/443;WPA2 路径完成 M1-M4 和成对密钥 CCMP,错误密码在 M2 MIC 被拒绝且无 DHCP
SHA-bound network-first expectation user_firmware_matrix.py;user_firmware_expectations.schema.json;test_user_firmware_matrix.py;evidence-2026-10-25-network-first-review-expectation.json UI/headless/network-first 由 device/firmware/SHA 绑定;required/forbidden markers、network status、expectation 与 NVS digest 同 result key;OpenAI 无需 frame 即完成 guest 联网 marker、DHCP、DNS、TCP/443、pcap 与 stop cleanup
Refreshed public artifacts functional user_firmware_matrix.py;test_user_firmware_matrix.py;evidence-2026-10-25-refreshed-four-functional-sd-mbr/evidence.json;evidence-2026-10-25-openai-nvs-precondition.json 4 个当前公开 BIN 的 Device Service 结果为 3 PASS / 1 PARTIAL;XiaoZhi/EDC/CrossPoint 达到 frame/input 层 PASS;OpenAI 的 UI/input 规则仍为 PARTIAL,但空 NVS、WPA2 与错误密码前置条件已分层验证
跨厂商公开固件 runtime matrix user_firmware_matrix.py;test_user_firmware_matrix.py;S3/C6 与 Core2 evidence 7 台设备、21 个公开样本;10 PASS / 11 PARTIAL;Core2 AWS ATECC608 初始化已单列关闭,但样本仍因 BMI270 等独立边界为 PARTIAL;C6 Zigbee 继续归类为 runtime_model_gap
C6 Zigbee thread-sim 可行性 tests/firmware/c6_zigbee_thread_sim/run_feasibility.py;evidence-2026-10-24-c6-zigbee-thread-sim-feasibility.json 双实例 UDP relay 观察到双向 802.15.4 帧,但 commissioning/join 未完成;结果为 PARTIAL/runtime_model_gap
运行时模型缺口登记 runtime-model-gap-register.md;C6 Flash/PMP patches;Core2 flash-IPC/QIO/cross-core/WDT-liveness/late-state 探针;timer/WDT-level/stateful-SSI/handoff-trace patches;pending SPI/INTMATRIX remap;high-priority IRQ 与 classic RMT;ATECC608/classic-DMA;LVGL/SPI diagnostic;跨厂商与修复 evidence RUNTIME-01、RUNTIME-03、RUNTIME-04 和 RUNTIME-05 已关闭;RUNTIME-03 的虚拟设备范围包括 DPORT deadlock、Neopixel RMT、classic WiFi、normal-WDT startup、API Key 和 Wi-Fi Connect UI;setup/REPL 与任意 legacy application 转 API-01,物理边界保持独立
网络隔离 tests/network/linux_isolation/ Linux private namespace、无外部路由、pcap
错误密码 P0 tests/network/wrong_password/run_test.py;evidence-2026-10-24-wrong-password-pass.json 6 次 auth/reject、无 DHCP、无 HTTP、固件失败 marker 和 SoftAP wrong-password warning 同次 7/7 PASS
错误密码/radio 重连 network_lane.py、tests/network/reconnect_probe/run_test.py;evidence-2026-10-24-radio-loss-recovery-pass.json radio QOM false→true、scan 1→0→1、双 DHCP、前后 HTTP 200、双侧流 pcap 和同 session 证据
DNS/UDP 数据面 network_lane.py、tests/network/idf_dns_udp/;evidence-2026-10-24-dns-udp-pass.json host-forwarder DNS、host 收到固定 UDP 载荷、guest 收到同载荷回包;不冒充 controlled DNS policy
Core2 WiFi-only deterministic repeat tests/network/core2_openmac_wifi/run_test.py;evidence-2026-10-24-deterministic-5x.json runner 显式传入 tcg,thread=single,tb-size=128 + icount;scan/association/DHCP/HTTP 独立 5/5,不含 BLE/DNS/公网
DNS + TLS/Host allowlist tests/network/tls_allowlist/、QEMU patch 0027 Linux namespace 下允许域名 A/拒绝 NXDOMAIN、TLS CA、允许 200/拒绝 403 和 pcap PASS
UIFlow2 guest IPv6 lifecycle tests/network/ipv6_end_to_end/;test-only patch;evidence-2026-10-24-guest-ipv6-direct-test-build-pass.json;evidence-2026-10-25-ipv6-namespace-aaaa-http-pass.json Direct run 在同一 StickS3 guest 创建 link-local 并完成 IPv6 HTTP;Linux namespace run 进一步由同一 test-build guest 完成 controlled AAAA、allowed HTTP、denied-port、pcap、namespace/QEMU cleanup。原厂 UIFlow2 仍未默认启用 IPv6,结果不等于公网 IPv6 或 RF
Bounded CIDR/dual-stack egress tests/network/egress_allowlist/ nftables 默认 drop、IPv4 CIDR 与 IPv6 exact 地址的允许/拒绝端口/地址、worker→upstream 双栈 veth/NAT、源地址转换、IPv6 neighbor control、namespace/NAT 清理
Controlled domain set network_policy.py;network_sandbox.py;test_network_policy.py;test_network_sandbox.py suffix 只在 DNS label boundary 匹配;exact 优先、最长 suffix 优先;每个 exact/domain/CNAME terminal answer 必须被 allowed endpoint 地址/CIDR 覆盖;IPv4-mapped IPv6 record 拒绝;evilallowy.test 不匹配 allowy.test
HTTP Host authority network_sandbox.normalize_http_authority();ControlledHttp;test_network_sandbox.py;evidence-2026-10-26-host-authority-exact-dns-namespace-pass.json 只接受单一 Host header、可选数字端口、origin-form target 和严格 DNS label;拒绝 userinfo、逗号/multi-colon、越界端口、absolute-form 和重复 Host;Linux namespace 下同一 StickS3 guest 完成 DNS/TLS/DHCP/pcap
Controlled CNAME lifecycle network_sandbox.py;device_service.py;tests/network/dns_cname_chain/;tests/network/cname_guest_lifecycle/ resolver 覆盖最多 8 跳、cycle/权限/冲突;三个独立 lease 由同一 stock UIFlow2 guest 完成 CNAME→terminal A→HTTP、denied-name/port、pcap、namespace cleanup。evidence ZIP 同时带 DNS/HTTP fixture 和 isolation 文件
DHCP renewal tests/network/idf_dhcp_renewal/ guest 调用 renew API;pcap 区分初次 DORA 与后续 REQUEST/ACK,lease/地址/HTTP 联合 PASS
双设备 lab fabric tests/network/lab_fabric/、patches 0028 private namespace 内两台 QEMU guest 完成 DORA、A→B TCP 和双侧 pcap;宿主、公网、metadata、默认路由不可达并按预期清理。QEMU 运行路径是 socket switch;TAP/bridge 是独立 primitive
热门用户固件 platform/tools/user_firmware_matrix.py 公开固件的启动、首帧、输入和串口结果
公共 API /api/v1 Device Service 可观察、可保留的 session/evidence
Worker lifecycle /api/v1/worker、/worker/drain、/worker/resume;platform/tests/test_worker_registry.py stable ID、独占状态目录、heartbeat、generation、drain/resume、active/abandoned lease 和 bounded results;不含远程调度或活动 QEMU re-attach
Remote worker directory /api/v1/workers、/workers/{id}/heartbeat、drain、stop、results;platform/tests/test_worker_directory.py 持久 identity/generation、stale 判定、live-instance 冲突、capability/结果上限和原子 0600 状态文件;不启动、调度或接管 worker
Remote job queue /api/v1/jobs、/jobs/claim、heartbeat、result、cancel;platform/tests/test_worker_queue.py、test_device_service.py、tests/network/worker_claim_idempotency/ 持久幂等任务、capability match、worker lease、expiry/retry、stale/stop/generation 回收、re-claim 后旧 lease result 的 409 fencing 和原子 0600 状态文件;claim 以 identity-bound claim_idempotency_key 支持响应丢失/服务重启后的同 job/lease replay,异请求与过期 lease fail closed;不执行任务、不接管活动 QEMU
Lease-bound evidence store /api/v1/evidence;platform/tools/evidence_store.py;test_evidence_store.py;tests/network/evidence_store/ worker HMAC + live job/lease/generation 绑定;多 MiB ZIP、响应丢失幂等、异内容 409、服务重启后 metadata/content、result evidence ID/SHA 联合校验、0600 内容和有界保留;未证明物理跨主机或对象存储复制
Authenticated worker discovery worker_discovery.py; worker_discovery_seed.py; serve.py --worker-discovery-*; worker_agent.py --discover-control / --discover-control-seed-url; discovery tests active-token HMAC multicast 与 unicast seed beacon、TTL/clock/URL/包上限、零硬编码 control URL bootstrap、错误/旧 token reject、SIGHUP rotation;两个独立 subnet + masquerade 的 seed 路径连续 3/3 PASS
Worker control-plane restart continuity worker_agent.py --control-reconnect-timeout; worker_queue.py result lease binding; tests/network/worker_control_restart/ 初始 runtime=qemu 非网络 session 暴露 nic 未初始化 FAIL 并保留;修复后真实 central/runtime Device Service 分离,central 停止 2.2s 后同 state 重启,worker 重注册、继续 heartbeat、同一 identity/generation/lease 完成 PASS、evidence ZIP、runtime session stop 和 QEMU reap PASS;不覆盖 runtime restart/cross-host migration
Worker runtime-service restart continuity worker_agent.py --runtime-reconnect-timeout / evidence_delay_seconds; device_service.py QEMU + companion recovery; tests/network/worker_runtime_restart/ runtime Service SIGKILL 2.2s 后同 state 重启,同一 session/PID 重新接管;trusted-host unified fixture 重建 HTTP generation 2、adopt 同 BLE peer、完成 GATT cycle 2 和 guest HTTP recheck;worker status/evidence/stop retry,原 job/lease PASS,ZIP 含两代 HTTP/serial/network/pcap,session 与 QEMU/companion cleanup PASS;cross-host/namespace-managed/Tab5 migration 不覆盖
Session-create idempotency device_service.py session-idempotency.json; worker_agent.py job+lease key; tests/network/session_idempotency/ 并发同 key 同请求只建一个 session/QEMU lease;key/request 只存 SHA,异请求 409,service restart 后仍返回原 session;跨主机/跨租户存储 NOT RUN
Worker executor, discovery and rotation platform/tools/worker_agent.py、worker_auth.py、worker_discovery.py、worker_discovery_seed.py、transport_security.py、auth/discovery/executor/TLS tests、tests/network/worker_discovery_seed/、tests/network/worker_partition_fencing/、tests/network/worker_executor/、tests/network/worker_tls/、tests/network/worker_cross_netns/、tests/network/worker_cross_container/ 同主机真实 QEMU job、worker HMAC、evidence ZIP/SHA256 和 terminal result;control/runtime 双 URL 由单测、两个 veth namespace 和三个独立 Docker 容器对验证,central control plane 不接收 session API;QEMU 前绑定 source firmware、normalized artifact 和 QEMU SHA,serial/frame/QOM、terminal result、QEMU reap、namespace/container/bridge cleanup 均 PASS。loopback 真实 HTTPS/mTLS、服务端校验、客户端证书、签名请求、真实 StickS3 QEMU job 和 unified board/WiFi/BLE job over mTLS PASS;SIGHUP rotation、overlap 和自动 migration PASS;trusted-host unified companion continuity PASS;multicast 与 unicast seed discovery、错误/旧 token reject 和 rotation 后重新发现 PASS;network blackhole 后 bounded heartbeat fence、OS process 与真实 QEMU PID stop/reap、lease expiry/requeue 和 retry 各自 3/3 PASS;worker-local qemu-unified lane 另以三次独立运行证明同 session HTTP/BLE/pcap 在 fence 后随 companion 一起终止,fresh retry 完成 unified evidence。QEMU 内 guest/device-controller side effect、物理跨主机 executor、无 reachable seed 的任意 NAT traversal、跨主机 reattach 和 namespace-managed/Tab5/cross-host companion 仍开放
Worker restart integration tests/network/worker_lifecycle/evidence-2026-10-24-pass.json 真实 QEMU session 跨 drain 保持;停止后 drained;SIGKILL 后 generation 2 记录 abandoned lease 并将会话恢复为 interrupted failed;进程组清理 PASS

设备级 PASS 至少要有固件 hash、runtime/profile、输入、串口、frame 和对应 数据面证据。进程启动、版本匹配或单条日志不能单独作为应用 PASS。

Companion recovery boundary

trusted-host unified companion recovery 已闭合:

  • DeviceSession.reattach() 先验证 QEMU PID/start-time、QMP ownership 和 running 状态;
  • HTTP fixture 每次请求原子写入 http-fixture.json,重启后按 profile port 和递增 generation 重建;
  • BLE peer 只在 PID、精确 start-time 和完整 process command SHA256 全部匹配 时 adopt;缺少 ownership 或没有完成证据时 fail closed;
  • unified StickS3 live fixture 在重启后完成 BLE GATT cycle 2 和 guest HTTP recheck,并在同一 job/lease evidence ZIP 中保留两代 HTTP、serial、network 和 pcap。

namespace-managed、Tab5 和 cross-host companion recovery,以及连续外部 evidence stream 仍开放;这些场景不能从 trusted-host PASS 继承。

证据优先级

  1. 同一固件路径的物理硬件验证。
  2. 同一固件路径的 validated virtual-device 验证。
  3. 模型/协议单测和静态分析,只作为实现支撑,不单独发布固件结论。

任何虚拟结果都要标记为 virtual-device validation;RF、功耗、声学、光学、 机械和电气结论不能由当前 QEMU/esp-emu 路径替代。

文档维护规则

  • 当前能力变更:更新 README.md、docs/project-status.md 和对应专题页。
  • 计划或缺口变更:只更新 docs/project-backlog.md 或专项 backlog。
  • 用户交接、代码阅读顺序或工作流摘要变化:先核对当前状态、Backlog 和代码 入口,再更新 docs/engineering-handoff.md;不要把动态计数或逐次运行流水 复制进去。
  • API 变更:同步 docs/device-service-api.md、OpenAPI 和 tests。
  • 设备/外设变更:同步源清单、生成目录、契约、coverage 和矩阵文档。
  • 验证结果:写回测试 evidence 或 agent-work-logs,不要只留在会话里。
  • 新增 runtime_model_gap:同步缺口登记和 Backlog,保留原失败 evidence; 修复后追加新 evidence,不改写当时诊断。
  • 新文档:先登记到 文档导航,并标明它是当前事实、契约、 专题说明还是历史证据。
  • 被推翻的当前结论:在所有当前入口删除旧陈述,在历史页保留原日期并写明 取代关系;不要只在新页面加一句更正而留下互相矛盾的主入口。

公共二进制入口由 platform/tools/uiflow_main_loader.py 以真实UART纯字节码 canary取得会话能力,platform/tools/uiflow_runtime.py区分import派发与应用body, platform/tools/uiflow_package_runtime.py保留真实文件发布与依赖切换; platform/web/uiflow-main-loader.js在托管Web消费者核验同一proof和会话身份。 tests/units/run_main_mpy_runtime.py通过8787验证stock/兼容固件与Web handoff, 实施范围和门禁见公共main.mpy计划。

历史工具来源的离线digest索引在platform/tests/fixtures/historical_tool_provenance.json; tests/units/verify_historical_tool_provenance.py对独立历史Git检出执行逐blob校验, 普通docs CI不下载旧source或运行时附件,详见保留规则。

剩余 Xtensa 本轮最终身份与 10 板/11 例门禁见 浏览器准入证据。 0016 的 qcode/矩阵、0017 的 WASM systimer deadline 和 0018 的 TCA CFG0 锁存/W1C 分别由实际 C 控制验证;最终 46 层完整构建另做全部公开 fixture 的独立 guest 回归。宿主控制、单板准入和正式部署是不同证据层。

本轮 Atom / Stick 独立板接线、Flash 修复和限定运行证据: 接入总结, patches/qemu-m5stack-peripherals/0085..0089、 tests/uiflow2/atoms3_peripherals、stickc_plus2_peripherals 和各独立 UI probe。 无屏浏览器输出由 test_public_qemu_headless_guest.mjs 检查真实 RMT QOM 读回, Dial 转环输入由 test_public_qemu_encoder.mjs 检查固定路径和不回声。

浏览器 UIFlow 源码工作台(实施中)

platform/web/public-uiflow-firmware.js 与 uiflow-workbench-profiles.json 组合官方板级 UIFlow2 基底和明确的编程启动源码;不在宿主解释 Python。 public-micropython.js 通过同 guest UART0 raw-paste 执行源码, public-qemu-runtime.js/public-qemu-engine.js 保持 UART owner、reset epoch、 字节队列、实例取消与真实串口输出。public.js 提供编辑、导入、运行、中断和输出。

platform/tests/test_public_uiflow_firmware.mjs 核组合/来源合同; test_public_micropython.mjs 与 test_public_micropython_ui.mjs 核协议和 UI 所有权边界。 真实浏览器功能分别由 test_public_uiflow_guest.mjs 和 test_public_qemu_buttons_guest.mjs(含 public_qemu_button_pointer.mjs)取证, 源码位于 tests/browser-qemu/uiflow_workbench/。默认静态检查不启动 guest, 所有逐板实际行为、性能与清场结论仍需独立运行,不从 host 合同继承。

tests/browser-qemu/startup_timing/prepare.py 为原固定示例生成只读启动时戳观测器。 源码锁、完整脚本等价与路径合同用于复现已有计时方法;生成与语法检查不授予 guest PASS。