What's new in 3.8.0 (May 28, 2026): Price feed conformance overhaul (gun.deals v2 spec) plus a sweep of cron resilience fixes. Most referral revenue rides on the gun.deals + wikiarms feeds, so the wor

Updated October 22, 2026 in What's new

Released May 28, 2026. Price feed conformance overhaul (gun.deals v2 spec) plus a sweep of cron resilience fixes. Most referral revenue rides on the gun.deals + wikiarms feeds, so the work was driven by a real MAP violation incident on Holosun HS507COMP that surfaced multiple deeper feed quality problems.

Feed Overhaul , gun.deals + wikiarms

  • Stripped 9 non spec fields from gun-deals-feed.php: <description>, <msrp>, <weight>, <quantity>, <sku>, <category>, <fflRequired>, <capacity>, <barrelLength>. None of these appear in gun.deals' v2 spec. They bloated the feed 3x with no documented parser benefit. File size: 143.9 MB → 63.0 MB (~56% reduction). Faster gun.deals pulls and indexing on their end. Wikiarms was already minimal , only needed helper integration.
  • Added <reloading> wrapper detection to both feeds. Per spec, "Do not omit specification for ammo, firearm, part or reloading products, because the offer will not be listed in that case." ~6,500 reloading products (Reloading Bullets/Brass/Dies/Presses/Tools, Powder Measures, Case Preparation, Black Powder, Muzzleloader Supplies) were previously emitting NO type wrapper and being silently dropped by gun.deals. Now they emit <reloading><type>...</type></reloading> with mappings keyed off category.
  • New shared helper file includes/feed-helpers.php used by both gun.deals + wikiarms. Five functions:, tgdIsAmmoCategory() , excludes Ammo Boxes / Storage / Holders / Cases / Pouches / Magazines / Accessories from ammo classification (~707 products were misclassified as ammo via LIKE '%ammo%'), tgdExtractAmmoCaliber() , digit prefix validation rule rejects any caliber string starting with a letter (junk like "HORNADY FLEXLOCK", "FULL METAL JACKET", "AMMO BOX", "MAGNUM ACTION"). Falls back to title regex covering ~45 caliber patterns, then gauge column., tgdExtractAmmoRounds() , broader patterns for round count extraction: "Box of N", "Case of N", "N rd", "N/box", "N per box", tgdDerivePartType() , spec quality <type> strings ("9mm magazine", "ar15 lower", "12 gauge choke tube"). Same digit prefix gate on caliber so junk doesn't pollute part types., tgdDeriveReloadingType() , category → reloading type string
  • Hide text mapping confirmed with gun.deals support (2026-05-28) in gun-deals-feed.php:, map_absolute → MAP, cart_price / see_in_cart → Add to Cart for best price (gun.deals' OWN spec example, observed rendering on Locke Arms competitor), email_for_price / email_for_price_link -> Email for price (gun.deals confirmed lowercase verbatim), call_for_price → Call for Price, Custom hide text strings without a whitelist phrase get silently dropped , the price displays publicly (MAP violation). Holosun fix went out before any escalation from the brand.
  • Field name landmine preserved , gun.deals continues to emit <title> / <image> (NOT <name>/<imageUrl> from the spec). Gun.deals' production parser only reads the legacy names; renaming on 2026-05-27 dropped ~115K listings overnight. Wikiarms reads the canonical names , those stay as <name> / <imageUrl>.

Caliber Data Quality

  • Discovered products.caliber column is polluted with bullet type strings ("FULL METAL JACKET" 120 rows, "JACKETED HOLLOW POINT" 122 rows, "POWER POINT", "ACCUBOND", "MATCHKING") plus 84 rows literally containing "AMMO BOX". Sourced from distributor feeds that conflate caliber and bullet construction. These were being emitted as <caliber> and making ammo offers unusable for gun.deals' classification. Digit prefix validation now rejects them at feed emission time; title regex extraction recovers the real caliber. Hornady Critical Duty UPC 090255913767 went from <caliber>HORNADY FLEXLOCK</caliber> to <caliber>40 s&w</caliber>. CVA Magazine UPC 043125111015 went from <type>magnum action magazine</type> to <type>rifle magazine</type>. A separate DB side cleanup sweep would remove the junk at source but is out of scope for this release.

Cron Resilience

  • cron/mge_tracking.php , Both success and error cron_log INSERTs now getDB(true) to refresh PDO. The error path log INSERT is wrapped in its own try/catch so a dead connection on the log write can't bury the original error.
  • cron/sync_inventory.php , set_time_limit(600) → set_time_limit(1200) after ~15 daily 600s timeouts. Most runs complete in 5-10 min but distributor feed bursts plus the Phase 4a staleness sweep can spike to 12-15 min.
  • admin/cron_controller.php , set_time_limit(1800) → set_time_limit(2400). Must stay above the longest child plus buffer.
  • cron/gunbroker_data_fixer.php , Added $pdo = getDB(true) before the character replacement loop. Earlier steps in this script can run several minutes; first character UPDATE was hitting "gone away".

Verification

All releases: What's new in Trinity. The same notes are on the What's New page in your admin.

<!-- search: what's new whats new change log changelog release notes update version 3.8.0 may 28 2026 May 2026 stripped 9 non spec fields from gun deals feed.php added reloading wrapper detection new shared helper file includes feed helpers.php hide text mapping confirmed with gun.deals support 2026 05 28 field name landmine preserved discovered products.caliber column is polluted cron mge tracking.php cron sync inventory.php admin cron controller.php cron gunbroker data fixer.php -->

Still stuck? Email support@2adata.com and tell us which article you were reading.

Comments

No comments yet. Questions and tips from other store owners are welcome.

Leave a comment

Your first comment is reviewed before it appears. We email you a link to confirm it is you; your address is never shown or shared.