fw-02 — Broader Ideas
Identity is always author-supplied
key joins {passive:true}, contain, sideEffects, and aria-setsize as an author promise the
runtime cannot derive. Once you have seen the ambiguity proof — [A,B,C] → [B,C] is genuinely
undecidable — you will stop treating keys as a lint rule and start treating them as data.
The design question this hands you: when your system must be conservative because it cannot know something, could the caller simply tell you? That question turns impossible optimisations into possible ones.
The snapshot model of a render
Every value in a component body is a snapshot of one render. That single sentence resolves stale
closures, the useEffect dependency debate, and most "why is this value old" confusion — better than
any rule about dependency arrays.
It generalises to any system that re-executes a function to produce a description: your values are from that execution, and anything that outlives it (a timer, a subscription, a promise) captured a snapshot.
Positional storage, priced
Hooks' rules exist to buy zero-ceremony composition. The alternatives — named keys, class fields, compiler-assigned slots — each cost something specific, and knowing the table means you can evaluate the next framework's choice rather than react to it.
Note that the compiler row is where React eventually went, which is fw-06's subject: move
analysis to build time and you can relax a runtime constraint.
Next
fw-03 builds the architecture that does know what changed. fw-04 takes this runtime and makes
it interruptible, which is where the DOM-operation counter you built starts mattering under load.