Files
kst4contest/docs/superpowers/specs/2026-11-11-beacon-session-safety-design.md
T

129 lines
7.2 KiB
Markdown

# Beacon Session Safety Design
Freigegeben von Marc am 2026-11-11.
## Ziel
Die Beacon-Funktion darf nach einem Programmstart oder Profilwechsel nicht aus einer
gespeicherten Aktivierung weiterlaufen. Jeder Beacon wird in der laufenden Sitzung bewusst
eingeschaltet, hält seine eigene Kategorie-QRG als Referenz fest und schaltet nur bei einer
automatisch von UCXLog oder Win-Test gemeldeten Abweichung von mehr als 5 kHz ab.
Der zusammengefasste `MyBeacon`-Chip macht Aktivierung, Teilaktivierung, automatische
Abschaltung und Versandfehler ohne Umweg über das Einstellungsfenster erkennbar.
## Verbindliches Verhalten
### Intervall und Sitzung
- Das kleinste zulässige gemeinsame Beacon-Intervall beträgt fünf Minuten.
- Genau fünf Minuten sind zulässig. Kleinere geladene Werte werden im Speicher auf fünf
Minuten normalisiert; die mitgelieferte Konfiguration verwendet für beide Kategorien fünf.
- Nach jedem Programmstart und Profilwechsel sind beide Beacons ausgeschaltet.
- Ein Disconnect oder Reconnect innerhalb derselben Programmsitzung verändert ihre
Aktivierung nicht.
- Die Aktivierungsflags werden nicht aus XML gelesen. Die vorhandenen XML-Elemente bleiben
für die Dateikompatibilität erhalten, werden aber immer mit `false` geschrieben.
### Aktivierung und benötigte QRG-Werte
- `MYQRG` und `MYQRGSHORT` benötigen eine gültige Haupt-QRG.
- `SECONDQRG` benötigt eine gültige zweite QRG.
- Diese Voraussetzung gilt unabhängig davon, in welchem der beiden Bakentexte die Variable
vorkommt.
- Fehlt ein benötigter Wert oder ist er ungültig, bleibt der betroffene Beacon aus. Sein
kategorieweiser Status nennt die fehlende oder ungültige QRG als Grund.
- Der gemeinsame Chip aktiviert beide nutzbaren Kategorien unabhängig. Ein gültiger Beacon
wird eingeschaltet, auch wenn der andere abgelehnt wird; der Chip zeigt dann `1/2`.
- Ein Text ohne QRG-Platzhalter darf ohne bekannte QRG aktiviert werden.
- Geprüft wird der bereits angewendete Text, nicht ein noch offener Settings-Entwurf.
### Kategoriebezogene Referenz-QRG
- Beim Einschalten übernimmt jeder Beacon die aktuell gültige QRG seiner eigenen Kategorie
als Referenz.
- Ist keine gültige Kategorie-QRG vorhanden und benötigt der Text sie nicht, wird die erste
später gültige manuelle oder externe QRG zur Referenz.
- Eine gültige manuelle QRG-Eingabe ist eine bewusste Operatorentscheidung. Sie deaktiviert
keinen Beacon und verschiebt die Referenz der zugehörigen Kategorie.
- Eine ungültige manuelle Eingabe deaktiviert jeden aktiven Beacon, dessen angewendeter Text
den betroffenen QRG-Wert benötigt. Benötigt sein Text ihn nicht, bleibt der Beacon aktiv;
nur die Referenz seiner Kategorie wird gelöscht.
- Ausschließlich QRG-Übernahmen von UCXLog `RadioInfo` und Win-Test `STATUS`, für die der
bestehende QRG-Abgleich aktiv ist, dürfen automatisch abschalten.
- Der Vergleich erfolgt in ganzzahligen Hz gegen die aktuelle Referenz. Genau 5.000 Hz sind
zulässig; erst eine größere Abweichung schaltet ab.
- Ohne Referenz setzt die erste externe QRG nur die Referenz und schaltet nicht ab.
- Ohne SO2R betrifft eine externe Änderung von `MYQRG` ausschließlich die Hauptbake. Mit
SO2R folgt Radio 1 `MYQRG` und Radio 2 `SECONDQRG`.
### Status und Tooltip
- Der Status wird als strukturierter Snapshot aus `core` geliefert. Übersetzte Anzeigetexte
entstehen ausschließlich in `app-desktop`.
- Der Snapshot kennt `OFF`, `PARTIAL`, `ON` und `FAILED` sowie den Zustand beider Kategorien.
- Der Tooltip zeigt je Kategorie den aktuellen Zustand oder letzten Abschalt-/Ablehnungsgrund:
noch nicht in dieser Sitzung aktiviert, durch den Benutzer ausgeschaltet, fehlende oder
ungültige Haupt-QRG, fehlende oder ungültige zweite QRG oder automatische QRG-Abweichung
von mehr als 5 kHz.
- Der QRG-Grund nennt keine konkreten Frequenzen.
- Timeraktivität überschreibt den kategorieweisen Grund nicht.
- Ein erfolgreicher späterer Lauf löscht einen früheren Versandfehler der Kategorie.
### Verkehrsfarben des `MyBeacon`-Chips
- `on` und `1/2`: Hintergrund `#238636`, Rand `#56D364`, weiße Schrift.
- Der bestehende 200-ms-Aktivitätsblitz verwendet Hintergrund `#FFB300`, Rand `#FFE082`
und Schrift `#1B1B1B`.
- `off`: neutraler Theme-Hintergrund mit `#D50000` im hellen beziehungsweise `#FF6B6B` im
dunklen Design.
- `FAILED`: dauerhaft `#D50000` mit Rand `#FF6B6B` und weißer Schrift.
- `FAILED` unterdrückt den orangefarbenen Aktivitätsblitz.
- Andere Status-Chips behalten ihr heutiges Theme-Verhalten.
## Technischer Ansatz
Eine controllerseitige `BeaconSessionState`-Komponente koordiniert den Zustand beider
Kategorien. Die beobachtbaren Flags in `ChatPreferences` bleiben kompatible UI-Projektion,
aber kein persistenter Produktzustand. Die Komponente verwaltet Referenzen, kategorieweise
Gründe und Versandfehler und ist der einzige Produktionsschreibpfad der Aktivierungsflags.
Manuelle QRG-Eingaben und externe Logger-Meldungen verwenden getrennte Controller-Einstiege.
UCXLog und Win-Test übergeben die bereits ermittelte Kategorie, den formatierten Anzeigewert
und die genaue Frequenz in Hz innerhalb der bestehenden `UiDispatcher`-Grenze. Damit ist die
Herkunft explizit; Listener, Thread-lokale Markierungen oder erratene Ursprünge sind unnötig.
Der vorhandene `BeaconTask` bleibt für Auflösung, Validierung und Einreihung in die reguläre
TX-Warteschlange verantwortlich. Er meldet je Kategorie Erfolg oder Fehler an den
Sitzungszustand zurück. Ein DTO im gemeinsamen Model transportiert den strukturierten Status
über den bestehenden Threadstatus-Kanal; Compose übersetzt Gründe und wählt die Chipfarben.
## Unveränderte Grenzen
- Beide Kategorien teilen einen Timer und besitzen getrennte Aktivierung und Texte.
- Der zweite Versand setzt weiterhin eine verfügbare zweite Chatkategorie voraus.
- Aktivieren sendet nicht sofort und startet den Timer nicht neu.
- Der erste Timerlauf nach dem Verbindungsaufbau bleibt bei ungefähr zehn Sekunden.
- Nachrichtenauflösung, Längenlimit, TX-Warteschlange und ON4KST-Framing bleiben unverändert.
- Die Chip-Texte `off`, `1/2`, `on` und `FAILED` und seine gemeinsame Klickfunktion bleiben.
- Es gibt keine neue Produktionsabhängigkeit, kein neues persistentes Schema und keine
Änderung eines externen Protokolls.
## Berücksichtigte Ansätze
1. **Gewählt:** controllerseitiger Sitzungszustand mit expliziten manuellen und externen
Ereignissen. Das hält Policy, Referenzen und Gründe zusammen und bleibt testbar.
2. **Verworfen:** Flags in Preferences, Referenzen in einem Guard und Gründe in `BeaconStatus`.
Der zusammengehörige Zustand wäre auf mehrere Besitzer verteilt.
3. **Verworfen:** Beobachtung der QRG-Werte mit temporärer Herkunftsmarkierung. `MutableValue`
trägt keine Quelle; die asynchrone UI-Weitergabe machte diesen Ansatz fragil.
## Dokumentationswirkung
Die Änderung ist benutzerseitig sichtbar, betrifft Laufzeit/Persistenz sowie die bestehende
UCXLog-/Win-Test-Integration. Geprüft und bei Bedarf angepasst werden die relevanten
deutschen und englischen Konfigurations-, Workflow-, Variablen-, Funktions- und
Benutzeroberflächenabschnitte, Changelog, Website-Texte, `docs/PROJECT_CONTEXT.md` und der
ältere Live-Beacon-Entwurf. README und verbundene Projekte sind voraussichtlich nicht
betroffen.