Overview Weighted score across 6 categories

Score
86/ 100
scoring v2.0
LuxFaber Score measures how cleanly AI agents can read and interpret this page. Scored across 6 categories — crawl accessibility, structured data, semantic HTML, content clarity, determinism. The breakdown below shows where pressure concentrates so you know what to fix first.
Crawl Accessibility · 18%
97
Structured Data · 18%
92
Semantic HTML · 16%
100
Content Clarity · 18%
72
Determinism · 15%
100
agentic_surface · 15%
53

Gates

All gates passed.
  • no-html
    Primary fetch returned HTTP 200 with non-empty body
  • robots-disallow-all
    At least one AI bot is allowed in robots.txt
  • bot-block
    At least one bot UA fetch succeeded without challenge
  • agentic-browsing
    Lighthouse not run — pass --lighthouse to enable agentic-browsing gate

Quick wins

Highest score-gain-per-minute fixes for this page.

+18.0 pts ~20m crawl.robots.disallow-enforced

Disallow path https://stelnyx.com/preview/ returned 302 — robots.txt Disallow may not be enforced

Fix: Ensure disallowed paths return 403/404/410 rather than 200

+15.0 pts ~30m agent.openapi.discoverable

No OpenAPI/Swagger spec discovered

Fix: Publish openapi.json at /.well-known/openapi.json or /openapi.json

+15.0 pts ~30m agent.schema-actions.present

No Schema.org potentialAction found

Fix: Add Schema.org potentialAction to your primary entity

+10.5 pts ~30m agent.llms-txt.quality

llms.txt: 1 section(s), 0 URL(s), 123 bytes

Fix: Expand llms.txt with multiple sections, documentation URLs, and meaningful content

+12.0 pts ~60m agent.mcp-manifest.valid

MCP manifest found but missing required fields (name/server_name, version, tools/resources)

Fix: Add name (or server_name), version, and at least one tool or resource to mcp.json

All findings

Crawl Accessibility (30)
INFO crawl.ai-plugin-manifest.present Moderate ~60m score: 100

Migrated to agent.ai-plugin.present in v2.0 (agentic_surface category)

Why: /.well-known/ai-plugin.json was defined by OpenAI for ChatGPT plugins. Many agentic systems still look for this file to auto-discover capabilities — it's effectively the /robots.txt of agent APIs.

Copy-paste fix
// /.well-known/ai-plugin.json
{
  "schema_version": "v1",
  "name_for_human": "Stelnyx — Infrastructure for engineers who ship",
  "name_for_model": "stelnyx_—_infrastructure_for_engineers_who_ship",
  "description_for_model": "API for Stelnyx — Infrastructure for engineers who ship. Use to answer questions about this product.",
  "api": {
    "type": "openapi",
    "url": "https://stelnyx.com/openapi.json"
  }
}
INFO crawl.auth-wall Quick ~0m score: 100

No auth-wall signals detected

Why: Auth-walled pages require login before crawlers can read content. Flagged for awareness — most AI agents can't authenticate and will see only the login form.

PASS crawl.bot-block Moderate ~60m score: 100

No bot-blocking signals detected

Why: WAF challenges that don't recognize legitimate AI bots silently lock you out of LLM training/inference.

PASS crawl.canonical.matches Quick ~3m score: 100

