Skip to content
KONIGI Patterns

AI Assistants / Understanding answers / Knowledge cutoff notice

‹ 2 of 5 ›

Knowledge cutoff notice

People need to know when an answer may rely on outdated information.

Updated September 12, 2026

Problem

An AI answer can describe outdated information as if it were current. People need to know when an answer has not been checked against recent sources.

Solution

Show a notice when a time-sensitive answer relies on the model’s training data. Include the model’s published knowledge cutoff where available, and explain that it does not guarantee complete knowledge before that date.

Distinguish an answer checked against current sources from one that was not. If search is available, offer a way to check the information and show the sources used.

Keep the notice attached to the relevant answer. A warning on every response is easy to overlook.

Use when

The assistant answers questions about changing information and may rely on training data.

Don’t use when

The answer is drawn from supplied material or retrieved sources, or the task is generation rather than recall. A cutoff notice on a rewritten paragraph is noise attached to an operation the cutoff doesn’t affect.

Trade-offs

Frequent notices become easy to ignore, while missing a notice can give false confidence. Detecting time-sensitive questions is imperfect. A cutoff date helps explain a limit but does not establish that an answer is accurate.

Checklist

  • Does the notice appear on time-sensitive answers rather than all of them?
  • Is a specific date given rather than a vague warning?
  • Does the date track the model actually used?
  • Can the viewer tell whether this answer was checked against live sources?
  • Is the absence of sources meaningful in this product?
  • Does the model picker show cutoffs alongside the names?
  • Is there a one-click path from the notice to a search-backed answer?
  • Does the notice survive copying or sharing the answer?
  • How does it read on the tenth occurrence in one session?
  • Is the notice suppressed when the answer came entirely from supplied material?

Compare

Claude publishes per-model training cutoffs in its documentation, which makes the property checkable rather than folkloric, and leaves surfacing it to the product built on top. ChatGPT mostly resolves the question by searching when a query looks current. A disclosure problem becomes a retrieval one, and the viewer is left to infer from the presence of sources. Perplexity sidesteps the pattern almost entirely by retrieving for nearly everything, so its equivalent risk is a stale source rather than a stale model. GitHub Copilot shows the same limit in its sharpest form, suggesting code against the library versions present in its training data, so a stale cutoff surfaces as a deprecated API call rather than as a wrong fact.

Citation chip and Source list show material used to check an answer. Mode switch can enable search. Refusal applies when the assistant lacks enough information to answer. Model picker can show each model’s cutoff.

Knowledge cutoff notice anatomy A time-sensitive answer carrying a dated notice rather than a permanent disclaimer, alongside the same question answered from live sources, showing that the presence or absence of a source list is what distinguishes the two. A date is information. May be outdated is not from training data to May 2026 no sources, so nothing was checked reuters.com sec.gov checked, and the list says so who runs it · what it costs · which version · is it still supported questions about current state, detectable before the answer is written 2 1 3 4 1 STATE THE DATE It is one of the few limits that can be given exactly rather than estimated. 2 PER MODEL, NOT PER PRODUCT Several models means several cutoffs, and the picker usually omits all of them. 3 CHECKED OR RECALLED These two answers look identical and differ completely in reliability. 4 TRIGGER ON THE QUESTION Current state, prices, roles, versions. All detectable before answering. Coverage thins out well before the stated date, which is the follow-up nobody can answer.
Wireframe — the pattern's anatomy, not any one product's version of it

Implementation

A date is information; a permanent “may be outdated” banner is not. The same question answered from training data and from live sources differ by whether a source list is present, and questions about current state are detectable before the answer is written.

shadcn
npx shadcn@latest add button
Tokens
--card--card-foreground--primary--muted--muted-foreground--border--status-warn

Vite 5 is still receiving security fixes but no new features. Vite 6 changed the default environment API, so moving the build means updating any plugin that readsconfig.serverdirectly. Your slow build is more likely the three unbundled icon packs than the Vite version.

from training data to May 2026

no sources, so nothing was checked

