> ## Documentation Index
> Fetch the complete documentation index at: https://site.aspect.build/llms.txt
> Use this file to discover all available pages before exploring further.

# Your agent doesn't know how to run your tests.

> And when the build fails, all it gets is log text to guess at, so it retries blindly or hands the problem back to a human.

export const MarketingPage = () => <div className="marketing-page-marker" style={{
  display: "none"
}} />;

export const CTA = ({title, subtitle, primaryCta, primaryHref = "#", secondaryCta, secondaryHref = "#"}) => <section className="w-full flex justify-center px-4 py-16 md:py-20">
    <div className="w-full rounded-2xl text-white flex flex-col md:flex-row items-center justify-center gap-10 md:gap-16 p-8 md:p-12 text-center md:text-left" style={{
  maxWidth: "1140px",
  background: "linear-gradient(135deg, #1a3a5c 0%, #176ACC 100%)"
}}>
      <div>
        <h2 className="text-2xl md:text-3xl font-semibold tracking-tight">{title}</h2>
        {subtitle && <div className="mt-3 text-blue-100 text-base">{subtitle}</div>}
      </div>
      <div className="flex flex-wrap gap-3 shrink-0 justify-center">
        {primaryCta && <a href={primaryHref} className="inline-flex items-center px-6 py-3 rounded-lg bg-white text-blue-700 font-semibold hover:bg-blue-50 transition whitespace-nowrap shadow-sm">
            {primaryCta}
          </a>}
        {secondaryCta && <a href={secondaryHref} className={`inline-flex items-center px-6 py-3 rounded-lg border border-blue-300/50 text-white font-semibold hover:bg-blue-700/30 transition whitespace-nowrap ${secondaryHref === "/request-demo" ? "demo-gradient-btn" : ""}`}>
            {secondaryCta}
          </a>}
      </div>
    </div>
  </section>;

export const StatsBar = ({stats = []}) => <div className="flex flex-wrap justify-center gap-8 md:gap-16 py-4">
    {stats.map((stat, i) => <div key={i} className="flex flex-col items-center text-center">
        <span className="text-3xl md:text-4xl font-bold text-zinc-900 dark:text-white">{stat.value}</span>
        <span className="text-sm text-zinc-500 dark:text-zinc-400 mt-1">{stat.label}</span>
      </div>)}
  </div>;

export const FeatureGrid3 = ({children}) => <div className="marketing-grid-3">{children}</div>;

export const FeatureGrid2 = ({children}) => <div className="marketing-grid-2">{children}</div>;

export const FeatureShowcase = ({title, description, href, linkText = "Learn more", flipped = false, label, children}) => <div className={`flex flex-col ${flipped ? "md:flex-row-reverse" : "md:flex-row"} items-center gap-10 md:gap-16 py-10`}>
    <div className="flex-1 min-w-0">
      {label && <p className="text-xs font-semibold tracking-widest text-blue-600 dark:text-blue-400 uppercase mb-3">{label}</p>}
      <h3 className="text-2xl md:text-3xl font-bold text-zinc-900 dark:text-white tracking-tight">{title}</h3>
      <p className="mt-4 text-zinc-500 dark:text-zinc-300 leading-relaxed text-base">{description}</p>
      {href && <div className="mt-6">
          <a href={href} className="inline-flex items-center text-blue-600 dark:text-blue-400 font-semibold text-sm hover:underline underline-offset-2">
            {linkText} →
          </a>
        </div>}
    </div>
    <div className="flex-1 min-w-0 feature-showcase-image">
      {children}
    </div>
  </div>;

export const PlatformFeature = ({title, description, href, linkText = "Learn more"}) => <div className="flex flex-col p-5 rounded-xl border border-zinc-200 dark:border-zinc-700/60 bg-white dark:bg-zinc-800/40 hover:border-blue-200 dark:hover:border-blue-700 hover:shadow-sm transition-all duration-200">
    <h3 className="text-sm font-semibold text-zinc-900 dark:text-white">{title}</h3>
    <p className="mt-1.5 text-xs text-zinc-500 dark:text-zinc-400 leading-relaxed">{description}</p>
    {href && <a href={href} className="inline-flex items-center mt-3 text-xs text-blue-600 dark:text-blue-400 font-semibold hover:underline underline-offset-2">
        {linkText} →
      </a>}
  </div>;

