A leave-behind from a current customer · passive recon only
ClickSafety is the original OSHA-authorized online outreach provider: 25+ years, 8 million courses, DOL-carded, and one of the very few training sites that ships an llms.txt to guide AI to its catalog. That instinct is exactly right: the next wave of "get my crew OSHA-30 certified" starts inside an assistant. This is a passive, respectful read of what a shopper's browser (and an AI crawler) actually receives today: five findings, each with the exact proof, and one through-line: the machine-readable layer stops at a list of links, and the plumbing under it has two fixable leaks.
How we looked (passive only)
robots.txt, /llms.txt, /sitemap.xml, /.well-known/*, and a handful of the site's own static-asset URLs. No account, no form submission, no endpoint probing, no scanning, no wall routed around. Recon date: 2026-07-12. Platform confirmed: Adobe Commerce (Magento), backend host prd-magento.ascendlearning.com, ClickSafety is an Ascend Learning company (its own About page and its infrastructure both say so).
No jargon: you already bet on AI discovery; here's what each fix is worth in enrollments.
A sitemap is how search engines and AI indexers learn every course URL you have. ClickSafety's is not XML: it's a photo.
GET /sitemap.xml returns HTTP 200 with content-type: image/jpeg, a 1,692-byte, 262×262 JPEG. And your robots.txt explicitly directs crawlers to Sitemap: /media/clicksafety_sitemap.xml, which returns the identical 1,692-byte JPEG. So both the path a crawler tries by convention and the path you hand it resolve to the same picture, not a URL map.
# the conventional discovery path $ curl -sI https://www.clicksafety.com/sitemap.xml HTTP/2 200 content-type: image/jpeg content-length: 1692 # the path your OWN robots.txt declares $ curl -s https://www.clicksafety.com/robots.txt | grep -i sitemap Sitemap: https://www.clicksafety.com/media/clicksafety_sitemap.xml $ curl -sI https://www.clicksafety.com/media/clicksafety_sitemap.xml HTTP/2 200 content-type: image/jpeg content-length: 1692 $ file <that response> → JPEG image data, JFIF, 262x262, progressive
static/version1784862428, theme path frontend/BORN/Clicksafety) and the core RequireJS assets return 200; the OSHA-30 page rendered with zero page errors and zero script 404s. Nothing below is being asserted as current.Every page's HTML tells the browser to load its JavaScript from a versioned path. On the course and cart pages, that path returned "not found."
All five pages reference static assets under static/version1783652806/…. Fetch the core Magento JavaScript at that version: requirejs/require.js, requirejs-config.js, mage/common.js, Magento_Ui/js/core/app.js, js/clicksafety-main.js, js/theme.js, and every one returns HTTP 404 as text/html (verified by plain curl, 6-of-6 consecutive hits on require.js). In real Chrome, the OSHA-30 page, the Business Accounts page, and the cart logged "Refused to execute script … MIME type ('text/html') is not executable" plus RequireJS "Script error" for those exact modules.
# every page references this static version… / , /osha-30-construction , /courses/all-courses/ , /checkout/cart → static/version1783652806 # …and the core JS at that version 404s (independent curl, not our crawler): $ curl -sI .../version1783652806/frontend/BORN/Clicksafety/en_US/requirejs/require.js → 404 text/html $ curl -sI .../mage/common.js → 404 $ curl -sI .../Magento_Ui/js/core/app.js → 404 $ curl -sI .../js/clicksafety-main.js → 404 (require.js: 404 on 6/6 hits) # real Chrome, on /osha-30-construction and /checkout/cart: Refused to execute script from '…/mage/common.js' because its MIME type ('text/html') is not executable Error: Script error for "Magento_Ui/js/core/app" (requirejs.org/docs/errors.html#scripterror)
static_content_version across CDN cache nodes rather than a hard outage. We can't see the full logged-in impact passively. But it reproduces from any terminal, and it's worth your ops team confirming the deployed static version matches what's live on the edge.Your prices, durations, and DOL-card details are on the page, but only as human text. There's no structured data an assistant can trust and cite.
Rendered-DOM check across the money pages: the home page, the full course catalog (/courses/all-courses/), and the flagship OSHA-30 page all return ld+json = 0 (schema.org/JSON-LD, the invisible labels search engines and AIs read): no schema.org/Course, no Offer, no Product. Prices render as plain text ($189 and $79 on OSHA-30; $65–$489 across the catalog), as do course length, DOL-card issuance, prerequisites, and state-specific variants. The OSHA-30 page does carry OpenGraph tags (social cards work), but OG isn't product data.
page ld+json og prices (text only) / 0 0 $391 $489 $189 $89 $140 /courses/all-courses/ 0 0 $200 $89 $189 $391 $140 $300 $275 $65 /osha-30-construction 0 5 $189 $79 # og present, but 0 Course/Offer schema
schema.org/Course or Offer behind any of it.A lot of engineering effort went into watching human visitors. Very little went into the machine-readable product layer, and the security header meant to contain all that has holes in it.
The live Content-Security-Policy on every page (checkout included) allowlists dozens of advertising, analytics, and session-replay origins: the full HubSpot suite, LuckyOrange session-replay (incl. a live checkout websocket wss://realtime.luckyorange.com), ZoomInfo, Microsoft Clarity, Optimizely, The Trade Desk, DoubleClick, Meta, LinkedIn, Bing, Rubicon. And the CSP weakens itself: form-action and frame-src each include a bare * wildcard, so the directive that's supposed to constrain where a form can post or what can be framed is effectively open.
# from the live content-security-policy header (excerpt): form-action … www.paypal.com *.cardinalcommerce.com * *.hubspot.com … 'self'; frame-src … player.vimeo.com *.doubleclick.net * *.hubspot.net … 'self'; connect-src … wss://realtime.luckyorange.com/mqtt *.zoominfo.com *.clarity.ms *.adsrvr.com … # third-party hosts that actually loaded on the cart render: optimizely · hsforms · hs-scripts · newrelic · braintreegateway · googletagmanager · ensighten · nc0.co
Secure; HttpOnly; SameSite=Lax, HSTS is on, X-Frame-Options: SAMEORIGIN, and object-src 'none'. This isn't a sloppy store: it's a well-built one carrying more tracking weight than its product data.* wildcards blunt the protection it's meant to provide.This is the finding that turns the other four into an opening. You did the hard part: deciding to be legible to AI. You stopped about a hundred feet short of the payoff.
GET /llms.txt returns HTTP 200, 3,065 bytes: a genuinely thoughtful, brand-aware file that points assistants at your courses and Business-Account pages. That puts ClickSafety ahead of ~99% of training sites, which serve nothing. But it's a list of URLs. No prices, no course durations, no DOL-card facts, no "which course for which job or state" mapping, and no way to act: /.well-known/agent-card.json is a 404, and there are no callable tools. So an assistant learns where your OSHA-30 page is, then still has to hand the shopper back to a human to actually enroll a crew.
$ curl -sI https://www.clicksafety.com/llms.txt → 200 text/plain 3065 bytes ✓ authored, brand-aware $ curl -sI https://www.clicksafety.com/.well-known/agent-card.json → 404 # no way for an agent to act llms.txt contents: course + business URLs only, no prices · no durations · no DOL-card data · no tools
Credited baseline: what's genuinely well-built
llms.txt, a bet on AI discovery that almost no competitor has made.Honesty note: our raw crawl logged extra "net::ERR_FAILED" console lines: those were induced by our own webfont blocking during screenshotting, not ClickSafety defects, and are excluded from every finding above. The meaningful signals are the reproducible curl statuses and the rendered-DOM counts.
The through-line
None of this is a rebuild. A working sitemap and a matched static-content version are ops fixes. Structured course data and a callable agent layer are additive: they sit on top of the Adobe Commerce store you already run. Do them and the next shopper's assistant answers "cheapest OSHA-30 with a DOL card" with your $189 course, then books the whole crew. The next page shows it in your own brand.