Agent Experiences

The CLEAR Framework

CLEAR is a checklist for writing pages that survive being taken apart. Concise, Logical, Explicit, Accessible, Referenceable — five properties that decide whether a passage lifted out of your page still means what you meant. It is a heuristic, not a validated model, and its value is that it makes you do the individually-supported things consistently rather than remembering three of them on a good day.

The five properties

C

Concise

The answer arrives before the throat-clearing does

L

Logical

Structure that exists in the markup, not just on screen

E

Explicit

Nothing load-bearing left to inference

A

Accessible

Reachable, renderable, and readable without a browser

R

Referenceable

Citable at a stable address, by a named source

What this framework is, and what it is not

CLEAR is a structured heuristic, not a validated model. No published study isolates the citation lift attributable to adopting it. Nobody has run the experiment — you would need matched content sets, a controlled corpus, and access to a retrieval system that does not publish its internals. Anyone quoting you a percentage improvement from "implementing CLEAR" is inventing it.

The components have varying degrees of support. Retrievability and passage self-containment follow from how retrieval systems demonstrably work — they operate on chunks, and a chunk that depends on absent context is degraded evidence. Freshness has public measurement behind it: Ahrefs' 2026 analysis found AI-cited URLs skew roughly 25.7% fresher than the web at large (Ahrefs, 2026). Attribution and machine-readable structure are argued from mechanism rather than measured directly. "Keep sentences short" is a style preference with no evidence attached to it at all.

So why use it? Because the failure mode in practice is not ignorance, it is inconsistency. Most teams know they should date their claims and name their sources; they do it on the pages someone remembered to. A five-item checklist that fits in your head is a mechanism for doing the supported things every time. Treat CLEAR as scaffolding for judgment, not as a substitute for it.

C — Concise

What it means: the answer to the question a section promises arrives in that section's first sentence or two, and everything after it is elaboration a reader can stop reading. Concise is about information order, not word count. A three-thousand-word page can be concise; a two-hundred-word page that spends its first hundred words establishing that databases are important is not.

Why it matters mechanically: retrieval scores passages against a query. A passage whose opening sentences are generic context ("In today's fast-moving landscape…") is semantically similar to every other page's opening and distinctive of nothing. Worse, when a synthesis step has to pick the sentence that answers the question, front-loaded preamble means the answer sits deep in the passage, competing with sentences that are about the topic in general. Putting the claim first raises the density of the signal in the part of the text most likely to be quoted.

Done badly

Rate limits

In the modern API landscape, rate limiting has become an increasingly important consideration for developers building at scale. As traffic patterns grow more complex, understanding how a platform manages request volume is essential to designing a resilient integration. Our approach to rate limiting has been carefully designed with developer experience in mind, and we are constantly evolving it based on customer feedback. Currently, most plans allow a generous number of requests.

Done well

Rate limits

The API allows 1,000 requests per minute per API key on the Standard plan and 10,000 on Enterprise. Exceeding the limit returns HTTP 429 with a Retry-After header in seconds.

Limits are counted in a 60-second sliding window, per key rather than per account, and apply to every endpoint except /health. Requests rejected with 429 do not count toward the window.

The second version is not shorter by accident — it is shorter because it deleted the sentences that carried no information. Note also what it did not do: it did not drop the detail about sliding windows and excluded endpoints. Concise means the preamble goes, not the substance.

How to check it

  • Read only the first sentence under each heading. If that sequence does not answer the questions the headings ask, your answers are buried.
  • Delete the first paragraph of any section and see whether anything was lost. If not, it was preamble.
  • Search the page for "In today's", "It is important to note", "When it comes to", "landscape", "leverage", and "seamless". Each hit is a sentence that probably says nothing.
  • Ask whether every adjective is doing work. "Generous" limits, "robust" security and "blazing-fast" performance are unfalsifiable and therefore unquotable.

L — Logical

