Skip to content

Schutzrahmen-Pruefstand: auf Ruhe warten, statt in den Nachlauf zu messen - #453

Merged
oe5sos merged 1 commit into
mainfrom
fix/schutzrahmen-pruefstand-ruhe
Nov 14, 2026
Merged

oe5sos merged 1 commit into
mainfrom
fix/schutzrahmen-pruefstand-ruhe

Conversation

@oe5sos

@oe5sos oe5sos commented Nov 14, 2026

Copy link
Copy Markdown
Owner

beimZiehenWirdDerRahmenSICHTBAR war auf main rot (Linux-Shard 3/4, 1 von 304
— derselbe Fall und derselbe Shard wie am 2026-10-20). Das Programm hat dabei
vollkommen richtig gearbeitet.

Die Ursache stand im vollen Protokoll, nicht in den FAIL-Zeilen

QINFO : … Schutzrahmen: 1 schwebende Fenster lagen auf einer Bedienleiste
        und wurden heruntergeschoben
FAIL! : beimZiehenWirdDerRahmenSICHTBAR() … (der Rahmen bleibt beim Ziehen
        unsichtbar)

Nach dem Aufbau setzt MainWindow zwei Nachläufe an (MainWindow.cpp,
„Zwei Nachläufe"): singleShot(0) und singleShot(500), beide rufen
schwebendeAusDemSchutzrahmenHolen(). Auf dem lastigen Läufer kam der zweite
erst mitten in der Messung — er holte den eben platzierten Schweber von der
Sperrzone weg. Danach berührte nichts mehr etwas, also schwieg meldeZug() zu
Recht.

Drei Änderungen, alle im Prüfstand

  • warteBisDasHauptfensterSteht() nach dem Muster von
    warteBisDerRahmenSteht() aus tst_side_area_integration.cpp (Zwei Fensterprüfstände: auf Ruhe warten, Grundlage frisch erzwingen #451):
    Mindestfrist über die 500 ms hinaus, danach auf Ruhe warten — drei gleiche
    Messungen der Fenstergeometrie, nicht eine. Auf den Zustand warten, nicht
    auf die Uhr.
  • Das processEvents() zwischen move() und meldeZug() ist weg. Genau in
    dieser Lücke lief der Nachlauf. meldeZug() liest frameGeometry() direkt.
  • Sprechende Meldungen. Fällt der Fall doch, sagt er jetzt, wo das Fenster
    liegt und dass ein Nachlauf es geholt haben kann. Die alte Meldung hat mich
    zuerst auf die falsche Spur geführt.

Neuer Prüffall für eine ungedeckte Wache

einePlatzierungLoestDenHinweisNICHTAus: die Wache
if (s_eigeneBewegungen > 0) { return; } in meldeZug() war nirgends
festgenagelt — in keinem der vier Prüffälle, die EigeneBewegung überhaupt
nennen. Darum konnte ich sie zuerst für die Ursache halten; nichts schloss sie
aus. Jetzt tut es etwas, und zwar in beide Richtungen: eine Platzierung löst den
Hinweis nicht aus, ein echter Zug danach aber doch.

Zwei Gegenproben

Ein lokal grüner Lauf beweist hier nichts — der Fall war vor der Behebung lokal
grün und auf dem Läufer rot. Also die Lage gezielt hergestellt:

  1. Nachlauf mitten in die Messung (mw.schwebendeAusDemSchutzrahmenHolen()
    zwischen move() und der Prüfung) → rot, mit derselben Protokollzeile wie
    in der CI und der neuen Meldung
    die Lage kam nicht an: 42,100 304x124 trifft die Sperrzone nicht.
  2. Die Wache aus meldeZug() entfernt → einePlatzierungLoestDenHinweis NICHTAus wird rot („der Hinweis blinkt beim PLATZIEREN").

ctest -R "^tst_schutzrahmen$" grün (6,2 s), 24 Prüffälle.

🤖 Generated with Claude Code

…ssen

`beimZiehenWirdDerRahmenSICHTBAR` war auf main rot (Linux-Shard 3/4, 1
von 304 -- derselbe Fall und derselbe Shard wie am 2026-10-20). Das
Programm hat dabei vollkommen richtig gearbeitet.

Die Ursache stand im VOLLEN Protokoll, eine Zeile vor dem Fehlschlag,
und nicht in den FAIL-Zeilen:

    Schutzrahmen: 1 schwebende Fenster lagen auf einer Bedienleiste
    und wurden heruntergeschoben

Nach dem Aufbau setzt MainWindow zwei Nachlaeufe an (MainWindow.cpp,
"Zwei Nachlaeufe"): `singleShot(0)` und `singleShot(500)`, beide rufen
`schwebendeAusDemSchutzrahmenHolen()`. Auf dem lastigen Laeufer kam der
zweite erst mitten in der Messung -- er holte den eben platzierten
Schweber von der Sperrzone weg. Danach beruehrte nichts mehr etwas,
also schwieg `meldeZug()` zu Recht, und der Lauf meldete das als „der
Rahmen bleibt beim Ziehen unsichtbar".

Drei Aenderungen, alle im Pruefstand:

* `warteBisDasHauptfensterSteht()` nach dem Muster von
  `warteBisDerRahmenSteht()` aus tst_side_area_integration.cpp (#451):
  Mindestfrist ueber die 500 ms des zweiten Nachlaufs, danach auf Ruhe
  warten -- drei gleiche Messungen der Fenstergeometrie, nicht eine.
  Auf den ZUSTAND warten, nicht auf die Uhr.
* Das `processEvents()` zwischen `move()` und `meldeZug()` ist weg.
  Genau in dieser Luecke lief der Nachlauf. `meldeZug()` liest
  `frameGeometry()` direkt und braucht keine Ereignisrunde.
* Sprechende Meldungen: faellt der Fall doch, sagt er jetzt, WO das
  Fenster liegt und dass ein Nachlauf es geholt haben kann. Die alte
  Meldung („der Rahmen bleibt beim Ziehen unsichtbar") hat mich zuerst
  auf die falsche Spur gefuehrt.

Dazu ein neuer Prueffall, `einePlatzierungLoestDenHinweisNICHTAus`: die
Wache `if (s_eigeneBewegungen > 0) { return; }` in `meldeZug()` war
NIRGENDS festgenagelt -- in keinem der vier Prueffaelle, die
`EigeneBewegung` ueberhaupt nennen. Darum konnte ich sie zuerst fuer
die Ursache halten; nichts schloss sie aus. Jetzt tut es etwas, und
zwar in beide Richtungen: eine Platzierung loest den Hinweis nicht
aus, ein echter Zug danach aber doch.

ZWEI GEGENPROBEN gefahren, weil ein lokal gruener Lauf hier nichts
beweist:

1. Nachlauf absichtlich mitten in die Messung
   (`mw.schwebendeAusDemSchutzrahmenHolen()` zwischen `move()` und der
   Pruefung): rot, mit derselben Protokollzeile wie in der CI und der
   neuen Meldung „die Lage kam nicht an: 42,100 304x124 trifft die
   Sperrzone nicht". Damit ist der Fehlschlag des Laeufers gezielt
   hergestellt, nicht nur vermutet.
2. Die Wache aus `meldeZug()` entfernt: `einePlatzierungLoestDen
   HinweisNICHTAus` wird rot („der Hinweis blinkt beim PLATZIEREN").

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@oe5sos
oe5sos merged commit 3da9e7b into main Nov 14, 2026
12 checks passed
oe5sos added a commit that referenced this pull request Nov 14, 2026
)

tst_cat_funkgeraet riss auf main die 300-s-Frist (Lauf 43597444850,
macOS Apple Silicon 2/2, ***Timeout 300,09 s) und machte main rot.

Es haengt nicht. Dieselbe Datei, derselbe Shard, derselbe Test #90:

  d6bad41 (vor #452)   Passed  237,60 s
  240f4dc (mit #452)   Passed  254,49 s
  3da9e7b (mit #453)   ***Timeout 300,09 s

Bei 254 s Grundlast bleiben 15 % Luft; das reisst eine Lastschwankung,
ohne dass sich am Pruefstand etwas geaendert haette -- #453 fasst ihn
gar nicht an. Die 300 waren also von Anfang an zu knapp bemessen, was
erst auffiel, als sie rissen. Der Vorgaenger desselben Falls steht im
Kommentar: am 08.11. liefen die 120 s ab.

900 s sind das Dreieinhalbfache der gemessenen Dauer, damit die
naechsten Faelle nicht gleich wieder dagegen laufen. Die Zahlen stehen
im Kommentar, damit beim naechsten Mal nicht geraten werden muss, und
mit dem Hinweis, wo der Posten sitzt: die Warterunden gegen das
rigctld-Doppel, nicht der Fensteraufbau.

Alle 14 Compliance-Skripte gruen.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant