Skip to content

We Proved Our AI Never Got Its Instructions — With One Word

A one-line test that shows whether your AI actually received its instructions -- before a green status hides the gap.

Published
Updated
AI-generated, checked by independent automated gates, no human editorial review.
How this guide was made
We Proved Our AI Never Got Its Instructions — With One Word

AI-generated. Written by an automated system, checked by independent automated gates, and published without human editorial review. How we label and verify.

How to verify your system prompt reached the model — a two-minute proof-string test

We built an automation and thought it worked. Everything showed green. The workflow reported success. But the assistant’s replies were generic. To check that the system prompt actually reached the model, we put one exact, unique proof string into the system prompt, sent a trivial user message, and checked the response character-for-character; the reply proved whether the instruction had actually arrived at runtime.

The surprising moment

We had configured an assistant to reply only with one fixed string when called through our routing automation. The interface displayed the correct system instruction. Logs said success. Yet the reply was a polite, generic greeting, not the fixed string. Puzzling. We tried different inputs. Same result.

Then someone suggested a brute-force check: replace the system prompt with a unique, exact string that the model must return verbatim. Send a totally neutral user message — “ping” — and look at the response bytes. The first time we ran that, the model returned a normal sentence. That single line made everything click: the system prompt field in our UI had never been attached to the actual outgoing API call.

What we tried and what changed

Experiment 1: Put a unique alphanumeric string in the system prompt, no other instructions. Sent “ping” as the user message. Result: reply was human-like, not the exact string. Interpretation: the model had not received the string.

Experiment 2: Sent the same call but from a different path where we knew the system prompt was included in the outgoing request. Result: the model returned the exact string, byte-for-byte. Turning point: we had a live proof that the string reaching the model produces an exact, verifiable output.

Experiment 3: Captured the outgoing HTTP request from the service that reported success. The system prompt field was populated in the UI, but absent in the request body. Fixing that one line — actually attaching the prompt to the request payload — produced the exact string in responses and restored expected behavior.

The rule that fell out

If a workflow reports SUCCESS it only means the pipeline finished; it does not prove the system prompt was present in the runtime call. To check that the system prompt actually reached the model, set the prompt to require the model reply with one exact, unique proof string, send a trivial user message, and check the response character-for-character. A match = prompt live. A generic reply = prompt missing.

Why this works

Models, by design, will output an exact required string if instructed to do so in the system prompt and nothing else contradicts it. So the test converts a configuration check into an observable, deterministic behavior. It bypasses dashboard illusions. It forces the runtime to show whether the instruction actually crossed the wire.

A representative detail (not a full recipe)

Pick a string that’s long enough to be obviously unique (we used a 40-character alphanumeric sequence). Put that sequence as the entire system instruction and send a plain user message like “ping”. If the reply equals the sequence exactly, the system prompt reached the model; if it doesn’t, trace the outgoing request. The full, runnable checklist and the scripts we used live in the members’ library.

A fair counter-example

We once saw a case where the test returned the exact string but the broader application still behaved oddly. That taught us a separate lesson: the proof-string test only confirms the system prompt reached that specific runtime call, not that every downstream transformation or middleware step will preserve or use it correctly. In short, a pass proves delivery to the model at that moment; it doesn’t guarantee the entire system behaves correctly under load or with additional layers attached.

How we fixed the failure

The fix was mechanical. We traced the codepath where the system prompt was supposed to be added to the API payload. The UI showed the prompt in a configuration panel, but the code that constructed the outgoing request omitted it. After inserting the prompt into the outgoing request body and re-running the proof-string test, the model returned the exact string and normal behavior resumed.

How we know this is repeatable

Three concrete findings from our tests: first, a unique proof string returned verbatim proves the model saw that instruction. Second, a generic reply alongside a reported-success status reveals the prompt never reached the outgoing request. Third, adding the prompt into the actual request body immediately produced the exact string in the response. We reproduced those results across different endpoints until the behavior was consistent.

Won’t a model sometimes ignore a prompt and still return something similar?

It can. But this test reduces ambiguity: an exact, unique proof string is either present or not. If you ask for a precise token sequence and the model doesn’t return it character-for-character, the instruction didn’t land as intended in that call.

Could the model accidentally produce the same string without seeing it?

Possible but extremely unlikely when the string is long and unique. Make the proof string sufficiently random and improbable to avoid false positives.

What if the test fails in production but passes in staging?

That indicates an environment-specific wiring problem. Compare the actual outgoing requests in both environments; the missing prompt will usually be absent in the failing environment’s HTTP payload. The tested, runnable resolution for this class of problem is in the members’ library.

Final thought: success lights on a dashboard are not evidence of correct configuration; a short proof-string call is. Do the two-minute test. It tells you, concretely, whether the instruction reached the model.

Sources: our own content pipeline incident and repeatable tests run during debugging.

What the platform docs and security guidance say