What it means: the page has a hierarchy, the hierarchy is expressed in the markup, and the markup's hierarchy matches the meaning. One h1. h2 for real top-level sections. h3 nested under the h2 it belongs to, never skipping a level to get a smaller font. Lists that are lists. Tables that are tables.

Why it matters mechanically: before a page is embedded or scored, it is converted to text and split into chunks. Heading boundaries are the most common split points, and the heading trail is frequently prepended to each chunk so the passage carries its own context. That means your headings do double duty: they decide where the cuts happen, and they are part of what gets compared to a query. A page built from styled divs has no boundaries to cut on, so the chunker falls back to arbitrary length splits and your carefully separated sections get merged and severed in the wrong places.

Done badly

<div class="section-title">Authentication</div>
<div class="body">Use a bearer token.</div>
<h4 class="big-heading">Rotating keys</h4>
<p>Generate a new key, then...</p>
<div class="grid">
  <div>Standard</div><div>1,000/min</div>
  <div>Enterprise</div><div>10,000/min</div>
</div>

The title is a div chosen for its class; the h4 was chosen for its size, not its depth; the table is a CSS grid. Converted to text this becomes an undifferentiated run of lines, and "Standard 1,000/min" loses its column meaning entirely.

Done well

<h2>Authentication</h2>
<p>Use a bearer token.</p>
<h3>Rotating keys</h3>
<p>Generate a new key, then...</p>
<table>
  <caption>Rate limits by plan</caption>
  <thead>
    <tr><th>Plan</th><th>Requests per minute</th></tr>
  </thead>
  <tbody>
    <tr><td>Standard</td><td>1,000</td></tr>
    <tr><td>Enterprise</td><td>10,000</td></tr>
  </tbody>
</table>

Identical rendering is achievable with CSS. The difference is that this version still means something after the CSS is thrown away — which is exactly what happens.

Logical also covers ordering. Group what belongs together; do not scatter three parts of one procedure across a page because the layout looked better that way. Within a section, move from the general statement to the specific case, and keep any sequence in sequence — a prerequisite listed after the step that needs it is a defect regardless of who is reading.

How to check it

  • Extract the heading outline and read it on its own. It should read as a coherent table of contents. If a heading is meaningless out of context, rewrite it.
  • Verify exactly one h1, and that no level is skipped going down.
  • Fetch the page with curl and pipe it through a markdown converter. What you get back is roughly what a fetcher gets. Check that the structure is still there.
  • Look for headings chosen for typography. If someone used h4 because h3 was too big, the fix is CSS, not markup.

E — Explicit

What it means: nothing load-bearing is left to inference. Pronouns resolve within the sentence or the one before it. Numbers carry units, currencies and dates. Terms are defined where they are first used. Comparisons name what they compare against. A section does not depend on a paragraph three screens up.

Why it matters mechanically: this is the property that most directly serves passage-level retrieval. Your page is not retrieved as a page; a chunk of it is retrieved on its own, without its neighbours. Every implicit dependency in that chunk — "as described above", "this approach", "it is 40% faster" — becomes either an unresolvable reference or, worse, a resolvable-but-wrong one when a synthesis step guesses at the antecedent. Explicit writing is what makes a passage true in isolation.

Done badly

As mentioned above, this approach is significantly faster and much cheaper than the alternative. It typically completes in well under a second, and most customers see costs drop noticeably after switching. The new version improves this further.
  • "This approach" — which one?
  • "The alternative" — to what, measured how?
  • "Well under a second" on what workload and what hardware?
  • "Costs drop noticeably" — from what to what?
  • "The new version" — which release, dated when?

Done well

Batch ingestion completes a 1 million row load in under one second on the reference hardware described in the benchmark linked below, compared with a row-by-row insert of the same dataset. Because batch ingestion is billed per operation rather than per row, the same load costs one API call instead of one million. Batch ingestion has been the default since release 4.2 (June 2026).

Every noun is named, every number has a unit and a condition, and the paragraph is true if you read it with nothing around it.

A caution that belongs here rather than in the pitfalls section, because it is the most common way Explicit goes wrong: being explicit means naming the subject when the reference would otherwise be ambiguous. It does not mean repeating your product name in every sentence. Prose that reads "Example API rate limits let Example API users limit Example API requests" is not explicit; it is keyword stuffing wearing a framework as a disguise, and it degrades the text for every reader including the machine ones.

How to check it

  • Copy any single section into a blank document and read it cold. Anything you cannot resolve is an implicit dependency.
  • Grep for "above", "below", "the former", "as discussed", "this" at the start of a sentence, and "it" where the antecedent is more than one clause away.
  • Find every number and ask: unit, period, condition, source. Missing any of the four is a defect.
  • Find every comparative — faster, cheaper, better — and check that the thing being compared against is named.

A — Accessible

What it means: the content can actually be obtained and read by a non-browser client. That is three separate things: it is reachable (not blocked, not behind an interstitial, not gated), it is present in the served HTML (not assembled by client-side JavaScript), and its meaning survives being reduced to text (alt text on informative images, real text instead of text-in-images, transcripts for media, table semantics rather than visual columns).

Why it matters mechanically: most content fetchers do not execute JavaScript. If your article body arrives via a client-side fetch, the retrieved document is your shell — navigation, footer, a loading state — and that is what gets embedded. This is a binary failure, not a degradation: it does not matter how concise and explicit the prose is if the prose is not in the response.

It is worth being clear that Accessible in CLEAR overlaps heavily with accessibility in the human sense, and the overlap is not a coincidence. Alt text, semantic landmarks, real headings, captions and transcripts exist because a screen reader also consumes a linearized text stream with no visual layout. The work you do for assistive technology is largely the same work, which makes this the letter with the best independent justification.

Done badly

  • Pricing rendered from a JSON payload fetched after page load
  • The comparison table published as a PNG with no text equivalent
  • Key steps only visible after clicking an accordion that mounts its content on open
  • Status conveyed by a green or red dot with no text label
  • An email gate in front of the technical documentation
  • Alt text reading alt="chart"

Done well

  • Prices server-rendered into the HTML, with the same values in Offer markup
  • Comparison published as a real <table>; the image, if any, is decorative
  • Accordions rendered in the DOM and hidden with CSS, so the text is in the source
  • Status as the word "Deprecated", with colour as reinforcement rather than the message
  • Documentation ungated; the gate, if you need one, sits in front of the download
  • Alt text stating what the chart shows and what it concludes

How to check it

# Is the content in the response, before any JS runs?
curl -sL https://example.com/docs/rate-limits | grep -c "1,000 requests per minute"

# Roughly what a fetcher sees after conversion to text
curl -sL https://example.com/docs/rate-limits \
  | python3 -c "import sys,html,re; t=sys.stdin.read(); \
t=re.sub(r'(?s)<(script|style).*?</\1>','',t); \
print(html.unescape(re.sub(r'<[^>]+>',' ',t)))" | tr -s ' \n'
  • If the grep count is zero while your browser shows the text, the content is client-rendered and invisible to most fetchers.
  • Read the stripped output. Anything you cannot understand from it, a text-based consumer cannot either.
  • Check robots.txt and any CDN bot rules for accidental blocks of agents you meant to allow — see controlling AI access.
  • Confirm structured data is in the server response too, not injected by a tag manager.

R — Referenceable

What it means: if something wants to cite you, everything it needs is present and stable. A canonical URL that does not change. Anchor targets on headings so a specific claim can be linked, not just the page. A named author. Honest published, modified and — where relevant — reviewed dates. Sources named in the prose, not hidden inside anchor tags. An organization that resolves to a known entity.

Why it matters mechanically: a generative answer that cites you has to produce a URL, and often an attribution. If the passage it used carries no provenance, the system either drops the citation or asserts the claim unattributed — neither of which does you any good. And a URL that has moved twice since it was indexed is a citation that lands on a redirect chain or a 404, which is a reputational cost paid by both parties.

Done badly

