fix: ZE-Label „Zeiteinheiten" erkennen + Parsing/UX härten #1

Merged
vr6syncro merged 2 commits from fix/ze-label-und-robustheit into main 2026-07-10 20:06:18 +02:00
Owner

Gemeldeter Fehler

Ein Prüfschritt mit dem Label Zeiteinheiten: (statt Zeitaufwand (ZE):) ergab „Kein ZE-Wert angegeben", obwohl die Zeitspanne korrekt erkannt wurde:

Zeiteinheiten:
4.1       ( 2026-07-7 11:57:06   -   2026-07-7 12:10:58 )

Ursache: parseZE() kannte nur Zeitaufwand … und ein alleinstehendes ZE. In „Zeiteinheiten" gibt es kein isoliertes ZE (\bZE\b matcht nicht) → ZE-Soll fiel durch.

Nach dem Fix (im Browser verifiziert): ZE-Soll 4,10, gesamt 23,11 ZE, manuelle Tätigkeiten 19,01 ZE (11 Min 24 Sek).

Änderungen

parseZE

  • Label Zeiteinheit(en) als ZE-Synonym erkannt (Kern des Bugs).
  • Zeitstempel vor den Label-Mustern ausblenden → bei fehlendem ZE-Wert wird nicht mehr die erste Stempel-Ziffer als ZE gelesen (z. B. 2026 / 11).
  • Label-Varianten ZE-Soll: und ZE = x akzeptiert (Buchstaben-Lookahead, damit ZE-828 weiter -828 bleibt).

normalizeText

  • Tag-Stripping nur für echte Tags/Kommentare → Vergleichsangaben < 30 s / > 2 s und dazwischenliegende Zeitstempel bleiben erhalten.

parseRange

  • Warnhinweis bei mehr als zwei Zeitstempeln statt stillem Griff auf die ersten beiden.

calc

  • Sichtbare Warnung bei unlesbarer bzw. negativer ZE-Eingabe.

UI

  • Autofill überschreibt manuell geänderte Felder nicht mehr (Dirty-Flags).
  • Ergebnis wird bei Feldänderung als veraltet markiert (Stale-Hinweis).
  • Meldungs-Live-Region (role=status) dauerhaft sichtbar außerhalb des versteckten Ergebnis-Cards → zuverlässige Screenreader-Ansagen.

Tests

  • 186 Assertions grün (node test/run.mjs), +31 neu für die obigen Fälle.
  • Getesteter == ausgelieferter Code (Harness extrahiert den PR-CORE-Block 1:1).

Herkunft der Verbesserungen

Zusätzlich zum gemeldeten Bug wurde eine allgemeine Review-Runde (Fable-Worker, adversarisch verifiziert) durchgeführt. Alle hier umgesetzten Punkte wurden gegen den echten Code bestätigt. Bewusst nicht umgesetzt: reine Code-Kosmetik (totes NAMED["#39"], pad2/pad-Dublette) — gebündelt für die geplante „schick machen"-Phase.

🤖 Generated with Claude Code

