Skip to content

稳定性与发布检查清单 ​

当前系统改进范围与验收边界见系统改进候选与验收状态。本文第11节保留各历史批次原始结果;旧批次“尚未实现/在途”的记录不覆盖最新状态,也不能作为新版本通过证据。

资源六组对照、RTC参考配对和外设物理故障的统一记录方法见资源实测与物理验收记录,其中明确现有长稳脚本的业务和内存字段覆盖范围。

本清单用于每次功能调整、版本发布和现场部署前确认 FastBee-Arduino 在对应芯片上可构建、可部署、可长期运行。

发布前除了脚本检查,还需要人工确认 Web 控制台关键页面:登录后仪表盘状态正常,网络在线,日志无异常告警,文件/配置备份可访问。

部署后登录页

网络基础配置

发布检查推荐按测试金字塔逐层加码:先通过低成本检查,再进入构建、真机冒烟和长期稳定性验证。

测试分层和冒烟流程详见 部署、烧录与测试。本清单只列出发布前必须逐项核对的检查项。

冒烟测试通过后才进入长稳阶段;如果冒烟阶段已经出现认证、网络、版本能力或资源指标异常,应先定位并重刷固件或回滚配置。

1. 本地环境检查 ​

浏览器观察的有效时长 ​

2026-10-04后继修复使test-device-monitor-soak.mjs按首个至最后一个成功样本的单调时钟跨度判定覆盖,同时保留样本数量与空档检查。首次采样等待、截图、导出与清理耗时不能补足观察时长;首次有效样本较晚时,截止时间仅顺延一次,后续失败不会不断重置窗口。已记录的HTTP/SSE/测量失败不会因恢复或时间延长而变为通过。该修复当前待集中回归,尚无新真实长稳结论。

该脚本仍是指定COM15页面布局的辅助观察,保留原30~172800秒边界;它不能代替带制品/配置绑定的设备7天观察器或独立用户试用。不要把不同脚本、候选、失败窗口拼接成一次24h/7d通过。

powershell
powershell -ExecutionPolicy Bypass -File scripts\doctor.ps1 -Port COM6

检查项包括 PlatformIO、Node.js、Git、串口、native 测试工具链和测试目录追踪状态。需要运行 native 测试时追加:

powershell
powershell -ExecutionPolicy Bypass -File scripts\doctor.ps1 -Port COM6 -RequireNativeToolchain

2. 静态检查与 native 单元测试 ​

静态检查覆盖 UTF-8 文本格式、默认配置合法性、i18n 完整性、Web 前端烟测和 Git 空白字符:

powershell
powershell -ExecutionPolicy Bypass -Command ".\scripts\test-all.ps1 -Checks doctor,static -Port COM6"

native 单元测试需要 MSYS2 g++ 工具链,脚本会自动在常见路径中搜索(D:\msys64\ucrt64\bin 等):

powershell
powershell -ExecutionPolicy Bypass -Command ".\scripts\test-all.ps1 -Checks native -Port COM6"

也可以通过环境变量 FASTBEE_NATIVE_TOOLCHAIN_BIN 指定工具链路径。

3. 全版本构建基线 ​

2026-10-03 系统计划的 Web 预算修订 ​

跨文件迁移、运行资源诊断、持续温控和仪表模板等后继候选,与原通过候选相比,有效发布资源由 324,353 B 增至 353,249 B。原 317 KiB 门槛下的失败报告仍保留;清理未引用方法只实测减少约 0.8 KiB,不能把调整预算称作体积优化。

本批增加有界 32 KiB 共用资源额度:基础总量上限 313 KiB,含屏幕模块为 349 KiB;首页 66 KiB、单资源 26 KiB、运行模块 16 KiB、文件数与 DOM 限制保持原值。该修订仍需新候选门禁和九环境 LittleFS 容量验证;设备页面性能、瞬时内存与长期稳定另行实测,不因静态资源通过就标记发布或实物验收完成。

powershell
powershell -ExecutionPolicy Bypass -Command ".\scripts\test-all.ps1 -Checks doctor,static,build,artifacts -Port COM6"

覆盖 9 个发布环境(详细硬件边界和资源上限见 硬件与环境):

环境Flash / PSRAM分区表
esp32-F4R04MB / —partitions/4MB.csv
esp32-F8R08MB / —partitions/8MB.csv
esp32-F8R88MB / 8MBpartitions/8MB.csv
esp32c3-F4R04MB / —partitions/4MB.csv
esp32c6-F4R04MB / —partitions/4MB.csv
esp32c6-F8R08MB / —partitions/8MB.csv
esp32s3-F8R08MB / —partitions/8MB.csv
esp32s3-F8R88MB / 8MBpartitions/8MB.csv
esp32s3-F16R816MB / 8MBpartitions/16MB.csv

所有环境共享统一功能基线,硬件相关能力由具体环境覆盖,运行时功能默认按需启用。

默认配置策略:外设模板和外设执行规则出厂禁用,只有现场完成接线核对后才启用。

4. 部署 ​

普通部署使用统一入口,端口通过参数传入,不依赖 platformio.ini 固定串口:

powershell
powershell -ExecutionPolicy Bypass -File scripts\deploy.ps1 -Env esp32s3-F16R8 -Port COM6

只更新文件系统:

powershell
powershell -ExecutionPolicy Bypass -File scripts\deploy.ps1 -Env esp32s3-F16R8 -Port COM6 -SkipFirmware

只更新固件:

powershell
powershell -ExecutionPolicy Bypass -File scripts\deploy.ps1 -Env esp32s3-F16R8 -Port COM6 -SkipFs