Recent research shows that structured content performs better. Posted by the Content Team.

URL: /blog/2024/03/post-1174?utm_source=newsletter — relaunched last year as /resources/insights/structured-content-v2

The source lives only in the anchor, so extraction loses it. No named author, no date, no anchor to the specific claim, and the address has already moved once.

Done well

Ahrefs' 2026 analysis of AI search overlap found that AI-cited URLs skew roughly 25.7% fresher than the web at large (ahrefs.com).

By [Full Name], [Role]. Published 15 January 2026; reviewed 11 August 2026. URL: /docs/rate-limits#sliding-window — unchanged since publication.

Publisher, year and magnitude are inside the sentence, so the attribution survives conversion to plain text. The claim has its own anchor.

How to check it

  • Strip every tag from a paragraph. If the attribution disappeared with the tags, it was never in the text.
  • Confirm every h2 and h3 has a stable id derived from its text, and that the ids do not change when you re-render.
  • Check the canonical URL is self-referential and that old paths still 301 rather than 404.
  • Confirm the visible dateline and the JSON-LD dates come from the same source field, so they cannot disagree. See trust and authority signals.

End to end: one page, five passes

The letters are easier to apply in sequence than all at once. Below is a real-shaped documentation page — how to rotate an API key — taken through one pass per letter. Nothing is invented at the last step that could have been fixed at the first; each pass does one job.

The starting page

<div class="hero-title">Key Management Made Simple</div>
<div class="lede">
  Security is more important than ever in today's threat landscape.
  That's why we've built a powerful and flexible key management
  experience designed to keep your integration safe. Rotating your
  credentials regularly is widely considered a best practice.
</div>

<div class="h-large">Getting started</div>
<div class="body">
  It's easy. Head to the dashboard and you'll find everything you need
  under settings. From there you can create a new one and swap it in.
  Make sure to do this before the old one expires or you may experience
  disruption. Most customers find the process takes just a few minutes.
</div>

<img src="/img/rotation-steps.png">

<div class="h-large">Notes</div>
<div class="body">
  As mentioned above, timing matters. The overlap period is generous.
  See the docs for more details.
</div>

It renders fine. It is also unusable as a source: no heading structure, no procedure, the actual steps are inside a PNG, and the one specific fact on the page ("the overlap period") is never given a value.

Pass 1 — Concise: delete the preamble, lead with the answer

The lede says nothing that is not true of every API on earth. The body buries the procedure under reassurance. Cut both to the claim a reader came for, and title the page after the task rather than after a slogan.

Rotating an API key

Create a new key in the dashboard, deploy it, then revoke the old one.
Both keys work during the overlap period, so rotation causes no downtime.

Roughly 90 words became 30, and the page now answers its own title in the first two sentences. What remains is thin — the next passes add substance back, but substance rather than filler.

Pass 2 — Logical: give it real structure

A rotation procedure has a natural shape: what you need first, the ordered steps, what to do when it goes wrong. Express that shape in headings and an ordered list, so the chunker cuts on meaningful boundaries and each chunk inherits a heading trail that names its subject.

<h1>Rotating an API key</h1>
<p>Create a new key in the dashboard, deploy it, then revoke the old one.
   Both keys work during the overlap period, so rotation causes no downtime.</p>

<h2 id="before-you-start">Before you start</h2>
<ul>...</ul>

<h2 id="steps">Rotation steps</h2>
<ol>
  <li>...</li>
</ol>

<h2 id="verifying">Verifying the rotation</h2>
<h2 id="rollback">If something breaks</h2>
<h2 id="faq">Common questions</h2>

Read the outline alone: prerequisites, steps, verification, rollback, questions. That is a coherent table of contents, and every heading names something a person might actually search for.

Pass 3 — Explicit: put the values in

This is where the page stops being generic. Every vague noun gets named, every duration gets a number, and every step becomes an instruction rather than a gesture at one.

