Files
rigdoctor/docs/DECISIONS.md
T
jessey 305b6c4497 Initial commit: docs, decisions, and M1 sensor core
Planning docs (SPEC, ARCHITECTURE, MODULES, ROADMAP, DECISIONS) with
decisions D1-D15 settled: RigDoctor name, Python 3 + Qt/PySide6 stack
(core/CLI/daemon stdlib-only), Ubuntu + NVIDIA first, .deb packaging,
read-only + suggestions, GUI + tray modules, stress module dropped.

First code: the M1 sensor core (stdlib-only) and a CLI.
- core engine: Reading/Sample model, Sampler, hwmon reader
- self-probing sources (NVIDIA first): nvidia-smi GPU, coretemp/k10temp
  CPU, /proc/meminfo + DDR5 SPD memory, NVMe storage
- CLI: snapshot (text/JSON), monitor, sources; record/report stubbed
- stdlib unittest smoke tests

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 16:40:21 +02:00

128 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RigDoctor — Decisions & Open Questions
Format: each item is **OPEN** (needs a call) or **DECIDED** (with date + rationale).
Decisions D1D15 were all settled on 2026-05-21; the original open questions are kept below
with their resolutions so the reasoning is traceable. No tracked decisions are currently open.
## Decided
### D1 — Project name — *DECIDED 2026-05-21*
**RigDoctor.** Confirmed as the final name (repo, package, and CLI command `rigdoctor`).
Alternatives (RigWatch, GameDoc, Penguin Pit Crew, LGD) dropped.
### D2 — Language / runtime — *DECIDED 2026-05-21*
**Python 3 + Qt (PySide6).**
- *Why Python:* fastest AI-assisted development (largest codegen corpus) and a perfect fit
for the real workload — parsing `nvidia-smi`/sysfs/`journalctl`, CSV/JSON, subprocess.
- *Why Qt/PySide6:* one toolkit covers **both** the desktop GUI and the system-tray applet.
- *Layering that preserves "low overhead":* the **core engine, CLI, and crash-logger daemon
stay stdlib-only** (no hard deps, tiny footprint); **only the GUI and tray modules pull in
PySide6**. This maps cleanly onto the modular installer — a headless/server user never
installs Qt.
- *Trade-off accepted:* the GUI carries a Qt runtime dependency (not a single static binary).
Mitigated by shipping a `.deb` that declares `python3` + `python3-pyside6` (see D8).
### D3 — Distro priority order — *DECIDED 2026-05-21*
**Ubuntu first**, by an explicit margin. Debian comes along for free via `apt`. Arch
(`pacman`) / Fedora (`dnf`) / openSUSE (`zypper`) are best-effort later. The package-manager
and distro abstraction stays in the design so other distros can be added, but all primary
development, testing, and packaging target Ubuntu.
### D4 — GPU vendor priority — *DECIDED 2026-05-21*
**NVIDIA first.** It's the seed hardware (RTX 3070) and the source of the motivating crash.
AMD and Intel come later behind the vendor abstraction; nothing should hard-code NVIDIA in a
way that blocks them.
### D5 — MVP scope — *DECIDED 2026-05-21*
**M1 + M3 + M4 (the *Essential* bundle), NVIDIA-only**, CLI-first. This is the first build
target — it captures the seed crash and explains the logs before any installer, GUI, tray,
or multi-vendor work.
### D6 — Crash-logger trigger model — *DECIDED 2026-05-21*
**Let the user choose.** All three modes are supported and selectable (installer + config):
1. **Always-on** `systemd --user` service.
2. **Game-launch-triggered** (auto-start when a game/Steam session starts, stop after).
3. **Manual** (CLI command, or the tray applet's "start recording" button).
*Still open:* the exact game-launch detection mechanism — see D12.
### D7 — Stress / repro module — *DECIDED 2026-05-21*
**Out of scope. Module M7 is dropped.** RigDoctor will not build or bundle stress/load
generators. Users who want to reproduce load can run existing tools (gpu-burn, vkmark,
stress-ng) themselves alongside the logger.
### D8 — Distribution / packaging — *DECIDED 2026-05-21*
**`.deb` package** as the primary distribution channel (matches the Ubuntu-first focus). The
`.deb` declares dependencies per module group; the interactive installer (M9) handles module
selection on top. AUR / Flatpak / COPR are possible later, not now.
### D9 — Scope of action (read-only vs apply-fixes) — *DECIDED 2026-05-21*
**Read-only + suggestions.** RigDoctor diagnoses, monitors, and **suggests** actions in
plain language (with the exact command where possible), but does **not** apply changes
itself in this stage. Auto-applying fixes (governor, power profile, etc.) is a deliberate
later milestone, gated behind explicit user consent when it lands.
### D10 — GUI is a first-class deliverable — *DECIDED 2026-05-21*
The app must run **three ways**: (a) **CLI-only / headless** (full functionality from the
terminal, works over SSH), (b) a **desktop GUI**, and (c) a **system-tray / top-menu-bar
applet** with quick actions. This supersedes the original "terminal-first, GUI maybe later"
non-goal. GUI and tray are separate optional modules over the shared core engine.
### D11 — Tray / menu-bar applet — *DECIDED 2026-05-21*
A small always-available applet in the Linux top menu bar (system tray / StatusNotifierItem,
via Qt's `QSystemTrayIcon`; on Ubuntu/GNOME this surfaces through the AppIndicator
extension). Provides quick actions and at-a-glance status.
*Still open:* the exact set of quick actions/indicators — see D13.
### D12 — Game-launch detection mechanism — *DECIDED 2026-05-21*
**Layered approach, no root** (logger stays a `systemd --user` service):
1. **Wrapper (precise, primary):** `rigdoctor wrap %command%` for per-game Steam launch
options, plus an installer helper that registers RigDoctor as a **global Steam
compatibility tool** (covers all Proton games without per-game edits). The same wrapper
field works in Lutris/Heroic. Deterministic start/stop, knows the title, needs no
watcher daemon. *Build first.*
2. **Zero-config watcher (fallback):** low-frequency poll of Steam's `RunningAppID`
(`~/.steam/registry.vdf`) plus a `/proc` heuristic for non-Steam launchers, for users
who won't edit launch options. *Build later.*
3. **GameMode (opportunistic):** if Feral `gamemoded` is present, use its D-Bus
`GameRegistered`/`GameUnregistered` signals (via `gdbus`/`busctl` — no Python dbus dep).
- *Explicitly rejected:* root-only kernel mechanisms (proc-connector netlink `PROC_EVENTS`,
eBPF) — they'd force the logger to run as root.
- *Phasing:* wrapper ships with the game-launch trigger mode (Phase 4); watcher + GameMode
follow.
### D13 — Tray / menu-bar applet: actions & indicators — *DECIDED 2026-05-21*
**Live readouts (from M1) + a Run Diagnostic action.**
- **At-a-glance live data** shown inline in the tray dropdown, refreshed periodically:
**CPU temp, GPU temp, memory used/total** (e.g. "14 GB / 32 GB"). A status dot
(normal / throttling / alert) is proposed alongside.
- **Run Diagnostic** — the primary action. Launches the **guided diagnostic session**
(SPEC §4): prompts *which game to focus on*, starts a focused log collection for that
game's session (M3, scoped via the D12 game detection), then scans/analyzes (M4) and
presents the findings.
- **Supporting actions (proposed minimal set):** Open dashboard (M10), Start/Stop recording
(manual trigger), Snapshot now, Quit.
### D14 — Final installer module list & bundles — *DECIDED 2026-05-21*
**Use the current `MODULES.md` catalog and bundles as final.** Modules: M1, M2, M3, M4, M5,
M6, M8, M9, M10, M11 (M7 dropped). Bundles: Essential / Monitoring / Diagnostics /
Desktop UI (+ Custom). No further additions planned for v1.
### D15 — Distro package-name mapping → apt-only — *DECIDED 2026-05-21*
*What it was:* RigDoctor's optional modules need a few system packages (smartmontools,
lm-sensors, dmidecode, python3-pyside6, AppIndicator). The same tool is named differently
per distro (e.g. `lm-sensors` on apt vs `lm_sensors` on pacman/dnf; Qt is `python3-pyside6`
on apt). Supporting multiple distros would require a table mapping each logical dependency to
the right package name per package manager.
*Decision:* **apt-only.** We maintain package names for **Ubuntu/apt only** and do **not**
build or maintain mappings for other package managers. A thin seam is left in the design so
another package manager *could* be added later, but multi-distro support is **not** a planned
deliverable. Revisit only if Ubuntu-only proves too narrow.
## Open
None currently — all tracked decisions (D1D15) are resolved. New questions will be added
here as they arise. Remaining detail to flesh out during build: the tray's supporting-action
set (D13 proposed list) and per-module apt package names (filled in as modules land).
</content>
</invoke>