Non-functional requirements — Rymflux v1
Vague NFRs are not NFRs. Every row has a measurable target derived from the charter constraints and platform philosophy.
Non-functional requirements — Rymflux v1
Performance
| ID | Requirement | Target | Measurement |
|---|---|---|---|
| NFR-PERF-1 | Playback start latency (stream URL) | ≤ 2 seconds from play command to first audio frame, p95 | Engine instrumented play_called → audio_frame_emitted |
| NFR-PERF-2 | Playback start latency (local file) | ≤ 500ms from play command to first audio frame, p95 | Engine instrumented metric |
| NFR-PERF-3 | Plugin launch time (first request cold start) | ≤ 5 seconds from request to first response byte, p95 | Plugin runtime request_sent → first_byte_received |
| NFR-PERF-4 | Search response time (all plugins, best case) | ≤ 2 seconds for 3 plugins responding within timeout, p95 | Search manager query_started → results_displayed |
| NFR-PERF-5 | Plugin idle memory | ≤ 50 MB per idle plugin process | OS process RSS measurement |
| NFR-PERF-6 | Room switch latency | ≤ 300ms from user action to room UI rendered, p95 | Shell switch_requested → room_activated |
| NFR-PERF-7 | Plugin binary size | ≤ 20 MB for reference local-files plugin | File size on disk |
Reliability & availability
| ID | Requirement | Target | Measurement |
|---|---|---|---|
| NFR-REL-1 | Core platform crash-free rate | 99.5%+ of sessions (measured weekly) | Crash reporting telemetry |
| NFR-REL-2 | Plugin crash recovery | Plugin crash does not crash the core. Recovery (restart + retry) within 10 seconds | Plugin runtime process_exited → next_request_handled |
| NFR-REL-3 | Queue durability across restarts | Queue persistence is a Should (S5) requirement deferred to v2. No measurement target applies until the feature is implemented. | — |
| NFR-REL-4 | Library data integrity | Library file corruption detected on load; automatic backup restored from last known-good copy | Integrity check on library load (checksum) |
Security & isolation
| ID | Requirement | Target / standard | Notes |
|---|---|---|---|
| NFR-SEC-1 | Plugin process isolation | Plugins run as separate OS processes. A plugin crash or memory error does not affect the core or other plugins. | Enforced by OS process boundaries (constraint C1) |
| NFR-SEC-2 | Plugin filesystem access | Plugin can only read/write within its own config and state directories and any explicitly granted paths | Plugin manifest may declare read_paths and write_paths permissions |
| NFR-SEC-3 | No plugin code loaded into core | Core process must never load, link, or exec plugin code in its own address space | Validated by design review and CI artifact scan |
| NFR-SEC-4 | Content ID collision prevention | Library content IDs are UUIDs. No two content items share a UUID. | UUID v4 with collision probability < 1e-18 per 1B items |
Compatibility
| ID | Requirement | Target | Notes |
|---|---|---|---|
| NFR-COMPAT-1 | Desktop platform support | Linux (Ubuntu 22.04+, Fedora 38+), macOS (14+), Windows (10+) | Constraint C5 |
| NFR-COMPAT-2 | Plugin language support | Any language that can produce a standalone executable (compiled or interpreted with shebang) | Protocol is JSON over IPC; no language-specific runtime required |
| NFR-COMPAT-3 | Audio format support (reference plugin) | MP3, FLAC, OGG Vorbis, WAV, AAC (M4A) | Reference plugin FFmpeg-based or uses per-platform decoders |
Resource usage
| ID | Requirement | Target | Notes |
|---|---|---|---|
| NFR-RESC-1 | Core platform baseline memory (idle, no plugins loaded) | ≤ 120 MB RSS | Startup measurement |
| NFR-RESC-2 | Core platform baseline disk usage (application only) | ≤ 200 MB installed | Excludes user library data |
| NFR-RESC-3 | Plugin idle timeout | Plugin terminated after 5 minutes of inactivity (configurable) | Prevents resource exhaustion from many idle plugins |
Maintainability
| ID | Requirement | Target | Notes |
|---|---|---|---|
| NFR-MAINT-1 | Plugin API versioning | Plugin manifest declares protocol version. Core rejects plugins with unsupported major version. | Breaking change requires major version bump and ADR |
| NFR-MAINT-2 | Plugin debugging | Plugin stdout and stderr captured and viewable through core diagnostics | Scope FR-PLUGIN debugging |
| NFR-MAINT-3 | Startup time (cold, no plugins) | ≤ 3 seconds from launch to UI ready | First-time and subsequent cold start |
Accessibility
| ID | Requirement | Standard |
|---|---|---|
| NFR-A11Y-1 | Keyboard navigation for all core UI controls | All transport controls, room navigation, and search operable via keyboard alone |
| NFR-A11Y-2 | Screen reader support for playback status | Now-playing metadata, transport state (playing/paused), and queue position announced |
Internationalization
| ID | Requirement | Notes |
|---|---|---|
| NFR-I18N-1 | UI strings externalized to resource files | v1: English only. Externalization enables community translations in v2. |