You wrote a prompt with two reasonable rules: “be concise” and “cover all edge cases”. The model gave you something that is neither concise (it lists six edge cases) nor complete (it skipped the one that matters). When you remove the “concise” rule, the answer is genuinely thorough. When you remove “cover all edge cases”, the answer is genuinely tight. Both rules alone work. Together they cancel. This is a constraint-fight: the model cannot maximize both, so it averages, and averages are mediocre.
This page walks through how to find hidden constraint fights in your prompts and how to rank rules so the model knows which to drop when it cannot satisfy them all.
Common causes
1. Soft adjective vs hard rule
“Make it concise” (soft) vs “include all 7 fields” (hard). The hard rule wins, “concise” is sacrificed but the model still tries — leaving you with output that is neither short nor well-structured.
How to spot it: one rule is countable, the other is taste.
2. Style vs format
“Warm conversational tone, return strict JSON” — JSON has no room for warmth. The model picks one, usually format. You get bland JSON with awkward string padding.
How to spot it: format constraint is structural (JSON, table, schema) and style is voice (warm, friendly, persuasive).
3. Reasoning vs brevity
“Show your reasoning step by step” + “answer in one sentence” — these are mathematically opposite. The model usually picks brevity and hides reasoning.
How to spot it: both length cap and chain-of-thought request in the same prompt.
4. Conflicting tone targets
“Formal but playful”, “expert but accessible”, “authoritative but humble” — these were always tensions, not pairs. The model averages to “corporate”.
How to spot it: two adjectives joined by “but” or “and”.
5. Implicit conflicts from system prompt
Your prompt says “be casual” but a system prompt says “use formal English”. The model obeys the system prompt and ignores the in-message rule, but you cannot see why.
How to spot it: behavior depends on which platform / project you run the same prompt in.
Before you change anything
- Print your full prompt including any system prompt or project instructions.
- List every constraint, one per line.
- For each pair, ask “if these clash, which wins?”
- Test with one constraint removed to see whether the conflict was the bottleneck.
- Decide your priority order before re-prompting.
Information to collect
- All constraints from system prompt + project + user message.
- The output you got and which rule it satisfied vs ignored.
- A test where you removed one rule — did quality go up?
- Model, temperature, platform.
- Whether the conflict is mathematical (length vs detail) or interpretive (tone).
Shortest path to fix
Step 1: List every constraint on one sheet
Get them all visible. Often you wrote 8 rules and forgot 3 are pulling against the other 5.
Step 2: Pair them and rank
For each pair that clashes, declare a winner:
Concise vs Comprehensive → Comprehensive wins. Length cap removed.
Warm tone vs JSON output → JSON wins. Drop "warm" from this prompt.
Show reasoning vs 1 sentence → Reasoning wins. Length becomes "max 5 sentences".
Formal vs playful → Pick one. (You cannot have both.)
Step 3: Move the winner to a “Non-negotiable” block
Top of prompt:
NON-NEGOTIABLE:
1. Output must be valid JSON matching schema X.
2. All 7 required fields present.
3. Factual claims must cite source.
PREFERENCES (drop if conflict with above):
- Field descriptions short.
- Use plain language in description strings.
The model is much better at following ranked constraints than equal-weighted ones.
Step 4: Convert adjectives to rules
If you keep an adjective, make it measurable so it does not silently conflict:
Bad: "Be concise."
Good: "Total output under 150 words."
Bad: "Be warm."
Good: "Use 'we' at least twice. Avoid the word 'individuals'."
Step 5: Test with a deliberately conflicting input
Feed an input where the constraints obviously fight. If the model still tries to satisfy all, your ranking did not land. Re-prompt with more explicit priority.
Step 6: Separate constraints into two passes
If two constraints truly cannot coexist, split the workflow:
Pass 1: Generate the full comprehensive answer. No length limit.
Pass 2: Compress Pass 1 output to under 150 words. Preserve facts.
This decomposes the conflict into sequential, satisfiable tasks.
How to confirm the fix
- A second person reading the prompt can predict which rule wins in each conflict.
- The model satisfies the non-negotiables 100% of the time.
- When preferences cannot all hold, the model drops them in your declared order.
- Removing the lowest-priority preference does not improve output (it was already being dropped quietly).
If it still fails
- You may have a third hidden conflict from system prompt or project instructions — check both.
- Constraint may be mathematically impossible (1-sentence answer with full reasoning) — change one.
- Try a different model — some follow ranked constraints more reliably than others.
- If you must satisfy all constraints, split into multiple passes (see Step 6).
Prevention
- Maintain a constraint hierarchy template: non-negotiable / preference / nice-to-have.
- Make trade-offs explicit in every prompt: “if you must choose, prefer X over Y”.
- Have a peer scan your prompt for contradictions before running.
- Beware of “but” and “and” between adjectives — they usually hide conflicts.
- Audit production prompts quarterly for accumulated constraint conflicts.
- When using both system prompt and user prompt, ensure they do not contradict.
Related reading
- Mixed tone instructions
- Style vs format conflict
- Latest sentence overrides
- Long prompt degrades output
- Prompt lacks context hierarchy
Tags: #Troubleshooting #Prompt #Prompt quality #Prompt engineering