<h2 id="before-you-start">Before you start</h2>
<ul>
  <li>You need the <strong>Admin</strong> role. Members cannot create or
      revoke keys.</li>
  <li>Know every service using the current key. List them with
      <code>GET /v1/keys/{id}/usage</code>, which returns the client IDs
      seen in the last 30 days.</li>
</ul>

<h2 id="steps">Rotation steps</h2>
<ol>
  <li>In Dashboard &rarr; Settings &rarr; API keys, choose
      <strong>Create key</strong>. The new key is shown once; it cannot
      be retrieved later.</li>
  <li>Deploy the new key to every service found above. Both the old and
      new key authenticate successfully during the overlap period.</li>
  <li>Confirm zero requests on the old key for 24 hours using the usage
      endpoint, then choose <strong>Revoke</strong> on the old key.</li>
</ol>
<p>The overlap period is <strong>7 days</strong> from the moment the new
   key is created. After 7 days the old key stops authenticating whether
   or not you have revoked it, and requests using it return
   <code>401 key_expired</code>.</p>

"The overlap period is generous" became "7 days, and here is exactly what happens on day 8." That single sentence is now something that can be retrieved, quoted, and relied on — and it is the sentence a user in trouble is actually searching for.

Pass 4 — Accessible: get it out of the image and into the response

The original put the steps in rotation-steps.png. Pass 3 already moved them into text; this pass makes the rest of the page survive a non-rendering client, and adds the machine-readable restatement of what the page visibly says.

<!-- The diagram now illustrates the text instead of carrying it -->
<img src="/img/rotation-timeline.png"
     alt="Timeline: new key created on day 0, both keys valid through
          day 7, old key stops authenticating on day 8.">

<!-- Server-rendered, not fetched client-side -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "HowTo",
  "name": "Rotating an API key",
  "totalTime": "PT10M",
  "step": [
    { "@type": "HowToStep", "name": "Create a new key",
      "text": "In Dashboard > Settings > API keys, choose Create key.",
      "url": "https://example.com/docs/key-rotation#steps" },
    { "@type": "HowToStep", "name": "Deploy the new key",
      "text": "Deploy the new key to every service using the old one." },
    { "@type": "HowToStep", "name": "Revoke the old key",
      "text": "After 24 hours with zero requests on the old key, revoke it." }
  ]
}
</script>

Also in this pass: the FAQ accordion renders its answers into the DOM and hides them with CSS rather than mounting on click, and the page is confirmed present in curl output. See schema markup for the wider markup pattern.

Pass 5 — Referenceable: make it citable

The page is now correct and extractable. The last pass makes it attributable and stable, so a citation of it lands somewhere real in two years.

<link rel="canonical" href="https://example.com/docs/key-rotation">

<p class="byline">
  Written by <a href="/authors/[author-slug]" rel="author">[Full Name]</a>,
  [Role].
  Published <time datetime="2026-01-15">15 January 2026</time>.
  Last substantive update <time datetime="2026-06-02">2 June 2026</time>
  (overlap period changed from 3 to 7 days in release 4.2).
  Reviewed <time datetime="2026-08-11">11 August 2026</time>.
</p>
  • Stable ids on every heading, so the overlap-period rule can be linked as /docs/key-rotation#steps rather than as a whole page.
  • The URL is task-named and versionless, so it does not need to move when the product does.
  • The modified date says what changed, which is far more useful than the date alone.
  • Any external claim on the page names its source in the sentence.

What actually changed

The finished page is longer than the original, which is worth noticing. CLEAR is not a compression algorithm. It removed roughly 120 words of reassurance and added several hundred words of specifics — role requirements, an endpoint, an exact overlap period, a failure mode, an error code, a rollback path.

The test to apply is not length. It is this: take any single section of the finished page, paste it into an empty document, and ask whether it is still true and still useful. On the original, no section passes that test. On the rewrite, every one does.

Common pitfalls

Each letter has a characteristic way of being over-applied. These are the failures that come from taking the framework seriously and running past the point where it helps.

Over-fragmenting in the name of Concise

