Surge Evaluator: sechs Entscheidungen, eine Richtung
Aus einem Fenster von Pegelmesswerten wird eine Stufe — normal, warning, severe. Sechs Entscheidungen, die alle in dieselbe Richtung ziehen: Zuverlässigkeit.
Begründungen hinter technischen Entscheidungen — hauptsächlich damit ich sie später nicht neu aufrollen muss. Was funktioniert hat, was nicht, und unter welchen Annahmen.
Aus einem Fenster von Pegelmesswerten wird eine Stufe — normal, warning, severe. Sechs Entscheidungen, die alle in dieselbe Richtung ziehen: Zuverlässigkeit.
Der V2-Scope steht. Ein Admin-Frontend plus Demo-Widget für den Hot Path — Angular statt React, BFF statt Token im Browser, und ein vertikaler Slice statt Feature-Liste.
MetricGate wurde solo, nebenbei und mit Claude Code als primärer Implementierungshilfe gebaut. Warum ich Kalenderschätzungen aus den Planungsdocs gestrichen habe, wie ich den Aufwand über Commit-Zeitstempel messe — und was die Geschwindigkeit kostet.
Warum MetricGate Token-Bucket-Updates als Lua-Script ausführt statt als naiven GET-SET-Zyklus — was ohne Lua schiefgeht, wie atomare Ausführung das löst und was Lua kostet.
Warum MetricGate Row-Level Locks statt Applikations-Locks verwendet, um konkurrierende Reparent-Operationen im Mandantenbaum zu serialisieren.
Wie MetricGate PostgreSQL, Redpanda und EF-Migrationen in einem Testlauf koordiniert — und welche Domain-Regeln Unit Tests schlicht nicht abfangen können.
Die Entscheidung, nachdem es ein paar Tage gesackt ist.
Warum ServiceDeskLite Clean Architecture Dependency-Regeln durch Project-References statt Naming Conventions durchsetzt — und was das kostet.
Warum ServiceDeskLite Handler direkt in Endpoints injiziert statt über einen Mediator zu dispatchen — und wann diese Entscheidung überdacht werden sollte.
Wie ServiceDeskLite einen expliziten Result-Typ verwendet, um Handler-Ergebnisse sichtbar zu machen — und wo DomainExceptions noch hingehören.
Warum ServiceDeskLite ProblemDetails mit benutzerdefinierten Extension-Feldern als einziges Error-Format verwendet — und wie der Contract geteilt wird, ohne das Web an die API zu koppeln.
Warum ServiceDeskLite Guid in einem TicketId Record Struct kapselt — was der Compiler abfängt, was der Mapping-Overhead kostet und wie UUIDv7 es verbessert.
Warum ServiceDeskLite zwei vollständige Persistence-Implementierungen mitbringt — und warum der eingebaute InMemory Provider von EF Core keine davon ist.
Warum Ingestor große Import-Dateien in 500-Zeilen-Chunks verarbeitet statt auf einmal — begrenzter Blast Radius, Partial-Success-Semantik und die Trade-offs, die damit kamen.
Deterministische Idempotency Keys für eine Import-Pipeline entwerfen — warum SHA256 über File-Content, was der Unique Index durchsetzt und wie HTTP-Clients davon profitieren.
Warum Ingestor mit einem database-backed Outbox statt RabbitMQ startet — und was das umschaltbare Dispatcher-Pattern später ermöglicht.
Warum Ingestor einen Result<T>-Typ statt Exceptions an Application-Boundaries verwendet — was er explizit macht, was er kostet und wo Exceptions noch hingehören.
Wie eine explizite Domain State Machine mit neun States und einer aufgezählten Transition-Tabelle stille State-Korruption in einer lang laufenden Pipeline verhindert.