| 角色 | 必读分册 | 读完应能回答的问题 |
|---|---|---|
| 项目负责人 / PM | 本总纲 + 06-开发排期与任务分派 | 谁在什么时间交什么;哪个里程碑可以叫停 |
| 固件工程师 A(引擎) | 02-EdgeMemory-固件规格书 第 2–6、9–10 章 | emlite 的数据布局、事务与 HAL 签名;掉电如何保证 |
| 固件工程师 B(接口 / 网络) | 02- 第 7–8、11 章 + 03-EdgeMesh-网络协议规范 | USB/WiFi/串口三条通路怎么通;碎片接力消息怎么走 |
| 工具链工程师 | 02- 第 5 章(.emf)+ 04-Studio 第 4–5 章 | .emf 怎么打包;离线向量在哪算 |
| Web 前端工程师 | 04-EdgeMemory-Studio-Web控制台规格 | 五步向导的状态机;P0–P5 Prompt 怎么落地 |
| 测试 / QA | 05-测试与验收计划 | 96 条用例怎么跑;G7 掉电一票否决怎么判 |
| 硬件 / 采购 | 01-EdgeHippo-EdgeMesh-硬件规格书 | 分区表改了什么;α 形态的 PHY 冲突何时必须定案 |
三个名称各管一层,不得混用。此前文档中的「EdgeMemory」「EdgeMemory-MVP」「EdgeMemory Studio」等代号自本版起全部收敛到下表。
| 层 | 名称 | 英文 | 指代范围 | 反例(禁止) |
|---|---|---|---|---|
| 硬件 | EdgeHippo | EdgeHippo Device | 物理设备、模组、Dongle、载板及其 PCB / BOM / 结构件。产品主张:边缘上的另一个你——承载一枚或多枚记忆碎片(.emf)的随身容器 |
把软件栈叫 EdgeHippo;把协议叫 EdgeHippo;继续使用旧名 EdgeMan(ADR-013 已废止) |
| 网络 | EdgeMesh | EdgeMesh Network | 设备间发现、互联、知识库碎片接力、账本同步的协议层。含 BLE / Wi-Fi / UART / USB 四种承载 | 提「算力共享」「分布式算力」;把单机功能叫 EdgeMesh |
| 软件 | EdgeMemory | EdgeMemory Stack | 设备端固件软件栈(引擎 + 策略 + 运行时)及其配套 PC / Web 工具链 | 把硬件叫 EdgeMemory;把网络叫 EdgeMemory |
| 名称 | 类型 | 定义 |
|---|---|---|
EdgeMemory Core | 固件子系统 | 引擎抽象层(HAL)。后端实现二选一:emdb(eXtremeDB)/ emlite(自研) |
EdgeMemory Runtime | 固件子系统 | 策略层:遗忘、去重、冲突消解、时效与优先级 |
EdgeMemory Studio | Web 应用 | 浏览器端控制台(原代号 EMP Studio)。连接设备、生成知识库、一键烧录 |
eme | CLI 工具 | PC 端命令行:构建 / 校验 / 烧录 .emf,固件 OTA 与串口刷写,设备体检 |
.emf | 文件格式 | EdgeMemory Fragment —— 知识库碎片包。32 B 文件头 EMKBIMG1 |
EME-XXXXXX | 设备 ID | EME- + MAC 后 3 字节大写 HEX(例:Dev-B = EME-21E980)。旧前缀 EMGW- 在 MVP 期间仅做兼容识别,不再新发 |
edgehippom-<board>-<ver>.bin | 固件产物 | 例 edgehippom-devb-v1.0.0.bin。构建入口仍是 build_board.ps1 |
| 型号 | 载体 | MVP 形态 | 说明 |
|---|---|---|---|
| EdgeHippo Dev-A | XIAO ESP32-S3 N8R8 (8 MB Flash + 8 MB PSRAM) | γ 磁吸卡形态原型 ( form=gamma-card) | MAC 44:BD:8D:71:FA:C8;App 0x300000;LED GPIO21(低电平点亮);容量 稳态 3,300 条(方案 B 后;灌入上限 3,700 条)。与 Dev-B 同为 EdgeHippo 外设本体,两者对等、无上下级关系,差异仅来自容量与接口 |
| EdgeHippo Dev-B | ESP32-S3-DevKitC N16R8 (16 MB Flash + 8 MB PSRAM) | β USB Dongle 形态原型 ( form=usb-dongle) | MAC 14:C1:9F:21:E9:80;App 0x410000;WS2812 GPIO48;USB-OTG GPIO19/20 |
本小节回答一个团队必然会追问的问题:「既然两块板都是 EdgeHippo 外设本体,为什么不一块板打天下?」结论见下表,并据此纠正 v1.0 中的一处过时表述。
| 问题 | 答案 | 依据 |
|---|---|---|
| ① Dev-A 容量够做一台外设吗? | 够。方案 B 后 N8R8 稳态容量 3,300 条(灌入上限 3,700 条,占 93.00% 触发淘汰),完全是一台可用外设 | 对照 S2 场景:一个野外巡检专家包 = 1,800 条,在 Dev-A 上只占一半,还剩一半余量接纳现场新增记录。 ⚠️ v1.0 曾写「2,500 条只够装一个人的偏好档案」——那是方案 B 之前的数字,现已作废 |
| ② 那为什么还需要两块板? | 因为要覆盖两种形态。Dev-A 是 γ 磁吸卡形态原型(BLE),Dev-B 是 β USB Dongle形态原型(USB CDC+MSC)——两者对等、无上下级关系,差异只来自容量与接口 | 形态直接决定接口与使用场景:γ 走 BLE、贴手机背面;β 走 USB、拖文件即灌库(首个自销 SKU)。容量差同时给出了天然分层:Dev-B 约 12,900 条(门槛 12,000),Dev-A 稳态 3,300 条。没有任何一块板是「上位机」 |
| ③ 它真的不可替代吗? | 不完全。诚实地讲,PC + Studio 可以顶替它做宿主侧验证——WebUSB / Web Serial / HTTP 三条通路都能调 Dev-B | 真正不可替代的只有两件事: ① BLE 直连互联:EdgeMesh 的 M1/M2/M3 碎片接力必须有第二台设备(浏览器没有 BLE Central 到板的能力) ② γ 形态的成本 / 尺寸 / 功耗实测:N8R8 撑不撑得住决定 γ 磁吸卡能不能做出来 |
| ④ 资源紧张时可以砍吗? | 不建议,但可以降级为 P2 | 它是 §4.1 中「三条宿主通路」与「碎片接力」两项 MVP 承诺的唯一载体。砍掉 = S2 场景的接力验证与 γ 形态定型同时推迟。优先级:必须先砍别的东西 |
产品形态(MVP 之后,用于定价与路线图,不在 MVP 交付范围内):
| 形态 | 产品名称 | 接口 | 单位毛利 | 定位 |
|---|---|---|---|---|
| α | EdgeHippo α 板载模组 | UART / SPI | ¥80 | B2B 主收入。焊进客户设备,客户主控不改架构即获得记忆能力。α 模组强制保留双槽 OTA(焊死后无救砖通道) |
| β | EdgeHippo β USB Dongle | USB CDC + MSC | ¥327 | 首个自销 SKU,¥399。唯一销量可达且不依赖单一大客户的形态 |
| γ | EdgeHippo γ 磁吸卡 | BLE | ¥692 | 贴手机背面的个人记忆卡。P2 |
| δ | EdgeHippo δ SD 卡 | SDIO | — | 期权,不排期 |
它把一个人(或一台设备)的所知、所好、所忌、所经历,压缩成一枚可携带的记忆碎片(.emf),装进任意宿主。宿主负责思考,EdgeHippo 负责让这次思考有边界、有参考——而且在没有网络的任何环境里都一样成立。
一句话破题:它不提供算力,只提供「我是谁、我记得什么、我不该答什么」。
| 拆解 | 含义 | 它支撑什么 |
|---|---|---|
| Edge + Me | 边缘上的「我」 | 品牌主张:一个随身的分身,而不是一台设备 |
| Edge-Me(mory) | 读作 Edge Memory 的缩略 | 与软件栈 EdgeMemory 天然同源,不用解释第二次;.emf、eme CLI 顺理成章 |
| Me = 最小单位 | 一个人 / 一台设备的最小记忆单元 | 支撑产品机制:碎片可克隆、可分身、可回收——同一枚碎片可灌进多台设备,也可整包撤销 |
改名沿革:本产品曾用名 EdgeMan(v1.0 定稿)。改名为 EdgeHippo 的原因是——EdgeMan 描述的是「一台硬件」,EdgeHippo 描述的是「一个被安放在边缘的你」。前者是品类词,后者是主张句。硬件名称随之变更为 EdgeHippo,EdgeMesh(网络)与 EdgeMemory(软件)不受影响。
「有边界、有参考」如果不落到字段与接口上,就只是一句广告语。下表左列是用户语言,右列是它在本项目里的实际落点——这是本产品的叙事与技术之间唯一被允许的连接方式。
| 支点 | 用户语言 | 工程定义 | 已有落点 / 本版变更 |
|---|---|---|---|
| ① 克隆 Clone |
把「我」放到设备上 | 一个人的知识、偏好、红线、履历被打包成自洽的碎片;同一碎片可灌入任意 EdgeHippo 形成分身;可整包 frag.delete 撤销 |
落点:em_mem_t.frag_id、.emf 32 B 头 EMKBIMG1、em_frag_* HAL、Studio P0–P5 生成规程(W5-*) |
| ② 边界 Boundary |
让思考有边界 | 不只回答「这像什么」,还要能回答「这不在我的范围内」。三类拒答:红线条目 / 时效过期 / 置信度低于阈值 | 落点:meta.refusal 红线条目、ttl_h 时效、本版新增 em_query_t.min_score(低于阈值返回空结果而非勉强命中) |
| ③ 参考 Reference |
有参考,不是凭空生成 | 每次返回必须是可被引用的证据:片段 + 出处 + 时间戳 + 置信度,宿主可直接引用,无需黑盒信任 | 落点:em_hit_t{score, matched_by}、EM_Q_EXPLAIN、meta.src、Studio P4 打进包内的 20 条验收用例 |
min_score、或在未命中时返回向量空间内"最接近但不相关"结果的做法,一律视为缺陷——它破坏的正是「有边界」这一产品承诺。
| 原则 | 内容 | 它否决了什么 |
|---|---|---|
| ① 不共享算力,只接力知识 | 设备之间交换的是知识库碎片(.emf)与查询结果,不是计算任务 | 否决「分布式推理」「算力市场」「任务竞标」。实测:ESP32-S3 跑 2890 万参数模型仅 9.88 tok/s,无交换价值 |
| ② 向量离线算,板上只检索 | embedding 一律在 PC / Hub / 云端 API 侧算好后灌入;板上只做 ANN 检索与混合过滤,不跑模型 | 否决「板上做 embedding」「端侧生成」。板上算力留给检索与事务 |
| ③ 事务一致优先于峰值召回 | 宁可召回略低,也不能出现「库打不开 / 索引与数据不一致」。可预测性 > 峰值指标 | 否决「先写数据、后异步建索引」这类最终一致方案;否决为凑召回率牺牲 P99 |
P99/P50 < 4 的来源。
硬盘什么都留,记忆会挑。去重(新 Pattern 与已有条目余弦 > 0.95 则合并而非新增)就是 L2 层的容量控制阀——这是「记忆会挑」的工程实现,也是本产品与「一个带检索的 U 盘」的本质区别。
| 不做 | 原因 | 何时可能做 |
|---|---|---|
| 算力共享 / 分布式推理 | S3 无可交易算力(9.88 tok/s);跨板拆分实验困惑度从 192 崩到 358 | 永不(方向已废弃) |
| 板上跑模型 / 做 embedding | 违反原则②;算力留给检索与事务 | 永不(S3 世代) |
| 代币 / 钱包 / 提现 | 银发〔2026〕42 号:RWA 代币化境内严禁,且「提供中介、信息技术服务」被一并点名 | 永不(境内) |
| 摄像头 / 麦克风 / GPS | 占用大量 RAM 与 Flash,是容量与延迟的主要干扰项。实测裁剪仅省 ≈120 KB,但去掉的是并发与内存峰值压力 | P2,按形态决定 |
| 真实传感器采集 | MVP 用板内确定性合成数据源(CWRU 风格参数化模型,seed 可控、逐字节可复现) | W4-07 真实采集对照,P2 |
| 多 Hub 集群 / 广域网 | MVP 只做单局域网 / 单 Hub | P2 |
| 移动端 App | Web 优先;γ 形态再评估 | P2 |
| eXtremeDB 后端落地 | SDK 未在开发机;emlite 先行。HAL 接口不变,替换不改上层 | 授权到位后 W1-12/W1-13 |
┌──────────────────────────────────────────────────────────────────────┐
│ 宿主 Host(不属于本项目,但要能接进来) │
│ 机器人主控 / AGV / 巡检仪 / PC / 手机 App │
└───────────────┬──────────────────────────────────────────────────────┘
│ UART / SPI / USB / Wi-Fi
┌───────────────▼──────────────────────────────────────────────────────┐
│ EdgeMemory Runtime —— 策略层(软件 · EdgeMemory) │
│ 遗忘策略 · 去重(L2 余弦>0.95 合并) · 冲突消解 · 时效与优先级 · 拒答话术│
├──────────────────────────────────────────────────────────────────────┤
│ EdgeMemory Core —— 引擎 HAL(软件 · EdgeMemory) │
│ ┌────────────────────────────┬───────────────────────────────────┐ │
│ │ 后端 A: emlite(自研·先行) │ 后端 B: emdb(eXtremeDB·后替换) │ │
│ │ flash-backed HNSW + IVF │ 原生 ANN + sequence 时序 + ACID │ │
│ │ 列式时序环 + WAL + CoW │ Active Replication Fabric │ │
│ └────────────────────────────┴───────────────────────────────────┘ │
│ 统一 HAL:em_open/put/get/query/ts_* /tx_* /sync_* │
├──────────────────────────────────────────────────────────────────────┤
│ 宿主接口层(软件 · EdgeMemory) │
│ USB CDC+MSC(TinyUSB) │ HTTP+CORS │ 串口行协议 │ CLI │
├──────────────────────────────────────────────────────────────────────┤
│ EdgeMesh —— 网络层(局域网 · 发现 / 接力 / 账本) │
│ 发现 · 目录 · 碎片接力 · 账本记账 · 冲突消解 │
│ 承载:BLE(NimBLE) │ Wi-Fi(HTTP) │ UART1 │ USB MSC(离线投递) │
└──────────────────────────────────────────────────────────────────────┘
▲ ▲
│ .emf 灌入 │ 生成
┌───────────────┴──────────────┐ ┌────────────────┴─────────────────┐
│ EdgeMemory Studio(Web) │ │ PC 工具链 eme CLI │
│ 连接→向导→打包→烧录 │ │ 离线 embedding / 打包 / 烧录 │
└──────────────────────────────┘ └──────────────────────────────────┘
(无后端,浏览器直连厂商 API + 直连设备)
| 层 | 代码位置 | 负责人 | 关键约束 |
|---|---|---|---|
| 宿主接口层 | main/ | FW-B | 通用层改动必须两板回归 |
| EdgeMesh 网络能力 | main/(复用 link_mgr + /api/mesh/*) | FW-B | 语义从「算力竞标」改为「碎片接力」,消息名可保留,字段重定义 |
| 策略层 Runtime | main/em_* | FW-A | 不得直接访问 flash;只经 HAL |
| 引擎 Core / HAL | components/edgehippom/ | FW-A | HAL 接口在 emdb 替换时不得变更 |
| PC / Web 工具 | tools/ + web/ | TOOL / WEB | .emf 版本兼容:v1 固件可安全跳过 v2 向量段 |
判据分两级:G1–G5 是可行性门槛(不过则 MVP 失败);G6–G9 是完整性门槛(不过则不可对外销售)。G7 为一票否决项。
| ID | 维度 | 判据 | 级别 | 用例 |
|---|---|---|---|---|
| G1 | 容量 | Dev-B(N16R8)≥ 12,000 条(可行性门槛 8,000);Dev-A(N8R8)≥ 2,500 条。条 = int8/384d 向量 + ≤150 B 摘要。库可正常打开并检索 | 门槛 | TC-N-01 |
| G2 | 延迟 | 12,000 条库上混合查询:P50 < 10 ms,P99 < 30 ms(板侧,不含 USB 往返),且 P99/P50 < 4 | 门槛 | TC-N-02 |
| G3 | 内存 | 稳态 PSRAM ≤ 5 MB,DRAM ≤ 180 KB;运行期 malloc 调用次数 = 0 | 门槛 | TC-N-03/04 |
| G4 | 闭环 | 时序 → 特征 → ANN 命中 → 回写新指纹 → 下一次查询可被命中 | 门槛 | TC-S1-07 |
| G5 | 灌库 | 12,000 条 .emf:HTTP ≤ 60 s|USB bulk ≤ 90 s|串口 921600 ≤ 240 s|MSC ≤ 60 s。四通道分别计,不合并 | 门槛 | TC-N-05/06 |
| G6 | 断网 | 拔网线 / 关 Wi-Fi 后,本地灌库、检索、回写、接力全部可用;联网后复测全过 | 完整性 | TC-N-07 |
| G7 | 掉电 | 随机掉电 100 次,库 100% 可开且索引与数据一致 —— 一票否决 | 否决 | TC-N-08 |
| G8 | 引擎实现 | emlite:.text ≤ 60 KB;运行期 malloc 0 次;abort P99 ≤ 2 × P50 | 完整性 | TC-N-11/12 |
| G9 | 网络 | 三节点(Dev-A / Dev-B / Studio)碎片接力可完成;账本双向一致,误差 0 | 完整性 | TC-M-* |
| 指标 | 目标 | 用途 |
|---|---|---|
| 首字节启动时间 | < 800 ms | 宿主上电后多久可查询 |
| 单条写入 P99 | < 8 ms | 在线学习能力 |
| compact(碎片整理)耗时 | < 30 s @ 满库 | 维护窗口 |
| S1 场景 top-1 召回 | ≥ 85%,误报 ≤ 5% | 合成数据源下;真实数据验证前不得对外宣称 |
| Studio 端到端成功率 | ≥ 95%(首次使用,无引导) | 决定 β 形态能否自销 |
| ADR-014 拒答正确率 | TC-C-09…TC-C-12 四条全过 | 不判 MVP 生死,但属 MVP 交付项——它验收的是产品承诺「有边界」,缺了它 EdgeHippo 就退化成一个带检索的 U 盘 |
每条 ADR 记录一个已经做过权衡、不再重新讨论的决策。若要推翻,必须新增一条更新的 ADR 并在本文档留痕。
| ID | 决策 | 依据 | 影响 |
|---|---|---|---|
| ADR-001 | 放弃算力共享,改设备端记忆外设 | S3 实测 2890 万参数 9.88 tok/s;跨板拆分实验困惑度 192→358;DePIN 板块已出清 83%(202 亿→34.6 亿美元) | 全部叙事、硬件形态、商业模式 |
| ADR-002 | 引擎双后端 HAL,emlite 先行 | eXtremeDB SDK 不在开发机;不能让商务阻塞开工。HAL 接口不变,替换不改上层 | 授权谈判从「阻塞全部」降级为「性能优化项」 |
| ADR-003 | 分区采用方案 B:app 槽 2 MB × 2 | 固件实测 1.459 MiB;2 MB 槽余量 34–38%;1.5 MB 槽余量仅 1–4%(方案 C 已否决) | Dev-B 容量 12,900 条(门槛 12,000) |
| ADR-004 | 保留 OTA 双槽 | OTA 只写 app 分区不碰 edgehippom(升级不破坏已灌记忆);现有 ota_mgr.c 已实现双槽 + rollback + 启动自证,保留零工作量、去掉反而要改代码。真实净代价仅 −16% | α 形态强制保留(焊死后无救砖通道) |
| ADR-005 | MVP 不接传感器,用板内确定性合成源 | 只用基础主板;合成源放板内 → 写入吞吐、窗口特征化、L0 环形覆盖仍是真实的,只有「数据从哪来」是假的 | 真实采集对照 W4-07 移 P2;此前不得宣称 S1 召回率已获真实数据验证 |
| ADR-006 | L0 原始波形不落 flash,放 PSRAM 环形缓冲 | 10 s @ 4 kHz × 3 轴 int16 = 240 KB;只有判定异常的窗口才转存取证区。flash 放不下 80 分钟原始波形 | 时序区预算可实测回收 |
| ADR-007 | L2 靠去重收敛(余弦 > 0.95 合并) | L2 不能无限生长;去重即容量控制阀 | 「记忆会挑」的工程实现 |
| ADR-008 | Studio 无后端 Serverless | 产品卖「私域记忆、数据不出设备」;若灌库过程把内容过一遍我方服务器,卖点自相矛盾,且是竞品最好用的攻击点。附带:零运维、零合规敞口、API Key 不经我方 | 板端须加 CORS + OPTIONS 预检;页面必须 http/localhost |
| ADR-009 | USB 通道:WebUSB 优先 / Web Serial 兜底 / esptool-js 救砖 | 浏览器无法访问 USB MSC(虚拟 U 盘是 OS 层概念)。拖 .emf 进虚拟 U 盘是 OS 行为,Web 端只负责生成 + 引导 | UX 依然成立,但不得当成浏览器功能排期 |
| ADR-010 | .emf 向量置记录末尾,前后向兼容 | 现有 em_kb_search 是文本/标签匹配(无向量)→ .emf 分 v1 纯文本 / v2 带向量;v1 固件可安全跳过多余字节 | schema 从第一天预留向量字段 |
| ADR-011 | EdgeMesh 复用现有骨架、重定义语义 | 固件已有 /api/mesh/{query,bid,request,result,award} 与 mesh.query/mesh.ledger 命令 | 消息名可保留,字段从「算力竞标」改为「碎片接力」 |
| ADR-012 | 积分 = 内部记账配额,非代币 | 银发〔2026〕42 号:RWA 代币化境内严禁,且「提供中介、信息技术服务」被一并点名 | UI 中禁止出现钱包、币价、提现、收益等词 |
| ADR-013 | 硬件名 EdgeMan → EdgeHippo,定位升维为「边缘上的另一个你」 | EdgeMan 描述的是「一台设备」(品类词),EdgeHippo 描述的是「一个被安放在边缘的你」(主张句);且读作 Edge-Me(mory) 与软件栈同源。产品承诺从「记得住、查得到」升维为「让思考有边界、有参考」 | 派生一并调整:eme CLI(原 eman)、设备 ID EME-(原 EMAN-)。EdgeMesh / EdgeMemory 不变。对外口径中的所有 EdgeMan 表述即日废止。板级定位(形态标识)见 ADR-018 |
| ADR-014 | 拒答优先于勉强命中:em_query_t.min_score 为强制接口 | 「有边界」是产品承诺而非特性。云端 RAG 追求"尽量答",EdgeHippo 必须能说"这不在我的范围内"。三者构成拒答面:红线(meta.refusal)/ 过期(ttl_h)/ 低置信(min_score) | 未命中时返回空结果 + 拒因,禁止返回"最接近但不相关"的结果。绕过阈值的实现一律判为缺陷 |
| ADR-015 | Dev-B 时序区预算由 1.375 MB 压到 0.4375 MB | 机械理由:按原预算,12,000 条装载后记录区占用 89.8% > 85% 淘汰线 → 策略层随即淘汰 → 稳态仅约 10,022 条 → G1(≥12,000)不达标。压到 0.4375 MB 后占用降至 80.6%,稳态 12,500 条,G1 达标(余量 649 条) | 代价(定案):L1 保留期由 30 天降至 9.68 天(Dev-B)/ 8.26 天(Dev-A),3 流——此为已批准的时序区扩容后的目标值;扩容实施前的当前实现为 7.56 天,引用时必须注明是哪一个。 本数字为派生量快照,不得在本表硬锁:换算链 = ts_l1_pages ÷ ts_streams × 每页行数 ÷ 1440,行大小/时序区页数/流数任一变动即需重算,权威链见 SPEC.md §2.8。演进轨迹(留痕,不再据此反复改文档):30 天 → 5.69 天 → 11.33 天(布局优化,8 B 行)→ 10.07 天(一度定案 9 B 行,被 A2 否决)→ 11.33 天(改回 mark 但沿用 8 B 行)→ 7.56 天(落地:mark 需 4 B,为满足 A2 步长升至 12 B)→ 9.68 / 8.26 天(定案:扩时序区补回,且 rec_cap 零损失)。
三项改动:① L1 行砍掉 rms / p2p(读取时用 p2p = max−min、rms = sqrt(mean²+std²) 现算,EM_AGG_RMS/PP 接口完全不动,属无损压缩);② 行内 minute(4 B)上提至页头;③ 半写行检出采用行尾提交标记 mark(4 B,最后写),判据为「等于固定值」——已用位级撕裂注入实测 100% 检出,不依赖数据取值与端序,无残留风险。关键推论(请一并引用):PSRAM 上限恒为 12,603 → rec_cap 无论记录区多大都不可能超过 12,600。故记录区只需够到临界点(X ≥ 2,340 页且取整余量 ≥ 30),多给纯属浪费,省下的全给时序区。推论的另一半同样重要:只有记录区被压到 2,340 以下,瓶颈才转移到记录区,此时改记录区才影响 rec_cap;当前稳态 12,633 > 12,603,瓶颈仍在 PSRAM。最终定案:Dev-B 记录区 2,346 / 时序区 139,Dev-A 619 / 122; rec_cap Dev-B 12,600、Dev-A 3,300,零损失(取整余量 33 条)。G1 余量分别为 600 / 800 条。升级档(默认不启用):Dev-B 2,325 / 160 → L1 11.33 天,但 rec_cap 降至 12,500;仅当 S1/S2 实测确认 L1 需求 > 9.68 天时才切换。代价是 rms 有约 1 LSB 定点量化误差,且每流须占整数页。回滚条件:W1-14 降维/量化一旦成功,释放的容量优先回划时序区。若 S1/S2 实测需要更长 L1 窗口,须新增 ADR 重新分配 |
| ADR-016 | emlite 批准新增六个模块:em_core.c(装配体)/ em_pool.c(内存池)/ em_util.c(CRC32 + UTF-8 截断)/ em_tx.c(事务)/ em_mem.c(记录编解码)/ em_wal_rec.c(启动恢复) | 第 9 章原目录是在实现细节未知时写的。实现倒逼出三个真实模块:装配体塞进 em_wal.c 会造成「事务 + API 编排」双职责并突破单文件 300 行;CRC32 / UTF-8 截断必须下沉,因组件不得反向依赖 main(否则板无关性与 PC 单测可编性双重失效);内存池是 malloc-free 约束的落地单元。原则:目录服务于实现,而非让实现迁就目录 | 02 分册第 9 章目录已同步标注【ADR-016 批准新增】。配套依赖铁律:只有 em_store_blk.c 可 include em_flash_io.h 并调用 em_flash_*,其余模块调用一律视为架构违规——破例则 PC 仿真与板端等价性失效。配套流程规则:凡为守住「单文件 ≤ 300 行」而拆分的新文件,无需事前批准,事后回填 SPEC 即可 |
| ADR-017 | 契约单点原则:HAL 契约只能有一份权威定义,且必须在构建期强制 | 撞号事故:QA 侧自抄 EM_ERR_NOT_FOUND = -2,与权威 EM_E_NOMEM = -2 撞号。后果是「内存池耗尽」被静默解释成「条目不存在」——不崩溃、不报编译错,只让异常路径上的断言判错方向。这是测试代码自己造出来的沉默逻辑错误,review 看不出来 | 权威定义固定在 include/edgehippom.h;其他位置(含测试脚手架)必须无条件 include 它,拿不到即编译失败。不得靠 review 或约定维持一致性——凡是能靠人记住的,终将漂移 |
| ADR-018 | 取消网关角色分层,板级定位改用形态标识:两板均为 EdgeHippo 外设本体,对等无层级;板级属性一律用形态(form factor)表达 | 根因是旧架构遗留:上一代 EdgeMemory Gateway 方案把「边缘节点(edge)/ 网关(gateway)」的上下级分层照搬进了新方案,但新方案的本体是外设记忆体——Dev-A 与 Dev-B 只是不同形态(γ 磁吸卡 / β USB Dongle)与不同容量,不存在谁在上、谁在下的关系。「角色」一词会把两台对等外设误读成主机与从机,与「装进任意宿主」的定位直接冲突(见 ADR-001 放弃算力共享、ADR-013 边缘上的另一个你)。板级形态与产品形态矩阵(§2.4 / 01 号分册 §4)本就是两套东西:形态标识只描述这块板长什么样,不描述它在网络里是什么 | 影响面:① 板位映射——Dev-A = γ 磁吸卡形态原型(form=gamma-card,EME-71FAC8,8MB,稳态 3,300 条 / 灌入上限 3,700 条);Dev-B = β USB Dongle 形态原型(form=usb-dongle,EME-21E980,16MB,约 12,900 条,门槛 12,000)。② Kconfig——EMGW_ROLE_EDGE / EMGW_ROLE_GATEWAY 二选一改为 EMGW_FORM_GAMMA_CARD / EMGW_FORM_USB_DONGLE;固件运行时字符串 edge / gateway 改为 gamma-card / usb-dongle。③ 板级命名——文档中不再以 gateway / 网关 / 边缘节点 / HOST 宿主原型 描述板位;EdgeMesh 自身的网络分层协议语义(L2/L3、发现/接力/账本)保留不变,但不得与板级形态混用。④ 设备 ID 前缀统一为 EME-(原 EMAN- 已废止)。本 ADR 不废止 ADR-001..017,只补正板级定位这一层 |
| ADR-019 | 时序窗口为左闭右开 [t0, t1):em_ts_window 与 em_ts_agg 必须用同一套分钟序号判定,含 t0 所属分钟、不含 t1 所属分钟 | 规格(02 分册 §ts.query / §ts.agg)原只给了函数签名,未定义开闭区间,实现选了闭区间并由此产生实测缺陷:按「第 i 分钟」的自然写法查询,逐分钟曲线整体错位一格且相邻窗口重复计入边界行。取证——注入 12 个分钟窗口(第 8 分钟幅值 ×8),逐分钟 rms 实测 111×6, 634, 634, 111×4:第 6 格本应 111 却拿到 634,因其 t1 正落在第 7 分钟起点、闭区间把第 7 分钟那行也算了进去;sqrt((111²+890²)/2)=634 与实测完全吻合,是闭区间的数学确证而非巧合。左闭右开是时序 API 通行约定(相邻窗口不重不漏)。附带的实现铁律:两函数不可一个比微秒、一个比整除分钟——t1 非整分钟时二者会分叉(实测 6/6 全分叉),故统一按 minute = t / EM_TS_MIN_PER_US 的序号比较 | 影响面:① 引擎——em_ts_query.c 两处判定改为 mi >= m1 排除(window 与 agg 逐字一致口径)。② 调用方——逐分钟查询必须写 t1 = 下一分钟起点,CLI ts.agg / ts.window 注释已写明。③ 验收——新增实测脚本 em_scenarios.py 的 S1-08b 会随区间语义回退而变红(正常段 max/mean < 1.5)。④ 规格——02 分册 §ts.query / §ts.agg 条款回填本口径。本 ADR 不废止 ADR-001..018,只补上规格缺口的一层 |
| 编号 | 分册 | 责任 | 内容 |
|---|---|---|---|
| 00 | EdgeMemory-MVP 定稿总纲(本文档) | PM | 命名、范围、架构、硬指标、ADR、分工、排期、风险 |
| 01 | EdgeHippo 硬件规格书 | 硬件 | 双板规格、分区表(可直接替换)、容量账、形态矩阵、引脚分配、PHY 冲突、BOM |
| 02 | EdgeMemory 固件规格书 | FW-A | 分层、双后端 HAL、数据模型、.emf 格式、存储布局、命令集、HTTP API、闭环实现、构建规范 |
| 03 | EdgeMesh 网络协议规范 | FW-B | 拓扑、传输矩阵、消息 envelope、六种原语、三种接力模式、账本、安全 |
| 04 | EdgeMemory Studio Web 控制台规格 | WEB | 四通道连接、五步向导、P0–P5 Prompt 全文、.emf 打包、烧录通路矩阵 |
| 05 | EdgeMemory-MVP 测试与验收计划 | QA | 96 条用例、判据映射、自动化、缺陷分级、放行规则、报告模板 |
| 06 | 开发排期与任务分派 | PM | 角色 RACI、WBS 全表(101 项)、甘特、关键路径、里程碑 |
| 07 | 开发团队启动指南(README.md) | PM | 环境搭建、构建命令、目录结构、第一天任务、每周节奏 |
01-产品与战略/EdgeMemory-设备端记忆外设-市场与产品战略报告_v1.0_20261026.html —— 市场验证、竞争定位、单位经济02-工程任务书/EdgeMemory-MVP-产品设计与开发任务书_v1.2_20261026.html —— v1.0→v1.2 的推导过程(容量重算、方案 C 否决依据)04-EdgeMesh-历史方案/ —— 已废弃的算力共享方案,仅供理解 ADR-001
| 代号 | 职责 | 投入 | 交付物 |
|---|---|---|---|
| PM | 架构裁决、范围控制、对外沟通、里程碑放行 | 0.5 | ADR、排期、验收报告 |
| FW-A | EdgeMemory Core(emlite)+ 策略层 + 数据模型 + 事务 | 1.0 | components/edgehippom/、掉电测试、PC 仿真单测 |
| FW-B | 宿主接口(USB CDC/MSC、HTTP+CORS、串口)+ OTA + EdgeMesh | 1.0 | main/ 接口与协议、两板回归 |
| TOOL | eme CLI、.emf 打包器、PC 侧离线 embedding、flash 仿真 | 1.0 | tools/、.emf 校验器 |
| WEB | EdgeMemory Studio 前端 | 1.0 | web/、向导状态机、Prompt 集成 |
| QA | 用例执行、自动化、长稳与掉电台架 | 0.5 | 测试报告、缺陷库 |
main/ 框架与协议)改动必须两板回归;板级差异一律走 boards/sdkconfig.<board_id> + 分区表 + CONFIG_EMGW_*。禁止跨板拷贝 sdkconfigbuild_board.ps1 -Board xiao|devkit|all [-Flash] [-Port]。必须在 PowerShell 显式设 IDF_PATH / IDF_PYTHON_ENV_PATH / IDF_PYTHON_CHECK_CONSTRAINTS=0 + PATH(Git Bash 不支持)。日常增量用 inc_build.shsys.info 的 build_time,不要靠 idf.py build 的退出码(build | while read 会吞退出码)POST /ota,token emgw-ota-demo),串口只用于首刷与排障。KB 镜像 OTA 用 POST /kbota(?dry=1 预检),改前必 --backup{"id":n,"cmd":"name","args":{}}。新增命令必须同步更新 02 号分册第 7 章命令表与 Studio 的协议适配层cmd_console_write + esp_log_set_vprintf)h_index 页面 HTML 约 24 KB| 阶段 | 周次 | 目标 | 并行角色 | 出口判据 |
|---|---|---|---|---|
| M0 基线 | W1–W2 | 源码树核对、分区表改并整片重烧、USB 复合设备冒烟、CORS 冒烟、性能基线测量 | FW-A + FW-B | CDC+MSC 枚举成功;浏览器可 fetch 到板子;sys.info 报出 11.875 MB |
| M1 引擎 | W3–W8 | emlite 存储布局 + 事务 + WAL + 掉电保护;PC 仿真单测全绿 | FW-A + TOOL | G7 掉电 100 次全过;G8 三项达标 |
| M2 检索 | W6–W11 | HNSW/IVF 建索引与查询、混合过滤、策略层去重与冲突消解 | FW-A | G1 + G2 + G3 达标 |
| M3 接口 | W9–W14 | USB CDC+MSC 灌库、HTTP+CORS、串口行协议、OTA/KB-OTA | FW-B + TOOL | G5 四通道达标 |
| M4 闭环 | W12–W16 | 合成数据源 → 特征化 → 检索 → 回写 | FW-A + FW-B | G4 达标 |
| M5 网络 | W13–W18 | EdgeMesh 发现、三模式接力、账本 | FW-B | G9 达标 |
| M6 控制台 | W3–W20 不依赖 emlite,可最早开工 | Studio 五步向导、P0–P5 Prompt、.emf 打包、一键烧录 | WEB + TOOL | 端到端成功率 ≥95% |
| M7 验收 | W21–W24 | 三场景灌库 + 全量 96 条用例 + 长稳 7×24 h | QA + 全体 | G1–G9 全过 → Go/No-Go 评审 |
工时口径见 06 号分册:合计 101 项 / 398 人日(×1.3 缓冲 ≈ 517 人日)。按 5 人投入 ≈ 21 周,与上表 W1–W24 吻合。Go/No-Go 最小集:固件侧 152 人日;含 Studio 演示 187 人日。
| ID | 风险 | 等级 | 缓解 | 触发后的动作 |
|---|---|---|---|---|
| R1 | eXtremeDB 授权条款迟迟不定 | 高 | 双后端 HAL + emlite 先行,授权不再是阻塞项 | 继续 emlite 路线;不对外承诺 emdb 时间表 |
| R2 | 掉电测试不过(G7) | 高 | WAL + CoW + 原子提交;PC 仿真可精确控制断电时刻 | 一票否决,回退到纯软件授权路线评估 |
| R3 | P99 超标(G2) | 高 | 按白皮书三招:① 离线聚类后按簇顺序落盘(I/O 主导非 CPU)② MCU 级用 IVF+graph 混合 ③ 为可预测性调优而非峰值召回 | 降维 / 量化(W1-14),不是换 MCU |
| R4 | 容量不足(G1) | 中 | 三项高杠杆:降维量化 +50~150% > 时序区实测回划 > 分区内动态比例 | 启用 W1-14;不要再压 app 槽(方案 C 已否决) |
| R5 | USB-OTG 与 USB-Serial-JTAG 共用内部 PHY | 中 | PCB 阶段决定:外部 PHY 或烧 eFuse 切 JTAG | 事后不可改;MVP 期板 B 常备 USB-UART 转换器,console 改 UART0 |
| R6 | 改分区表后未及时重烧,导致已灌库作废 | 中 | 分区改动排在 W0-05,必须在任何正式灌库之前;先 esptool flash-id 确认容量 | 整片重烧 + 重灌(Dev-B 现网 4343 条须先备份) |
| R7 | 固件膨胀撑爆 app 槽 | 中 | W0-06 构建期硬门槛:占用 > 槽×0.8 告警、> 槽×0.9 构建失败 | 重新评估槽大小或裁剪功能 |
| R8 | 栈溢出 / 内存泄漏导致长稳失败 | 中 | 7×24 h 长稳;启动即打 heap 水位基线 | 按已知坑排查:NimBLE host ≥8192;hub_task 6144 内不放大缓冲;大数组改堆 |
| R9 | CORS / mixed-content 不通,Web 方案地基失效 | 中 | M0 阶段半天冒烟 | 改走浏览器插件或本地代理;不得为此改回有后端 |
| R10 | 场景缺位(无人真正需要) | 高 | M7 前强制绑定单一杀手场景,不许市场部自己挑;自销 SKU 只作定价锚 | 转向 α 模组 B2B,回避 AI 玩具红海 |
| R11 | S1 召回率被误当作真实数据验证结论外传 | 中 | 合成数据源结论一律标注「合成」;W4-07 真实对照未完成前不得宣称 | 立即更正对外口径 |
| R12 | 合规越线(UI 出现币价 / 提现 / 钱包) | 高 | ADR-012 写入 UI review checklist;发布前逐屏过一遍 | 立即下线并整改 |
| ✅ 可说 | ❌ 不可说 |
|---|---|
|
|
| # | 事项 | 负责 | 耗时 | 说明 |
|---|---|---|---|---|
| 1 | 核对源码树(emgw-tools.cmd status + 备份区比对) | FW-B | 0.5 d | 确认 main/ 的 14 个 .c 与 boards/ 配置是唯一真源,避免在两个副本间反复横跳 |
| 2 | 改分区表 + 整片重烧(方案 B) | FW-A | 0.5 d | 两行 CSV,+61% 容量。必须排在正式灌库之前;Dev-B 现网 4343 条先备份 |
| 3 | 跑 USB 复合设备冒烟(官方 tusb_composite_msc_serialdevice 示例移植) | FW-B | 2 d | 风险最低、信心价值最高。「拖文件即灌库」一旦跑通,整个产品说服力立刻成立 |
| 4 | 跑 CORS 冒烟(板端加 OPTIONS 预检后浏览器 fetch) | WEB | 0.5 d | 整个 Web 方案的地基,不通则一切无从谈起 |
| 5 | 测性能基线(PSRAM 可用量 / 4 KB 页读延迟 / 1 MB 顺序写耗时) | FW-A | 0.5 d | 把所有「推算」标注换成实测起点 |
| 6 | 向 McObject 发书面询问:MCU 端分发授权条款 + eXtremeDB 9.0 三项能力是否在授权内 | PM | 0.5 d | 零成本。手上先有实测数据,谈价地位完全不同 |
| 7 | Studio 向导 + 打包(WP7-C/D)开工 | WEB + TOOL | — | 不依赖 emlite,可立即开始 |
app1 结束地址前移 → edgehippom 起始偏移改变 → 已灌入的记忆全部作废。分区不能向后增长,所以「先用别的方案、不够再改」不是免费选项。