部署前脚本会自动执行:残留进程清理(esptool/python/xtensa 工具链) → 构建缓存完整性检查(libFrameworkArduino.a 缺失或 bootloader.bin 锁定时自动 clean) → Web 资源检测(data/www/*.gz 缺失时自动调用 node scripts/gzip-www.js 生成) → doctor 环境检查。构建失败时自动 clean + rebuild 一次。

其他部署选项:

powershell
# 跳过 doctor(环境已确认过)
powershell -ExecutionPolicy Bypass -File scripts\deploy.ps1 -Env esp32s3-F16R8 -Port COM6 -SkipDoctor

# 仅构建不烧录
powershell -ExecutionPolicy Bypass -File scripts\deploy.ps1 -Env esp32s3-F16R8 -BuildOnly

# 部署后自动打开串口监视器
powershell -ExecutionPolicy Bypass -File scripts\deploy.ps1 -Env esp32s3-F16R8 -Port COM6 -Monitor

5. 设备烟测 ​

powershell
powershell -ExecutionPolicy Bypass -File scripts\smoke-test-device.ps1 -BaseUrl http://<device-ip> -Profile unified -RequireNetworkConnected

如现场要求 MQTT 必须已经完成认证连接:

powershell
powershell -ExecutionPolicy Bypass -File scripts\smoke-test-device.ps1 -BaseUrl http://<device-ip> -Profile unified -RequireNetworkConnected -RequireMqttConnected

烟测用例由 scripts/device-api-test-matrix.json 驱动。-Profile 仅接受 unified,作为命令兼容参数保留,不表示固件产品版本。验证项包括:

分类验证接口
认证登录会话、多会话共存、Bearer token 优先于旧 Cookie
系统/api/health、/api/system/health、/api/system/status、/api/system/info?probe=1(heap/maxAlloc/PSRAM)、/api/system/metrics(memguard 内存守卫)、/api/system/web-runtime、/api/system/capabilities(按环境校验功能开关)
设备/api/device/config、/api/device/info、/api/device/time
网络/api/network/status(status / connected / deviceNetworkType / ipAddress)、/api/network/config
协议MQTT 状态、MQTT 配置、Modbus 状态、协议配置
外设外设列表、外设类型、外设执行规则、执行控件、触发类型、静态/动态事件
配置迁移列表、单文件导出、多文件导出、导入回环
扩展接口文件系统、日志列表/尾部/信息、OTA 状态、规则脚本、按能力暴露的用户/权限及 /api/batch 子请求

6. 长期稳定性 ​

长稳阶段重点看趋势,不只看最后一轮是否成功。若 CSV 中出现耗时持续升高、heap/maxAlloc 持续下降、同一接口间歇失败或认证偶发失效,应先归类根因再决定是修复、降频、关闭高风险功能还是回滚发布。

发布级阈值预设 ​

长稳阈值统一由 scripts/device-stability-thresholds.json 管理。当前发布固件推荐使用 unified 断言集;-StabilityPreset release 会按测试脚本的兼容 profile 选择阈值:

powershell
powershell -ExecutionPolicy Bypass -File scripts\soak-test-device.ps1 -BaseUrl http://<device-ip> -Profile unified -Rounds 100 -StabilityPreset release -RequireNetworkConnected -ReportPath .pio\test-results\soak-unified.csv

通过 test-all.ps1 统一入口时,预设参数会自动透传到 soak 脚本:

powershell
powershell -ExecutionPolicy Bypass -Command ".\scripts\test-all.ps1 -Checks device-soak -StabilityPreset release -SoakRounds 100 -DeviceProfile unified"

如果需要临时放宽或收紧某项阈值,直接传参即可覆盖预设值(脚本会在启动日志中标注来源):

powershell
powershell -ExecutionPolicy Bypass -File scripts\soak-test-device.ps1 -BaseUrl http://<device-ip> -Profile unified -Rounds 100 -StabilityPreset release -MaxP95LatencyMs 8000 -MinHeapFreeBytes 30000

阈值矩阵校验由 scripts/validate-stability-thresholds.js 负责,已纳入 static 检查。阈值文件保留历史 profile 字段以兼容旧报告;新发布环境重点验证 unified、实际芯片资源和运行时内存趋势。

CSV 报告会记录每个接口的状态、耗时、失败原因、heapFree、heapMaxAlloc、psramFree 和 psramTotal。如果出现偶发 503 Low memory,优先查看第一次失败前后的 heap/maxAlloc 和接口名称。

关键参数:

参数默认值说明
-Rounds60循环轮次,发布建议 ≥ 100
-TimeoutSec10单次请求超时(秒)
-RetryCount1瞬态错误重试次数
-DelayMs500请求间隔(毫秒)
-StabilityPresetdisabled阈值预设,release 自动套用 device-stability-thresholds.json 中对应 profile 的发布级门控
-MaxFailureRatePercent0可容忍失败率,0 表示零容忍(preset 已填充时可省略)
-AuthChecksEvery0每 N 轮重新验证登录,0 表示不重复验证

7. 发布产物 ​

powershell
powershell -ExecutionPolicy Bypass -File scripts\build-all-artifacts.ps1 -CleanOutput

dist\firmware\all-latest\manifest.json 会记录环境、版本、硬件、部署命令、文件大小、SHA-256 和 smoke 状态占位。产物命名规则:fastbee-{chip}-F{flash}R{psram}.bin(如 fastbee-esp32s3-F16R8.bin、fastbee-esp32c3-F4R0.bin)。发布前应将真实设备 smoke/soak 结果同步到发布记录。

现场只需要烧录已有发布包时,使用:

powershell
powershell -ExecutionPolicy Bypass -File scripts\flash-release.ps1 -Env esp32s3-F16R8 -Port COM6

这会直接写入 dist\firmware\all-latest 中对应环境的合并镜像(默认波特率 921600),适合恢复被中断的升级或量产烧录。添加 -DryRun 可预览而不实际写入。

8. 现场问题定位 ​

现场排障建议先确认 Web 控制台是否可达,再看仪表盘资源状态,最后定位 MQTT、外设规则和配置文件。

低内存或接口偶发失败时,优先采集:

  • /api/health 或 /api/system/health
  • /api/system/info?probe=1
  • /api/network/status
  • /api/mqtt/status
  • /api/system/metrics(memguard 内存守卫等级、heap 趋势)
  • scripts\soak-test-device.ps1 输出的 CSV
  • 串口日志:python scripts\serial-diagnostics.py COM6 --duration 60

标注带 PSRAM 的环境(如 esp32-F8R8、esp32s3-F8R8、esp32s3-F16R8)应在目标硬件和运行时确认 psramTotal > 0;无 PSRAM 环境不得套用该断言。所有组合都应分别核对内部 RAM、最大连续块、任务栈和运行时降级状态,不能用环境名推断实际内存或稳定性。

9. 故障码与排查手册 ​

故障定位优先使用 include/core/ErrorCodes.h 中的统一错误码,并结合 /api/system/info?probe=1、/api/network/status、/api/mqtt/status、/api/system/metrics、设备日志和串口日志判断。现场记录至少包含:设备 ID、固件版本、PlatformIO 环境、硬件型号、网络环境、故障时间、最近操作、错误码、日志片段和恢复方式。

错误码分段 ​

范围模块典型错误码排查方向
0成功OK—
1-99通用错误ERR_INVALID_PARAM、ERR_TIMEOUT、ERR_OUT_OF_MEMORY、ERR_NOT_SUPPORTED、ERR_NOT_FOUND参数合法性、接口超时、内存余量、功能是否启用
100-199存储/配置ERR_FS_INIT_FAILED、ERR_FILE_NOT_FOUND、ERR_CONFIG_LOAD_FAILED、ERR_CONFIG_SAVE_FAILED、ERR_CONFIG_INVALID、ERR_NVS_WRITE_FAILEDLittleFS 挂载、JSON 格式、NVS 读写、配置写入中断
200-299网络ERR_WIFI_CONNECT_FAILED、ERR_WIFI_DNS_FAILED、ERR_WIFI_MDNS_FAILED、ERR_AP_START_FAILED、ERR_NETWORK_UNREACHABLE、ERR_WIFI_IP_CONFLICTSSID/密码、信号、DHCP、DNS、mDNS、网关、IP 冲突
300-399协议ERR_MQTT_CONNECT_FAILED、ERR_MQTT_PUBLISH_FAILED、ERR_MODBUS_RECV_FAILEDBroker、Topic、鉴权、串口参数、从站地址
400-499安全ERR_AUTH_FAILED、ERR_AUTH_TOKEN_EXPIRED、ERR_AUTH_PERMISSION_DENIED、ERR_SESSION_EXPIRED、ERR_ACCOUNT_LOCKED用户、会话、Token、浏览器 Cookie、账户锁定(以当前能力为准)
500-599Web 服务ERR_WEB_SERVER_INIT_FAILED、ERR_WEB_HANDLER_FAILED、ERR_WEB_PARSE_FAILED、ERR_WEB_UPLOAD_FAILEDAPI 参数、上传包、JSON 请求体、路由注册
600-699系统服务ERR_LOW_MEMORY、ERR_HIGH_CPU_USAGE、ERR_OTA_VERIFY_FAILED、ERR_OTA_INSTALL_FAILED、ERR_GPIO_CONFIG_FAILED、ERR_TASK_CREATE_FAILED内存门控、OTA 包校验、引脚冲突、FreeRTOS 任务创建

常见现象排查 ​

现象优先采集可能原因处理建议
设备不上线/api/network/status、串口启动日志WiFi 配置错误、DHCP 失败、DNS 失败、IP 冲突进入 AP 重新配网,确认路由器、SSID、密码和 IP 策略
MQTT 不在线/api/mqtt/status、Broker 日志服务器不可达、账号密钥错误、Topic 前缀不一致核对服务器、端口、TLS、用户名密码和 Topic
数据不上报MQTT 状态、外设配置、事件日志外设未启用、规则未触发、发布失败先手动读取外设,再验证规则和上报 Topic
命令无响应平台下发记录、设备事件日志messageId 重复、命令格式错误、权限不足核对统一消息包络、命令名、参数和响应 Topic
配置不生效配置文件、API 响应、重启日志字段非法、需要重启、保存失败检查 ERR_INVALID_PARAM 或 ERR_CONFIG_SAVE_FAILED,使用配置迁移功能回退
OTA 失败/api/ota/status、升级日志下载失败、包类型错误、SHA-256 不匹配使用匹配环境的发布包重新升级;4MB 单应用环境不支持 OTA
设备反复重启串口日志、重启原因、heap看门狗、栈溢出、低内存、异常外设禁用最近新增规则/外设,采集重启前日志,检查 ERR_LOW_MEMORY
串口无日志串口号、波特率、供电端口错误、供电不足、固件未启动检查烧录端口、供电、电平和启动脚
传感器数据异常外设配置、接线、I2C/UART 扫描引脚错误、地址错误、供电不稳按外设手册核对引脚、地址、供电和采样周期
长时间运行后异常soak CSV、heap 趋势、日志尾部内存碎片、接口并发、文件写入频繁降低轮询频率,关闭重接口,检查 memguard 等级,复测 heap/maxAlloc
ESP32-S3 红外遥控异常外设配置RMT 驱动冲突(ESP32-S3 已禁用红外库)ESP32-S3 环境不支持红外遥控,改用 ESP32 或 ESP32-C3

现场恢复顺序 ​

  1. 先确认供电、串口日志和启动阶段是否正常。
  2. 再确认 /api/system/info?probe=1 中的 PlatformIO 环境、heap、maxAlloc 和 PSRAM。
  3. 检查 /api/system/metrics 中的 memguard 等级,评估内存压力。
  4. 检查网络状态和 MQTT 状态,区分"设备离线"和"平台未连接"。
  5. 检查最近修改的配置、外设、规则和协议参数。
  6. 如果配置疑似损坏,使用配置迁移功能(/api/config/transfer)导出备份,再恢复默认配置或导入已验证备份。
  7. 如果 OTA 失败,使用 flash-release.ps1 烧录与硬件匹配的已验证发布包,随后重新执行 smoke。
  8. 现场恢复后必须补跑对应版本的冒烟测试,并将故障码、根因和处理方式写入发布记录。

10. 稳定性回归守卫 ​

以下守卫必须随功能修改同步维护,避免并发读取、资源突发和无效网络配置再次造成卡顿或复位:

层机制防什么
测试层native 行为回归:test_static_concurrency.cpp、test_sensor_driver.cpp、test_wifi_network.cpp并发、传感器互斥和 WiFi 恢复逻辑退化
固件层限流 12s 看门狗、HealthMonitor 四级内存保护、AP→STA 自动探测恢复现场失控
规范层代码修改规范「并发与时序临界路径」、资源占用「DRAM 消耗源实测分解」写出同类新问题
部署层FS + 固件同烧;部署后 STA 实测:/api/system/status + 首屏资源并发计时 + 登录接口 + 观察 [STATUS]/[METRICS] 无重启漏验证

不要把某次测试的空闲 heap 或页面耗时作为永久基线。不同板卡、配置和网络环境差异较大,应以同一设备烧录前后的趋势对比、当前阈值配置和完整测试报告为准。

11. 发布证据记录 ​

每次候选版本都应重新生成证据,不沿用历史版本结论。至少记录以下项目:

验证项结果说明
九个发布环境编译待填写保存环境名、结果、RAM/Flash 用量和构建日志
native 与契约测试待填写保存命令、通过数、失败数和报告路径,不手写固定用例总数
Web/API 冒烟待填写每种实际交付板卡至少一台;记录页面、状态码、耗时和失败重试
MQTT / Modbus待填写按本次启用能力测试;未编译或未配置的能力标记为不适用
外设与规则联动待填写使用实际接线验证读值、动作和上报结果
内存降级与恢复待填写验证 active、disabled、no-memory 状态与恢复行为
长期稳定性待填写记录持续时间、重启次数、成功率和 heap/maxAlloc 趋势

验收记录应附固件版本、PlatformIO 环境、设备型号、配置摘要和测试时间。任何失败项都必须保留原始日志、复现条件和处理结论,修复后重新执行受影响项及基础回归。

11.1 板卡改进候选的验收边界 ​

板卡资源策略、注册容量和按需内存的说明见板卡能力与验证边界。新增能力应依次通过本地行为回归、目标固件构建、保全配置部署、实物验证和持续运行;前一级通过不替代后一级。

  • npm run test:host 中的离线浏览器矩阵只使用本机模拟接口,不会证明继电器、电机、传感器或触屏实际正常。命令应答与物理动作反馈分别记录。
  • 构建前后固定源码摘要,归档环境、分区、固件和 Web 的 SHA256;触屏专用 RGB 固件与普通 S3 固件不可因 Flash/PSRAM 容量相同就互换。
  • 复用现有部署脚本与仓库构建锁;串口、构建、Web 发布和文件系统写入串行。已有现场配置优先于公开模板,保留设备身份、用户认证、网络、MQTT、规则和历史数据。
  • 只改应用时优先应用分区更新并验证整个文件系统摘要不变;修改 Web 时才使用保全非 Web 文件的合并流程。需要两者更新时同时核对各自制品,不能烧录默认文件系统抹掉用户配置。
  • 每台设备保存新鲜身份/分区检查,以及本次 written=true、verified=true 的独立写入/回读证据。单纯命令退出成功、历史报告或健康接口一次成功均不足以宣称部署验收。
  • 初次 HTTP 超时只记为连接或响应失败,不立即归因网络或固件;重新确认 MAC、当前地址、请求阶段与同窗口日志,保留失败样本。

11.2 持续运行与内存收益 ​

按同一候选版本和额定配置依次进行 2 小时探索、24 小时混合负载和 7 天候选观察。100 轮或一次短烟测不是 24 小时/7 天。固件或关键配置改变后建立新的观察窗口,不把多个版本拼成连续通过。

至少记录内部空闲堆、最大连续块、最低堆、PSRAM、任务栈余量、守卫等级、启动时长/复位计数、采集有效率、业务计数是否推进及 HTTP 429/正文不完整/认证失败。PSRAM 充足不能补偿内部堆不足;错误样本和采样空档不能删除后重新计算为全通过。

功能内存对照应分别覆盖:编译裁剪、用户关闭、无外设实例、有实例、停用生效后和恢复启用后。用户选择、生效方式、实际初始化和临时降级须区分;不能通过静默关闭已启用功能、定时复位或不断暂停采集维持“稳定”。

24 小时头尾稳定窗口中位数下降不超过 max(2 KiB, 基线的 2%) 可用作初步排查线,但仍需检查单向下降、不可回收对象和 7 天趋势,不是无泄漏证明。最终余量采用各板型实际功能的现有保护线与实测峰值,禁止为了通过验收下调门槛。

触屏手感/显示、真实传感器变化、继电器触点、电机限位及独立用户零代码操作应有单独实物记录。硬件未接入、校准不足或尚未持续到目标时间时明确标记“待验证”,不以后台监测进程已启动替代完成。

11.3 有历史采样设备的维护窗口 ​

文件系统镜像保全只覆盖已经落盘的数据。串口进入 bootloader 会复位,不能保存 RAM 中尚未写入的历史样本;lastFlushSucceeded=true 也不代表当前 dirty=false。维护前记录认证后的历史状态、采样时间、dirty/persisted 与当前固件身份,并在写入前重新检查。

当前正常系统重启会尝试保存历史,但 API 接受重启不等于落盘成功:必须另验保存结果/恢复数据。连续采样下的一次干净快照不是原子冻结证明,应记录检查到进入 bootloader 的间隔及可能存在的采样窗口;没有证据时不得承诺最后一个样本零丢失。不能通过工厂恢复或静默关闭规则、历史功能解决维护问题。

当目标固件未编译历史功能时,404 只记录“接口未开放”,再与该目标的编译能力对应,不能把 404 写成“历史已落盘”。保存源码与测试归档时使用 Git 忽略的私有备份目录;配置、口令和串口原始日志不得进入公开报告。

11.4 观测器本身的验收 ​

内部 DRAM 必须从当前接口实际存在的字段读取:/api/system/status 原始响应的 data.memory.dram8Free 与 data.memory.dram8Largest;观测器先解包 data 后才使用内部的 memory.* 路径。/api/health 的 aggregate heap/PSRAM 不能替代;缺字段、负值、字符串或布尔值应使该样本无效,并与传输错误分开计数。

guardLevel=NORMAL 不等于全部服务已经恢复。同步记录 degraded 和 memoryDegradation,核查 MQTT、Modbus、执行 worker 和可选外设是否仍暂停或等待恢复;不把“内存回升但功能未恢复”记为完整稳定通过。

网络失败记录接口、headers/body 阶段、HTTP 状态、耗时和底层错误码。Node fetch 的超时可能为只读 message 的 DOMException,观测器不得修改原异常并覆盖真正故障;包装异常时保留 cause 和停止标志,落盘前脱敏。先跑缺字段、超时、正文截断、恢复后仍保留失败、身份改变及中断等离线测试,再开启新观察窗口。

观测器版本、部署报告、固件/Web 和现场配置分别固定摘要。主机测试脚本变更不等于设备固件更新;固件构建归档后继续修改脚本时,需要单独记录观测器版本,不能继续宣称工作目录与旧构建全量摘要相同。短测通过不能覆盖此前失败,也不能替代 2h/24h/7d 及物理行为验收。

正式长稳前还要核对脚本允许的最大时长及终态汇总。2026-10-01 本地修复后,两份只读观测器支持 30~604800 秒,采样间隔 10~300 秒;低频观察优先沿用现场既定 60 秒间隔。当前是工具本地回归通过,没有真实 24h/7d 通过结果。已启动的旧观察保持原脚本/原哈希,不热替换、不拼接窗口。

continuous24hStatus / continuous7dStatus 分别对应至少 86400 / 604800 秒的完整连续技术观察:未请求该时长为 NOT_RUN,运行中为 RUNNING,中断或不足目标为 INCOMPLETE,发生错误为 FAIL。只有整个请求窗口完成、单调时钟的有效样本跨度达到目标、样本量/空档/业务/内存及配置检查通过才为 PASS。即使退出清理耗时或系统时钟跳变,也不能补足差 1ms 的样本跨度。失败或中断的 7 天运行不拆出一个 24h PASS;物理操作、校准及独立用户试用仍单独验收,acceptanceStatus 不随技术窗口自动通过。

COM15 的 ECM50-A 观察器 test-device-soak.py 在 >=24h 时必须指定 --deployment,指向已有 written/verified/applicationWritten 均 true 且带有效固件 SHA256 的部署报告。报告及观测外设/Modbus 配置摘要会持续核验,变更则停止并另起候选;不要把该指定业务脚本直接用于 C3、classic 或触屏。触屏继续使用其专用 test-screen-panel-soak.mjs、固定部署和面板配置。部署报告哈希绑定不代替部署前的 MAC/分区/回读证明。

2026-10-04 后继增量还要求触屏观察器的部署报告同时具有 written=true、verified=true、applicationWritten=true,以及格式有效的固件和 Web SHA256。缺失应用证明、只有文件系统写入证明、缺失或畸形摘要都在网络请求及创建观测目录之前拒绝。原始部署报告应保留;不能手改旧报告补字段冒充新写入。此变更及相应离线回归已准备,尚待集中测试,不属于 r19 或现场验收结论。

11.5 同功能的 Flash 去重 ​

Screen UI 与 LCD/OLED 同时编译时,LCD 的中文模式复用 ScreenRuntime 已链接的完整 WQY12 字库,避免再链接一份子集。OLED-only 固件仍保留较小子集;用户 lcdGb2312 开关、ASCII 回退和字体编号不变,不以关功能或改分区解决容量超限。

回归包含已安装固定版本 U8g2 的全部 4041 个子集字形与完整字体对应编码数据/字体度量比较,以及有/无 Screen UI、ESP32 宏组合。链接 Flash 节省需以各目标新 ELF/bin 实测为准,不能解释为运行 RAM 节省;光学显示与触屏交互仍须实物验证。

g06 r2 候选九 canonical 目标、Host/Native 及源码归档已通过;其中 esp32s3-F8R0 链接 Flash 减少 109184 B,最终 BIN 为 3565824 B,在原 3670016 B 槽内余 104192 B。数值仅属于该已归档候选,后续 SPI 改动须重新验证;RGB 触屏不在九 canonical 构建内,仍须专用构建。该优化尚未部署,不代表实物显示或长期稳定已经通过。

11.6 SPI 初始化错误与共享边界(候选代码) ​

2026-10-01 的后续候选把通用 SPI、SDSPI、MFRC522、SPI TFT 接入统一的初始化检查。底层 SPI.begin 失败不得继续宣布成功、挂载/读卡或操作显示专属 GPIO;首次 pin attach 失败残留的总线句柄会局部回滚,不关闭原有共享总线。MFRC522 还拒绝仅指定部分总线引脚,并处理 reader 分配失败。全默认引脚使用固件板型定义,并非自动识别接线。

错误标识含义及处置边界
SPI_PINS_INVALID / RFID_SPI_PINS_INVALID缺必需引脚、总线脚相互重叠或只填写了部分 RFID 总线引脚;按板型/实际接线核对,勿猜引脚
SPI_PINS_CONFLICT活跃总线脚与新请求不同,或只写总线未接 MISO 却新增读设备;不允许运行中自动重绑
SPI_BUS_UNMANAGED总线已经启动但来源/引脚无法确认;拒绝接管和关闭,先检查初始化入口及已有模块
SPI_MUTEX_UNAVAILABLE / SPI_BUSY锁分配失败或 1 秒内未获得初始化锁;失败保持原有共享状态,不以重启循环掩盖
SPI_INIT_FAILED底层启动或 pin attach 失败;核对板型、受保护引脚与资源冲突;不能因此直接归因硬件损坏
RFID_ALLOCATION_FAILEDreader 分配失败,此次未继续初始化 SPI 或发起读卡

失败证据应包含模块、配置版本、错误码与当前固件摘要,但不公开认证、网络或 MQTT 凭据。先处理配置和资源冲突,必要维护仍遵守备份、历史干净窗口、输出安全与精确候选部署要求;不要强制停掉其他用户的总线。

初始化检查候选 spi-init r2 已通过完整 Host、Native、九 canonical 构建及私有源码归档,尚未部署。这个已归档候选不包含下面 11.7 的新 SD 租约代码;当时 SD/RFID/TFT 仍保守保留共享总线。规划器未放宽 TFT/全双工共存,RGB 触屏不是 SPI TFT。实物组合、24h/7d 和独立用户试用仍单独待验证。

调用路径迁移时,旧契约测试也必须同步核验实际传参、错误传播、失败清理和 GPIO/通信的执行顺序,不能仅删除旧函数名断言以令测试变绿。当前 SD/RFID 安全契约与四使用方真实初始化方法的故障注入共 9 项定向通过;完整门禁首轮两项旧调用文本断言失败保留,修正后另起完整复验。所有结论仍按具体候选区分。

11.7 SD 实际租约与安全卸载(新候选) ​

后续代码为共享 SPI 增加固定 16 个实际 owner/CS 槽,SD 首先接入。SD 持有租约期间不能被通用 end 关闭总线;配置、挂载、卸载、容量查询、列表/读取/写入/删除在“存储锁 → 总线操作锁 → Arduino 事务”的顺序下执行。文件操作未结束时,其他关闭请求不能绕过操作锁。等待有上限,超时返回 BUSY,不执行一半后假报成功。

SD 挂载失败、缺卡或无法创建 /fastbee 时回收本次 SD 层及自己的租约;正常卸载可以保留配置后重挂。其他已迁移 owner 仍使用时保持总线,错误 owner 不能卸载已有挂载。首次并发创建存储锁只保留一个发布成功的互斥,重复启停复用它。原沙箱、最大 16KiB 文件、32 项列表及实际接线要求不变。

新增错误应保留并解释:SPI_CLIENT_LIMIT 为固定槽满,SPI_CS_CONFLICT 为已登记的 CS 冲突,SPI_OWNER_CHANGED 为同一 owner 未释放就换 CS,SPI_IN_USE 为仍有租约,SPI_BUS_LOST / SD_SPI_LEASE_LOST 为硬件句柄丢失而现有租约尚未正确退出。后者不自动重建活跃总线,容量查询也不拿旧缓存伪装新读取;先核验资源状态和可恢复路径,不用定时重启掩盖问题。

迁移尚未覆盖通用 SPI、RFID 和 SPI TFT 的完整运行 owner,也未解决 W5500 的共享硬件 host。因此即使租约归零,本增量也不自动关闭整个 SPI 硬件;SD 卸载只能回收自己的挂载和租约,不能新引入误断有线网络的行为。自动最后退出回收待双向 host 协调完成后再开放。仅已登记 owner 的 CS 冲突由此表保护,完整引脚/旧配置冲突仍依赖原预检;没有据此开放任意混用。

最终保留硬件 host 的策略已重新执行本地 13 项专项通过(9.809s),含编译完整生产 SD 管理器的故障/并发 harness、1000 次启停和文件入口检查。固定表有静态内存成本,互斥有驻留成本;真实 RAM 收益、峰值、实际卡、混合外设和长稳均未实测。该增量尚需新一轮完整 Host/Native/构建,不能引用上一候选通过来代替,更没有新增部署或物理验收。

卸载不会自动关闭 host,也不允许因此静默换绑 SCK/MISO/MOSI。同引脚可重挂,改变总线脚仍可能返回 SPI_PINS_CONFLICT;应先核对全部使用方与维护条件,不强关共享总线来令配置生效。运行时换脚/回滚仍待双向资源协调及单独验证。

SD 租约 sd-lease r1 后续已在 UTC 2026-10-01 04:12:51 完成完整 Host、Native、九 canonical 与私有归档,生产输入和 15 个相关测试输入前后稳定;36 个归档镜像哈希复核一致。仍未部署,RGB 不在 canonical 矩阵内;此通过不包含下面新增 RFID/Web 改动。

11.8 RFID 租约与忙碌状态(后续候选) ​

MFRC522 使用稳定单例租约,初始化、认证读写和停止在同一操作锁下执行。读写未完成时 stop 可以返回 SPI_BUSY;此时 reader、租约和 SS/RST 引脚保留,外设管理器不得继续当作停用成功。规则事件在卡片事务清理并释放锁后派发;轮询忙时跳过,不等待其它外设完成。这里只覆盖锁等待上限,不承诺全部底层 I/O 有相同硬时限。

诊断使用者应如何理解
statusAvailable=false / SPI_BUSY本次没有取得一致状态,不等于未初始化或卡片移除。页面显示“忙碌,状态待刷新”;不要把上次 UID 当成新采样,不盲目重复写卡
RFID_CONFIG_CHANGED现有 reader 的引脚配置不同,必须先安全停止,再重配;不能把旧 reader 当作新配置成功
RFID_STOP_REQUIRED上一轮清理尚未完成,保留的 reader 需要显式停止重试
RFID_SPI_LEASE_LOST总线句柄/租约已丢失,扫描/读写被拒绝;核对全部共享使用方后按明确维护流程恢复
RFID_RUNTIME_DISABLED / RFID_BUDGET_DENIED功能未启用或未获内存预算准入,本次未初始化设备;不是自动检测到模块损坏

API 状态只取一次非阻塞快照,避免轮流查询多个字段而混合启停前后状态。忙时页面保留用户块数据输入,不自动写卡、改配置或重启;新鲜状态恢复后正常展示。默认 SPI 脚取编译板型常量,实际模块仍须按板卡、引脚预检和接线确认;不存在一套所有 ESP32/S3 通用的 RFID 接线。

原写卡保护不变:仅 MIFARE Classic 普通数据块 1~62,禁止制造商块和扇区尾块,先认证,再写入并核验回读。验证仅覆盖生产代码的主机模拟与 Web 渲染;没有真实卡片/读卡器、危险输出或新设备写入证据。固定容量租约尚未覆盖通用 SPI/SPI TFT/W5500 的所有路径,不能据此宣称任意共享组合、内存收益或长稳已经通过。

最终相关本地回归 36/36 PASS(19.102s),包括实际生产驱动在规则引擎开/关两种编译下执行、并发停止保护、1000 次启停、忙碌状态快照与 Web 渲染。rfid-lease r1 已于 UTC 2026-10-01 05:06:11 完成完整 Host/Native/九目标及私有归档,生产和相关测试输入稳定,36 个镜像与源码 ZIP 哈希复核一致。仍未部署,RGB 专用构建、实物、24h/7d 和独立用户试用未因此通过;不覆盖下节新代码。

11.9 通用 SPI 的逻辑所有权与退出(后续候选) ​

通用 SPI 现在以外设逻辑 ID 登记成功运行实例,不再依赖复制后变化的配置对象地址。ID 限 1~40 字节且无内嵌 NUL,与现有外设配置上限一致;与 SD/RFID 指针 owner 共用固定 16 槽,槽满返回 SPI_CLIENT_LIMIT,不无界扩容。配置副本销毁不会令 owner 悬空;同 ID 修改 CS/总线脚/MISO 使用方式需先安全停止旧实例,不能静默换绑。

错误/行为判读与维护边界
SPI_OWNER_INVALIDID 为空、超过 40 字节或含 NUL;拒绝初始化,不触发 GPIO
SPI_LEASE_MISSING配置存在不代表已成功初始化;本次不进入总线事务
SPI_CONFIG_CHANGED / SPI_OWNER_CHANGED请求与运行 owner 不一致;核对当前配置和资源,先安全停止后再重配
SPI_BUS_LOST现有租约尚存但底层句柄丢失;拒绝读写,不在活跃 owner 下偷偷重建
SPI_BUSYI/O 的总线锁等待 20ms 后放弃本次传输;setup/teardown 沿用 1000ms 等待。停止失败仍保留租约和 CS,不是已停用

数据操作按“外设管理器锁 → SPI 操作锁 → Arduino 事务”执行,核验 owner 后才拉低 CS,传输结束先拉高再结束事务。空缓冲不触发传输;读取失败报告长度 0。频率为 0 使用原初始化约定的 1MHz 默认值;不能把锁等待上限当作硬件 I/O 总时长上限。

退出只释放本逻辑 ID 的租约。只有实际释放成功,且既有配置别名和运行 owner 都未占用 CS,才把自己的 CS 置输入。缺失/失败配置的退出不能拆掉别人引脚;仍不自动调用 SPI.end,防止关闭 W5500/未迁移使用方的共享 host。同一总线换脚仍可能被拒绝,不能强关网络使其生效。

本地最终 30 项专项通过(26.119s),覆盖真实 SPI helper/初始化器及生产 SPI I/O 分支、故障注入、并发退出、共享保全和 1000 次启停;外层容器/硬件为模拟,不是完整管理器集成或实物通过。固定 inline key 表估算多约 640 B 静态 RAM,目标 ABI/固件符号尚待核实,不承诺关闭功能后这部分完全释放。新候选仍须完整 Host/Native/九目标、RGB 与独立部署验收;没有新现场配置/固件写入或 24h/7d 结果。

11.10 独立用户零代码验收材料 ​

NC01~NC04 独立用户验收操作卡 已提供温控继电器、采集/MQTT 上报、只读 Modbus 和板卡迁移四个场景,共 20 个用例,初始状态全部 NOT_RUN。材料已准备不代表向导/模板/迁移功能已完整实现,也不代表 V14 已通过。

试用前逐项固定候选、硬件/接线、数据语义与验收阈值;输出安全条件不明确时不得驱动负载。缺少必要表单或导入预览应回报产品缺口,不用手写 JSON/脚本绕过;缺硬件、授权或独立用户时保留 BLOCKED。页面保存、实际生效、设备读回与物理反馈分开记录,保留原失败和恢复两份证据。

11.11 SPI TFT 的可确认停止(后续候选) ​

SPI TFT 已接入固定容量 owner/CS 租约;初始化、绘制、背光和休眠共享操作锁。停止 BUSY 或 PWM detach 失败时,保留 backend、租约和专属脚供原屏幕任务重试,不销毁仍持有资源的对象;配置切换/取消配置不得越过未完成清理。状态锁竞争也不会把任务句柄指向已删除任务。

同一指针 owner 改变 MISO 使用方式现在与逻辑 ID owner 一样拒绝,需先停止。不同使用方仍保守要求共享引脚一致:已有 MISO 可加入 write-only TFT,write-only 总线先启动时不能静默追加 MISO。W5500 双向 host 协调未完成,因此停止 TFT 不调用 SPI.end,也不承诺总线已完全回收。

本地生产 TFT/ScreenDevice/initializer 及屏幕、SD/RFID/通用 SPI、功能页扩大回归 167/167 PASS(105.431s),含模拟故障、在途停止和 1000 次启停;Native 2378 项通过。不是实物控制器应答、真实 RTOS 时序、内存无泄漏或长稳证据。S3/C3 canonical 定向构建另行核验,不代表九目标、RGB 专用构建或已部署;真实组合与 24h/7d 仍待验证。

11.12 功能准入不是实际运行 ​

功能配置 新候选保留 active 兼容字段,但明确 activeMeaning=admission_only;admissionState 解释预算、网络、父依赖和运行降级,instanceState 当前为 unobserved。Web 区分待保存和待重启,附属能力受限可见,不再把准入当作“运行中”。

Flash/RAM 总计为静态估算;系统空闲 DRAM/最大连续块独立展示,不能用估算值声称实例占用或关闭后释放量。G03 首批 24/24 本地行为回归和上述扩大回归已通过;真正的实例观测、统一按需初始化/释放以及设备内存/恢复测量尚未结项。现有设备未部署时继续使用原候选,不自动继承新字段与通过结论。

11.13 RTC 计时规则增量与回退边界 ​

DS1302 RTC 示例 新增类型化计时启停表单说明。动作 35 仅允许固定 start/stop;配置、类型、功能准入、实际实例与引脚重新核验,Web/规则/生命周期共享外设管理器锁。无效日历不写入,状态相同不重复写寄存器,写后读回不一致保留失败。锁等待 50ms 不是完整操作时限。

发布前验证:表单目标/命令选择、保存/重新打开、切换触发、启停轨迹、错误目标拒绝、未初始化/忙锁/断线与读回失败;分别记录主机 mock、固件构建、API 和实物时钟推进/断电保持。不得自动启用现场规则来补齐证据。日期校时、质量字段、显示/上报、长稳和独立用户仍有未完成项。

旧固件不识别动作 35;新导出配置不可直接作为旧版本恢复包,禁用规则也不足以解决编号不兼容。保留加动作前的配置与固件,按实际候选实施记录核对摘要。当前没有因这次开发自动刷机、改变现场时间或开启充电。

2026-10-01 15:13:53 的 system-plan-g04-rtc-action-20261001-local-r3 已终结 PASS:定向 94/94、Native 2378/2378、静态门禁、启用 DS1302 的 S3-F8R0 firmware/buildfs/制品校验通过,1074 个生产/测试输入稳定;离线 Chromium 双视口表单另有 10/10 PASS(隔离页面、无真实 API)。15:17:40 完成同候选源码与四镜像私有归档复核。生产输入摘要 bfb5af11ce7c772ea38e6616d7c7cf2051e555830bd29eb3956d1cabc3294371;固件为 3,584,544 B、SHA256 4be05806c26f2187fcff94448ee219526d593732e8163ab25a8a776b1b05be06。

上述本地与单环境构建不替代当前完整 Host/九环境/RGB、部署、实物走时/断电保持或 24h/7d。原 tft-admission 测试输入变化失败和 RTC local-r2 夹具失败继续保留;不得用本批通过覆盖历史失败或宣称 G04 整包完成。

11.14 W5500 双向 SPI 与实例观测(后续候选) ​

更新 11.7~11.11 历史批次的未迁移边界:新 W5500 实现同 host 使用同一全局 SPIClass;classic 独立 HSPI 要求网络六脚与全局 SPI/CS 隔离。ETH.end 后必须确认 handle/netif 消失,再删除专用总线和释放网络租约;停止失败保留静态 transport,适配器销毁不遗留悬空 owner/回调。明确拒绝 HAL 锁关闭与未验证的旧 Core2 回退,不改变现有九目标的功能基线。

2026-10-01 16:01:57 的 ethernet r1 通过 50 项定向、Native 2378 项、S3-F8R0/classic-F8R0 firmware/buildfs 与制品校验,1084 输入稳定并私有归档。生产摘要 062db1358b3b31070b7890e84bc012f135e21e39041114532d76953409a2be96;不含随后加入的实例观察。网络与非 SPI 配置跨页预检、真实共享链路、全矩阵、RGB 和实物长稳仍开放;租约归零也不自动关闭全 host。

G03 后续为 DS1302/RFID/Ethernet 提供被动初始化快照,详见功能配置页。43 项本地测试通过,但不是全部服务、硬件健康或内存收益报告。发布检查应分别核验未知/未初始化/已初始化/忙锁/清理失败、准入停用但资源保留、旧字段兼容以及保存/重启状态不被实例标记覆盖;禁止用静态 RAM 数量替代设备实测或把新代码归入旧固件证据。

11.15 网络与外设的双向配置预检(后续候选) ​

网络配置中的 W5500 MISO/MOSI/SCK/CS/RST/IRQ 已纳入外设配置资源图;外设新增、修改、启用和网络保存双向检查硬冲突,经典 ESP32 独立 host 也不能复用别人独占的物理 GPIO。兼容的同 host 总线信号可以共享,CS/复位/中断仍排他。引脚在 int8_t 收窄之前检查类型和范围,拒绝布尔/null、分数、越界截断和非法文本;全部字段有效后才提交候选,缺省字段保留旧值,可选 RST/IRQ 可为 -1。

保存与外设改配共用管理器递归锁;忙锁、OOM、图容量不足或硬冲突时,不提交网络/功能变更,不触发重启。纯 Wi-Fi 引导允许外设管理器尚未建立,但 Ethernet 改配不能无锁继续。网络 API 尚无逐引脚风险确认表单,本批没有新增该能力;现有警告政策及外设确认流程保持不变。

资源返回明确标记 claimScope=configuration、networkClaims=w5500、runtimeReservationsIncluded=false。配置声明不代表真实初始化或已释放资源,尤其改配待重启、旧租约与清理失败保留仍须另外核验;4G/UART、跨文件导入事务和实际混合硬件恢复仍开放。

主工作区合入后本地回归 80/80 PASS(40.762s,无跳过),涵盖真实资源规划/解析器和模拟生命周期;完整 r3 候选在 2026-10-01 16:59:25 启动,冻结 1099 个生产/测试输入,摘要 f0b3966211cde2145c7ca41503fe2f7f2e9ed883c5cdd80751063135a6358496。终态以后续实施记录为准,运行中不记通过。此前 r1/r2 的失败保留;本批未部署、未改变现场网络或时钟,没有实物/长稳结论。

后续核验:r3 于 17:23:34 FAIL;三个 Host 阶段退出码均为 0,但五个生产输入期间变化,Native/九环境未跑。保留他人改动及失败记录,不把该批当作稳定候选。

11.16 RTC 日历读写及只读采集模板(新候选) ​

动作 36 返回无时区的有效运行日历;动作 37 只显式复制 system-local,保留暂停状态并读回,成功不等于可信校时,失败可能已经写入。详见 DS1302 示例;不要用读取操作证明绝对时间准确或把新动作直接交给旧固件。

17:34:05 启动隔离 r4,1106 个生产/测试输入,摘要 de593717bc7903b6fd705a1e3b43f872991e54c4505966d50b554f7d64794406。定向 84/84,Native 2377/2378(旧源码位置断言 FAIL);其余独立构建/Host 继续。Native 修正及 G05 模板在主目录,不属于该 r4。每次部署须重新对应源码/镜像/配置保全和读回,不能继承未通过的总状态。

G05 新增传感器通道/RTC 日历只读草稿向导:真实类型目录、显式目标/通道/字段、驱动采样下限、预览确认与禁用草稿,沿用原保存预检。33 项定向、28 项离线双视口通过,但不证明打包、设备、MQTT 收件、独立用户或完整 NC01~NC04。首次使用仍须先核对数据质量及上报,再人工启用;不会自动保存/执行、改接线或开危险输出。G00~G06/H1、24h/7d 保持开放。

11.17 19:26 接续:失败候选与后续修复分别追踪 ​

r4 已于 18:54:16 终结 FAIL:八个 canonical 构建通过,S3-F16R8 因磁盘空间失败,Native/文档静态失败保留;1106 输入、源码 ZIP 和 32 镜像仅通过完整性核验,不具备部署门槛。构建缓存经逐文件验证转移,真实历史附件补入隔离区,没有删除历史失败或修改现场配置。

r5 自 18:55:24 冻结 1123 输入,Native 和 120 项定向通过,但 Host 与部分 buildfs 已失败,独立环境继续。不得部署失败候选。下一候选需先检查 scratch 目录、真实文档附件和 Web 预算,再冻结主目录修复;每环境分别保留匹配的 Web 树、镜像和源码 SHA256,只有完整通过才可生成部署清单。COM8 canonical 不可冒充 RGB 专用固件。

主目录后续增量包括只读 Modbus 草稿、懒生成向导和核心脚本块保守压缩:46 项离线真实表单通过,scratch 发布 316.0 KiB、静态 DOM 3301,原预算未上调;完整页面矩阵仍在运行,不属于 r5。H1 目前仅 ADS1115/PCA9685 纯寄存器合同本地验证,没有新硬件生产驱动或现场验证;MCP23017 官方资料仍待核对。未操作串口、RTC 或物理输出,24h/7d/V14 和其他计划交付项仍开放。

11.18 20:04 接续:本地验证完成项与新候选准备 ​

上述 core-chunk-minify r1 已取得离线 185/185 与 configuration 114/114 PASS。保留发布合同常量名后 capability r3 的 11 个干净能力构建与 C3/S3 smoke 通过,原失败保留。随后部分导入反馈修复的 scratch Web 为 316.2 KiB、DOM 3301,原预算通过;15 项导入行为与 22 项双视口通过。部分导入失败须显示已确认保存数量、未知写入与没有自动回滚,已有执行配置待重启也不能直接重启混合配置。

IO 扩展器加入被动初始化快照,UART 七函数机械拆分;分别有 25+9 项和 28 项本地回归,不继承 r5 编译通过。README 的旧版本推荐已消除并加入构建矩阵表格防回归。完整 r6 将固定这些增量,预检目录/附件/Web 后运行 Native、Host 和九环境;只有最终稳定 PASS 与制品完整性齐备才可生成部署清单。

构建缓存磁盘迁移只针对已结束环境、逐文件校验并保留完整副本;新候选使用独立 D: build 根,旧失败/旧构建树保留。失败候选源码保全只证明字节完整,不生成部署许可。RGB、实际部署/读回、危险输出安全条件、实物矩阵、24h/7d 和独立用户 V14 仍须逐项完成。

11.19 20:08 接续:r5 终态与 r6 归属 ​

r5 于 20:02:29 终结 FAIL:三个 Host 和全部九个 buildfs 失败,1123 输入稳定但成功构建清单为空。独立保存失败源 ZIP 后的新完整性报告通过,原完整性失败保留;这不改变 candidateStatus=FAIL,不产生镜像/Web树/部署许可。

r6 于 20:06:37 固定 1133 输入,摘要 322fb47b3291a33ad65637a0489eb8e59b209bcf7583a7d13f910c9596a0d763;20:06:38 启动串行完整门禁。三项预检与 20:07:54 Native 已通过,定向、Host、九环境及归档结果以该候选终态为准。显式使用 D: build 根并保留旧缓存树;不得改动在途输入或复用 r5 失败为通过。此批仍不含 RGB、设备写入、实物、长稳或 V14。

11.20 20:29 接续:失败不遮掩,其余阶段继续 ​

r6 的 166 项定向、Host unit 1190 项(1 项 Windows 权限跳过)已通过。Host static 在配置保全模拟测试中因 Get-FileHash 命令不可用失败,其他独立阶段继续;不可据 Native/单元通过放行发布。主目录已将该文件哈希改为 .NET 流式 SHA256,模拟命令不可用的保全/恢复/锁测试通过;这是后续增量,不倒写 r6 结论。

主目录新增自动生成的九环境/Web 能力矩阵及过期守卫,21 项本地回归通过。发布适配器补查源 ZIP/manifest 的存在、哈希、大小、文件集和完整核验计数,13 项通过;旧完整性 PASS 不再代替制品当前完整性。

RTC 诊断将日期标为上次读取的无时区日历,保留未核验/暂停/未知质量,读失败清旧值;关窗或换目标后旧写入回包不触发新目标读取。41 项本地与 16 项双视口通过,移动暂停按钮可见,scratch 316.5 KiB 满足原预算;不代表时间源可信或实体屏绑定完成。以上均不属于 r6,完整后续候选、现场、24h/7d/V14 仍待逐项验收。

11.21 20:52 接续:SD 状态可信度和目标隔离 ​

主目录后续 SD 诊断改为零等待的生命周期/容量快照;忙锁或租约失效不能显示为未挂载,容量明确标注最近一次操作的年龄,未知/不一致/部分写入后的旧容量不输出。文件 API 在操作锁内核对真实 owner,错误目标不读写另一挂载外设;页面迟到回包不覆盖新窗口或触发新目标刷新,未确认的写入不自动重试。

底层与界面扩大回归 69/69、真实 fragment 双视口 22/22 PASS,scratch Web 316.7/317 KiB、DOM 3301,原预算不变。这些是本地 mock/scratch 证据,不是 SD 实物、断电保持、拔卡/满盘恢复或长稳验收。增量不在 r6 中,后续候选重新冻结、完整回归和核验。

r6 Host contracts 通过,20:47 的前三个固件环境通过;Host static FAIL 仍阻止发布。当前线程自动接续已启用,不重复占用串口或并发构建,失败窗口不清除;G00~G06/H1、RGB、实际设备/物理、24h/7d 和 V14 尚未整体完成。

20:59 接续:r6 已通过前五个 canonical,正在 C6-F4R0;完整 r7 已排队等待 r6 锁释放,尚未冻结或开始门禁。新批次先核验 r6 归档,再持两仓锁备份、捕获并重跑;额外 SPI/RFID/Ethernet/TFT 25/25 本地回归通过,不替代真实设备证据。

11.22 21:11 接续:候选编排的负路径边界 ​

r6 已通过七个 canonical,S3-F8R8 在编译;Host static FAIL 仍阻止发布,最终源/镜像/Web 完整性待核验。两仓锁的实际 PID 和启动时间均已确认,r7 仍仅排队,不重复启动。

主仓新增独立编排审计,23/23 本地临时夹具通过(7.615 秒、无跳过):错误锁身份、非终态或输入变化、源 ZIP 被替换/成员重复/字节不符、预检失败、Host/单环境失败继续但不能变 PASS、源与文档变化都阻止继续。证据位于 FastBee-Arduino/artifacts/system-plan-r7-orchestration-audit-20261001/local-r1;已排队脚本前后 SHA256 未变。

这些测试模拟子进程、构建和归档,不运行真实门禁/PlatformIO/设备,不是 r7 冻结或发布通过。没有刷机、改配置/RTC 或驱动输出,实物、RGB、24h/7d/V14 及 G00~G06/H1 剩余开发继续开放。

11.23 21:49 接续:规则引用保护与动作清单 ​

r6 已完成九环境构建及独立归档校验(1133 输入、36 镜像、9 份 Web),但 Host static FAIL 仍在,禁止发布。r7 于 21:20 冻结新输入,Native、255 项定向、Host unit(1255 PASS/1 跳过)、Host static 和 Host contracts 已通过,九环境继续;不是新固件已经部署。

主目录下一候选新增规则启停引用保护:整份 periph_exec.json 导入时,动作 22/23 必须指向同包规则,不能借用即将被替换的旧规则 ID,禁用规则也不豁免。先验证再原子替换;拒绝不会发布运行图或要求重启。旧配置加载和普通保存兼容保留,事件/外设/远程来源不误当规则 ID;完整板卡与跨文件引用/事务仍待实现。

真实 C++/ArduinoJson 存储路径在 C3、classic、S3、C6 四分支验证,合并 58 项回归通过;移除保护的变异版本被测试拒绝。Web 7+9 场景、24 项双视口通过,scratch Web 316.8/317 KiB,预算不变。这些都是本地证据,不继承 r7 或实物通过。

另新增由真实 C++ 目标谓词生成的 38 动作、43 类型清单(主仓 docs/generated-action-target-contracts.md),14 项行为/过期检查通过。分别列本机/扩展器/passive 模式;通用动作、保留/退役号及系统动作不被误标为任意外设可用。清单不是板卡/具体模块/实例可用或完整 E3~E5 支持矩阵。没有访问串口、改配置/RTC、驱动物理输出,所有实物和长稳门槛仍保留。

22:08 接续:r7 前四个 canonical 已通过,C3-F4R0 运行中;r8 已唯一排队等待 r7 两仓锁释放。r8 编排 29 项临时夹具通过不算真实候选通过,实际捕获前还要验证 r7 源/镜像/Web 以及文档/编排 ZIP 的终态完整性。最新主目录增量重新冻结、完整复验,不继承 r7;不重复启动或改变在途输入。

11.24 22:23 接续:校时结果和 UTC 显示可靠性 ​

主目录 HTTP 校时新增时间样本/延迟/回绕/数值边界校验,不接收 301 或用嵌套时间掩盖部分错误字段,系统设时失败不报告成功。ISO8601 的 Z 时间改用 UTC,普通本地时间显示不变,转换失败不显示旧值;没有改现场 RTC、系统时区或调用实际设时。

新增 22 项 HTTP 生产方法/真实 JSON 回归,加 RTC/格式化/Web 合同共 82/82 本地通过(58.322 秒);全部网络、系统设时、日历转换都在测试边界替换。时间来源认证、SNTP/MQTT 独立入口、失鲜和实体展示仍待完成,不能据此关闭 G04 或把模拟设时算设备验收。r7 前六环境通过、第七环境运行;该修复属于后续候选,r8 尚在唯一队列。

22:28 追加:HTTP 共享客户端增加零等待互斥,真实线程阻塞一次请求时,1000 次并发请求没有网络/设时副作用;早退后可重新同步。23 项 HTTP 加相关回归共 83/83 通过(55.122 秒),该守卫不覆盖其它独立 SNTP/MQTT 入口。r7 前七环境通过、S3-F8R8 运行;r8 launcher PID28592 在 22:09:16 唯一启动,等待原锁。现场配置与输出仍未触碰。

22:29:r7 前八环境通过,最后 S3-F16R8 继续;NTP 原回退策略的 5 项本地合同另行通过,不改变无 PSRAM 的异步 SNTP 优先策略。整批终态/归档及 r8 冻结仍须实际报告,不提前视作发布许可。

11.25 22:36 接续:r7 软件门禁闭合,r8 冻结运行 ​

r7 在 22:34:28 取得 PASS:Native、255 项定向、Host unit(1255 PASS/1 跳过)、Host static/contracts、九个 canonical 的应用/文件系统及收尾检查通过,源码和文档前后稳定。独立归档核验 1142 输入、36 私有镜像、9 Web;文档/编排另核验 103 文件。源 ZIP SHA256 81ae5df5acd5ae2bf2b5ea3872c37a6e436edf076e5c7e8d40da3d7880283cbc。原 r6 static FAIL 保留,不能改写旧候选结论。

r8 在终态/归档预验后沿唯一队列取得两仓锁,22:34:41 完成新 snapshot:1148 源码/测试输入、102 文档输入,sourceDigest 1f4a4c886b0d5d52170ba6f23721f14eac029b3f3e58fda0708a66f986dbe2cb。已确认包含导入引用、动作清单、HTTP 时间/UTC/互斥及测试增量;完整门禁继续,不能沿用 r7 的 PASS。复用 D: 缓存,旧树和失败证据保留,没有重复构建入口或触碰活动输入。

这只是分层的软件候选/归档进展。未访问串口、刷机、改配置/RTC 或驱动物理输出;RGB、实物故障/内存/恢复、24h/7d、V14 与剩余产品闭环继续待验,不把制品清单当自动部署许可。

22:40:r8 五项预检、Native 和定向阶段已通过,Host unit 运行中;完整 Host、九环境及独立终态归档尚待,不提前转为 PASS。

11.26 23:20 接续:LCD1602 写入可靠性与候选隔离 ​

r8 实际已通过 Native、281 项定向和全部 Host(unit 1295 项、含 1 跳过);23:17 已归档 S3-F8R0/classic-F8R0,classic-F4R0 继续。九环境、输入稳定终检与独立归档还未完成,不重复启动或修改在途输入。

主目录新修复 LCD1602:按实际取得的 Arduino 官方 LiquidCrystal 1.0.7 初始化序列发送数据半字节和使能脉冲,保持 DATA/RS/背光;初始化清屏/归位不再被未初始化守卫跳过。检查每次 Wire 缓冲长度和 ACK,部分失败/忙锁/租约丢失后拒绝继续写,要求重新初始化,不自动重试未知传输。保留共享总线延迟回收,不回收其它设备租约;尺寸/地址、空字形与浮点格式边界同步防护。

完整生产驱动与真实 I2C 管理器的 23 项回归,加相关 10 项共 33/33 本地通过(66.329 秒);原失败及夹具编译失败记录保留。覆盖全部 43 个启动传输位置、256 个数据值、真实线程事务锁和忙锁恢复;不是只有测试源码里的模拟实现,也不是实际屏幕验收。

这批改动属于 r8 之后候选,r9 编排另行准备,尚未启动;不得沿用 r8 构建结论。标准 PCF 背包映射、电源电平、实际显示/对比度、断线掉电/共享负载与长期恢复仍需实物条件;ACK 不能证明屏幕内容正确。本轮未访问串口、刷机、改现场配置/RTC 或驱动物理输出;所有其它 G00~G06/H1、RGB、24h/7d/V14 门槛继续开放。

23:26:LCD 最终 33 项回归再次通过(65.764 秒),新测试核验生产/夹具输入前后不变;r9 编排的 29 项临时负路径与语法通过,不等于真正门禁。r8 前四环境已通过、C3-F4R0 继续;保留锁和独立候选界限。

23:28:r9 已唯一排队(23:26:46 启动,PID23236/session55593),实际等待 PID28592 的 r8 主仓锁;snapshot 尚不存在。先确认 r8 终态和独立保全,再备份/冻结 LCD 等主目录增量并重新跑完整门禁;不重复启动、不抢锁、不把排队当 PASS。仍未新增部署或实物证据。

11.27 23:55 接续:共享 I2C 与 ADS 会话准备区 ​

新增修复和测试留在主仓 artifacts/system-plan-i2c-transport-stage-20261001-r1,避免 r9 捕获半成品。七文件补丁尚未并入主目录生产/测试,也不在 r8;等 r9 实际冻结后先核对旧文件及补丁哈希,再并入并重新测试,不继承已有候选通过。详情见主仓 docs/system-improvement-i2c-transport-20261001.md。

实际 I2CSensorBus/管理器复现了地址短写漏检、缺字节/-1 被误报成功及异常排空无限循环;新实现拒绝错误输入、保留 SHT 地址探测和正常 repeated-start、限制异常排空,并保留共享 owner/失败恢复边界。最终准备区 20 项传输加 14 项 ADS 会话共 34/34 通过,另有真实传感器后端/重开/回收三组 3/3 通过、89 个输入稳定;旧失败和超时记录保留。这是局部本地验证,不是完整 Host 或设备验收。

ADS 会话依官方 TI 资料处理旧转换/连续模式排空、token 取消隔离、配置丢失与超时;必须观察 busy→ready 才接受新样本,错过转换窗口保守丢样。尚无注册驱动、地址级独占、参数/Web/缓存/质量完整接入和实物结论;状态机不等于产品支持。MCP23017 资料缺失仍保留,未被单项阻塞拖住其它软件工作。

23:54 的 r8 已完成八环境、最后 S3-F16R8 继续,r9 仍在唯一队列;整批终态/独立归档及 r9 snapshot 以实际报告为准。未访问串口、刷机、改配置/RTC 或驱动物理输出;G00~G06/H1、RGB、真实资源/内存/恢复、SD/UART、NC 迁移、实物与 24h/7d/V14 仍逐项开放。

11.28 2026-10-02 00:02:r8 终态、r9 冻结与修复并入 ​

r8 已于 10 月 1 日 23:57:51 完整软件门禁 PASS,源/文档稳定;独立归档及本轮只读重验确认 1148 源输入、104 文档/编排输入、36 镜像与 9 Web。源 ZIP SHA256 32b70ea562f8d43560479176e666b7c4c8e9525dbcebc1612bce326318254961。原失败候选保留,归档/构建清单不构成部署授权。

r9 随唯一队列于 23:58:10 完成 snapshot(1155 源/测试、104 文档;摘要 68eeb36cd866fcc4d71018133fcf0b32e843356536b3f3e204400061e2158a69),runner2576、两仓锁23236 正在运行;00:02 预检/Native/定向通过,Host unit 继续。LCD 修复在 r9 内,I2C/ADS 新增量不在 r9。

在确认 r9 不再捕获主目录后,七文件准备区补丁经哈希/目标校验并入主目录;真实入口和相关回归 44/44 PASS,32.637s,无跳过。ADS 会话不是注册驱动,不能宣称外置 ADC 可用;地址独占、配置/缓存/质量/Web/样例和实物仍待完成。r10 编排 29 项临时夹具通过,00:02 尚未启动,后续仍须排队完整复验,未修改活动隔离输入、共享依赖或旧缓存。

00:06 更新:r10 已于 00:04:49 唯一启动等待(session4649、launcher1244),仍由 r9 owner23236 持有两仓锁,r10 snapshot 未出现。本项 I2C/ADS 完整门禁待后续冻结,不把排队当验证完成;原候选失败、实物和长期验收边界不变。

11.29 2026-10-02 00:51:ADS1115 生产路径与地址独占 ​

r9 已于 00:39:15 完整软件门禁 PASS;独立归档及本轮只读复验确认 1155 源输入、106 检查输入、36 镜像和 9 Web。r10 已冻结运行,唯一 runner23172、锁 owner1244;不再是等待 r9 的状态。本轮 32 文件 ADS 生产新增量在 r10 冻结后才合入,不属于 r9/r10。

ADS1115 接入、边界与验收及默认停用的配置/规则片段已同步。主目录 107/107 离线回归(63.789s,无跳过)、双视口生产元数据/渲染/保存检查 32 项通过;包含地址独占、注册/参数/缓存、显式校准系数与失败质量,仅支持每地址一个 MUX,不冒充四通道扫描或已完成实物标定。

r11 已唯一排队(session15205,launcher4116),等待 r10 独立终检/保全后捕获和完整验证;不把排队、局部通过或归档完整性当完整发布。PCA9685/MCP23017、RGB、设备矩阵、真实内存/恢复测量、24h/7d/V14 及其它计划欠项仍开放;本轮未访问串口、刷机、现场配置/RTC 或物理输出。

蜂信物联 | fastbee.cn