안티 패턴: 감정 및 확신 점수
기분이나 자기 평가 1~10 점수만으로 절대 에스컬레이션하지 않습니다
안티 패턴: 감정 및 확신 점수은(는) CoddyKit의 무료 Claude Architect 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Claude Architect 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Claude Architect 강의에는 총 4개의 강의가 포함되어 있습니다.
이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.
The Tempting Shortcut
When you build a Claude agent that handles real users, one question dominates: when do we hand off to a human?
A seductive idea appears early: "Let the model tell us how it feels." Ask Claude to rate its own confidence 1-10, or run a sentiment classifier on the customer's tone, and escalate when the number crosses a line.
It feels data-driven. It is actually one of the most common anti-patterns on the certification exam. This lesson shows you why, and what to do instead.
What a Good Escalation Trigger Looks Like
Escalation should fire on observable, verifiable facts about the conversation, not on a vibe.
The exam recognizes exactly four good escalation triggers:
- Explicit human request — the user asks for a person. Escalate immediately.
- Policy gaps — the situation falls outside what the agent is allowed to resolve.
- No progress after attempts — repeated tool calls or turns yield nothing.
- Threshold violations — a concrete, defined limit is crossed (e.g. refund amount).
Each of these is grounded in something you can point to in the transcript or the data.
The Bad Triggers
Now the flip side. The exam lists triggers you must never use as the basis for escalation:
- Sentiment analysis — escalating because the message "sounds angry."
- Model self-rated confidence — a 1-10 score Claude assigns to itself.
- Untrained classifiers — ad-hoc mood/intent detectors with no validated ground truth.
These share one fatal flaw: they are not grounded in verifiable state. They are guesses about an internal feeling, dressed up as a metric.
Why Self-Rated Confidence Fails
A self-rated 1-10 confidence score has no calibration. The model is not measuring anything external — it is producing a plausible-looking number on demand.
The same answer might get an 8 in one phrasing and a 4 in another. The score does not correlate reliably with correctness, so an escalation threshold built on it is arbitrary noise.
Contrast this with a real reliability practice from the fact sheet: field-level confidence calibrated on a labeled validation set before automating. Calibration against ground truth is rigorous; a model grading its own homework is not.
# ANTI-PATTERN: do not do this
system = (
"Answer the question, then rate your confidence "
"from 1 to 10. If your confidence is below 7, "
"end your reply with ESCALATE."
)
# The 1-10 number is uncalibrated self-report.
# Threshold 7 is arbitrary -> noisy, unreliable handoffs.Why Sentiment Escalation Fails
Sentiment-based escalation routes on the customer's mood instead of their request. That is the wrong variable.
A calm user may have a hard, out-of-policy problem that genuinely needs a human. A frustrated user may have a trivial, fully solvable request. Mood and resolvability are not the same axis.
Worse, naive sentiment detection is itself an untrained classifier — brittle to sarcasm, politeness, and phrasing. You would be stacking one unreliable signal on top of another and calling it a policy.
The Right Pattern for Emotion
Emotion is not irrelevant — it is just not an escalation trigger. The exam prescribes a specific three-step pattern for an upset user:
- Acknowledge the emotion.
- Propose a concrete solution.
- Escalate only if the request is reiterated — i.e. the user explicitly insists or asks for a human.
So you respond empathetically and try to solve the problem first. The handoff happens on the explicit reiterated request, which is a verifiable event, not on the sentiment score that detected the frustration.
# Good: empathy in the reply, escalation on the REQUEST
system = (
"If the customer is upset: first acknowledge how they "
"feel, then propose a concrete next step using your tools. "
"Call escalate_to_human ONLY if the customer explicitly "
"asks for a person or repeats the request after your fix."
)Anchor Escalation in Tools and Thresholds
The reliable way to escalate is to wire it to concrete state and explicit thresholds, enforced where it matters.
In the Customer Support scenario, you expose an escalate_to_human tool alongside get_customer, lookup_order, and process_refund. The model decides to call it based on the four good triggers — not on a mood reading.
For anything with financial, legal, or safety consequences, you do not trust the prompt alone. You enforce it deterministically.
# Escalate on a real threshold, deterministically enforced.
# A PostToolUse / outgoing-call hook blocks the action
# regardless of how the model 'feels' about it.
def on_process_refund(amount, customer):
if amount > 500:
# Hook = 100% deterministic enforcement
return {"block": True, "route": "escalate_to_human"}
return {"block": False}Hooks vs Prompts for the Hard Limits
Why a hook and not a sentence in the system prompt?
The fact sheet is blunt about this: hooks are 100% deterministic; prompts are ~90% probabilistic. When a wrong escalation (or a missed one) has financial, legal, or safety consequences, ~90% is not good enough.
A self-rated confidence threshold lives entirely inside the probabilistic layer — it can drift, be re-rated, or be talked around. A threshold violation enforced by a hook (e.g. refund > $500 always routes to a human) is a guarantee. Reserve hard code for guarantees; keep model-driven judgement for everything softer.
No-Progress: A Verifiable Trigger Done Right
"No progress after attempts" sounds fuzzy but is actually concrete: it is grounded in observable loop state, not feelings.
You count real attempts — tool calls that returned no usable result, turns with no forward movement. That is a fact about the transcript, the same way stop_reason is a fact about the response.
Critically, note the difference from the anti-patterns: an iteration cap here is a safety net for a genuinely stuck loop, never a confidence dial. You are escalating because nothing worked, which you can prove, not because the model rated itself unsure.
# Escalate on demonstrable lack of progress, not on mood.
attempts = 0
while True:
resp = client.messages.create(model=MODEL, max_tokens=1024,
system=SYS, tools=TOOLS,
messages=history)
if resp.stop_reason == "tool_use":
results = run_tools(resp)
if all(r["empty"] for r in results):
attempts += 1
history += [as_turn(resp), tool_results(results)]
if attempts >= 3: # verifiable, not a vibe
escalate_to_human(reason="no_progress")
break
else:
break # terminate on stop_reason, never on parsed textEmpty Result Is Not Low Confidence
A frequent trap: treating an empty or ambiguous result as "the model is unsure, so escalate."
The fact sheet draws a sharp line. Distinguish:
- an access FAILURE (the lookup errored — maybe retry the transient fault locally), from
- a valid EMPTY result (the query ran fine; there are simply no matches).
And for ambiguity — multiple customer matches — the correct move is to ask for more identifiers, never guess, and never escalate on a fabricated confidence drop. The right signal is the structured outcome of the tool, not a sentiment or self-score wrapped around it.
Putting It Together
An architect-grade escalation policy reads like this:
- Escalate on explicit human request, policy gaps, no progress after attempts, and threshold violations — all verifiable.
- For upset users: acknowledge, propose a solution, escalate only on reiteration.
- Enforce consequential thresholds with hooks, not prompt text.
- Never route on sentiment, a self-rated 1-10 confidence, or an untrained classifier.
The throughline: escalate on facts you can point to, and reserve deterministic code for the guarantees that matter.
GOOD_TRIGGERS = [
"explicit_human_request", # escalate immediately
"policy_gap",
"no_progress_after_attempts",
"threshold_violation", # hook-enforced when consequential
]
BAD_TRIGGERS = [
"sentiment_score", # mood is not resolvability
"self_rated_confidence", # uncalibrated 1-10 self-report
"untrained_classifier", # no validated ground truth
]Quick Check
A scenario-style question on escalation design.
Recap & Takeaways
Key takeaways:
- Escalate only on verifiable triggers: explicit human request, policy gaps, no progress after attempts, threshold violations.
- Never escalate on sentiment, a model self-rated 1-10 confidence score, or untrained classifiers — they are not grounded in real state.
- For emotion: acknowledge → propose a solution → escalate only if the request is reiterated.
- Distinguish an access failure from a valid empty result; for ambiguous matches, ask for more identifiers, don't guess.
- Enforce consequential thresholds with hooks (deterministic), not prompts (~90%). Reserve hard code for guarantees.
Design escalation around facts you can point to — and you will pass both the exam and production.
자주 묻는 질문
“안티 패턴: 감정 및 확신 점수” 강의는 무료인가요?
네 — “안티 패턴: 감정 및 확신 점수” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Claude Architect 강의 전체를 잠금 해제할 수 있습니다. Claude Architect 강의에는 총 4개의 강의가 포함되어 있습니다.
“안티 패턴: 감정 및 확신 점수”에서 뭘 배우나요?
기분이나 자기 평가 1~10 점수만으로 절대 에스컬레이션하지 않습니다 브라우저에서 직접 실행하는 실습 코드로 Claude Architect을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Claude Architect을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Claude Architect은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“안티 패턴: 감정 및 확신 점수” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Claude Architect 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Claude Architect 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 명확한 에스컬레이션 조건
- 안티 패턴: 감정 및 확신 점수
- 구조화된 오류 컨텍스트
- 로컬 복구와 에스컬레이션