Expanding on what we missed with sycophancy
The most complete prompt-adjacent launch postmortem in public: which gates existed, which signals fired, and why the human signal was overridden.
How organisations actually change the system prompt of a production LLM feature: where the prompt lives, who may edit it, what gates the change, and how it gets rolled back. Reconstructed from the published incidents, prompt-repo diffs, design documents and engineering accounts of OpenAI, xAI, GitLab, Uber, Discord, GitHub, DoorDash and a dozen others, so an architect can put a change pipeline around the one production artefact that usually has none.
A short piece of natural-language configuration steers what a production system says to customers. Changing it has the blast radius of a deploy and, at most organisations, the ceremony of a wiki edit.
State the problem without naming the technology: part of your system's behaviour is defined by a document rather than by code. The document is edited by hand, interpreted by a statistical component, and its effects are global the moment it is saved. The question this guide answers is what change management for that document looks like when it is done seriously, and what happens in public when it is not.
Every LLM-backed product has three levers that change behaviour: the model (a new snapshot or provider), the context machinery (retrieval, tools, memory), and the prompt. The first two inherit change control from somewhere: model swaps go through procurement and capacity planning, code goes through pull requests and CI. The prompt inherits nothing. It is too much like copy to feel like code and too much like code to be treated as copy. The published record of 2024 to 2026 is, in large part, a record of organisations discovering where on that line the prompt actually sits, one incident at a time.
The surprise in this corpus, and the finding to carry into a design review: the industry is running the same experiment in both directions at once. xAI, after three prompt incidents in twelve months, re-coupled prompt changes to the controls code already had: mandatory review, a public repository, round-the-clock monitoring (xAI statement, May 2025). GitLab's design document runs the opposite way: it moves prompts out of the application codebase precisely to decouple them from the release train (Prompts Migration). Both are rational, and the tension resolves once you notice that the deploy path was never the real control. The eval gate is. OpenAI's sycophancy rollback is the proof: the April 2025 update went through offline evals and A/B tests and shipped anyway, because no gate measured the property that regressed (OpenAI, May 2025).
Scope. This guide covers the change lifecycle of prompts and prompt-shaped configuration in production systems: authoring, storage, review, evaluation gates, staged rollout, runtime protection and rollback. It deliberately does not cover prompt-injection attacks and jailbreak defence, retrieval quality in RAG systems, agent orchestration above the model, or detecting regressions caused by infrastructure changes under an unchanged prompt; that last problem has its own guide in this collection (When the model quietly gets worse, 2026-09-08).
Across the teams that have published their prompt pipelines, the same six stations recur. What varies is where the prompt lives and how hard the gate is.
The pipeline above is a reconstruction, not any single company's diagram, and the stations earn their place from different sources. Uber's prompt engineering toolkit is the most complete first-party description of the store: revisioned templates in a central registry, a development stage and a production stage, and the rule that "users only productionize the prompt template that passed the evaluation threshold on an evaluation dataset" (Uber, 2024). GitHub describes the gate at its heaviest: more than 4,000 offline tests in CI, followed by "live internal evaluations, similar to canary testing", switching a set of employees to the candidate before customers see it (GitHub, Jan 2025). Discord describes the middle honestly: after many prompt adjustments "it's often difficult to tell if changes are actually improving results", which is why they pair every task prompt with a critic prompt evaluated by a stronger model, then move to a limited A/B release (Discord, 2024).
Downstream of the deploy, DoorDash's Dasher support chatbot shows the runtime pair that protects a prompt in flight: an inline guardrail that validates each response before it is sent, and a separate LLM judge that monitors quality after the fact. DoorDash reports a 90% reduction in hallucinations and a 99% reduction in compliance issues from that pair (DoorDash, 2024). LinkedIn's account adds the measurable tail: roughly 10% of responses carried structurally invalid YAML until a defensive parser plus prompt hints cut the error rate to about 0.01% (LinkedIn, Apr 2024). Format and schema failures are the prompt-adjacent regressions you can actually assert on, and the teams that publish numbers all assert on them.
Two honesty notes on the reconstruction. First, the full six-station pipeline is corroborated only piecewise: no single published account walks one prompt change through every station, so the composite is this guide's, assembled from stations that each have at least two independent sources. Second, the review station is the least evidenced and the most load-bearing. Uber's and GitLab's write-ups describe versioning and evaluation in detail and say almost nothing about who approves a prompt diff; the only organisation explicit about mandatory human review of prompt changes is xAI, and it became explicit the week after that review was circumvented. Neither account says so, but a registry whose UI lets an operator promote a revision single-handedly has reproduced exactly the write path that failed at xAI, with better version history.
In the codebase (aider, most small teams), in a registry (Uber), or in a gateway service (GitLab moves prompts from Rails into YAML files in its AI Gateway). The location varies; the requirement is identical everywhere: every production request must be traceable to an immutable prompt version.
Sources: GitLab design doc, Uber, aider
Machine-checkable properties (schema validity, edit-format compliance, required phrases) gate cheaply and deterministically. Judgement properties (tone, helpfulness) need an LLM judge, and the judge itself drifts: graders change their criteria as they read outputs, so the judge needs periodic human recalibration.
Sources: LinkedIn, Shankar et al., UIST 2024
The prompt's speed is symmetric. OpenAI's first mitigation for sycophancy was a system prompt update pushed on a Sunday night, hours before the model rollback that took about a day. X's first mitigation in July 2025 was taking the bot offline and deleting one line. Design the lever on purpose rather than discovering it during an incident.
Sources: OpenAI, grok-prompts diff
Four forks in the road, each with the condition that flips the answer. The sources genuinely disagree on the first one, which is what makes it interesting.
Two questions organise everything in this section: who holds the pen, and what stands between the pen and production. The corpus splits cleanly on the first question and converges on the second. On the pen: aider and the pre-2025 xAI kept it with engineers editing files; Uber and GitLab built registries partly so that the pen could move to product and operations people without dragging the deploy pipeline along. On the gate, every team that has written anything down after 2024 lands in the same place: a fixed evaluation set, a threshold, and staged exposure, with the arguments only about how hard the threshold is and who may override it.
It is worth being precise about what the xAI-versus-GitLab disagreement is not. It is not a disagreement about rigour; both directions add control. xAI's problem was an ungoverned write path, so it borrowed code's write controls. GitLab's problem was a governed write path with the wrong cadence, a monthly monolith release that self-managed customers install late, so it moved the artefact to a faster path while keeping review. An architect deciding between them is really answering one question: is your bottleneck the absence of control, or control built for a slower artefact? The failure catalogue below is what happens when the first answer is pretended to be the second.
| Decision | Chosen | Rejected | Because | Evidence |
|---|---|---|---|---|
| Prompt location | Gateway YAML, outside the monolith | Prompts in Rails codebase | Decouple prompt and model changes from monolith releases; self-managed fleets lag by months | GitLab design doc |
| Change control | Mandatory review, published repo, 24/7 monitoring | Direct edit access for employees | Two incidents in which the review process was absent or circumvented | xAI, May 2025 |
| Launch gate | Qualitative flags are launch-blocking | A/B wins over expert unease | "Unfortunately, this was the wrong call" | OpenAI, May 2025 |
| Prompt-change validation | Benchmark every prompting change | Eyeballing outputs | Changelog records the score with each prompt change, e.g. "Benchmarked at 63.2% ... no regression" | aider history |
| Prompt shape | Task-oriented prompts | One mega-prompt | Accuracy declined as instructions accumulated past ~1,500 tokens | GoDaddy, 2024 |
| Compatibility | Prompt payloads carry model metadata | Bare prompt strings in the protocol | Old clients must degrade gracefully when a prompt format is no longer supported | GitLab AI gateway blueprint |
One decision is conspicuously missing from the public record: whether to publish the reasons for prompt changes. xAI's transparency repo has fourteen commits and every message reads "Updated grok prompts"; the community issue asking whether the repo is even complete has no answer. Anthropic publishes the prompts themselves with each release, and no rationale beside the diff. Code solved this problem twenty years ago with commit messages and decision records, and no operator has yet carried that practice to the prompt, which means every reader of a published prompt diff, regulator and competitor and customer alike, is left to infer intent from wording. Nobody has published an account of doing this well; treat that gap as an opportunity rather than a convention.
Seven published incidents, three failure classes. Class one is a missing write gate. Class two is a green gate that measured the wrong thing. Class three is the output being read as a contract.
Grouping the seven incidents by company would hide the pattern; grouping them by failure class exposes it. Three classes cover everything published so far. In the first, the change path itself is the defect: someone or something could write to the production prompt without an effective gate. In the second, a gate existed and passed, because it measured properties other than the one that regressed. In the third, the failure is not in the change process at all but in what the world does with the output: a court, a customer, or a social platform treats the model's sentence as the company's sentence. The classes escalate. Fixing class one buys you class two, and fixing class two still leaves class three, because no eval suite makes a fabricated policy statement non-binding.
The xAI sequence rewards a close read because it is the only public case of one operator iterating on prompt governance under fire, three times, with the artefacts visible. The February incident produced a revert and nothing else. The May incident produced the structural fix: prompts in Git, mandatory review, monitoring. The July incident then went straight through that machinery, because the "politically incorrect" line was not an unauthorised change; it was an approved one whose behaviour in composition nobody had evaluated. The May fix addressed the write path, and the July failure walked in through the gate. That progression, revert without reform, then reform bypassed, then reform passed by an unevaluated line, is Figure 5, and it is the cheapest education available in why review and evaluation are different controls.
Class two is also where the research literature earns its seat at the incident table. The sycophancy launch is a management story on the surface, an eval-coverage story underneath: the gate was green because nothing in it measured the property that failed. Sclar et al. supply the mechanism that makes such blind spots structural rather than careless. If meaning-preserving formatting alone can move a task score by double digits, then an eval suite is always a sample of a much larger behaviour space, and the honest claim for any green gate is "no regression on what we measured, as phrased". Teams that internalise this stop asking whether a prompt change is safe and start asking which properties they have purchased evidence about.
What the record does not contain matters as much. No public postmortem in this corpus describes a prompt registry rollback failing, a versioned prompt store losing an audit trail, or a staged prompt rollout leaking a bad variant to the full fleet. Either the tooling works, or its failures are not being written up. Both readings argue for treating vendor claims about prompt-management platforms as unverified by incident evidence, which is the standard the rest of infrastructure is held to.
Everything quantitative in the corpus, with context and date. Measured unless marked otherwise.
Four states apply to these figures, and the table mixes them, so read the labels. GitHub's 4,000 tests, LinkedIn's error rates, the incident windows and the tribunal's $650.88 are measured or adjudicated. DoorDash's reductions are claimed, first-party, without published methodology. The cache arithmetic in the callout below is derived, and the arithmetic is shown. And the most important quantity in the whole topic is unknown: no organisation has published its prompt change frequency, so nobody outside the platform teams knows whether the artefact with the least ceremony is changed weekly or hourly. The closest public proxy is xAI's repo cadence, nine commits in the ten days around the July incident and roughly monthly otherwise, and a repo the operator curates is a lower bound at best.
| Metric | Value | At | Context | As of | Source |
|---|---|---|---|---|---|
| Offline tests gating production changes | 4,000+ | GitHub Copilot | Run in automated CI; followed by employee canary | 2025-01 | GitHub |
| Accuracy spread from formatting alone | up to 76 pts | LLaMA-2-13B | Meaning-preserving format variants, few-shot tasks | 2024 | Sclar et al. |
| Sycophancy exposure window | ~4 days | OpenAI | Apr 25 ship to Apr 29 rollback complete (free users) | 2025-04 | OpenAI |
| Grok "politically incorrect" line lifetime | ~4 days | xAI | Added Jul 4, deleted Jul 8, in the public repo | 2025-07 | grok-prompts |
| Invalid structured output, before and after | ~10% → ~0.01% | Defensive YAML parsing plus prompt hints | 2024-04 | ||
| Hallucination / compliance reduction from guardrail + judge | 90% / 99% | DoorDash | Vendor-of-self claim in first-party blog; no independent measurement published | 2024 | DoorDash |
| Mega-prompt size at which accuracy declined | >1,500 tokens | GoDaddy | Single prompt accumulating instructions across use cases | 2024-02 | GoDaddy |
| Consumer system prompt size | 16,739 words / ~23k tokens | Claude (claude.ai) | Over 11% of the context window before the user types | 2025-05 | O'Reilly Radar |
| Cache write / read multipliers | 1.25× / 0.1× | Anthropic API | 5-minute cache; any change to the prefix, one character included, invalidates | 2026 | Anthropic docs |
| Cached input discount, automatic | 50% | OpenAI API | Prefix-matched from 1,024 tokens, 128-token increments | 2024-10 | OpenAI |
| Damages for chatbot misstatement | $650.88 | Air Canada | Negligent misrepresentation, 2024 BCCRT 149 | 2024-02 | ABA |
| Public prompt repo activity | 14 commits, 0 community PRs merged | xAI grok-prompts | Every commit message reads "Updated grok prompts" | 2026-09 | grok-prompts |
DoorDash's 90%/99% figures are a first-party claim with no published methodology; treat them as directional. The Claude prompt measurements are of a leaked artefact plus the published subset, measured by a third party. The cache multipliers are pricing facts, not benchmarks, and they date-stamp themselves: re-check both vendors' pages before using them in a cost model. Derived figure worth carrying: at Claude's published rates a stable 23k-token system prompt costs about a tenth of its nominal token price per request, which means a weekly prompt edit cadence can move real money at high request volume purely through cache resets; the arithmetic is (write at 1.25x + cold reads at 1x) versus warm reads at 0.1x while the prefix is stable.
Every source behind this page, graded. The full ledger with quotes ships alongside as sources.md. One access note: this research session could fetch code hosts directly; other pages were read through search-engine retrieval, and the ledger marks which quotes are verbatim and which are the retrieval tool's close paraphrase.
The most complete prompt-adjacent launch postmortem in public: which gates existed, which signals fired, and why the human signal was overridden.
The incident notice: rollback timeline, and the system prompt named as the first mitigation lever.
Timestamped incident account: review circumvented, and the fix list is code's controls applied to prompts.
The adjudicated record: the operator is responsible for all information on its website, chatbot included.
Fourteen commits, every message "Updated grok prompts", author "CI agent". The July 8 fix is a one-line deletion. Issue #38 asks whether the repo is complete; no answer. PR #53 sat 3.5 months and closed unmerged.
The benchmark exists "to quantitatively evaluate performance whenever prompting or the backend ... changes"; the changelog records scores per prompt change, e.g. "Benchmarked at 63.2% for gpt-4/diff, no regression".
The recorded decision to move prompts from the Rails monolith to YAML in the AI Gateway, "decoupling prompt and model changes from monolith releases".
Prompt payloads carry the model they were built for, so the gateway can degrade gracefully when old clients send prompts it no longer supports.
The behaviour contract the evals are supposed to encode, maintained as a public document with archived releases, dedicated to the public domain.
Babuschkin: the employee "pushed the change without asking"; users discovered the line through the model's own reasoning display.
A vendor-side update changed the bot's behaviour; the operator's lever was to disable the AI element entirely.
A front-line AI response was read as an announcement; the fix was labelling AI responses as AI.
The most complete first-party prompt platform description: revisioned templates, development and production stages, eval threshold as the promotion gate.
4,000+ offline tests in CI before any production change, then internal canaries on employees.
Task prompt plus critic prompt, because after many adjustments "it's often difficult to tell if changes are actually improving results"; then a limited A/B.
Inline guardrail validates each response; a separate judge monitors quality; claimed 90% hallucination and 99% compliance-issue reductions.
Structured-output failure quantified: ~10% invalid YAML down to ~0.01% via defensive parsing plus prompt hints about common mistakes.
The mega-prompt passed 1,500 tokens, costs grew, and "accuracy of our prompts also declined as we incorporated new instructions and contexts".
The earliest honest account of prompt work as experimentation, and the design defence that mattered: LLM output that is non-destructive and undoable, with no human paged on it.
The measured anatomy of a mature consumer prompt: 16,739 words, ~23k tokens, over 11% of the context window, roughly 8x the length of o4-mini's ChatGPT prompt.
Up to 76 accuracy points of spread across meaning-preserving formats; persists across scale and instruction tuning; FormatSpread estimates the interval without weights.
Criteria drift: graders need criteria to grade outputs, but grading outputs changes their criteria. The judge gating your prompt changes is itself unstable.
Conference synthesis: single-turn tests and static benchmarks are a weak fit for stateful systems; testing has to take the shape of the product.
The practitioner case that prompt iteration is driven by production observation: observability-driven development for LLM features.
Anthropic: writes 1.25x, reads 0.1x, one changed character invalidates. OpenAI: 50% automatic discount on cached prefixes from 1,024 tokens.
The only first-party public changelog of a consumer system prompt: updated with releases, explicitly excluding the API.
Six rungs from a repo convention to a change pipeline. The line from toy to real is crossed at rung three.
The order matters more than the tooling. Rungs one and two are achievable in a weekend with a repository and a test runner, and they already put you ahead of the change control that failed in three of the seven incidents above. Rung three is where most teams stall, because calibrating a judge means grading outputs yourself, and grading is the work everyone hopes the judge will remove. Rungs four to six are the production shape: they exist so that the question "which prompt produced this output, and how do I get back to the last good one" has a mechanical answer at 2 AM. Buy tooling for any rung you like; the record suggests the discipline, not the platform, is the scarce input.
Move every production prompt string into versioned files; require a PR for any edit; render the assembled prompt in CI so reviewers see the bytes the model will see, not the template.
Done when: no path exists by which a prompt reaches production without a reviewed commit. Teaches: where prompts actually hide (code, config, dashboards, vendor consoles).
Collect 30 to 50 real cases from production traffic. Write deterministic assertions first: output parses, schema validates, banned content absent, required behaviours present. Run on every prompt PR.
Done when: a deliberately broken prompt fails CI. Teaches: which of your product's properties are machine-checkable, which is decision 2's hinge.
Grade 30 outputs by hand before writing judge criteria; implement the judge; measure its agreement with your grades; re-measure monthly, because your criteria will drift as you read outputs.
Done when: you can state the judge's agreement rate with a human and its refresh date. Teaches: criteria drift, per Shankar et al., on your own data.
Give prompts immutable version ids and an environment label; stamp the id on every request trace; make rollback a label repoint that takes effect without an application deploy.
Done when: rollback measured under one minute, and any production output is traceable to the prompt version that produced it. Teaches: the registry pattern Uber and GitLab converged on.
Route the candidate prompt to employees first, then a percentage of traffic; compare judge scores and format-error rates between arms before promoting; keep the old version warm.
Done when: a seeded regression is caught in the canary arm without customer reports. Teaches: why OpenAI's A/B missed sycophancy: the arms only differ on what you measure.
Add cache-hit rate and per-request prompt cost to the dashboard; attribute cost spikes to prompt versions; report each prompt change with its eval delta and its cost delta, aider-style.
Done when: the last three prompt changes each carry a benchmark number and a cost number in their PR. Teaches: that prompt churn is a metered resource, and edit cadence is a design variable.
The queries that found this material, grouped by what they surface. The guide goes stale; these do not.
"system prompt" "unauthorized modification"chatbot statement "system update" disabled OR revertedtribunal OR court chatbot "negligent misrepresentation""prompt" "we rolled back" OR "we reverted" LLM<company> engineering "prompt" evaluation "we" -tutorial"prompt versioning" OR "prompt registry" production "we""evaluation threshold" prompt template productionizesite:github.blog evaluate models offline canarysite:github.com system prompts repo commitsrepo:xai-org/grok-prompts is:pr is:closed"architecture blueprint" OR "design document" prompts migration gateway"release notes" "system prompts" changelogprompt formatting sensitivity accuracy spread arxiv"criteria drift" LLM judge evaluationprompt caching "cache write" invalidate prefix pricingsystem prompt tokens measured "context window" share