Returns true if the value should be wrapped in a deep Proxy.
Only plain objects ({}) and arrays are wrappable.
Primitives, null, Date, Map, Set, RegExp, class instances, etc. are NOT wrapped.
Detection strategy (order matters):
Primitives and null -> false (fast exit)
Frozen/sealed objects -> false (nested set traps would silently fail)
Arrays -> true (fast exit)
Prototype check -> plain objects (isPlainObject) are wrappable
Tag check -> catch built-ins with internal slots (Date, Map, Set, etc.)
Everything else -> class instance, not wrappable
Prototype check comes BEFORE tag check to prevent Symbol.toStringTag spoofing:
a plain object with { [Symbol.toStringTag]: 'Date' } would fool the tag check
but is correctly identified as a plain object by its prototype.
Returns true if the value should be wrapped in a deep Proxy.
Only plain objects ({}) and arrays are wrappable. Primitives, null, Date, Map, Set, RegExp, class instances, etc. are NOT wrapped.
Detection strategy (order matters):
Prototype check comes BEFORE tag check to prevent Symbol.toStringTag spoofing: a plain object with { [Symbol.toStringTag]: 'Date' } would fool the tag check but is correctly identified as a plain object by its prototype.