Canonical matches final URL (https://stelnyx.com)

Why: Mismatched canonical sends agents to a different URL than the one they fetched.

Copy-paste fix
<link rel="canonical" href="https://stelnyx.com">
PASS crawl.canonical.present Quick ~3m score: 100

Canonical tag present: https://stelnyx.com

Why: LLM crawlers use canonical to dedupe and pick the authoritative URL.

Copy-paste fix
<link rel="canonical" href="https://stelnyx.com">
INFO crawl.hreflang-alternates Quick ~30m score: 100

No hreflang alternate links found

Why: hreflang tells agents which language/region variant is canonical for each locale, reducing duplicate-content signals across international site variations.

PASS crawl.http-status Quick ~30m score: 100

Primary fetch returned HTTP 200

Why: Non-2xx responses tell agents the page doesn't exist or is broken — score capped at 0.

PASS crawl.js-divergence Moderate ~120m score: 100

Static and browser bodies within 0% — no significant JS divergence

Why: When static HTML and browser-rendered HTML diverge heavily, AI crawlers that can't execute JS only see the shell — structured data, headings, and content are invisible.

INFO crawl.llms-txt.present Quick ~30m score: 100

Migrated to agent.llms-txt.present in v2.0 (agentic_surface category)

Why: /llms.txt is the emerging standard for site-level guidance to LLM agents.

Copy-paste fix
# https://stelnyx.com/llms.txt
# (https://llmstxt.org)

# Stelnyx — Infrastructure for engineers who ship

> One-paragraph site summary aimed at an LLM agent.

## Docs
- [Getting Started](https://stelnyx.com/docs)

## Optional
- [Changelog](https://stelnyx.com/changelog)
INFO crawl.mcp-manifest.present Moderate ~60m score: 100

Migrated to agent.mcp-manifest.present in v2.0 (agentic_surface category)

Why: /.well-known/mcp.json is the emerging discovery endpoint for MCP (Model Context Protocol) tool servers. AI agents that support MCP look here first before prompting a user to configure a server manually.

Copy-paste fix
// /.well-known/mcp.json
{
  "version": "1.0",
  "name": "Stelnyx — Infrastructure for engineers who ship",
  "tools": [
    {
      "name": "search",
      "url": "https://stelnyx.com/mcp/search"
    }
  ]
}
PASS crawl.redirect-chain Quick ~15m score: 100

Redirect chain length: 0

Why: Long redirect chains burn crawl budget and can lose query/state across hops.

PASS crawl.robots.bot-allow.applebot-extended Quick ~5m score: 100

applebot-extended is allowed in robots.txt

Why: Explicitly setting Applebot-Extended documents whether Apple AI products may use the content.

Copy-paste fix
# in robots.txt
User-agent: Applebot-Extended
Allow: /
PASS crawl.robots.bot-allow.bytespider Quick ~5m score: 100

bytespider is allowed in robots.txt

Why: Explicitly allowing Bytespider removes ambiguity for ByteDance crawler access.

Copy-paste fix
# in robots.txt
User-agent: Bytespider
Allow: /
PASS crawl.robots.bot-allow.ccbot Quick ~5m score: 100

ccbot is allowed in robots.txt

Why: Explicitly allowing CCBot removes ambiguity for Common Crawl visibility.

Copy-paste fix
# in robots.txt
User-agent: CCBot
Allow: /
PASS crawl.robots.bot-allow.claudebot Quick ~5m score: 100

claudebot is allowed in robots.txt

Why: Explicitly allowing ClaudeBot removes ambiguity for Anthropic crawler access.

Copy-paste fix
# in robots.txt
User-agent: ClaudeBot
Allow: /
PASS crawl.robots.bot-allow.google-extended Quick ~5m score: 100

google-extended is allowed in robots.txt

Why: Explicitly setting Google-Extended documents whether Google AI products may use the content.

Copy-paste fix
# in robots.txt
User-agent: Google-Extended
Allow: /
PASS crawl.robots.bot-allow.gptbot Quick ~5m score: 100

gptbot is allowed in robots.txt

Why: Explicitly allowing GPTBot removes ambiguity for OpenAI crawler access.

Copy-paste fix
# in robots.txt
User-agent: GPTBot
Allow: /
PASS crawl.robots.bot-allow.perplexitybot Quick ~5m score: 100

perplexitybot is allowed in robots.txt

Why: Explicitly allowing PerplexityBot removes ambiguity for Perplexity crawler access.

Copy-paste fix
# in robots.txt
User-agent: PerplexityBot
Allow: /
FAIL crawl.robots.disallow-enforced Quick ~20m score: 0

Disallow path https://stelnyx.com/preview/ returned 302 — robots.txt Disallow may not be enforced

Fix: Ensure disallowed paths return 403/404/410 rather than 200

Why: Robots.txt rules only matter if they are actually enforced by the origin or CDN.

PASS crawl.robots.present Quick ~5m score: 100

robots.txt is present

Why: robots.txt is the first file every crawler checks.

Copy-paste fix
# https://stelnyx.com/robots.txt
User-agent: *
Allow: /

User-agent: GPTBot
Allow: /

User-agent: ClaudeBot
Allow: /

Sitemap: https://stelnyx.com/sitemap.xml
INFO crawl.sitemap.child-fetchability Quick ~45m score: 100

Sitemap is a flat urlset (not an index) — child fetchability check not applicable

Why: Unfetchable child sitemaps make the sitemap index useless — crawlers cannot discover any of the URLs listed in those children.

PASS crawl.sitemap.discoverable Quick ~20m score: 100

Sitemap discovered via robots

Why: Without a sitemap, multi-page agents can't enumerate your site reliably.

Copy-paste fix
# Add to robots.txt:
Sitemap: https://stelnyx.com/sitemap.xml
PASS crawl.sitemap.domain-mismatch Quick ~30m score: 100

All sitemap URLs point to the scanned domain — no domain mismatch detected

Why: Sitemap URLs pointing to a different domain are unfollowable — crawlers and AI agents see a dead sitemap.

Copy-paste fix
# Verify all <loc> entries use your production domain:
# Expected: stelnyx.com
# Found: foreign host(s) in sitemap — update your CMS Site URL and regenerate
PASS crawl.sitemap.effectively-dead Moderate ~60m score: 100

Sitemap is functional — at least some content is reachable by crawlers

Why: A sitemap that exists but provides zero reachable content is worse than no sitemap — it signals to crawlers that discovery is supported but yields nothing.

PASS crawl.sitemap.liveness Quick ~20m score: 100

3/3 sampled sitemap URL(s) returned 2xx

Why: Stale sitemap URLs waste crawl budget and make discovery less reliable.

PASS crawl.sitemap.parseable Quick ~30m score: 100

Sitemap parsed successfully with 3 URL(s)

Why: Empty/invalid sitemaps look the same to a crawler as none at all.

Copy-paste fix
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url><loc>https://stelnyx.com/</loc></url>
  <!-- add one <url><loc>…</loc></url> per public page -->
</urlset>
PASS crawl.sitemap.staging-leak Quick ~30m score: 100

No staging/hosting platform domains detected in sitemap URLs

Why: Staging/hosting platform domains in sitemaps indicate a deployment misconfiguration — the sitemap was never regenerated for production.

Copy-paste fix
# WordPress: Settings → General → update WordPress Address + Site Address
# Or in wp-config.php:
define('WP_HOME', 'https://your-production-domain.com');
define('WP_SITEURL', 'https://your-production-domain.com');
# Then regenerate sitemap and resubmit in Google Search Console
PASS crawl.sitemap.url-health Quick ~30m score: 100

3/3 sampled sitemap URLs returned 2xx

Why: Broken URLs in sitemaps waste crawl budget and erode crawler trust in the sitemap's accuracy over time.

PASS crawl.spa-static-mode Quick ~30m score: 100

SPA framework detected — static HTML has sufficient text content (ratio 8.3%)

Why: Static HTML should contain meaningful content without requiring JavaScript execution.

INFO crawl.x-robots-header Quick ~10m score: 100

No X-Robots-Tag or robots meta tag detected

Why: X-Robots-Tag: noindex tells crawlers (and AI agents) to skip the page. noai and none are increasingly used to opt out of AI training — verify this is intentional.

Structured Data (7)
PASS sd.jsonld.count Quick ~15m score: 100

4 JSON-LD block(s) found

Why: JSON-LD is how LLMs reliably extract entity facts (org, products, articles) without parsing prose.

Copy-paste fix
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Stelnyx — Infrastructure for engineers who ship",
  "url": "https://stelnyx.com"
}
</script>
PASS sd.jsonld.entity-types Quick ~20m score: 80

Found expected entity types: SoftwareApplication, Organization, WebSite (vertical: saas)

Fix: Add Organization and WebSite JSON-LD; include Article/Product/Service where relevant

Why: Generic JSON-LD without recognised @type doesn't disambiguate the entity for agents.

Copy-paste fix
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "name": "Stelnyx — Infrastructure for engineers who ship",
  "url": "https://stelnyx.com"
}
</script>
PASS sd.jsonld.self-consistency Quick ~20m score: 100

JSON-LD self-consistency verified (4 check(s) passed)

Why: Conflicting structured data confuses downstream extractors and ranking systems.

PASS sd.jsonld.valid Quick ~10m score: 100

4/4 JSON-LD block(s) are valid

Why: Invalid JSON-LD silently breaks structured-data parsers — they just skip the block.

PASS sd.opengraph.complete Quick ~10m score: 80

Open Graph missing: image

Fix: Add missing og: meta tags: og:image

Why: OpenGraph drives link previews everywhere (Slack, iMessage, agent UIs that render share cards).

Copy-paste fix
<meta property="og:title" content="Stelnyx &#x2014; Infrastructure for engineers who ship">
<meta property="og:description" content="Stelnyx builds security, codebase and agent-readiness scanners, plus memory and agent tooling. Some are MIT-licensed CLIs; others are proprietary.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://stelnyx.com">
<meta property="og:image" content="https://stelnyx.com/og-image.png">
PASS sd.title-meta.quality Quick ~5m score: 100

Title (47 chars) and meta description (146 chars) within spec

Why: <title> + meta description are the snippet agents quote when summarising or citing your page.

Copy-paste fix
<title>Stelnyx &#x2014; Infrastructure for engineers who ship</title>
<meta name="description" content="Stelnyx builds security, codebase and agent-readiness scanners, plus memory and agent tooling. Some are MIT-licensed CLIs; others are proprietary.">
PASS sd.twitter-card.present Quick ~2m score: 100

Twitter Card type: summary_large_image

Why: twitter:card extends OpenGraph with X/Twitter-specific layout hints.

Copy-paste fix
<meta name="twitter:card" content="summary_large_image">
Semantic HTML (5)
PASS html.heading-hierarchy Quick ~30m score: 100

Heading hierarchy is valid (17 headings, 1 h1, no skips)

Why: Headings give agents the document outline. No h1 = no clear topic.

Copy-paste fix
<!-- Document outline -->
<h1>Page topic in one sentence</h1>
<section>
  <h2>Section heading</h2>
  <h3>Sub-section</h3>
</section>
INFO html.img-alt-coverage Quick ~30m score: 100

no <img> elements found, rule skipped

Why: Alt text is how agents (and screen readers) caption images. Missing alt = invisible content.

Copy-paste fix
<img src="/diagram.png" alt="Concise description of what the diagram shows">
PASS html.landmarks Quick ~30m score: 100

Landmarks present: main, nav, header, footer, article (5/5)

Why: Landmark elements let agents skip nav/footer chrome and zero in on the main content.

Copy-paste fix
<header>
  <nav>…site nav…</nav>
</header>
<main>
  <article>…page content…</article>
</main>
<footer>…site footer…</footer>
PASS html.lang-attr Quick ~1m score: 100

<html lang="en"> is set

Why: Without lang, agents can't decide whether to translate or which language model to apply.

Copy-paste fix
<html lang="en">
PASS html.link-text-quality Quick ~20m score: 100

All 29 link(s) have descriptive text

Why: "click here" / "learn more" tells agents nothing about the destination. Use descriptive link text.

Content Clarity (6)
INFO content.action-surface Quick ~0m score: 100

Action surface: 24 entry points — 1 form(s), 23 button(s), 0 mailto, 0 tel, 0 ARIA button(s)

Why: Forms, CTA buttons, and contact links are conversion entry points. Agent-driven buyers (using AI to evaluate vendors) look for these signals when deciding whether a site is a real business.

PASS content.boilerplate-ratio Moderate ~90m score: 100

Boilerplate ratio: 65.0% (5117 extracted / 7876 total visible bytes)

Why: Lots of nav/footer chrome relative to page body dilutes the signal in agent excerpts.

PASS content.readability-extract Moderate ~60m score: 100

Readability extracted 5117 chars of text

Why: If readability extraction returns null, agents likely can't isolate the article body.

INFO content.readability-signal Quick ~0m score: 100

Mozilla Readability extracted 5117 chars · siteName: Stelnyx

Why: Mozilla Readability is the same library Firefox Reader View uses; if it can't extract your content, neither can most third-party article scrapers.

WARN content.script-density Moderate ~60m score: 50

21 script/iframe elements (21 <script>, 0 cross-origin <iframe>)

Fix: Reduce third-party scripts and cross-origin iframes to improve content signal

Why: Heavy client-side script density is a red flag that content depends on JS to render.

FAIL content.signal-noise Moderate ~90m score: 30

Signal-noise ratio: 13.0% (8016 text bytes / 61460 total bytes)

Fix: Reduce script/style bloat or increase substantive text content

Why: High script/style-to-text ratio buries the actual content agents are trying to extract.

Determinism (3)
PASS det.bot-cloaking Moderate ~60m score: 100

gptbot and browser fetches returned identical content

Why: Different content to GPTBot vs a browser is the textbook cloaking pattern. Search engines flag this.

PASS det.fetch-stability Moderate ~60m score: 100

Two luxfaber fetches returned identical body hash

Why: If the same URL serves different bytes on every fetch, no agent can cache/cite reliably.

PASS det.ua-cloaking Moderate ~60m score: 100

luxfaber and browser fetches returned identical content

Why: Serving different content to a Luxfaber UA vs a browser UA = SEO/agent cloaking risk.

agentic_surface (11)
PASS agent.ai-plugin.present Quick ~45m score: 100

/.well-known/ai-plugin.json found

Why: The plugin manifest is still a useful compatibility signal for older agent runtimes.

INFO agent.cache-headers.quality Quick ~20m score: 100

Cache headers present

Why: Good cache headers keep repeated agent fetches efficient and consistent.

INFO agent.head-options.support Quick ~15m score: 100

HEAD request supported (HTTP 200)

Why: HEAD and OPTIONS support improve lightweight discovery and probing.

PASS agent.llms-txt.present Quick ~30m score: 100

llms.txt present

Why: llms.txt is the clearest site-level guidance file for agentic crawlers.

FAIL agent.llms-txt.quality Quick ~30m score: 30

llms.txt: 1 section(s), 0 URL(s), 123 bytes

Fix: Expand llms.txt with multiple sections, documentation URLs, and meaningful content

Why: A present but vague llms.txt file does not help agents much.

PASS agent.mcp-manifest.present Moderate ~60m score: 100

/.well-known/mcp.json found

Why: MCP discovery helps agents find tool servers without manual setup.

FAIL agent.mcp-manifest.valid Moderate ~60m score: 20

MCP manifest found but missing required fields (name/server_name, version, tools/resources)

Fix: Add name (or server_name), version, and at least one tool or resource to mcp.json

Why: Invalid MCP manifests are effectively invisible to supporting clients.

FAIL agent.openapi.discoverable Quick ~30m score: 0

No OpenAPI/Swagger spec discovered

Fix: Publish openapi.json at /.well-known/openapi.json or /openapi.json

Why: OpenAPI discovery gives agents a machine-readable way to inspect your API surface.

INFO agent.pagination.signals Quick ~20m score: 0

No pagination signals detected

Why: Pagination signals help crawlers traverse larger collections safely.

INFO agent.rate-limit-headers.present Quick ~10m score: 0

No rate-limit headers detected

Why: Rate-limit headers let automated clients back off predictably.

FAIL agent.schema-actions.present Quick ~30m score: 0

No Schema.org potentialAction found

Fix: Add Schema.org potentialAction to your primary entity

Why: Schema-linked actions let agents execute common workflows directly.

Metadata

LuxFaber version 0.2.0
Ruleset v2.0
Node v22.22.3
Primary UA Luxfaber/0.2.0 (+https://github.com/Stelnyx/LuxFaber)
Fetch timeout 15000ms
Schema version 1.0.0 }
Commercial services

Managed services and audits available

For hosted persistence, dashboards, deploy regression alerts, or human audits, see MONETIZATION.md.