CutoffNotice.tsxWraps an answer. Shows the model's cutoff as a date when the question is time-sensitive and no sources were checked; a source list suppresses it.

import type { ReactNode } from "react";
import { Button } from "@/components/ui/button";
import { isTimeSensitive } from "./timeSensitive";

/** A cutoff belongs to a model. A product with three models has three of
 *  them, so the notice takes the model rather than a date from a config. */
export type Model = { name: string; cutoff: Date };

type Props = {
  /** The answer this notice is attached to. */
  children: ReactNode;
  /** What was asked. Time-sensitive questions get the notice; the rest do not. */
  question: string;
  model: Model;
  /** What the answer was checked against. A non-empty list suppresses the
   *  notice: the sources are the signal, and their absence is what this line
   *  has to say out loud. */
  sources?: string[];
  /** The one-click path from a recalled answer to a checked one. */
  onSearch: () => void;
};

const monthYear = (d: Date) => d.toLocaleDateString("en", { month: "long", year: "numeric", timeZone: "UTC" });

export function CutoffNotice({ children, question, model, sources = [], onSearch }: Props) {
  const show = sources.length === 0 && isTimeSensitive(question);

  return (
    <div className="text-sm leading-relaxed text-card-foreground">
      {children}

      {show && (
        <div className="mt-3" role="note">
          {/* A date rather than "may be outdated". It is one of the few limits
              that can be given exactly, and a date lets the viewer reason
              about whether it matters to their question. */}
          <span className="inline-block rounded-md bg-status-warn/15 px-2.5 py-1 text-[11px] text-status-warn">
            from training data to {monthYear(model.cutoff)}
          </span>
          <p className="mt-2 flex flex-wrap items-center gap-x-2 text-[11px] text-muted-foreground">
            no sources, so nothing was checked
            <Button variant="link" size="sm" className="h-auto p-0 text-[11px]" onClick={onSearch}>
              check against live sources
            </Button>
          </p>
        </div>
      )}
    </div>
  );
}

timeSensitive.tsThe trigger. Current state, prices, roles, versions and recent years, all spotted from the question before the answer exists.

/**
 * The trigger keys on the question, not the answer. Current state, prices,
 * people in roles, versions, availability, and anything naming a recent year
 * are time-sensitive by construction, and every one of them can be spotted
 * before a token is generated.
 */
const CUES: RegExp[] = [
  /\b(who|which)\b.*\b(runs?|leads?|owns?|heads?|ceo|founder|maintainer)\b/i,
  /\b(cost|costs|price|pricing|how much|per (month|seat|year))\b/i,
  /\b(latest|current|newest|version|release|supported|maintained|deprecated)\b/i,
  /\b(now|today|currently|still|yet|any ?more|these days)\b/i,
  /\b20[2-9]\d\b/,
];

export const isTimeSensitive = (question: string) => CUES.some((re) => re.test(question));

demo.tsxHow it is called: a question about whether a version is still supported, answered without sources.

import { CutoffNotice } from "./CutoffNotice";

/**
 * A question about current state, answered from training data. The question
 * trips the trigger, there is no source list, so the answer carries the date.
 * Search would rerun the question against live sources and hand back a
 * source list, at which point the notice goes away on its own.
 */
const QUESTION = "Does Vite 5 still get security fixes, or do we have to move the build to 6?";

export default function Demo() {
  return (
    <div className="rounded-lg border bg-card p-4">
      <CutoffNotice
        question={QUESTION}
        model={{ name: "model", cutoff: new Date("2026-05-01T00:00:00Z") }}
        onSearch={() => {}}
      >
        <p>
          Vite 5 is still receiving security fixes but no new features. Vite 6 changed the default
          environment API, so moving the build means updating any plugin that reads
          <code className="mx-1 rounded bg-muted px-1 text-xs">config.server</code>
          directly. Your slow build is more likely the three unbundled icon packs than the Vite version.
        </p>
      </CutoffNotice>
    </div>
  );
}
What it renders. Identical markup in both panes, with only the token values changing.

Examples

No screenshots yet for this pattern. Browse Products to see other examples.