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.