"Details", "Anzeige öffnen", das Entwurfsfeld und die Aktionsgruppe tragen den Titel der Zeile im
zugänglichen Namen ("Details zu <Titel>"), das sichtbare Wort steht vorn (WCAG 2.5.3); ohne
Titel gilt der schlichte Name. Der Prüfstand sucht die Knöpfe unter den neuen Namen und prüft
zusätzlich die Eindeutigkeit der Namen (W8) und die Abschlusszeile im Reiter Erledigt (W5).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Abgeschlossene Zeilen tragen jetzt ein Badge (Gesendet grün, Verworfen/Erledigt neutral) und die
Zeile "Gesendet von Anna · vor 2 Std." aus doneBy/doneAt statt des Alters ab Anlage. Menschen
(mensch:<id>) werden über die Mitarbeiterliste aufgelöst, ein Worker wie max über das
Rollen-Register als "Max (automatisch)" und nie als "Kollege". Offene Zeilen bleiben unverändert.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Die globale Regel .page section + section traf den zweiten Abschnitt "Nachrichtenverlauf" und
ergab 52 px statt 16 px vor der Trennlinie. Eine Regel mit Nachbar-Kombinator (0,3,0) nimmt den
Zusatzabstand zurück; der Abstand kommt allein aus gap.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Der Dialog schloss im selben Takt, in dem pausing den Knopf der Leiste sperrte; useDialogFocus
konnte den Fokus deshalb nicht zurückgeben, und er blieb für Tastatur- und Screenreader-Nutzer
dauerhaft auf <body>. Das Board setzt ihn jetzt selbst, sobald pausing endet (auch nach einem
Fehler), und nur dann, wenn der Fokus verloren ist. Der Prüfstand-Check (Szenario I) ist grün.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
copyTextChecked erfüllt nur, wenn der Text wirklich in der Zwischenablage liegt (Clipboard-API,
sonst Notweg mit document.execCommand, dessen Rückgabewert jetzt geprüft wird; das Textfeld wird
immer entfernt). copyText bleibt für die Kundenansicht die verschluckende Hülle. Das Pult nimmt
die strenge Fassung, sodass die Zeile statt "Kopiert und geöffnet." den Hinweis zum Kopieren
von Hand zeigt. Die Reihenfolge Kopieren vor Öffnen bleibt (Nutzer-Geste).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Nur ein HTTP-Code ab 400 von Appwrite startet die 2-Minuten-Sperre. Übertragungsfehler
(TypeError, SDK-Fehler mit code 0, Fehler ohne Code), auch wenn sie erst nach der
Zeitgrenze eintreffen, geben die Dienst-Meldung (status 0) und sperren nichts: nach dem
Aufwachen aus dem Ruhezustand erholt sich das Hochhaus mit dem nächsten Takt. Eine späte
echte Ablehnung (etwa 429) sperrt weiter.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Echte Seite WorkersPage im Prüfstand (Austausch-Module für Anmeldung, Mitarbeiterliste und Sitzungs-JWT), Skript-API mit Pult, Aktionen und Interessent samt Schaltern für 409, 400, Ausfall und Leerzustand, vier neue Szenarien (Freigabe, Interessent, Anhalten, Handy), jedes Szenario läuft für sich, und der Szenario Desktop bestätigt jetzt die Rückfrage vor dem Anhalten.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Endprüfung P2. Die Zustände des Boards bei Ausfall des Dienstes und der Wechsel zwischen sichtbarem und verstecktem Tab
waren nur über Quelltext-Muster geprüft. Der Prüfstand (?fault=none|down|session|hang) schaltet jetzt den echten
API-Client hinter eine Fetch-Weiche (scripted-fetch.js, mit Node-Tests). Szenario F in shot.cjs prüft im Browser:
Hinweis mit „Neu laden“ bei 503 beim Öffnen und Rückkehr, Warnzeile „Verbindung gestört“ im Betrieb, versteckter Tab
(keine Abrufe, keine Bilder, beim Zurückkehren sofort beides), dauerhaftes 401 (höchstens ein frisches JWT, Meldung
„Anmeldung abgelaufen“, Erholung ohne neues Anmelden) und eine Antwort, die nie kommt (Zeitgrenze). Das Handy-Szenario
prüft zusätzlich Auswahl aus der Liste (Karte im Fenster, Fokus) und Fokus nach „Karte schließen“.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Endprüfung P2. Unter 1100 px steht die Karte über der Liste mit 19 Einträgen, aus der man wählt (die Liste ist dort die
Alternative zur Leinwand). Ein Klick in der Liste änderte nichts Sichtbares: die Karte öffnete sich oberhalb des
Fensters, Screenreader hörten nichts, und „Karte schließen“ ließ den Fokus ins Leere fallen.
Bei neuer Auswahl nimmt jetzt der Name in der Karte den Fokus (tabIndex -1), und liegt der Kartenanfang außerhalb des
Fensters, wird die Karte an den oberen Rand geholt (scroll-margin-top: unter der festen Leiste der Handy-Ansicht 64 px).
„Karte schließen“ gibt den Fokus an den Listeneintrag des Workers zurück.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Endprüfung P2. Ein Abruf auf toter Verbindung (Rechner im Ruhezustand, Netzwechsel) blieb offen, und die
Feed-Schleifen laufen mit einem Abruf je Schleife: die Seite stand still und zeigte veraltete Daten als aktuell.
createWorkersApi bricht jetzt jeden Versuch (JWT holen, senden, Antwort lesen) nach 20 s mit "Der Hustler-Dienst ist
gerade nicht erreichbar." (status 0) ab, auch wenn fetch oder createJWT das Signal nicht beachten.
Außerdem erzwang jede 401-Antwort ein frisches createJWT, bei dauerhaftem 401 etwa 16 bis 20 Mal je Minute und Tab.
Appwrite begrenzt createJWT je Nutzer; das Limit hätte auch Serverpuls, Finanzen und Vorschauen gesperrt. Nach einer
401-Folge (frisches JWT wird ebenfalls abgelehnt oder lässt sich nicht erzeugen) gibt es 2 Minuten lang kein frisches
JWT mehr, die Meldung "Anmeldung abgelaufen" bleibt; Erfolg hebt die Sperre auf.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Ein alter Tab nach einem Deploy fordert den Seiten-Chunk mit altem Hash an, nginx liefert die index.html, der Import schlägt fehl und React räumte ohne Boundary den gesamten Baum ab. RouteErrorBoundary hält Menü und Rahmen, zeigt den Hinweis mit Knopf „Seite neu laden“ und räumt den Fehler beim Pfadwechsel weg.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Die Bühne beruhigt die Regie beim Zurückkehren (alles zu Ende gespielt, alle heim, Aufzug und Effekte leer); im Standbild zeichnet flush() ein Bild.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Der Effektort spots.archiv lag auf Arne (x 130, y 231) statt auf einem gezeichneten Schrank; er sitzt jetzt in der Mitte der obersten Schublade des ersten Aktenschranks (x 148). Graue Räume behalten den Teamfarbton (Alpha 0,10) unter der Grautönung; das Schild ersetzt dort weiter den Titel (Platz). Neue Tests: Zeichnung trifft den Spot für pult, tresor, archiv; grauer Raum mit Tint ohne Titel.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Möbel und Requisiten aus der Vorlage (Schreibtisch, Monitor mit Schalter an/aus, Aktenschrank, Pflanze, Münze, Pokal, Stempel, Radar, Briefkasten, Tresor, Waage), neu Ablagekorb, Schild und die acht 7x7-Branchen-Icons mit drawIcon.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Raster je Kontext in einem WeakMap (setGrid/px/tint), Figuren mit den Posen stand, type, coffee und sleep, Graustufe für nicht angeschlossene Worker, Warnzeichen, Text und Sprechblasen mit Klemmung in die Canvas-Breite. Aufzeichnender Test-Kontext in tests/unit/helpers/fakeCtx.mjs.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Der Dienst liefert bei events(after) die ältesten pageLimit Einträge ab after - 5 s. Mit mehr als 200 Einträgen im Fenster kam mit after = jüngster ts immer dieselbe, schon bekannte Seite und das Neuere nie an. Eine volle Seite ohne neues Ereignis setzt jetzt eine Abrufmarke hinter die Spitze (cursor + 5 s, bei erneutem Stillstand + 1 ms), die über Runden hinweg gilt.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Das Portal antwortet darauf immer mit 409 bereits_eingeschaltet. Erkannt wird das Abo-Modell am Marker unlockedBy (abo, projekt) der Funktion; bei fehlendem Ticket steht "Ticket nachlegen" an der Stelle.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Bei Tickets mit einrichtungAbrechnung 'abo' steht "Vom Abo-Stundenkonto abziehen" im Dialog von Anfang an auf an (auch wenn der Abo-Status erst nach dem Öffnen ankommt), beim Nachtragen der Zeit eines Git-Blatts wird countsToPlan beim ersten Eintragen gesetzt. 'projekt', Kommentare und Kunden ohne Wartungs-Abo bekommen keine Vorgabe; ein von Hand abgehakter Haken bleibt aus.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Mit break-word weitete ein langer Projektname ohne Umbruchstelle die Seite auf (Handy 390 px);
nur Beträge und Nebenzeilen wechseln zu break-word und nowrap.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
overflow-wrap: anywhere wird break-word (Projektname 'Fachanwaltsseiten' bricht nicht mehr
mitten im Wort); Beträge und Stunden der Projektliste stehen auf white-space: nowrap,
damit das Eurozeichen nicht allein steht.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Der Server (rechnungsbau.js, baueAbRechnung) nimmt Anzahlung und Schlussrechnung ohne
Projekt an. Unter 'Ohne Projekt' lädt der Dialog die ABs des Kunden ohne Projekt und
ihre Rechnungen; frei bleibt die Vorgabe.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Bei stripeOk false steht 'Stripe nicht erreichbar – Beträge unbekannt' statt 'bereits berechnet
0,00 €', und es wird keine Rechnungsart vorgeschlagen.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Scheitert getProjektkonten, wird die Auftragsliste trotzdem geholt; kommt sie, bleibt der
Abschnitt bedienbar und der Fehler der Projekte steht eigens daneben.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Nicht sperrender Hinweis (§ 34a UStDV), solange financeSettings.steuernummer leer ist;
die Einstellungen werden einmal geladen, bei einem Ladefehler erscheint kein Hinweis.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Bei Anzahlung, Schlussrechnung und Aufwand wird 'Zahlungsziel in Tagen' mit
auftrag.zahlungszielTage vorbelegt (sonst 14); eine Eingabe des Nutzers bleibt.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>