Pull the three open items out of the finished port note

The dynamic-port note went to done/ while its tail still listed three things nobody
built: a list of structs, a struct field of kind list, and the unconnected list input.
Measured while extracting: inlineInputDef sends list, struct AND object into its number
branch, so the last item is wider than the note claimed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
rootandClaude Opus 5 committed 2026-09-10 12:40:21 +02:00
1 parent 0449218cb6
commit 9d62dfea7b
2 files changed
+37 -3

No files matched your search

@@ -335,9 +335,8 @@ bearbeitete Zeile belebt den alten Wert der ersten wieder.
Feld muss die Sektion also neu bauen. Ohne das erscheint die Zeile erst beim nächsten Rebuild —
gemessen, genau ein Browser-Check fällt.
**Weiterhin offen:** „Liste aus Structs" (macht `ListValue`/`StructValue` gegenseitig rekursiv),
ein Struct-Feld vom Typ Liste, und der unverbundene `list`-Eingang, der immer noch ein Zahlenfeld
zeigt.
**Bewusst nicht gebaut:** „Liste aus Structs", ein Struct-Feld vom Typ Liste und der unverbundene
`list`-Eingang. Die drei stehen als eigene Notiz in `todo-notes/struct-und-listen-restposten.md`.
### Der teuerste Fund lag nicht im Struct
@@ -0,0 +1,35 @@
# Restposten aus dynamischen Ports / Structs
Drei Punkte, die beim Bau von List-Tab und Struct-Variablen bewusst liegen geblieben sind. Sie
standen am Ende von `done/nodes-mit-dynamischer-port-zahl.md` und sind hierher gezogen, damit sie
nicht mit der erledigten Notiz verschwinden.
## 1. Der unverbundene Eingang zeigt das falsche Feld
`inlineInputDef` (`NodeRegistry.ts:131`) kennt nur `boolean`, `string`/`any` und *alles andere* —
und "alles andere" wird ein **Zahlenfeld**. Betroffen sind damit **`list`, `struct` und `object`**:
ein unverbundener `list`-Eingang bietet heute ein Zahlenfeld an.
Für `list` gäbe es die Antwort schon: der Knopf `n items` plus List-Tab. Der Weg dorthin ist
`listOpener` mit einer Slot-Adresse vom Kind `node` — der Slot existiert bereits. Für `object`
ist gar kein Inline-Wert sinnvoll; dort gehört das Feld weggelassen statt ersetzt.
## 2. Ein Struct-Feld vom Typ Liste
Ein deklariertes Struct-Feld ist heute ein Primitiv (Zahl, Text, Ja/Nein, Farbe), obwohl
`FieldValue` auch Listen zulässt. Ein Listen-Feld bräuchte einen Editor eine Ebene tiefer, also
einen **Pfad in der Slot-Adresse** (`ListSlot` in `state.ts` hat bewusst keinen). Die Naht ist die
eine Funktion `resolveList` — eine Signaturänderung, kein Umbau.
## 3. Liste aus Structs
Der teuerste der drei. `ListValue` ist heute `readonly (number | string | boolean)[]` und
`FieldValue` hält fest, dass kein Feld selbst ein Struct ist (`Properties.ts:5-8`); `sameValue`
verlässt sich darauf ("recurses exactly one level deep", `Properties.ts:50`), und
`LIST_ITEM_KINDS` macht eine Liste homogen.
Structs in Listen machen `ListValue` und `StructValue` **gegenseitig rekursiv**: beliebige
Schachtelungstiefe, echter Deep-Compare, und die Items brauchen eine gemeinsame deklarierte
Feldform — die im Typmodell keine Heimat hat, solange sie nur an *einer* Property hängt.
Setzt Punkt 2 voraus (Pfad in der Adresse).