The classic overcorrection: a 2,000-word guide split into eight 250-word pages, each too thin to answer anything on its own, each competing with the others for the same query, and the reasoning that connected them lost in the navigation. Depth is an asset — you are retrieved against sub-questions you never explicitly targeted, and a thorough page has more surface to match. Split a page when it genuinely covers two different tasks, not to hit a word count. The unit that should be self-contained is the section, and a section can be self-contained inside a long page.

Mistaking visual hierarchy for structural hierarchy

The page looks perfectly organized: big bold section titles, indented sub-points, a neat comparison grid. In the markup, the titles are divs with a font-size class, the indentation is padding, and the grid is CSS. None of that hierarchy exists once the styles are gone, and the styles are always gone. The reliable test is to view the page with CSS disabled or as converted text — whatever structure you can still perceive is the structure you actually have. A related version: choosing heading levels by how big they look, which produces outlines that skip from h2 to h4 and back.

"Explicit" degrading into keyword stuffing

Explicit means the reference is unambiguous, not that the product name appears in every sentence. The failure reads like this: "Example API rate limits are enforced by Example API. Example API rate limits apply to all Example API endpoints." This is worse than the pronoun it replaced. It is unpleasant to read, it flattens the sentence variety that carries meaning, and it is a pattern anti-spam systems have been detecting since the 1990s. Name the subject the first time in a section and whenever the antecedent would genuinely be unclear. Otherwise write normal prose.

Treating Accessible as a schema checkbox

A team ships JSON-LD on every template, marks Accessible complete, and never checks whether the content itself is in the response. Structured data is a restatement of the page; it is not a substitute for the page being fetchable and readable. If the article body is client-rendered, the markup is describing content the consumer cannot see — which is the worst of both worlds, since you now have assertions with nothing to corroborate them. Order the work correctly: reachable, then present in the HTML, then meaningful as text, and only then marked up.

Referenceable undermined by unstable URLs

You can do everything else right and lose it in a replatform. Every citation you have earned points at an address; change the addresses and you have discarded the accumulated value. The usual culprits are dates and versions baked into paths (/blog/2024/03/…, /docs/v3/…), CMS ids that change on migration, and site redesigns that move sections wholesale. Auto-generated heading ids that change when a heading is reworded break deep links in the same way, more quietly. Choose paths named after the durable thing, keep permanent 301s when you must move, and treat a URL you have published as a commitment.

Applying the checklist to content that should not exist

The framework improves how a page communicates what it knows. It cannot supply knowledge. A page with nothing first-hand to say, run through all five passes, becomes a well-structured page with nothing to say — and structure makes that more obvious, not less. If the honest output of the Explicit pass is that you have no numbers, no method and no source, the problem is upstream of the writing.

CLEAR checklist

  • Concise — every section answers its own heading in the first two sentences; no section opens with context-setting that could precede any page
  • Concise — no unfalsifiable adjectives standing in for facts
  • Logical — one h1, no skipped levels, and the heading outline reads as a table of contents on its own
  • Logical — lists are ul/ol, tabular data is a table, and nothing structural is a styled div
  • Explicit — every section is true when read in isolation; no unresolved "this", "above", or "the alternative"
  • Explicit — every number has a unit, a period, a condition and a source
  • Accessible — the content is in the raw HTML response and survives conversion to plain text
  • Accessible — informative images have descriptive alt text; nothing meaningful is conveyed by colour or position alone
  • Referenceable — sources named in the prose, stable heading ids, self-referential canonical, named author, honest dates
  • Referenceable — old URLs 301 rather than 404, and heading ids do not churn

Next steps: score a single page against the AXO scoring rubric, run a site-wide pass with the audit checklist, or read agent interaction patterns for the pipeline mechanics that most of these rules follow from.

Stay Updated

Analysis of AI search, crawler policy and agent standards — sent when there is something worth reading, roughly twice a month. Unsubscribe anytime.

We store your email address only to send you this newsletter. See our privacy policy.