feat: Größen-Konflikt — Teilpakete müssen zur angegebenen Größe passen (D62)

Größen zählen für diese eine Prüfung als Bereiche (Untergrenzen verdoppeln
sich, XXL nach oben offen); Konflikt erst, wenn selbst die günstigste Lesart
der Kinder die großzügigste des Elternknotens erreicht. Warnung sizeConflict
an der Elternzeile, Badge in --warn, Grund in Tooltip und aria-label. Nichts
wird automatisch korrigiert. Nebenbefund behoben: der Grafikexport zeichnete
das Größen-Badge mit festen Farben — das invertierte implizite M stand seit
jeher gefüllt im Bild. Die acht berechtigten Konflikte im eigenen Plan sind
nachgezogen. 372 Tests, 16 neue.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-24 15:55:16 +02:00
co-authored by Claude Fable 5
parent 257e1a9c17
commit 5b37c117e1
11 changed files with 305 additions and 11 deletions
+9
View File
@@ -109,6 +109,15 @@ One node per line. Everything except the label is optional.
- From `(M)` upward a node **should be decomposed further**; a node ≥ M
without children gets a placeholder hint in the diagram.
- For cost estimation a missing size counts as `M`.
- **Size conflict check:** a given size must fit the direct children. Each
size is read as a range (lower bounds double: XS=1, S=2, M=4, L=8, XL=16,
XXL=32; the upper bound is the next lower bound, XXL is open-ended). It is
a conflict — warning `sizeConflict` at the parent's line — only when the sum
of the children's lower bounds reaches the parent's upper bound, i.e. when
it is wrong under *every* reading. Only sized, non-optional, non-discarded
direct children count; in an `|`/`=` group only the smallest alternative.
An XXL parent never warns; nothing is corrected automatically. When you
write plans, pick parent sizes that pass this check.
### Token extraction order (why nothing collides)