schema = "sim.features"
[enforcement.audience]
code = "strict"
framework = "strict"
[enforcement.specimen]
user = "strict"
framework = "strict"
code = "advisory"
[enforcement.route]
major_entrypoints = "advisory"
frameworks = "advisory"
[[feature]]
id = "feature/sim-stream-host/generated-docs"
title = "Repository documentation surface"
summary = "Publish generated package, card, rustdoc, and index facts for stream host and hardware bridge crates."
owner = "crate/xtask"
audiences = ["code"]
guidance = "Use this row when checking the generated documentation and index lane for stream host surfaces."
claims_anchors = [
"anchor/cli/xtask",
"anchor/crate/xtask",
"anchor/doc/generated/card-index",
"anchor/doc/generated/feature-map",
"anchor/doc/generated/provenance",
"anchor/doc/generated/repo-contract",
"anchor/doc/generated/rustdoc-index",
"anchor/doc/generated/sim-index-fragment",
"anchor/repo/sim-stream-host",
]
claims_surfaces = [
"cli/xtask",
"docs/sim-stream-host/generated",
]
[[feature]]
id = "feature/sim-stream-host/hardware-host-surfaces"
title = "Hardware host surfaces"
summary = "Collect shared stream placement, Viture glasses semantics, Halo glasses semantics, and watch bridges above capsule-owned physical ports."
owner = "crate/sim-lib-stream-host"
audiences = ["code", "framework"]
guidance = "Use this row when placing a stream on host hardware or choosing a modeled device adapter."
claims_anchors = [
"anchor/crate/sim-lib-stream-halo",
"anchor/crate/sim-lib-stream-host",
"anchor/crate/sim-lib-stream-viture",
"anchor/crate/sim-lib-stream-wristbridge",
]
claims_surfaces = [
"site/sim-lib-stream-host",
]
claims_specimens = [
"spec-test/sim-stream-host/src/placement_tests",
]
[[feature]]
id = "feature/sim-stream-host/read-first-device-sessions"
title = "Read-first device sessions"
summary = "Separate observation authority from registered, bounded, named device effects through reachable session types and versioned provider manifests."
owner = "crate/sim-lib-stream-host"
audiences = ["code", "framework"]
guidance = "Open providers through OpenedSession. Keep observation consumers on ObservationSession; request EffectSession only for a registered descriptor and validate ProviderManifest against EffectRegistry before registration. Compose apparatus diversity from the generic revision-4 catalog and synthetic cassettes under provider-packs/; keep physical selection and identity private."
claims_specimens = ["spec-test/sim-stream-host/src/device_tests"]
supports = ["feature/sim-stream-host/hardware-host-surfaces"]
[[feature]]
id = "feature/sim-stream-host/named-music-effects"
title = "Named, bounded music effects"
summary = "Admit only reviewed MIDI send, audio route open/close, and emergency-stop adapters with explicit authority descriptors and deterministic fake-provider proof."
owner = "crate/sim-lib-stream-host"
audiences = ["code", "framework"]
guidance = "Compose MusicEffect descriptors through music_effect_registry; never translate arbitrary strings into provider commands. Use FakeEffectSession to prove expiry, idempotence, bounds, reversal, and local stop without hardware."
claims_anchors = [
"anchor/export/sim-lib-stream-host/shape/device-effect",
"anchor/export/sim-lib-stream-host/shape/music-effect",
]
claims_specimens = ["spec-test/sim-stream-host/tests/device_authority"]
supports = ["feature/sim-stream-host/read-first-device-sessions"]
[[route]]
id = "route/add-hardware-host-surface"
task = "Add a hardware host surface"
audiences = ["code", "framework"]
steps = [
{ feature = "feature/sim-stream-host/hardware-host-surfaces", why = "The host row owns placement, device adapters, and hardware-facing stream surfaces." },
{ feature = "feature/sim-stream-host/read-first-device-sessions", why = "Choose observation-only or registered effect authority before exposing the provider." },
]