b78a6fb51c
3 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
| b50ad2b9bc |
Sitzung ueberlebt Neuladen, Umlaute, Fehlergrenze
**Sitzung.** Die Tokens lagen nur im Arbeitsspeicher — jedes Neuladen warf den
Betreiber auf die Anmeldemaske. Das war die sicherste Variante und praktisch
unbrauchbar; mitten in einer Stoerung ist es kein Sicherheitsgewinn, sondern ein
Hindernis. Jetzt `sessionStorage` (nicht `localStorage`: stirbt mit dem Tab),
begrenzt durch zwei Uhren:
- **Harte Obergrenze** von 30 Minuten ab Anmeldung, durch keine Interaktion
verschiebbar. Sonst waere "30 Minuten" keine Zusage.
- **Untaetigkeitsgrenze** von 30 Minuten.
- Der sofortige serverseitige Widerruf bleibt die eigentliche Absicherung — die
Tokens sind opak, kein JWT, und genau dafuer wurden sie gewaehlt.
Dazu die Sitzungsuhr oben rechts neben "Abmelden", unter fuenf Minuten
auffaellig. Umgesetzt mit `useSyncExternalStore`: Die Restzeit haengt an der Uhr
und am Speicher, also an zwei Dingen ausserhalb von React. Sie beim Rendern
auszurechnen waere ein unreiner Aufruf, sie in einem Effekt zu setzen eine
zweite Renderrunde je Sekunde — beides hat der Linter gemeldet.
Sechs Tests halten die Grenzen fest, zwei davon durch Mutation als fangend
bestaetigt (Obergrenze mitverschieben schlaegt fehl).
**Fehlergrenze.** Ein Fehler in einer Komponente riss bisher den gesamten Baum
ab; uebrig blieb eine leere Seite — im dunklen Thema ein schwarzer Bildschirm
ohne jeden Hinweis. Die Grenze sitzt **um den Inhalt**: Menue und Kopfzeile
bleiben stehen, der Fehlertext ist lesbar und kopierbar.
**Umlaute.** Die Oberflaeche schrieb durchgehend ae/oe/ue/ss. Jetzt aeoeuess.
Dabei ein selbst verursachter Schaden, gefunden und behoben: Eine Regel
"ue → ü" ist falsch, weil die Buchstabenfolge nicht immer ein Umlaut ist. Sie
machte aus "Quelle" ein "Qülle", aus "neue" ein "neü", aus "aktuell" ein
"aktüll", aus "Dauer" ein "Daür". Die Abbildung laeuft jetzt ueber eine
gepruefte Wortliste mit Ausschluss englischer Bezeichner (`value`, `message`,
`session`, `queued`, `true`); die 23 zerstoerten Woerter sind einzeln
zurueckgesetzt. Ein alter Tippfehler ("geprueter") ist dabei mit aufgefallen.
82 Tests gruen, tsc sauber, eslint ohne Warnung.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
|||
| b3f0a99243 |
Weboberflaeche: Design-Fundament und bedienbare Auftraege
Ausgangslage, gemessen statt geschaetzt: Von 99 fachlichen Endpunkten rief die Oberflaeche 23 auf. Schreibend waren es neun, vier davon An- und Abmeldung. Real verwaltbar war: einen Auftrag anlegen, einen Bericht erzeugen, eine Meldung bestaetigen. Das ist ein Leseinstrument, keine Verwaltungskonsole. Dieser Schritt legt das Fundament und macht den ersten Bereich vollstaendig bedienbar. Fundament: - Tailwind v4 und Radix-Primitive (shadcn-Muster). Alles gebuendelt, keine externen Ressourcen — die CSP der Auslieferung laesst sie ohnehin nicht zu. - Farbsystem nach PROMPT.md §106: Semantische Farben ausschliesslich fuer Status, sonst neutral. Die Zuordnung der Fachbegriffe auf die fuenf Bedeutungen steht an genau **einer** Stelle (StatusBadge). Verteilt ueber die Seiten erschiene frueher oder spaeter irgendwo "partial_failure" gruen, und ein Betreiber haelt einen Teilfehler dann fuer einen Erfolg. Ein unbekannter Zustand wird neutral dargestellt, nie gruen. - Neue Seitenhuelle mit fuenf Bereichen, einklappbarer Seitenleiste, Schublade auf schmalen Geraeten und Dark Mode ueber ein Attribut am Wurzelelement (nicht allein ueber die Medienabfrage — eine Konsole, die nachts waehrend einer Stoerung von selbst umschaltet, ist laestig). - `useMutation` fuer schreibende Aufrufe: Doppelklickschutz, Vorgangsnummer bis in die Meldung, kein setState nach dem Aushaengen. `describeApiError` uebersetzt die bekannten Fehlercodes in Saetze **mit Abhilfe**. - Der API-Client sendet jetzt `Idempotency-Key`. Ohne ihn erzeugt ein Doppelklick zwei Auftraege — und bei einer Wiederherstellung zwei gleichzeitige Laeufe in dasselbe Ziel. - Fehlermeldungen nennen immer die `request_id`, kopierbar. Auftraege (Endpunkte, die vorher keine Oberflaeche hatten): - Lauf anstossen, anhalten, fortsetzen, loeschen, laufenden Lauf abbrechen. - Detailseite mit Laufhistorie: Fehlercode, Fehlerklasse und die Auskunft, ob eine Wiederholung ueberhaupt etwas bringt — ein Anmeldefehler behebt sich nicht durch Warten. - **Ein zweiter Anstoss ist kein Fehler, sondern eine Auskunft.** Der 409 wird als Hinweis gezeigt, nicht als Fehlschlag: Der Auftrag laeuft ja, und genau das wollte der Betreiber. - **Loeschen nennt die Folgen.** Die Wiederherstellungspunkte bleiben bestehen; sie gehoeren zum Repository, nicht zum Auftrag. Ohne diesen Hinweis loescht jemand einen Auftrag in der Annahme, Platz zu schaffen. Der Wiederherstellungs-Assistent ist gebaut (vier Schritte, Vorabpruefung als eigener Schritt, die drei Huerden vor dem Ueberschreiben sichtbar umgesetzt), aber noch nicht in eine Seite eingebunden. Drei Lint-Befunde behoben, alle dieselbe Sorte wie in Phase 8 und 12: setState im Effektkoerper und ein Schreibzugriff auf eine Referenz waehrend des Renderns. Der Bestaetigungsdialog haelt seinen Zustand jetzt im Portalinhalt — beim Schliessen verschwindet er von selbst, ein Zuruecksetzen im Effekt entfaellt, und die Huerde steht beim naechsten Oeffnen wieder. Die noch nicht umgebauten Seiten behalten vorerst das alte Stylesheet. Es faellt weg, sobald die letzte umgebaut ist. 69 Tests gruen, tsc sauber, eslint ohne Warnung, Bau 373 KB (115 KB gzip). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
|||
| 610719c316 |
Syncova Backups V1
Enterprise-Backup-, Recovery-, Verification-, Security- und Monitoring-Plattform fuer Proxmox VE, Windows, Linux und Dateisysteme. Der Leitsatz, der fast jede Entscheidung erklaert: Ein Backup gilt erst als vertrauenswuerdig, wenn Integritaet geprueft und Wiederherstellbarkeit nachgewiesen wurde. Deshalb steigt ein Wiederherstellungspunkt erst nach einem tatsaechlich durchgefuehrten Restore-Test auf "recoverable", und Unbekanntes geht in keine Bewertung als "gut" ein. Umfang (Phasen 0-23): - Repository Engine: inhaltsadressierte Bloecke, atomares Commit-Protokoll, Katalogaufbau allein aus den Manifesten — ohne Datenbank - Backup Engine: inhaltsabhaengiges Chunking, Deduplizierung trotz Verschluesselung, zstd, AES-256-GCM, Streaming mit Gegendruck - Agenten fuer Windows und Linux mit Auftragsabholung (Pull-Modell) - Proxmox-Provider mit beiden Zugriffswegen auf die Sicherungsarchive - Scheduler, Recovery Engine mit Pruefpunkt, Verification, Unveraenderlichkeit - Weboberflaeche, Kennzahlen, Meldungen, Berichte, Security Center, Ransomware-Heuristik (meldet, handelt nie) - Disaster Recovery, Haertung, Leistungsmessung, Chaos Testing - Eingefrorene Vertraege fuer API, Migrationen, Backup-Format und Repository - Auslieferungspaket fuer linux/amd64, linux/arm64 und windows/amd64 Nicht enthalten und als solches gekennzeichnet: Kapazitaetsprognose, Backup Copy, Changed Block Tracking bei Proxmox, erweiterte Attribute und ACLs. Gebaut, aber nie auf echter Hardware gefahren: der Windows-Dienst, die systemd-Einheit und der verpflichtende Proxmox-Meilenstein — ob eine wiederhergestellte VM startet, ist ungeprueft. Einzelheiten in CHANGELOG.md und docs/release-candidate.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |