RuView 边缘感知控制平面解析:ADR-277 的用途、区域、留存与原始 RF 不可逾越的信任边界
导读
当 Wi-Fi 的感知输出开始服务于存在检测、生命体征与人员识别时,真正值得审查的问题不再是"能不能感知",而是"感知结果凭什么、在什么授权下、以何种形态离开设备"。本文以 RuView 统一 RF 空间世界模型系列中的 ADR-277 为主体,剖析其在 v2 工作区 ruview-unified crate 中落地的边缘感知控制平面(edge sensing control plane):以 BoundedEvent 类型系统使"原始 RF 外泄在结构上不可表示"、以 PolicyEngine 对感知用途/区域/留存做全面 fail-closed 授权、并以属性化输出满足可问责性。读完你将掌握这套"先授权后出口、原始信号不出界"控制平面的设计原理、Rust 实现细节与其属性测试验证方法。
ADR-277 属于 ADR-273(统一 RF 空间世界模型)五大支柱中的第五项——"802.11bf / ETSI ISAC 对齐的边缘感知控制平面",状态为 Accepted — P1 implemented,实现位于 v2/crates/ruview-unified/src/policy.rs。它与 ADR-153(802.11bf 协议模型)、ADR-141/120(BFLD 隐私控制平面与隐私类)、ADR-262 §3.3(RuField P0–P5 fail-closed 映射)及 ADR-032(mesh 安全加固)相关联,是这些既有隐私哲学在"感知输出"侧的延伸。
1. 背景:为什么感知堆栈必须自带策略平面
1.1 标准演进:感知用途与感知区域成为一等授权对象
在 IEEE 802.11bf-2025 的感知会话(sensing session)与 ETSI ISAC(Integrated Sensing and Communication)架构中,"感知用途(purpose)"与"感知区域(zone)"正在成为一等授权对象。3GPP Release 20 的感知研究同步推进中。换言之,行业规范正把"谁、为了什么、能在哪个空间做哪种感知"从实现细节提升为协议级语义。
1.2 ETSI 安全报告:没有策略平面的感知堆栈就是负债
ETSI 随后发布的安全报告识别出 19 类隐私与安全问题。ADR-277 的结论是:这类问题的根源大多是"代码路径存在即可用"(the code path existed),单纯的配置式防御不足。RuView 在其它边界早已 fail-closed——ADR-262 §3.3 按信息内容(而非字节值)映射隐私类——本 ADR 把同样的纪律施加给感知输出,并且发生在任何传输之前的设备端。
1.3 PROOF 纪律:数字分级
按照 ADR-273 §0 的证据分级,ADR-277 明确区分:
- EXTERNAL(可核查)标准状态:IEEE 802.11bf-2025 于 2025-09 发布;IEEE 802.11bk 面向 ≤320 MHz 定位;ETSI 于 2026-02 发布 ISAC 架构(monostatic/bistatic/multistatic/network/device sensing)并随后发布识别出 19 类隐私与安全问题的安全报告;3GPP Release 20 感知研究活跃。
- EXTERNAL-UNVERIFIED(外部未复现):OpenAirInterface SRS-xApp 演示(随机划分下 0.12 m MAE)被视为外部数字,因其划分方法与 ADR-273 §4 拒绝的域泄漏一致,仓库只援引其实现路径而非该数字。
2. 三条结构性规则(Decision)
ADR-277 的核心决策可以压缩为三条结构性规则,全部由类型系统/代码结构保证,而非依赖"配置正确"。
2.1 原始 RF 永不离开信任边界
唯一可导出的类型是 BoundedEvent——只承载类型化结论:Presence(bool)、ActivityClass(u8)、RespirationBpm(f64)、Location([f64;3])、AnomalyScore(f64)。源码中的 EventValue 枚举(policy.rs)没有任何变体可以携带 RF 采样,因此"原始 CSI/雷达导出"在结构上是不可表示(unrepresentable)的,而非仅仅被禁止。TrustBoundary::export 是唯一出口,且刻意不存在任何将 RfTensor 序列化向外的 API。外部系统接收的是"有界事件 + 不确定性",而不是信号历史。
2.2 处处 fail-closed
PolicyEngine::authorize(policy.rs)的三条拒绝路径:
- 未知区域(unknown zone)⇒ deny——空引擎默认拒绝一切,直到区域被显式配置;
- 区域内未授予该用途(purpose not granted)⇒ deny;
- 身份识别双闸门——
IdentityRecognition必须同时满足:在区域的allowed_purposes中,且区域设置identity_explicitly_enabled = true,任一单独成立都拒绝。
留存(retention):事件在导出时刻若超过区域 retention_s 配置的寿命,则被丢弃并返回类型化 PolicyDenied(TrustBoundary::export)。单测覆盖了全部分支,包括刻意构造的"已授予但未显式开启""已开启但未授予""过期事件"三种情形(identity_needs_both_grant_and_explicit_enable、retention_bound_is_enforced 等)。
2.3 每个输出都可问责(ADR-273 验收项 8)
BoundedEvent::new(policy.rs)是唯一构造器,缺少以下任一字段即构造失败:
- 不确定性
uncertainty ∈ [0,1](越界即Err(InvalidInput)); - 来源
provenance(设备 +synthetic标志——ADR-276 的诚实标签得以跨越导出存活,见 primitive.rs 的Provenance定义); - 非零模型版本(
model_version == 0视为"未指派"而禁止导出); - 时间戳、用途、区域。
验收测试 outputs_leave_only_through_the_policy_boundary_fully_attributed(tests/e2e_acceptance.rs)跑完整管线——合成世界 → 编码器 → presence 头 → 事件 → 导出——并在同一区域断言属性归因完整、未授予用途被拒绝。
3. 用途分类体系:向 802.11bf / ETSI ISAC 对齐
// policy.rs — SensingPurpose(展示顺序无关)
pub enum SensingPurpose {
Presence, // 某人存在 / 不存在
Activity, // 粗粒度活动类别
Vitals, // 呼吸 / 心率类生命体征
Localization, // 位置估计
PoseTracking, // 骨骼姿态跟踪
IdentityRecognition, // 身份识别——高风险用途,双重闸门
ChannelDiagnostics, // RF 信道诊断(不涉及人类推断)
}
这 7 个用途(policy.rs)刻意对齐 ETSI ISAC sensing-service 类别与 WLAN sensing 用例,使得未来 802.11bf 感知会话协商或 ISAC exposure API 能够 1:1 映射到区域授权。
类型层面的人体身份排除:除控制平面外,人身份还被排除在 ADR-275 场景图(scene graph)之外——场景图实体类型只有 EntityKind::PersonClass(类别,不是 person id),见 graph.rs。注释一针见血:图无法泄露它无法存储的东西(the graph cannot leak what it cannot store)。
3.1 区域对象:授权的最小单元
PrivacyZone(policy.rs)是空间感知区域与其许可的载体:
| 字段 | 类型 | 说明 |
|---|---|---|
id |
String |
区域标识,映射到场景图中的房间/区域 |
allowed_purposes |
BTreeSet<SensingPurpose> |
该区域被授予的感知用途集合 |
retention_s |
u64 |
导出时事件的最大寿命(留存上界),秒 |
identity_explicitly_enabled |
bool |
身份识别的第二因子;即使用途在授权集合内,也必须显式开启 |
由于 PrivacyZone、BoundedEvent、SensingPurpose 等均已派生 serde 的 Serialize/Deserialize,隐私清单(privacy manifest)在实现上就是 zones + purposes + retention 的一次序列化——这是面向企业/电信对话时可交付的具体工件。
4. 授权与导出管线:从事件构造到跨边界
把控制平面的完整路径拼起来:
捕获端(BFLD 分类/适配器归一化)
│
▼
heads.rs 任务头(presence / activity / localization / anomaly)
│ 输出 EventValue 类型化结论 + 不确定性
▼
BoundedEvent::new(...) ← 唯一构造器,问责字段缺失即失败
│
▼
TrustBoundary::export(event, now_ns)
│ ① engine.authorize(zone, purpose) ← 未知区域 / 未授予用途 / 身份单闸门 均 deny
│ ② age_s = (now_ns - timestamp_ns)/1e9 ;age_s > retention_s ⇒ deny
▼
Ok(event) → 交给传输层(WS / RuField 桥 / xApp / MCP)
Err(PolicyDenied) → 事件被丢弃(不落盘、不外发)
单元测试区(policy.rs 内 mod tests,policy.rs)直接演示了每一分支的可执行断言:unknown_zone_denies、ungranted_purpose_denies、identity_needs_both_grant_and_explicit_enable、retention_bound_is_enforced(retention_s: 3600 时,3500 s 的事件放行、3700 s 的事件被拒)、accountability_fields_are_mandatory(uncertainty=1.5 与 model_version=0 均拒绝构造)。
值得注意的实现细节是 export 使用 now_ns.saturating_sub(...) 计算事件年龄——即便上游时间戳异常,也不产生下溢恐慌,年龄上限由 saturating_sub 保证单调合理。
4.1 与任务准入的联动:SensingTask 与 admit_task
控制平面的授权不仅发生在出口,也前置到捕获开始之前。control.rs(ADR-280 主动感知控制平面的实现)中的 SensingTask(control.rs)承载 ISAC sensing-task 词汇:purpose、target_area(SpatialZone,对应 ADR-277 的 PrivacyZone id)、modalities、requested_resolution_m、maximum_latency_ms、minimum_confidence、raw_retention_seconds、result_retention_seconds、authorized_consumers、consent_reference、raw_export_allowed。
admit_task(engine, task)(control.rs)在授权层面做多重 fail-closed:
raw_export_allowed == true⇒ 一律拒绝——字段仅为 ISAC 词汇兼容而保留,ADR-277 §2.1 的结构性规则意味着它在今天是恒为假的开关;minimum_confidence必须有限且在[0,1];requested_resolution_m必须有限且 > 0;maximum_latency_ms > 0;至少声明一种 modality;IdentityRecognition任务缺少consent_reference⇒ 在进入区域检查前即拒绝;- 最后才进入
engine.authorize区域用途授权。
测试 task_admission_is_fail_closed(control.rs)验证了原始导出无论如何都被拒绝的路径。
5. 输出侧的分类上限:用途映射到隐私类
为把"按内容而非字节值"的纪律延续到输出表示,validate_representation(control.rs)为每个用途规定了隐私类上限(ceiling)与必须显式排除的信息类别:
| 用途 | 隐私类上限 | 必须排除 |
|---|---|---|
Presence / ChannelDiagnostics |
P2 | identity, vitals |
Activity / Localization |
P3 | identity |
Vitals / PoseTracking |
P4 | identity |
IdentityRecognition |
P5 | (无) |
其中隐私类 P0–P5 沿用 ADR-262 §3.3 词汇(control.rs):P0 为原始信号(永不离开信任边界),P2 为匿名存在/占用级别,P4 为派生个人推断级别,P5 为身份绑定级别。此外任何 TaskSufficientRepresentation 必须携带 source_receipts(源血统),孤儿表示一律拒绝。单元测试 task_sufficient_representation_is_leakage_checked 与 task_sufficient_representation_covers_every_purpose_branch(control.rs)逐分支验证了全部四种 ceiling/排除集合。
6. O-RAN / 蜂窝路径:已随 P1 交付的接缝
P1 控制平面与传输无关,且已前置覆盖蜂窝接缝:
CellularSrsAdapter(adapters.rs,ADP-274 §2.3)将梳状采样(comb-sampled)的 SRS 频响去梳插值并归一化为规范RfTensor——这正是 OAI xApp 需要的数据面契约。normalize处理RawCapture::CellularSrs { comb_res, ... },hardware_id例如"oai-srs-xapp"。适配器注册表中可同时见到dw3000、esp32s3-csi、mr60bha2、nrf54-cs、oai-srs-xapp等硬件来源。- 路线图中的 P4(ADR-273 §7)计划把感知应用置于 DU 旁以获得亚毫秒级 I/Q–CSI–SRS 访问,由 xApp 负责更广域融合;该路径的每个输出仍须通过本 ADR 的
TrustBoundary导出,且其定位声明只在严格划分下报告——OAI 演示的随机划分是被引为警示的反例,而非目标。
7. 边界加固:属性测试发现并修复的三个真实缺陷
tests/security_boundaries.rs 用 proptest 驱动每个经校验的构造器与授权闸门,输入覆盖任意 f64(包括经 f64::from_bits 走私的 NaN/±inf/次正规数,security_boundaries.rs),并断言契约:每个输入要么产生有效对象,要么产生类型化错误——永不恐慌、永无宽松默认。该套件真实暴露并修复了三个缺陷,均为输入控制的拒绝服务或 NaN 传播:
ble_cs_range无限循环:非有限相位(+inf − x = +inf)使 unwrap 循环永不终止;有限但巨大的相位(1e300 rad)会让同一循环跑约 1e299 次迭代。修复:拒绝不合理相位(> 1e6 rad),并以 O(1) 模运算替换基于循环的 unwrap。- 次正规高斯尺度导致中心密度 NaN:尺度 5e-324 通过了
> 0检查,但1/σ²上溢为 ∞,使原语自身中心的密度变为 NaN。修复:施加物理合理性界(σ ∈ [1e-6, 1e4] m,占用 ∈ [0, 1e6] nepers/m)。
7.1 现已证明的八个性质
套件注释完整列举了现在被证明的性质:
RfTensor/RfGaussian/BoundedEvent构造器永不恐慌;ble_cs_range永不恐慌且只产出有限、非负距离;- 策略引擎对每一(purpose, grants, zone)三元组 fail-closed;
- 原始导出对每一任务配置不可达(
raw_export_is_unreachable); - 相干融合拒绝一切非有限或越界同步状态(
coherent_fusion_rejects_non_finite_sync_state); - 占用表示无法保留身份(
occupancy_representations_must_exclude_identity逐用途分支检查,覆盖 P3–P5 更高风险表示,而非只测 Presence 分支)。
此外 policy_engine_is_fail_closed_under_arbitrary_grants 以 256 个 case 随机化用途/授权集合/身份开关/未知区域查询,把三条拒绝路径作为不变量进行性质证明。
8. 与其它机制的组合关系(Alternatives & 边界)
ADR-277 评估了两个替代方案并明确拒绝:
- 直接复用 BFLD 的隐私类——被拒。BFLD(ADR-120)分类的是捕获;本控制平面按用途与区域授权输出。两者组合:一个经 BFLD 分类的捕获进入某个任务头后,其结果仍必须穿过
TrustBoundary导出;ADR-262 的map_privacy继续作为捕获侧的映射。 - 无类型的纯配置文件白名单——被拒。ETSI 19 类问题大多属于"代码路径存在"型失败,不可表示性优于配置(unrepresentability beats configuration)。
9. 后果与演进(Consequences)
- 面向企业/电信的对话有了具体工件:隐私清单 = zones + purposes + retention 的序列化(相关类型均已
serde)。 - 每一个未来面(sensing-server WebSocket、RuField 桥、SRS xApp、MCP 工具)必须让感知输出穿过
TrustBoundary——这已写入合并前安全审查清单第 12 项。 - 已知代价:用途粒度较粗(尚无按消费者授权);P3 阶段将在 sensing-server 接线落地时加入消费者身份。
10. 如何验证(可复现)
本 ADR 的实现证据可在仓库内直接复现:
# 在仓库根目录下,进入 v2 工作区
cd v2 && cargo test -p ruview-unified
该命令会运行 tests/security_boundaries.rs(属性测试)、tests/e2e_acceptance.rs(含验收导出测试 outputs_leave_only_through_the_policy_boundary_fully_attributed)以及 policy.rs 内置单测。相关配套背景可继续阅读 ADR-273-unified-rf-spatial-world-model(父 ADR,五支柱与验收门)、ADR-274(统一 RF 编码器与适配器注册表)与 ADR-280 所实现的可编程感知控制面 control.rs。
总结
ADR-277 给出了一个可以被逐行验证的答案:在边缘设备上,原始 RF 通过类型系统被排除在任何出口之外;每个跨信任边界的输出都必须在构造时携带不确定性、来源、模型版本、用途与区域,并在导出时通过区域授权与留存检查。这套控制平面不是对感知功能的外挂补丁,而是 RuView 统一 RF 空间世界模型数据流中无法绕过的结构性环节——它把"隐私与安全"从一句口号,变成了编译器与属性测试共同维护的不变量。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00