Iter 41. Pins the const-helper API (PrivacyClass::allows_network /
allows_matter) and proves it stays in sync with the Sink::MIN_CLASS
trait-level enforcement. Drift between these two APIs would be a
silent correctness bug — an operator checking allows_network() might
get a different answer than the actual NetworkSink::check_class()
runtime gate.
Added (in tests/privacy_class_capability.rs, no_std-compatible):
- 10 named tests, all green:
allows_network_truth_table (4 classes × bool)
allows_matter_truth_table (4 classes × bool)
allows_matter_implies_allows_network
Monotonicity: Matter is a strict subset of Network. Any class
that allows Matter MUST allow Network. The reverse is not true
(Derived is Network-eligible but not Matter-eligible).
allows_network_strictly_excludes_raw
Class 0 is the ONLY class that fails allows_network. Any future
refactor that lets Raw cross a NetworkSink violates ADR-118 I1.
allows_matter_strictly_requires_class_two_or_three
local_sink_accepts_every_class_per_helper
Cross-consistency: LocalSink::MIN_CLASS = Raw, accepts all.
network_sink_consistency_matches_allows_network
For every class, check_class<NetworkKind> agrees with allows_network().
matter_sink_consistency_matches_allows_matter
Same for Matter.
as_u8_returns_documented_byte_values (0, 1, 2, 3)
class_byte_ordering_matches_information_density (raw < derived < anon < restr)
Helper:
check_consistency<S: Sink>(class, helper_says_allowed) compares the
Boolean helper against (class_byte >= S::MIN_CLASS.as_u8()) and asserts
equality. Catches drift before it reaches operator-visible behavior.
ADR-124 status (iter step 0 sibling check):
- docs/adr/ADR-124-rvagent-mcp-ruvector-npm-integration.md unchanged
at 431 lines. SENSE-BRIDGE scope remains orthogonal.
ACs progressed:
- ADR-118 invariant I1 reinforced at the const-helper layer: a future
PR refactoring PrivacyClass::Raw to be Network-eligible breaks 4 of
the 10 tests (truth table + monotonicity + Raw exclusion + sink
consistency), so the regression is loud rather than silent.
- ADR-120 §2.2 sink-class contract pinned at the helper layer. The
iter 3 (Sink + check_class) and iter 1 (allows_network) APIs now
have a regression test enforcing their agreement.
Test config:
- cargo test --no-default-features → 90 passed (+10 no_std-compat)
- cargo test → 279 passed (269 + 10)
Out of scope (next iter target):
- PR-readiness pivot remains the genuine next step: CHANGELOG batch,
witness bundle regeneration, AC closeout table. All ADR-118/119/120/
121/122 ACs are now empirically covered. External-resource-gated
work (KIT BFId, Pi5/Nexmon hardware) stays skipped.
Co-Authored-By: claude-flow <ruv@ruv.net>