Problem
After #1005, the frozen representative_json invocation still records 817,937 property-lock acquisitions, including 798,645 named_snapshot acquisitions. These are present ordinary named-property reads in a single-owner Context. namedOwnPropertySnapshot still unconditionally takes property_lock after its lock-free Shape probe even though #1005 established an enable-only publication gate for this exact mutable-slot snapshot boundary.
Change boundary
Reuse Object.property_snapshot_locks_enabled and lockPropertySnapshot for the present-data branch of namedOwnPropertySnapshot. The default single-owner path may skip the mutex; after enableParallelSync() publishes concurrent GC or parallel JS, retain the exact current lock, accessor recheck, Shape revalidation, attribute read, and slot read. Do not change writers, absent-property publication, accessor reader gates, Proxy/exotic behavior, or shared-realm synchronization.
This is a single-owner continuation of #1005 under parent #473. It does not alter #532's shared-object synchronization or claim its remaining multi-lane acceptance gate.
Completion
- Pin lock-counter tests for disabled and enabled publication modes.
- Keep concurrent descriptor publication and mutation witnesses on the enabled path, including TSan/no-GIL coverage.
- Preserve JSON semantics, OOM/deep/cycle behavior, Test262 JSON, and required VM/tree agreement.
- Run seven alternating exact-parent pairs on both frozen JSON rows, array/object controls, and a generic named-property control with exact checksums.
- Land only with measured instruction/CPU non-regression and update #473.