الأنماط المضادة للحلقات والتنسيق
إنهاء تحليل النص والحدود الاعتباطية والتفكيك الضيق أكثر من اللازم
الأنماط المضادة للحلقات والتنسيق درس مجاني في Claude Architect على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Claude Architect، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Claude Architect 4 دروس في المجموع.
بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.
Why Loops Go Wrong
The agentic loop is deceptively simple: send a request, inspect the stop_reason, run any tools, append results to history, repeat until end_turn. Yet this is exactly where production agents fail most often.
This lesson dissects three orchestration anti-patterns that recur across the Claude Certified Architect exam:
- Text-parsing termination — stopping when the reply contains a word like "done".
- Arbitrary iteration caps used as the primary stop mechanism.
- Over-narrow decomposition — slicing work so finely that quality and coordination collapse.
Each looks reasonable in a demo and breaks under real traffic. Let's make the correct patterns reflexive.
The Loop Contract
Claude keeps no server-side state. Every turn you resend the full messages history. The model signals control flow through stop_reason, not through prose.
The four stop reasons you orchestrate against:
end_turn— the task is complete; exit the loop.tool_use— run the requested tools, append results, continue.max_tokens— output was truncated.stop_sequence— a configured sequence was emitted.
The contract is structural. Branch on the field the API guarantees, never on the text the model happens to produce.
import anthropic
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Audit the repo and summarize risks."}]
while True:
resp = client.messages.create(
model="claude-opus-4-1",
max_tokens=2048,
tools=tools,
messages=messages,
)
if resp.stop_reason == "end_turn":
break
# ... handle tool_use, append results, loop ...Anti-Pattern 1: Parsing Text for "Done"
The most common termination bug: scanning the assistant's text for a completion signal.
This fails in ways that are hard to debug:
- The model writes "I'm not done yet" — your substring match on "done" fires anyway and exits early.
- The model finishes but phrases it as "that completes the analysis" — your check never matches and the loop spins.
- A tool result quotes the word "finished" — false termination.
Natural language is probabilistic; control flow must be deterministic. The stop_reason field exists precisely so you never have to guess from prose.
# ANTI-PATTERN — do NOT do this
text = resp.content[0].text.lower()
if "done" in text or "finished" in text:
break # brittle: false positives + missed completionsThe Correct Termination
Terminate on stop_reason == "end_turn". When it is tool_use, execute every requested tool, append the results as a tool_result message, and continue. The model decides when it is finished by emitting end_turn — you simply honor that signal.
This keeps the decision model-driven where it belongs. The model has the full context to judge completion; your harness only routes the structured signal.
while True:
resp = client.messages.create(
model="claude-opus-4-1", max_tokens=2048,
tools=tools, messages=messages,
)
messages.append({"role": "assistant", "content": resp.content})
if resp.stop_reason == "end_turn":
break
if resp.stop_reason == "tool_use":
results = run_requested_tools(resp.content)
messages.append({"role": "user", "content": results})Anti-Pattern 2: The Cap as Primary Stop
The next trap is treating an iteration cap as the way you stop. You write for _ in range(5) and call it orchestration.
The problem is intent. A cap that is your primary stop means:
- Tasks that legitimately need 7 tool calls are silently truncated mid-investigation.
- Tasks that finish in 2 calls still appear "capped" in your telemetry, hiding real behavior.
- You have no signal distinguishing completed from ran out of budget.
The model's end_turn must remain the decision point. The cap is something else entirely.
# ANTI-PATTERN — cap IS the stop mechanism
for _ in range(5):
resp = client.messages.create(...)
run_tools(resp)
# loop exits by exhaustion, not because the task is doneCaps as a Safety Net
Iteration caps are valid — but only as a safety net against runaway loops, never as the primary termination logic. The reflex from the fact sheet: decisions are model-driven; reserve hard code for guarantees.
So the cap sits around the model-driven loop. end_turn is how you normally exit. The cap only fires in the pathological case, and when it does you treat that as an error condition worth logging and escalating — not a normal exit.
MAX_ITERS = 25 # safety net, not the plan
for i in range(MAX_ITERS):
resp = client.messages.create(...)
messages.append({"role": "assistant", "content": resp.content})
if resp.stop_reason == "end_turn":
break # normal, model-driven exit
handle_tools(resp)
else:
log.error("hit safety cap without end_turn")
escalate(messages) # treat as anomaly, not successWhen Guarantees DO Belong in Code
"Model-driven" does not mean "never use hard code." Reserve deterministic code for genuine guarantees — places where a probabilistic decision is unacceptable.
Examples from the exam's anti-pattern catalog:
- A hook blocking a refund over $500 — deterministic enforcement, ~100% reliable, versus a prompt at ~90%.
- A programmatic precondition: block
process_refunduntilget_customerhas returned a verified ID.
The line is clear: route open-ended decisions to the model; encode policy and safety in code. Caps belong to the latter only as a backstop.
Anti-Pattern 3: Over-Narrow Decomposition
Multi-agent systems use a hub-and-spoke shape: a coordinator decomposes, delegates, aggregates, routes, and handles errors. The orchestration failure here is slicing the work too finely.
Over-narrow decomposition spawns a subagent per trivial step. The costs compound:
- Coordination overhead dwarfs the actual work.
- Each subagent loses context — subagents do not inherit the coordinator's conversation history.
- Cross-cutting judgment that needs a whole-picture view gets fragmented across isolated agents.
Decompose by meaningful unit of work, not by individual operation.
Context Must Be Passed Explicitly
Because subagents start with a blank history, the coordinator must pass all needed context explicitly in each subagent prompt. Over-narrow decomposition makes this worse: more agents means more boundaries where context is dropped and more prompts to keep in sync.
Note also that multiple Task calls in a single response run in parallel, and the coordinator's allowedTools must include "Task". Parallelism is a reason to decompose at the right granularity — independent, self-contained units — not to shatter one coherent task into fragments that each need the same shared context re-injected.
AgentDefinition(
name="file_reviewer",
description="Reviews a single source file for local correctness issues.",
system_prompt=(
"You review ONE file in isolation.\n"
# subagent has NO coordinator history — pass everything it needs:
"Project conventions: {conventions}\n"
"File under review: {file_path}\n"
"Known constraints: {constraints}\n"
),
allowed_tools=["Read", "Grep"], # least privilege
)The Right Granularity: Code Review
Code review is the canonical example of correct decomposition — and it shows the difference from over-narrow slicing.
The right structure is a per-file local pass followed by a separate cross-file integration pass. A single-pass multi-file review dilutes attention; one agent juggling everything misses both local bugs and integration issues.
The wrong over-narrow extreme is the opposite error: a subagent per function or per line, none of which can see enough to judge correctness. Decompose into passes that each have a coherent scope — file-level, then integration-level — not into fragments below the level at which judgment is possible.
Fixed vs Adaptive Decomposition
One more lever prevents both over- and under-decomposition: match the strategy to the problem shape.
- Fixed pipelines / prompt chaining for known, sequential steps — extract, then validate, then format.
- Adaptive decomposition for open-ended investigations where the next step depends on what was just found.
Forcing a fixed pipeline onto an open-ended research task pushes you toward brittle over-narrow stages; using adaptive decomposition for a deterministic three-step transform adds needless coordination. Choose deliberately, and let the model drive the steps it should own while code owns the steps that must be guaranteed.
Quick Check: Loop Termination
An architect's agent loop calls tools across several turns. Pick the orchestration that matches the certification's reliability guidance.
Recap: Orchestrate on Signals, Decompose with Intent
Three reflexes to carry into the exam and into production:
- Terminate on stop_reason. Exit on
end_turn; never parse text for "done". The model owns the completion decision; you route its structured signal. - Caps are a safety net, not a plan. Keep a generous cap to catch runaways, treat hitting it as an anomaly, and reserve hard code for real guarantees (hooks, preconditions).
- Decompose at the right grain. Hub-and-spoke with coherent units — per-file then cross-file passes, not a subagent per line. Pass all context explicitly, and match fixed vs adaptive strategy to the problem.
Get these three right and most loop-and-orchestration distractors on the exam fall away.
الأسئلة الشائعة
هل درس «الأنماط المضادة للحلقات والتنسيق» مجاني؟
نعم — نص درس «الأنماط المضادة للحلقات والتنسيق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Claude Architect، انتقل إلى CoddyKit PRO. تتضمن دورة Claude Architect 4 دروس في المجموع.
ماذا ستتعلم في «الأنماط المضادة للحلقات والتنسيق»؟
إنهاء تحليل النص والحدود الاعتباطية والتفكيك الضيق أكثر من اللازم تتمرن على Claude Architect مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Claude Architect؟
لا تُشترط خبرة سابقة. Claude Architect على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الأنماط المضادة للحلقات والتنسيق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Claude Architect هذا؟
نعم. كل درس في Claude Architect يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأنماط المضادة للحلقات والتنسيق
- الأنماط المضادة للأدوات والأخطاء
- الأنماط المضادة للمطالبات والمراجعة
- الأنماط المضادة للتصعيد والمقاييس