## Gemeldeter Fehler Ein Prüfschritt mit dem Label **`Zeiteinheiten:`** (statt `Zeitaufwand (ZE):`) ergab „**Kein ZE-Wert angegeben**", obwohl die Zeitspanne korrekt erkannt wurde: ``` Zeiteinheiten: 4.1 ( 2026-07-7 11:57:06 - 2026-07-7 12:10:58 ) ``` **Ursache:** `parseZE()` kannte nur `Zeitaufwand …` und ein alleinstehendes `ZE`. In „Zei**t**einheiten" gibt es kein isoliertes `ZE` (`\bZE\b` matcht nicht) → ZE-Soll fiel durch. **Nach dem Fix** (im Browser verifiziert): ZE-Soll `4,10`, gesamt `23,11 ZE`, **manuelle Tätigkeiten `19,01 ZE` (11 Min 24 Sek)**. ## Änderungen **`parseZE`** - Label `Zeiteinheit(en)` als ZE-Synonym erkannt (Kern des Bugs). - Zeitstempel vor den Label-Mustern ausblenden → bei fehlendem ZE-Wert wird nicht mehr die erste Stempel-Ziffer als ZE gelesen (z. B. `2026` / `11`). - Label-Varianten `ZE-Soll:` und `ZE = x` akzeptiert (Buchstaben-Lookahead, damit `ZE-828` weiter `-828` bleibt). **`normalizeText`** - Tag-Stripping nur für echte Tags/Kommentare → Vergleichsangaben `< 30 s` / `> 2 s` und dazwischenliegende Zeitstempel bleiben erhalten. **`parseRange`** - Warnhinweis bei mehr als zwei Zeitstempeln statt stillem Griff auf die ersten beiden. **`calc`** - Sichtbare Warnung bei unlesbarer bzw. negativer ZE-Eingabe. **UI** - Autofill überschreibt manuell geänderte Felder nicht mehr (Dirty-Flags). - Ergebnis wird bei Feldänderung als veraltet markiert (Stale-Hinweis). - Meldungs-Live-Region (`role=status`) dauerhaft sichtbar außerhalb des versteckten Ergebnis-Cards → zuverlässige Screenreader-Ansagen. ## Tests - **186 Assertions grün** (`node test/run.mjs`), +31 neu für die obigen Fälle. - Getesteter == ausgelieferter Code (Harness extrahiert den `PR-CORE`-Block 1:1). ## Herkunft der Verbesserungen Zusätzlich zum gemeldeten Bug wurde eine allgemeine Review-Runde (Fable-Worker, adversarisch verifiziert) durchgeführt. Alle hier umgesetzten Punkte wurden gegen den echten Code bestätigt. Bewusst **nicht** umgesetzt: reine Code-Kosmetik (totes `NAMED["#39"]`, `pad2`/`pad`-Dublette) — gebündelt für die geplante „schick machen"-Phase. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Behebt den gemeldeten Fehler, dass Protokolle mit dem Label
"Zeiteinheiten: 4.1 ( … )" keinen ZE-Soll ergaben ("Kein ZE-Wert
angegeben"), obwohl die Zeitspanne korrekt erkannt wurde.

parseZE:
- Label "Zeiteinheit(en)" als ZE-Synonym erkannt (Kern des Bugs).
- Zeitstempel vor den Label-Mustern ausblenden, damit bei fehlendem
  ZE-Wert nicht die erste Stempel-Ziffer als ZE gelesen wird
  (z. B. "Zeiteinheiten: ( 2026-07-7 11:57:06 … )" -> nicht mehr 2026).
- Label-Varianten "ZE-Soll:" und "ZE = x" akzeptiert (Buchstaben-
  Lookahead, damit "ZE-828" weiter als -828 gelesen wird).

normalizeText:
- Tag-Stripping nur für echte Tags/Kommentare, damit Vergleichs-
  angaben wie "< 30 s" / "> 2 s" (und dazwischenliegende Stempel)
  erhalten bleiben.

parseRange:
- Bei mehr als zwei Zeitstempeln Warnhinweis (note) statt stillem
  Griff auf die ersten beiden.

calc:
- Sichtbare Warnung bei unlesbarer bzw. negativer ZE-Eingabe.

UI:
- Autofill überschreibt manuell geänderte Felder nicht mehr (Dirty-Flags).
- Ergebnis wird bei Feldänderung als veraltet markiert (Stale-Hinweis).
- Meldungs-Live-Region (role=status) dauerhaft sichtbar außerhalb des
  versteckten Ergebnis-Cards (a11y-Ansagen zuverlässig).

Tests: +31 Assertions (186 gesamt, grün). Browser-Verifikation des
gemeldeten Falls: manuelle Tätigkeiten 19,01 ZE.

Funde aus Fable-Review (adversarisch verifiziert) mit umgesetzt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013foajK9dPn26FDk76P4SfK
Härtungen aus einer zweiten adversarisch verifizierten Fable-Runde
(Fokus: Bezeichnungen/Layout ändern sich durch Updates der Quell-Software).

Korrektheit (verhindert still-falsche Ergebnisse):
- ISO-8601-Zeitzonen-Offset ("2026-07-07T11:57:06+02:00" / "...Z") wird in
  normalizeText entfernt. Vorher las parseRange das Offset-Fragment "02:00"
  als eigenen Zeitstempel -> ~10 h Fehldifferenz. Reine Wanduhr-Differenz,
  Offset irrelevant; No-Space-Dash-Ranges ("12:17:36-12:20:04") bleiben via
  negativem Lookahead als Trenner erhalten.
- parseZE: zwischen Label und Zahl sind nur noch Nicht-Buchstaben (plus der
  ZE-Marker) erlaubt. Ein verwaistes Label frisst dadurch keine Fremdzahl der
  Folgezeile mehr ("Zeitaufwand (ZE):\nToleranz 0,5 s" -> null statt 0,5).

Robustheit gegen Label-Umbenennungen (ohne neue Falschzahlen):
- "Zeit-Aufwand" / "Zeit Aufwand" / "Zeit-Einheiten" / "Zeit Einheiten".
- "ZE Soll:" / "ZE gesamt:" (Leerzeichen-Suffix nur mit folgendem :/=).
- Verkürztes Label "Aufwand:" / "Aufwand =" (Pflicht-Separator).
- Wert mit nachgestellter Einheit "4,5 ZE" / "828 ZE" (nur als letztes Token;
  Spannen "3-5 ZE" und Prosa "1 ZE entspricht 36 Sekunden" bleiben null).

Tests: +30 Assertions (216 gesamt, grün). ISO+Offset-Flow im Browser
verifiziert (23,11 ZE / manuell 19,01 ZE). Jeder Vorschlag zuvor empirisch am
extrahierten Core geprüft; unsichere Finder-Fassungen durch sichere ersetzt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013foajK9dPn26FDk76P4SfK
Author
Owner

Runde 2 — Robustheit gegen Label-/Layout-Drift (Commit 3c34976)

Zweite ultracode/Fable-Runde mit Fokus darauf, dass Updates der Quell-Software Bezeichnungen umbenennen oder das Layout leicht verschieben können. 6 Finder je Drift-Dimension, jeder Vorschlag empirisch am extrahierten Core geprüft; unsichere Finder-Fassungen durch sichere ersetzt.

Korrektheit (verhindert still-falsche Zahlen):

  • ISO-Zeitzonen-Offset 2026-07-07T11:57:06+02:00 / …Z: vorher las parseRange das Fragment 02:00 als eigenen Stempel → ~10 h Fehldifferenz. Jetzt in normalizeText entfernt (reine Wanduhr-Differenz). No-Space-Dash-Ranges 12:17:36-12:20:04 bleiben via negativem Lookahead korrekt.
  • Verwaistes Label frisst Fremdzahl: Zeitaufwand (ZE): (Wert fehlt) + Folgezeile Toleranz 0,5 s ergab 0,5. Jetzt sind zwischen Label und Zahl nur Nicht-Buchstaben erlaubt → null + sichtbarer Hinweis.

Neue Label-Toleranz (ohne neue Falschzahlen):

  • Zeit-Aufwand / Zeit Aufwand / Zeit-Einheiten / Zeit Einheiten
  • ZE Soll: / ZE gesamt: (Leerzeichen-Suffix nur mit folgendem :/=)
  • verkürztes Aufwand: / Aufwand = (Pflicht-Separator)
  • Wert mit Einheit 4,5 ZE / 828 ZE (nur als letztes Token)

Bewusst weiterhin null (Projektregel „lieber null als plausible Falschzahl"): 3-5 ZE, 12 ZE und 5 Minuten, 1 ZE entspricht 36 Sekunden, Aufwand: hoch (Stufe 3), Materialaufwand: 12.

Tests: +30 → 216 grün. ISO+Offset-Flow im Browser verifiziert (23,11 ZE / manuell 19,01 ZE).

Verworfen (bewusst nicht umgesetzt): Space-Tausendergruppierung 1 234,5 (unwahrscheinlich, riskant), > in HTML-Attributwerten (nur mit echtem Parser sauber lösbar), Mikro-/Nanosekunden. Können bei Bedarf nachgezogen werden.

## Runde 2 — Robustheit gegen Label-/Layout-Drift (Commit `3c34976`) Zweite ultracode/Fable-Runde mit Fokus darauf, dass **Updates der Quell-Software Bezeichnungen umbenennen oder das Layout leicht verschieben** können. 6 Finder je Drift-Dimension, jeder Vorschlag empirisch am extrahierten Core geprüft; unsichere Finder-Fassungen durch sichere ersetzt. **Korrektheit (verhindert still-falsche Zahlen):** - **ISO-Zeitzonen-Offset** `2026-07-07T11:57:06+02:00` / `…Z`: vorher las `parseRange` das Fragment `02:00` als eigenen Stempel → **~10 h Fehldifferenz**. Jetzt in `normalizeText` entfernt (reine Wanduhr-Differenz). No-Space-Dash-Ranges `12:17:36-12:20:04` bleiben via negativem Lookahead korrekt. - **Verwaistes Label frisst Fremdzahl:** `Zeitaufwand (ZE):` (Wert fehlt) + Folgezeile `Toleranz 0,5 s` ergab **0,5**. Jetzt sind zwischen Label und Zahl nur Nicht-Buchstaben erlaubt → **null** + sichtbarer Hinweis. **Neue Label-Toleranz (ohne neue Falschzahlen):** - `Zeit-Aufwand` / `Zeit Aufwand` / `Zeit-Einheiten` / `Zeit Einheiten` - `ZE Soll:` / `ZE gesamt:` (Leerzeichen-Suffix nur mit folgendem `:`/`=`) - verkürztes `Aufwand:` / `Aufwand =` (Pflicht-Separator) - Wert mit Einheit `4,5 ZE` / `828 ZE` (nur als letztes Token) **Bewusst weiterhin `null`** (Projektregel „lieber null als plausible Falschzahl"): `3-5 ZE`, `12 ZE und 5 Minuten`, `1 ZE entspricht 36 Sekunden`, `Aufwand: hoch (Stufe 3)`, `Materialaufwand: 12`. **Tests:** +30 → **216 grün**. ISO+Offset-Flow im Browser verifiziert (23,11 ZE / manuell 19,01 ZE). Verworfen (bewusst nicht umgesetzt): Space-Tausendergruppierung `1 234,5` (unwahrscheinlich, riskant), `>` in HTML-Attributwerten (nur mit echtem Parser sauber lösbar), Mikro-/Nanosekunden. Können bei Bedarf nachgezogen werden.
vr6syncro deleted branch fix/ze-label-und-robustheit 2026-07-10 20:06:18 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
vr6syncro/protokollrechner!1
No description provided.