msrt 0.1.8

Portable MSRT protocol implementation.
Documentation
# MSRT 架构总纲

MSRT 是面向 MCU 和上位机之间字节链路的消息传输协议核心。它应该能运行在 `no_std` 环境里,也应该能被 host、RTIC、Embassy、Tokio 或测试程序驱动,但协议核心不能绑定任何一个 runtime、HAL 或 adapter。

当前项目只讨论协议核心,不讨论串口驱动、USB CDC 驱动、DMA、tokio task、RTIC task 或命令行工具。这些属于 adapter 或应用层。

## 核心原则

- 协议核心是状态机,不是 runtime。
- 外部 API 尽量小,默认入口是 `endpoint``error`- 外部负责提供时间、输入 bytes 和发送 buffer。
- engine 负责维护协议状态、分片、ACK、重传、重组和输出动作。
- core、engine、reliability、wire 分层必须清楚,不能互相泄漏职责。
- 文档只记录架构思想,具体实验、实现步骤和临时计划不放在这里。

## 用户心智模型

外部用户只需要持续驱动 endpoint:

```rust
endpoint.receive(now_ms, bytes);
endpoint.send(message)?;

match endpoint.poll(now_ms, tx_buf)? {
    EndpointPoll::Transmit { bytes, .. } => write_link(bytes),
    EndpointPoll::Message(message) => deliver(message),
    EndpointPoll::SendFailed(failed) => report(failed),
    EndpointPoll::Idle => {}
}
```

`receive` 不等待更多输入,`send` 不等待链路发送完成,`poll` 每次只推进并返回一个高层动作。`Engine` 是 endpoint 内部持有的协议状态机,不作为 crate 外部 API 暴露。

## 分层

MSRT 当前分成五个协议部分:

- [core]core.md:协议对象和协议语言。
- [engine]engine.md:协议状态机入口和状态推进。
- [endpoint]endpoint.md:连接生命周期、单 peer 和多 peer 会话管理。
- [reliability]reliability.md:ACK、去重、重传、可靠性策略。
- [wire]wire.md:字节流边界、校验和重同步。
- [header-redesign]header-redesign.md:为了减少包头而做的 packet kind/header 边界改版记录。
- [stress-testing]stress-testing.md:压力测试过程、ACK 修复和噪音模型结论。

它们的关系可以理解为:

```text
wire
  从 byte stream 恢复完整 encoded packet bytes

core
  定义 packet、packet kind、message id 等协议对象

reliability
  判断 packet 是否重复、是否已 ACK、是否需要重传

engine
  组合以上能力,对外表现为一个可轮询状态机

endpoint
  在 engine 之上管理连接生命周期和 peer -> Engine 映射
```

## Cargo Features

MSRT 的 feature 边界要保持小而明确:

```text
default = ["std"]
dynamic-recovery
tracing
```

- `std`:默认启用,面向普通 host/bin/test 使用。
- `dynamic-recovery`:启用 RTT/PTO 动态恢复策略,适合动态网络、UDP、公网或延迟抖动明显的链路。
- `tracing`:启用库内部结构化诊断日志。默认不开,不跟随 `std`,库也不配置 subscriber。

库代码里不应该使用 `println!` / `eprintln!` 做诊断输出。需要诊断时使用 `tracing` feature;真正把日志打印到终端、文件,或者附带文件名和行号,是 bin、adapter 或应用层的责任。

默认配置服务于 MCU/串口这类短链路:

```text
固定 RTO
固定 retry limit
无 tracing 依赖
```

动态网络或公网 UDP adapter 可以显式启用 `dynamic-recovery`。历史压力测试 binary 已经从主 crate 移除,后续应该放在 adapter、仿真项目或独立测试项目里。

## 临时实现文档

未来持续开发时,可以在本地创建:

```text
architectures/implement/
```

这个目录用于放临时实现计划、实验记录、调试笔记和迁移步骤。它不进入 git,避免架构文档再次变成过程记录。