- Target framework
net10.0with nullable and implicit usings enabled. Keep Core types dependency-free beyond the BCL. - Preserve layered boundaries: Core contains models, services, and platform logic (ADB); UI handles presentation with MVVM. The UI layer references Core, never the reverse.
- MVVM with CommunityToolkit.Mvvm — use
[ObservableProperty],[RelayCommand], andpartial void OnXChangedfor property change reactions. - Avalonia UI with compiled bindings enabled by default. Use
x:DataTypeon views. - LiveCharts2 (
LiveChartsCore.SkiaSharpView.Avalonia) for time-series charting. - Keep one top-level type per file. Nested types are fine within their parent.
- Prefer the latest .NET language/runtime features where appropriate.
- Use trailing commas in multi-line initializers, parameter lists, and collection expressions to simplify diffs.
- Do not use private properties. Use private fields for stored state and private methods for computed values.
- Store the actual dependency you need, not an intermediary object you repeatedly drill into.
- Actively reduce duplication when introducing repetitive code. Consider whether shared abstractions can eliminate repetition structurally rather than just hiding it behind a helper method.
- Avoid instantiating objects inline when passing them to methods; assign to a variable first.
- Make all types
sealedby default. Only omitsealedwhen a type is explicitly designed for inheritance.
- Never use emoji icons in code, documentation, commit messages, or any project artifacts.
- Do not add comments that simply state "generated by AI" or similar attributions.
- Do not include
Co-Authored-Byattribution lines in commit messages. - Use simple
git commit -m "message"— do not use heredocs.
- At the start of each session, ask the user for the NVIDIA Shield IP address so you can run
adb connect <IP>to test changes on the device. Last known IP: 10.0.0.99. - Disconnect with
adb disconnect <IP>when done testing.