The vendor documentation treats the system prompt as a separate channel, which is exactly why it can go missing. Anthropic’s guide notes that setting a role in the system prompt focuses Claude’s behavior and tone for your use case. OpenAI’s Model Spec ranks messages in a chain of command, and it names one level as instructions given by developers using our API. In both designs the instruction only counts if the request actually carries it in that slot. A field in a settings panel is not that slot.

Security guidance points the same way from the other side. The OWASP entry on system prompt leakage says the prompts or instructions used to steer the behavior of the model can also contain sensitive information. Its mitigations start with this: avoid embedding any sensitive information in the system prompt, and keep guardrails outside the model. The OWASP prompt injection entry recommends that teams specify output formats and use deterministic code to validate adherence to them. A character-for-character comparison is about as deterministic as a check gets.

Research on attacks explains why the prompt cannot be treated as hidden. Perez and Ribeiro studied two attack types, goal hijacking and prompt leaking, against GPT-3. Anthropic’s own page on the topic is candid that defenses are partial: it says its strategies can significantly reduce the risk, and it suggests monitoring such as output screening and post-processing to catch leaks.

On testing in general, Anthropic’s evaluation guide says a successful LLM application starts with clearly defining your success criteria and then measuring against them. The proof-string test is a very small instance of that idea. The success criterion is a single exact string, so the grader needs no judgment at all.

How this lines up with what we saw

The docs describe a separate channel for instructions. Our failure lived in the gap between that channel and the interface: the system prompt field was populated in the UI but absent from the outgoing request body. The workflow still reported success, because success only meant the pipeline finished.

OWASP’s advice to validate with deterministic code matches how the test worked for us. A generic greeting came back where the exact string should have been. When the call was sent from a path that did include the prompt, the string came back byte-for-byte. And after the one-line fix, the exact string showed up in responses again.

The counter-example in this article also fits the documentation. A pass proves the instruction reached that specific call. It says nothing about middleware, later transformations or behavior under load, which is why the security guidance keeps authorization and other critical controls outside the prompt.

Checklist for a proof-string test

  1. Generate a long, random string and make it the entire system instruction for the test.
  2. Send a neutral user message such as “ping” through the exact path you use in production.
  3. Compare the reply to the string in code, character for character. No fuzzy matching.
  4. If it fails, capture the outgoing HTTP request and confirm the system field or its equivalent is actually in the body.
  5. Run the same test in every environment and through every endpoint that sends requests.
  6. Restore the real system prompt after the test, and keep secrets out of it either way.
  7. Treat a pass as proof of delivery only. Test downstream behavior separately.

More questions

Is a proof string the same as a canary for prompt leaks?

No. The test here checks that an instruction arrived. Leak detection watches for prompt text showing up where it should not, which is what Anthropic’s suggested output screening and post-processing is for. You can use the same unique-string trick for both, but they answer different questions.

Should the proof string be secret?

It does not need to be, and nothing sensitive should ride along with it. OWASP warns that system prompt content can leak, so a test string should be throwaway text with no credentials, internal URLs or role details attached.


How we know

The factual claims in this article come from our verification store — each with a source type, a confidence label and a reference. The method is documented on How we know.

– The gap was caught by sending a plain trivial message to the configured assistant and checking whether the reply matched the required proof string; instead the model replied with a generic greeting, revealing the system instruction never reached the runtime call even though the workflow reported success. | source: first-hand experience | conf: verified | ref:
– The technique: put one exact, unique string in the system prompt, send a trivial user message with no other instructions, and check the response character-for-character; a match proves the prompt is live, and any generic-sounding reply proves it is not. | source: first-hand experience | conf: verified | ref:
– A team built an automation meant to route a request to an assistant configured to reply only with one fixed proof string; the response body appeared, the workflow status showed success, and the underlying model had actually received no trace of that instruction. | source: first-hand experience | conf: verified | ref:
– Once a missing-instruction gap is found this way, the fix is mechanical: trace the exact step where the system prompt was supposed to be attached to the API call and confirm it is present in the actual outgoing request, not just in the interface field that displays it. | source: first-hand experience | conf: strong | ref:
– A workflow reporting SUCCESS says nothing about whether the correct configuration was actually in effect — it only reports that the pipeline finished running; a proof-string test can catch a wiring failure that the status field alone cannot. | source: first-hand experience | conf: strong | ref:

Related guides

Verification & Governance · Published

The Gate Rejected One Draft, Approved Another Same Day

One draft got rejected for inventing a detail. Another, on the same day, passed clean. Here's what that proves about the check in between.

Verification & Governance · Published

Four Ways We Checked the Same Work, Four Different Things We Caught

We ran the same AI-written files through four separate checks. Each layer caught something real that every layer before it had missed.

Verification & Governance · Published

API Returns 200 but Saves Nothing: The Missing Content-Type Header We Found

The Notion API returned HTTP 200 three times and saved nothing. How a missing Content-Type header hid the failure, and the read-back check that exposed it.