Run all five test panels and confirm zero failures before promoting any store to authoritative.
Resolve all items below before promotion
PASS
PASS
BLOCKED — prerequisite not met
BLOCKED — prerequisite not met
BLOCKED — prerequisite not met
BLOCKED — prerequisite not met
FAIL — Run the backend auth test panel — all negative tests must be rejected
FAIL — Run writer auth panel — all 8 rejection scenarios must return errors with records unchanged
FAIL — Run validateStoreMenuShadow below — migration.state must be shadow_comparison_passed before promotion is possible
Every merchant-reachable write path — UNSAFE=0 and NEEDS_REVIEW=0 required before promotion
Control record
reviewed_build store-a-cas-hardening-v1
reviewed_at 2026-07-22T23:55:00Z
reviewed_by platform-engineering
inventory_version 1.1.0
Inventory is STATIC — tied to this reviewed build. Any new merchant-reachable write path must be added, re-reviewed, and inventory_version bumped before promotion.
Every sections[] write path must have a final disposition — NEEDS_AUDIT is not acceptable
Control record — static inventory, reviewed build
reviewed_build store-a-cas-hardening-v1
reviewed_at 2026-07-22T23:10:00Z
reviewed_by platform-engineering
inventory_version 1.0.0
total_writers 14
If code changes introduce a new sections[] writer, increment inventory_version and re-review all paths.
Clone blocking modifier groups per-store with CAS-protected rewiring
Select Store A above to enable this panel.
Prove Store A mutations do not affect Store B or legacy. Uses timestamped markers and physical record inspection.
Simulate two concurrent writers at version N. Only Worker A must commit; Worker B must be rejected.
Protocol:
① Both workers read menu at version N
② Worker A: updateMany(version=N) → must return updated=1
③ Worker B: updateMany(version=N) → must return updated=0
④ Physical record: final version = N+1, Worker A data present, Worker B absent
⑤ Cleanup read: artifacts absent from physical DB
Create → Read DB → Read editable store menu → Shadow isolation → Delete → Confirm removal → Final integrity read
Chain:
Create item → Read physical DB → 4a Editable store menu read (management path) → 4b Runtime API check (shadow→absent via getMerchantMenu · authoritative→present via getRorkMenu+store_id) → Delete item → Confirm removal → Final integrity read (no artifacts)
Shadow: getMerchantMenu must NOT serve the item (legacy isolation). Authoritative: getRorkMenu({merchant_id, store_id}) must serve the item from the store-specific menu (migration_state=store_menu_authoritative).
Negative tests 1–8: each verifies both rejection AND physical records unchanged. Tests 6–8 are new saveItemModifierSetup CAS/ownership gate checks.
Negative tests must verify two things (not just rejection):
① Backend returns an error / non-OK response
② Physical records unchanged: menu_version, group.store_id, item.modifier_group_ids
A backend that mutates before failing is still a security gap.
6 rejection scenarios — each verifies: error returned + record unchanged + error code matches
Required evidence per scenario (all three must hold):
① Backend returns error / non-OK response with expected code
② Target record physically unchanged: merchant_id, store_id, is_active, hours, status
③ Error code matches expected pattern (e.g. MODIFIER_STILL_REFERENCED, status 400/403/409)