export const Hero = ({title, subtitle, badge, eyebrow, heroImageClassName = "", primaryCta, primaryHref = "#", secondaryCta, secondaryHref = "#", centered = true, children}) => <section className="w-full flex justify-center px-4 pt-16 pb-16 md:pt-24 md:pb-24" style={{
  background: "linear-gradient(180deg, var(--hero-gradient-start, #f8fafc) 0%, var(--hero-gradient-end, #ffffff) 100%)"
}}>
    <div className="w-full" style={{
  maxWidth: "1140px"
}}>
      {centered && !children ? <div className="flex flex-col items-center text-center">
          {badge && <div className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-blue-50 dark:bg-blue-900/30 border border-blue-200 dark:border-blue-700 text-blue-700 dark:text-blue-300 text-sm font-medium mb-6">
              {badge}
            </div>}
          {eyebrow && <div className="text-xs font-semibold tracking-widest uppercase text-blue-600 dark:text-blue-400 mb-4">
              {eyebrow}
            </div>}
          <h1 className="text-4xl md:text-5xl font-semibold text-zinc-900 dark:text-white leading-tight tracking-tight" style={{
  maxWidth: "820px"
}}>
            {String(title).split(/\\n|\n/).map((line, i) => i ? [<br key={i} />, line] : line)}
          </h1>
          {subtitle && <div className="subtitle-gap text-lg md:text-xl text-zinc-500 dark:text-zinc-300 leading-relaxed" style={{
  marginTop: "1rem",
  maxWidth: "600px"
}}>
              {subtitle}
            </div>}
          {(primaryCta || secondaryCta) && <div className="flex flex-wrap gap-3 mt-10 justify-center">
            {primaryCta && <a href={primaryHref} className="inline-flex items-center px-6 py-3 rounded-lg bg-blue-600 text-white font-semibold hover:bg-blue-700 transition shadow-sm">
                {primaryCta}
              </a>}
            {secondaryCta && <a href={secondaryHref} className={`inline-flex items-center px-6 py-3 rounded-lg border border-zinc-300 dark:border-zinc-600 text-zinc-700 dark:text-zinc-200 font-semibold hover:bg-zinc-50 dark:hover:bg-zinc-800 transition ${secondaryHref === "/request-demo" ? "demo-gradient-btn" : ""}`}>
                {secondaryCta}
              </a>}
          </div>}
        </div> : <div className="flex flex-col md:flex-row items-center gap-10 md:gap-16">
          <div className="flex-1 min-w-0">
            {badge && <div className="inline-flex items-center gap-2 px-4 py-1.5 rounded-full bg-blue-50 dark:bg-blue-900/30 border border-blue-200 dark:border-blue-700 text-blue-700 dark:text-blue-300 text-sm font-medium mb-6">
                {badge}
              </div>}
            {eyebrow && <div className="text-xs font-semibold tracking-widest uppercase text-blue-600 dark:text-blue-400 mb-4">
                {eyebrow}
              </div>}
            <h1 className="text-4xl md:text-5xl font-semibold text-zinc-900 dark:text-white leading-tight tracking-tight">
            {String(title).split(/\\n|\n/).map((line, i) => i ? [<br key={i} />, line] : line)}
          </h1>
            {subtitle && <div className="subtitle-gap text-lg md:text-xl text-zinc-500 dark:text-zinc-300 leading-relaxed" style={{
  marginTop: "1rem"
}}>
                {subtitle}
              </div>}
            <div className="flex flex-wrap gap-3 mt-8">
              {primaryCta && <a href={primaryHref} className="inline-flex items-center px-6 py-3 rounded-lg bg-blue-600 text-white font-semibold hover:bg-blue-700 transition shadow-sm">
                  {primaryCta}
                </a>}
              {secondaryCta && <a href={secondaryHref} className={`inline-flex items-center px-6 py-3 rounded-lg border border-zinc-300 dark:border-zinc-600 text-zinc-700 dark:text-zinc-200 font-semibold hover:bg-zinc-50 dark:hover:bg-zinc-800 transition ${secondaryHref === "/request-demo" ? "demo-gradient-btn" : ""}`}>
                  {secondaryCta}
                </a>}
            </div>
          </div>
          {children && <div className={`flex-1 min-w-0 hero-image ${heroImageClassName}`}>
              {children}
            </div>}
        </div>}
    </div>
  </section>;

<MarketingPage />

<Hero title="Your agent doesn't know how to run your tests." subtitle="And when the build fails, all it gets is log text to guess at, so it retries blindly or hands the problem back to a human." primaryCta="Install the Aspect CLI" primaryHref="/docs/cli/install" secondaryCta="Back to BazelCon" secondaryHref="/bazelcon-2026" centered={false}>
  <img noZoom src="https://mintcdn.com/aspectbuild/4wAijf_e0qg5Bve0/images/marketing/illustrations/cli-axl-mcp-hero.svg?fit=max&auto=format&n=4wAijf_e0qg5Bve0&q=85&s=e55239550d7610ae13823eac6abb8b7a" alt="An agent runs Aspect CLI and AXL tasks, then reads structured build results back over MCP" width="720" height="480" data-path="images/marketing/illustrations/cli-axl-mcp-hero.svg" />
</Hero>

