# Reflect.4. Preserving keyed rows — Mercury LMS > Contract: `@fiberfx/reflect` 4.1.1; Hypergraph and Hyperscript 4.1.1. ## Contract list({source, view, getKey?, mapItem?, bind?, mapProps?, hooks?}) returns a component. Source holds a readonly-compatible array. Stable keys preserve row DOM/local state; index is positional identity when getKey is absent. mapItem replaces item props. Functions it returns are scope-bound; raw function-valued direct item props are also wrapped. Required row props must be covered. mapItem/mapProps overlap refuses. Union views require complete items or one correlated item prop. ## Keys and refusals String normalization makes 1 and "1" duplicates, but leaves "01" distinct. Reject invalid keys, non-array state, primitive items without mapping. Verify package failures in a test. The [lab](/examples/reflect-lab/index.html?part=lists&lang=en) refuses duplicates in an application preflight, not by catching list's renderer exception. ## Observation Check Alpha, reverse, remove Beta: Alpha stays checked and changes position. Assert DOM identity separately. Removing and restoring a row starts fresh local state. Whole-exercise restart clears local state; merely resetting model data need not. ## Navigation - [HTML](/reflect/lists) - [Reflect](/reflect/llms.txt) - [Index](/llms.txt) - [Sitemap](/sitemap.xml) - [All English companions](/llms-full.txt)