# V29.1 - Local test results - 26 September 2026

## What was tested

The supplied V28 project plus the previously supplied V29 homepage was
used as the baseline. The THREE deployment files listed in MANIFEST.json
are the V29.1 change. No remote deployment or live database access occurred.

Production code was run with the supplied Laravel/vendor code, PHP 8.4.23
and isolated SQLite fixtures. The container lacks PDO database drivers and
some native extensions. Tests used a LOCAL-ONLY SQLite FFI adapter and a
missing mbstring polyfill. Those adapters, fixtures, test images and test
scripts are not part of either deployment package.

## Passed: 33 functional checks

28 synthetic regression checks covered:
- Pool combines an entitled custom cover, all gallery/album images and all
  photos on published reviews, including review-only businesses.
- Business IDs are isolated; suspended businesses and empty IDs are excluded.
- Pending reviews, video posters and orphan attachments are excluded.
- Duplicate final URLs count once, even across gallery, cover and review.
- Invalid paths, traversal attempts and URLs containing credentials are skipped.
- Existing custom-cover entitlement is preserved.
- Empty input issues no queries; photo queries are batched across businesses
  (3 SELECTs without nonempty custom-cover relations, not 3 per card).
- Production photo selection performed SELECTs only, without database writes.
- 500 draws selected all 5 eligible distinct photos in the test pool.
- Unpublishing/deleting attachments removes their unique photos on the next
  call; a duplicate still independently owned by a public gallery remains valid.
- New published-review photos and removed custom covers are reflected on the
  next render without a separate persistent photo cache.
- Relative media paths use the configured remote-storage URL helper.
  This checks URL construction only, NOT real remote-storage availability.
- Featured and Trending share one selected image for the same business.
- Existing labelled illustration remains when no real photo exists; real
  photos do not receive the illustration label.
- 80 HomePageV29::data renders with a warm listing cache still varied photos;
  20 renders after unpublishing a review did not use its removed photo.
- Disabled admin homepage sections remain disabled.

3 uploaded-data checks covered:
- A minimal SQLite copy of only the necessary public business/media fields
  was parsed from the supplied SQL snapshot; account/secret fields were not
  copied into that fixture. Actual service pools matched an independent
  SQL/file-existence check for all 205 active businesses in that snapshot.
- 13 active businesses had eligible local photos in the supplied files.
- 20 selection rounds stayed within the exact allowed pool for each business.

Important data limit: the uploaded snapshot contained no business_galleries
rows. Real snapshot checks therefore exercise the existing review photos;
galleries, albums, custom covers and combinations were separately tested
with synthetic records. No fixture records are shipped or written to the
user's database by this patch.

2 optional-category-section checks covered:
- Extra category businesses outside Featured/Trending enter the shared pool.
- The same selected photo is reused across all enabled homepage sections.

## Syntax and scope checks

- PHP syntax checks passed for both production service files.
- The modified legacy card partial was compiled by the supplied Laravel
  Blade compiler and its compiled PHP passed syntax validation.
- The partial's markup from @once onward is byte-identical to the baseline.
- Incremental deployment contains no CSS/JS/config/route/schema change.
- Package manifests and payload hashes are checked separately by VERIFY.php.

## Not verified here

- Live hosting, MariaDB/MySQL driver execution, production OPcache, remote
  storage, CDN/full-page caches, or PWA cache refresh.
- A new full browser, login/payment/email, performance/load or security audit.
- New desktop/mobile screenshots: layout and visual assets are unchanged
  from V29, apart from the selected photo source.

Staging checks should cover a business with several real gallery/review
photos, a review-only business, a business without photos, publication
changes, light/dark mode, mobile cards, and repeated network renderings.
Random selection is not a guarantee of a different photo on every refresh.
A full-page cache can serve old HTML without executing the selector.

The full package includes TEST_RESULTS_V29_PREVIOUS.md as historical V29
verification only. Those previous browser checks were NOT repeated as
part of the V29.1 tests above.