<div className="w-full flex justify-center px-4 pt-8">
  <p className="text-center text-sm text-zinc-500 dark:text-zinc-400">
    <strong className="text-zinc-900 dark:text-white">Written for</strong> Teams pointing coding agents at a Bazel monorepo.
  </p>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">What problem it solves</h2>
      <p className="mt-3 text-lg text-zinc-500 dark:text-zinc-300 leading-relaxed max-w-3xl">An agent faces the same problem a new hire does, minus the ability to ask anyone.</p>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        How do I run the tests? Lint this? Regenerate the BUILD files? Every repository answers differently, through a pile of scripts that are undiscoverable, undocumented and slightly different everywhere. A new engineer asks someone; an agent has nobody to ask, so it guesses, infers from CI config, or does nothing.
      </p>

      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed mt-4">
        Then the harder half. When the build fails, the agent needs to know <em>why</em>, and the only thing available is unstructured log text it has to guess at. So it retries blindly, burns compute on a wrong hypothesis, or escalates to a human, which erases the throughput gain that justified the agent.
      </p>
    </div>

    <div className="mt-8">
      <FeatureGrid3>
        <PlatformFeature title="Aspect CLI" description="One task runner on top of Bazel: test, format, lint, run, codegen, plus whatever your repository defines. A single help command lists all of it. Free, open source, no account." />

        <PlatformFeature title="AXL" description="The Aspect Extension Language. Your repository’s own tasks, written in Starlark, the language you already know from BUILD files, and run identically on every laptop and every CI provider." />

        <PlatformFeature title="MCP" description="Build results as tools an agent calls directly: invocations, configurations, logs, targets and cross-build target statistics. Drive the build, then read what actually happened, without writing glue between the two. The same data is available over a read-only REST API." />
      </FeatureGrid3>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12 bg-gray-50 dark:bg-zinc-900">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">Details that matter more to a machine than to a person</h2>
    </div>

    <div className="mt-8">
      <FeatureGrid2>
        <PlatformFeature title="Unknown parameters are rejected by name" description="A silently dropped filter produces a confidently wrong answer. That is worse than an error, because an agent will act on it." />

        <PlatformFeature title="Errors are structured" description="A client can branch on the failure rather than pattern-match prose." />

        <PlatformFeature title="Auth you already run" description="A bearer token from your own identity provider, verified against the issuer’s key set. It’s the same mechanism our CI runners use to reach remote execution." />

        <PlatformFeature title="Tasks are a config change" description="A new AXL task is Starlark checked into the repository, not a Go binary somebody has to compile and distribute." />
      </FeatureGrid2>
    </div>

    <div className="mt-14 max-w-3xl">
      <div className="mb-6">
        <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">Failures that are only yours</h2>
      </div>

      <div className="max-w-3xl mt-6">
        <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
          Lint fails only on violations the current change introduced. Pre-existing findings stay visible and don’t fail the task.
        </p>

        <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed mt-4">
          For a person that is a convenience. For an agent it is the difference between a usable signal and an unusable one: an agent evaluating its own work against a repository with years of accumulated lint debt can’t tell its mistakes from the inheritance. Scope the failures to the change and every failure it sees is its own, so the signal is actionable without a human triaging it first.
        </p>
      </div>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 py-8 md:py-12">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <div className="mb-6">
      <h2 className="text-3xl md:text-4xl font-semibold text-zinc-900 dark:text-white tracking-tight">Why we built it</h2>
      <p className="mt-3 text-lg text-zinc-500 dark:text-zinc-300 leading-relaxed max-w-3xl">Customers asked for the API and MCP by name.</p>
    </div>

    <div className="max-w-3xl mt-6">
      <p className="text-zinc-600 dark:text-zinc-300 leading-relaxed">
        The teams furthest along with agents hit this wall first, and they asked for machine-readable build truth before we offered it.
      </p>
    </div>

    <div className="mt-6 max-w-3xl">
      <ul className="space-y-3 text-zinc-600 dark:text-zinc-300 leading-relaxed" style={{ listStyle: "none", paddingLeft: 0 }}>
        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Not an AI product, and not an agent.</strong> We don’t generate code. We make the build and its results legible to whatever is generating it: yours, ours, or whatever you switch to next year.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Not lock-in.</strong> The CLI is free and open source and works on any Bazel repository, with or without the rest of our platform.</span>
        </li>

        <li className="flex gap-3">
          <span className="mt-2 shrink-0 rounded-sm bg-blue-600 dark:bg-blue-400" style={{ width: "6px", height: "6px" }} />

          <span><strong className="text-zinc-900 dark:text-white">Not a chat interface on top of your build.</strong> It is a command surface and an API.</span>
        </li>
      </ul>
    </div>
  </div>
</div>

<div className="w-full flex justify-center px-4 pt-12 pb-4">
  <div className="w-full" style={{ maxWidth: "1140px" }}>
    <FeatureGrid2>
      <a href="/bazelcon-2026/build-history-and-cost" className="flex flex-col p-5 rounded-xl border border-zinc-200 dark:border-zinc-700/60 hover:border-blue-300 dark:hover:border-blue-700 transition">
        <span className="text-xs font-semibold tracking-widest text-zinc-400 uppercase">← Previous</span>
        <span className="mt-1 font-semibold text-zinc-900 dark:text-white">Build Trends</span>
      </a>
    </FeatureGrid2>

    <div className="mt-6 text-center">
      <a href="/bazelcon-2026" className="inline-flex items-center text-blue-600 dark:text-blue-400 font-semibold hover:underline">
        All BazelCon materials →
      </a>
    </div>
  </div>
</div>

<CTA title="See it on your own builds" subtitle="Point a repository at a hosted instance and let a week of real builds accumulate." primaryCta="Start a trial" primaryHref="/trial" secondaryCta="Talk with us" secondaryHref="/contact" />
