# Verification checklist: store go-live for one tenant Tick each item with evidence (an HTTP code, an md5, a screenshot name). Paste the evidence into the GitHub issue before closing it. ## Before publishing - [ ] A GitHub issue is open in jbrake1/dwalliance; commits reference it. - [ ] The owner said yes, in their own words, after seeing the preview screenshots (desktop and 390 px mobile). - [ ] No session id, brand code, password or payment secret appears in any built file, config or commit (product, variant and company ids are fine, session ids are not). - [ ] Images have their EXIF and GPS removed (exiftool -gps:all FILE shows nothing). - [ ] Public copy follows the owner's wording rules and claims no feature that doesn't exist. Payment wording says no payment is taken automatically. - [ ] No page path collides with an API folder (/store/cart/, /store/settings/, /store/inventory/, /store/kit/ and the like). Product slugs aren't cart, checkout, product, products, search, invoice, shipment, settings, inventory or kit. - [ ] Store settings (shipping_flat, optional free_shipping_over, tax rules, store_email) are set through /store/settings/. - [ ] Backups of every file that will be updated are saved outside any web root, with md5s. The rollback command is written down. ## Catalog (public API on the tenant domain, no session) - [ ] /store/products/ list returns every product that should be for sale (active:true). - [ ] read for each slug: price correct, stock as intended, at least one image, at least one category. - [ ] /store/products/categories/ list returns the categories in the right order with their description JSON. - [ ] /store/search/ finds a product by a word in its name. ## Pages (HTTPS, canonical host and the other host) - [ ] /store/ → 200, and every product card links to a 200 page. - [ ] /store/.html → 200 for every product. Price and stock badge update live. The variant picker appears only for 2+ variants. - [ ] /store/cart.html, /store/checkout.html and /store/account.html → 200 and carry noindex. - [ ] /assets/js/store.js, /assets/js/cart.js and /assets/css/store-kit.css → 200 with the right content type. - [ ] Every image URL on the store pages → 200. - [ ] Every site page's Shop link points at /store/ (with the slash), and no link to the old store remains. - [ ] /sitemap.xml lists /store/ and the product pages, but not cart, checkout or account. ## Cart and checkout (only with the owner's OK; creates real rows) - [ ] Add, change quantity and remove on cart.html all work. The header badge count matches. - [ ] A sold-out product (stock 0) can't be added: the button is disabled and the server answers 409 if forced. - [ ] New-customer sign-up: code email arrives → verify → profile saved. - [ ] Returning sign-in works on the canonical host, and whoami shows the right email. - [ ] An address is saved. Checkout quote shows subtotal, shipping and tax. Checkout creates a PENDING invoice with the right lines, shipping, tax, total and shipping address copy. - [ ] A confirmation email goes to the customer and a copy goes to store_email. - [ ] A sale movement is written and available stock went down by the quantity ordered. - [ ] account.html lists the order. Delete account is offered, and refuses if an order is waiting for payment. - [ ] Staff: invoice list shows it. A COMPLETED payment for the balance turns it PAID. A shipment with tracking is readable by the customer. - [ ] Clean-up: the test invoice is VOIDED through the app and stock restored with /store/inventory/ adjust (VOIDED does not restore stock by itself). Results are written into the issue. ## After - [ ] tools/verify_public.sh DOMAIN out/ prints ALL PUBLIC CHECKS PASS on the canonical host and www. - [ ] Products list and whoami answer on the live site. - [ ] Rollback tested as a dry run, and the command was sent to the owner. - [ ] The site copy is committed to the repo under sites//, referencing the issue. - [ ] The issue is closed with the test results.