وكلاء Claude Code الفرعيون: سير العمل الإنتاجي لعمليات نشر آمنة
نحن نشحن مواقع بدون رأس لعملاء يقيسون كل شيء -- Core Web Vitals و schema markup و درجات إمكانية الوصول و تغييرات حركة المرور العضوية. يمكن لنشر واحد سيء أن يهدم التصنيفات التي استغرقت أشهراً لبنائها. لذا عندما أطلقت Anthropic subagents و hooks و skills في Claude Code، أعدنا بناء خط أنابيب ما قبل النشر بالكامل حولها.
تشرح هذه المقالة إعدادنا الدقيق: هيكل دليل .claude/، كل تعريف subagent، إعدادات hook، وملفات skill التي تربط كل شيء معاً. سنشارك أربع حوادث حقيقية اكتشفها النظام و الحسابات الاقتصادية بمستوى مقياسنا و المكان الذي يوجد فيه هذا النهج نقاط ضعف.
واجهنا ارتفاعاً بنسبة 40% في CLS وصل إلى الإنتاج على أي حال
قبل ثلاثة أسابيع. تصميم مدونة العميل. كل شيء بدا جيداً في dev. دمجنا.
بعد يومين أرسل CTO العميل لقطة شاشة من Search Console. قفز CLS من 0.08 إلى 0.14 على الجوال. الصفحات التي احتلت المرتبة #3 لـ "enterprise billing software" انخفضت إلى #8. تأثير الإيرادات؟ لقد قدروها بحوالي 40,000 دولار/شهر.
المشكلة؟ صورة بطل تحملت بشكل غير متزامن لكن بدون سمات حجم. كلاسيكي. CI لم يلتقط أي شيء لأننا لم نكن نتحقق من تحول التخطيط على نسخة الـ preview الفعلية.
هذا هو المكان الذي بدأنا فيه البحث عن subagents.
Subagents عبارة عن نسخ Claude Code محدودة النطاق تعمل داخل جلسة أب بنظام prompt خاص بها و وصول أداة و حد مهمة. Hooks تشغل subagents عند نقاط محددة -- قبل تشغيل أمر أو بعد تغييرات الملفات أو عند الالتزام. Skills عبارة عن ملفات تعليمات قابلة لإعادة الاستخدام (markdown) التي تعلم Claude كيفية تنفيذ مهمة معينة.
أطلقت Anthropic التصميم الجديد في 14 أبريل 2025، مما أدى إلى تقديم Routines إلى جانب هذه البدائيات. بالنسبة لحالة الاستخدام الخاصة بنا، كانت subagents الخام بالإضافة إلى hooks تمنحنا تحكماً أدق في الوقت الذي يتم فيه تشغيل كل فحص بالضبط والسياق الذي يستقبله.
الفرق الرئيسي عن فحوصات CI التقليدية: يمكن لـ subagents أن تفكر في النتائج و تربط الأخطاء عبر الفحوصات و تكتب ملخصات قابلة للقراءة من قبل البشر. تُرجع وظيفة CI رمز الخروج 0 أو 1. تُرجع subagent "البيانات المنظمة على /blog/[slug] تفتقد حقل dateModified الذي كان موجوداً في النسخة السابقة. هذا قد يسبب انحدار rich snippet في Google Search Console في غضون 3-5 أيام."
هذه هي الفكرة برمتها.
بعد ثلاثة أشهر، كسرنا إعداد GitHub Actions الخاص بنا أخيراً
كان خط الأنابيب السابق لدينا عبارة عن خليط من GitHub Actions استدعاء Lighthouse CI و pa11y و linkinator و نصوص Node مخصصة. كان يعمل.
نوعاً ما.
لكنه كان يحتوي على ثلاث مشاكل.
لا يوجد استدلال بين الفحوصات. إذا وضعت Lighthouse علامة على مشكلة CLS وضعت فحص إمكانية الوصول علامة على علامة alt مفقودة على نفس الصورة، حصلنا على تنبيهين منفصلين بدون اتصال. كان يتعين على المهندسين grep يدويًا من خلال سجلات CI وربط الطوابع الزمنية وكتشاف أنه نفس المكون.
مضيعة للوقت.
إعدادات هشة. لكل أداة ملف إعدادات خاص بها و تنسيق حد و مخطط الإخراج. تحديث الحدود يعني لمس 4-6 ملفات. YAML هنا. JSON هناك. متغيرات البيئة في مكان آخر. خطأ إملائي واحد وينتهي خط الأنابيب بأكمله بـ 0 عندما يجب أن يفشل.
لا توجد تفسيرات سياقية. حصل المهندسون على نعم أو لا. قضى المطورون المبتدئون 20-40 دقيقة لفهم لماذا فشل شيء ما و ماذا تفعل حيال ذلك. "درجة إمكانية الوصول: 87" لا يخبرك أي سمة ARIA مفقودة أو لماذا تهم للقراء الشاشة.
كنا ننفق 3 ساعات في الأسبوع في التصحيح من الإيجابيات الخاطئة أو شرح الأخطاء في Slack.
اللحظة الأخيرة؟ أغسطس 2025. دفعنا تصميم Northwind Traders الجديد في الساعة 4 مساءً يوم الجمعة (أعرف). مرت Lighthouse. مرت إمكانية الوصول. مرت الروابط. شحنا.
صباح الاثنين يرسل لنا VP التسويق بريداً إلكترونياً. "لماذا تفتقد صفحات المنتج الخاصة بنا من Google؟" اتضح أننا حددنا بطريقة الخطأ robots meta إلى noindex على كل صفحة تحت /products/. لم يتحقق CI الخاص بنا من علامات robots. استغرق الأمر ستة أيام للحصول على إعادة فهرسة. فقدوا ما يقدر بـ 12,000 دولار من الإيرادات.
لم نكن بحاجة إلى أداة CI أخرى -- كنا بحاجة إلى طبقة تنسيق يمكنها التفكير في مخرجات الأدوات التي نثق بها بالفعل. ملفات skill المكتوبة بشكل جيد هي الفرق بين subagent التي تهلوسن على قواعد إمكانية الوصول و واحدة التي تشغل pa11y بالأعلام الصحيحة و تفسر مخرجات JSON.
هيكل دليل .claude/ الخاص بنا
إليك الشجرة الفعلية:
.claude/
├── settings.json
├── agents/
│ ├── seo-regression.md
│ ├── cwv-smoke.md
│ ├── accessibility.md
│ ├── broken-links.md
│ ├── schema-validation.md
│ └── deploy-gate.md
├── skills/
│ ├── run-lighthouse.md
│ ├── run-pa11y.md
│ ├── run-linkinator.md
│ ├── parse-schema-org.md
│ ├── compare-seo-snapshot.md
│ └── format-deploy-report.md
└── snapshots/
└── seo-baseline.json
يحتفظ دليل snapshots/ بالبيانات الأساسية لفحوصات المقارنة. بسيط. نحن نصدره في Git لذلك يمكننا رؤية ما تغير عندما يسأل العميل "لماذا انخفضت التصنيفات يوم الثلاثاء الماضي؟"
لا شيء فاخر. فقط ملفات markdown و JSON.
اتصل عميل الساعة 11 مساءً لأن Google أسقطت جميع rich snippets الخاصة بهم
سبتمبر 2025. نحن نبني موقع التجارة الإلكترونية لتاجر تجزئة متوسط الحجم (دعنا نسميهم Acme Home Goods). لقد أمضوا ستة أشهر في الحصول على rich snippets -- نجوم المنتج و الأسعار و التوفر -- تظهر في نتائج البحث.
ندفع تحديث موضوع Shopify. يبدو جيداً. شحن مساء الجمعة.
السبت في الساعة 11:14 مساءً أتلقى رسالة نصية. "تبدو صفحات المنتج الخاصة بنا معطلة في Google. الستيرة ذهبت. الأسعار ذهبت. ماذا حدث؟"
أفتح Search Console. كل صفحة منتج واحدة تُرمي خطأ بيانات منظمة. حقل offers مفقود priceCurrency. بدونها، لن تعرض Google rich snippet. التصنيفات لم تنخفض، لكن معدل النقر من الانطباع انخفض من 4.2% إلى 1.8% بين عشية وضحاها.
التكلفة؟ حوالي 8,000 دولار/أسبوع من حركة المرور المفقودة حتى قمنا بإصلاحها و قامت Google بإعادة الزحف.
كان schema هناك. فقط غيرنا اسم الخاصية من priceCurrency إلى currency لأن Shopify API يستخدم هذا المفتاح. لم نفكر فيه. لم يلتقط التحقق منه أي شيء.
هذا هو المكان الذي بنينا فيه subagent schema-validation.
تنشئ ملف markdown في .claude/agents/ بـ system prompt و قائمة الأدوات المسموحة و تعليمات المهمة. تولد الجلسة الأب (أو hook) مع dispatch_agent() أو عبر config hook في settings.json.
الحد الأدنى من الهيكل:
# Agent: [Name]
## Role
[وصف بسطر واحد]
## Allowed Tools
- Bash (مقيد بأوامر معينة)
- Read file
- Write file
## Instructions
[وصف المهمة خطوة بخطوة، مع الإشارة إلى ملفات skill]
## Output Format
[الصيغة الدقيقة التي يتوقعها الأب]
كن حذراً جداً بشأن صيغة الإخراج. إذا كان منظم deploy-gate يتوقع JSON بـ boolean passed و string summary، اشرح ذلك. Subagents التي تُرجع نصاً حراً تكسر التنسيق. تعلمنا هذا بالطريقة الصعبة عندما أرجعت subagent جداول markdown و لم يتمكن الأب من تحليلها. استغرق الأمر ساعتين في الساعة 2 صباحاً لتصحيح الأخطاء لأن الأب فقط فشل بصمت. لا خطأ. فقط لم يشغل كتلة النشر.
لا تكرر خطئي. قفل الصيغة.
Subagent 1: فحص انحدار SEO
هذا يقارن عناصر SEO الحرجة للنسخة الحالية مقابل لقطة أساسية مخزنة.
# Agent: SEO Regression Check
## Role
اكتشف انحدارات SEO بين النسخة الحالية و الأساس المخزن.
## Allowed Tools
- Bash (نصوص node فقط)
- Read file
## Instructions
1. اقرأ ملف skill في .claude/skills/compare-seo-snapshot.md
2. شغل: node scripts/extract-seo-meta.js --url=$PREVIEW_URL --output=/tmp/seo-current.json
3. اقرأ .claude/snapshots/seo-baseline.json
4. قارن بين اللقطتين حقل بحقل:
- علامات العنوان (مطابقة دقيقة)
- وصف meta (التشابه > 0.85)
- عناوين Canonical (مطابقة دقيقة)
- عدد h1 (يجب أن يساوي 1 لكل صفحة)
- robots meta (يجب ألا يتغير إلى noindex)
- Open Graph tags (og:title و og:description و og:image موجودة)
5. ضع علم على أي صفحة حيث تغير robots إلى noindex كـ CRITICAL.
6. ضع علم على علامات العنوان المفقودة أو المكررة كـ HIGH.
7. ضع علم على تغييرات وصف meta > 15% مختلفة كـ MEDIUM.
## Output Format
{"passed": boolean, "critical": [], "high": [], "medium": [], "summary": string}
نص extract-seo-meta.js هو 120 سطراً من Puppeteer التي تضرب كل صفحة في sitemap و تفرغ العنوان و meta و canonicals و h1s و OG tags إلى JSON. لا شيء ذكي. فقط الاستخراج.
قيمة subagent في المقارنة والاستدلال، وليس الاستخراج. يعرف أي التغييرات تهم. أيها تجميلي. أيها سيكلف العميل 15,000 دولار في حركة المرور العضوية في الربع القادم.
مثال: إذا غيرت وصف meta من "Best CRM software for small businesses in 2025" إلى "Best CRM software for small business"، تكون نسبة التشابه 0.91. هذا جيد. لكن إذا تغيرت إلى "CRM software"، ينخفض التشابه إلى 0.65. تضع subagent علم عليه كـ MEDIUM لأن هذا انخفاض بنسبة 40% في كثافة الكلمات الرئيسية و قد يؤذي معدل النقر.
إنه ليس فقط diff. إنه الاستدلال حول ما يعنيه diff بالفعل.
التقطنا أربع مشاكل بهذا حتى الآن. موضوع robots noindex. حالة حيث حذف شخص جميع صور OG (كان سيؤذي المشاركات الاجتماعية). حالة حيث تم قص علامات العنوان إلى 40 حرفاً بدلاً من 60 (بدا فقط سيء، لم يؤذي SEO، لكن العميل كان سيلاحظ). وواحد حيث تغيرت عناوين Canonical من https:// إلى http:// (كان سيسبب عقوبات محتوى مكررة).
كل واحد منهم كان سيكلفنا على الأقل بضع ساعات من التنظيف و ثقة العميل. ربما أكثر.
نخزن seo-baseline.json في الريبو و نحدثه كجزء من hook deploy-success.
Subagent 2: اختبار دخان Core Web Vitals
# Agent: CWV Smoke Test
## Role
شغل Lighthouse على الصفحات الرئيسية و ضع علم على انحدارات CWV.
## Allowed Tools
- Bash
## Instructions
1. اقرأ .claude/skills/run-lighthouse.md
2. شغل Lighthouse CI ضد $PREVIEW_URL للصفحات التالية:
- / (الصفحة الرئيسية)
- /blog/ (الحائمة)
- /blog/[most-recent-post] (التفصيل)
- /services/ (إذا كانت موجودة)
3. الحدود (فشل إذا كان أي منها أقل من):
- LCP: 2500ms
- FID/INP: 200ms
- CLS: 0.1
- درجة الأداء: 85
- درجة إمكانية الوصول: 90
4. إذا كان مقياس قد انخفض بأكثر من 10% من التشغيل السابق،
ضع علم كـ WARNING حتى لو كان لا يزال أعلى من الحد.
5. قم بتضمين العنصر المحدد الذي يسبب LCP أو CLS حيث تقارره Lighthouse.
## Output Format
{"passed": boolean, "pages": [{"url": string, "scores": {}, "flags": []}], "summary": string}
يحتوي ملف skill المرتبط به (run-lighthouse.md) على استدعاء lhci CLI الدقيق:
# Skill: Run Lighthouse
## Command
```bash
npx @lhci/cli@0.14.0 collect \
--url="$1" \
--numberOfRuns=3 \
--settings.preset=desktop \
--settings.output=json \
--settings.outputPath=/tmp/lhci-results/
Parsing
اقرأ التشغيل الوسيط من /tmp/lhci-results/. استخرج:
- categories.performance.score * 100
- audits['largest-contentful-paint'].numericValue
- audits['cumulative-layout-shift'].numericValue
- audits['interaction-to-next-paint'].numericValue (إذا كانت موجودة)
## Subagent 3: فحص إمكانية الوصول
```markdown
# Agent: Accessibility Scan
## Role
شغل pa11y ضد URLs preview و أبلغ عن انتهاكات WCAG 2.1 AA.
## Allowed Tools
- Bash
## Instructions
1. اقرأ .claude/skills/run-pa11y.md
2. شغل pa11y ضد نفس مجموعة الصفحات مثل وكيل CWV.
3. جمّع النتائج حسب الشدة: خطأ و تحذير و ملاحظة.
4. لكل خطأ، قم بتضمين:
- معيار WCAG المنتهك (على سبيل المثال، 1.1.1 Non-text Content)
- عنصر HTML (محدد)
- اقتراح إصلاح بجملة واحدة
5. فشل إذا كان هناك أي أخطاء. حذر إذا كانت التحذيرات > 10.
## Output Format
{"passed": boolean, "error_count": number, "warning_count": number, "errors": [{"criterion": string, "selector": string, "fix": string}], "summary": string}
نحن نستخدم pa11y@8.0.0 بـ --runner=axe flag. محرك htmlcs الافتراضي يفتقد بعض مشاكل التباين اللوني التي يلتقطها axe.
Subagent 4: فحص الرابط المكسور
# Agent: Broken Link Scan
## Role
اسحب موقع الـ preview و أبلغ عن الروابط الداخلية والخارجية المكسورة.
## Allowed Tools
- Bash
## Instructions
1. اقرأ .claude/skills/run-linkinator.md
2. شغل: npx linkinator@6.1.2 $PREVIEW_URL --recurse --timeout 15000 --format json > /tmp/link-results.json
3. صفّي النتائج للحالة >= 400 أو الحالة === 0 (انتهاء المهلة).
4. افصل الروابط المكسورة الداخلية (نفس المجال) عن الخارجية.
5. الروابط المكسورة الداخلية هي CRITICAL. الروابط المكسورة الخارجية هي WARNING.
6. استثن المجالات الخارجية المعروفة بعدم الاستقرار: twitter.com و linkedin.com (يحجبان الزحف).
## Output Format
{"passed": boolean, "internal_broken": [{"source": string, "target": string, "status": number}], "external_broken": [...], "summary": string}
Subagent 5: التحقق من Schema
# Agent: Schema Validation
## Role
تحقق من صحة بيانات JSON-LD المنظمة على جميع الصفحات.
## Allowed Tools
- Bash
- Read file
## Instructions
1. اقرأ .claude/skills/parse-schema-org.md
2. لكل صفحة في sitemap:
أ. استخرج جميع كتل <script type="application/ld+json">
ب. حلل كـ JSON (فشل إذا كان غير صحيح)
ج. تحقق من الحقول المطلوبة حسب @type:
- Article: headline و datePublished و dateModified و author و image
- LocalBusiness: name و address و telephone
- WebPage: name و description
- BreadcrumbList: itemListElement بـ position و name و item
د. تحقق من أن جميع مراجع @id تحل داخل رسم بياني الصفحة
هـ. تحقق من أن عناوين URL في schema مطلقة و ليست نسبية
3. ضع علم على الحقول المطلوبة المفقودة كـ HIGH.
4. ضع علم على JSON غير الصحيح كـ CRITICAL.
## Output Format
{"passed": boolean, "pages": [{"url": string, "schemas": [{"type": string, "valid": boolean, "issues": []}]}], "summary": string}
Subagent 6: منسق بوابة النشر
هذا وكيل الأب يولد الخمسة الآخرين و يتخذ قرار go/no-go.
# Agent: Deploy Gate
## Role
نسق جميع فحوصات ما قبل النشر و أنتج قرار نشر نهائي.
## Allowed Tools
- Bash
- Read file
- Write file
- dispatch_agent
## Instructions
1. أنجب هؤلاء الوكلاء بالتوازي:
- .claude/agents/seo-regression.md
- .claude/agents/cwv-smoke.md
- .claude/agents/accessibility.md
- .claude/agents/broken-links.md
- .claude/agents/schema-validation.md
2. جمّع جميع المخرجات.
3. اقرأ .claude/skills/format-deploy-report.md
4. منطق القرار:
- إذا كان لدى أي وكيل علم CRITICAL: حجب النشر.
- إذا كان لدى 2+ من الوكلاء أعلام HIGH: حجب النشر.
- إذا كان لدى 1 وكيل علم HIGH: حذر و اطلب تجاوز يدوي.
- وإلا: وافق.
5. اكتب التقرير الكامل إلى /tmp/deploy-report.md
6. أخرج القرار.
## Output Format
{"decision": "APPROVE" | "WARN" | "BLOCK", "reports": {agent_name: agent_output}, "summary": string}
إعدادات Hook: settings.json
إليك settings.json الفعلي لدينا (مع عناوين URL خاصة بالعميل المحررة):
{
"hooks": {
"pre-commit": [
{
"agent": ".claude/agents/schema-validation.md",
"condition": "files_changed_match('**/*.json', '**/structured-data/**')",
"env": {
"PREVIEW_URL": "http://localhost:3000"
}
}
],
"pre-push": [
{
"agent": ".claude/agents/deploy-gate.md",
"env": {
"PREVIEW_URL": "$VERCEL_PREVIEW_URL"
},
"timeout": 300,
"on_failure": "block"
}
],
"post-deploy-success": [
{
"command": "node scripts/extract-seo-meta.js --url=$PRODUCTION_URL --output=.claude/snapshots/seo-baseline.json",
"description": "تحديث أساس SEO بعد النشر الناجح"
}
]
},
"agent_defaults": {
"model": "claude-sonnet-4-20250514",
"max_tokens": 8192,
"timeout": 120
},
"skills_directory": ".claude/skills/"
}
ملاحظات حول هذا الإعداد:
- نحن نستخدم
claude-sonnet-4-20250514للوكلاء الفرعيين وليس Opus. لا تبرر مهام الاستدلال هنا فرق التكلفة. يتعامل Sonnet مع "مقارنة كائني JSON و وضع علم على الاختلافات" بشكل جيد. timeout: 300على بوابة النشر يعطي جميع الخمسة وكلاء الوقت للتشغيل. للوكلاء الفرديين حدود افتراضية بـ 120s. المنسق يحصل على 5 دقائق لأنه ينتظر جميعهم.- الـ
conditionعلى hook pre-commit تعني أن التحقق من schema يعمل فقط عند لمس ملفات متعلقة بـ schema. لا فائدة من تشغيله على تغيير CSS. post-deploy-successيحدث الأساس. بدونه، تقارن فحص انحدار SEO ضد بيانات قديمة.
ملفات skill التي تربط كل شيء معاً
ملف skill الذي يقوم بمعظم الأعمال هو compare-seo-snapshot.md:
# Skill: Compare SEO Snapshots
## Purpose
قارن لقطتي بيانات SEO و حدد الانحدارات.
## Input
- لقطة حالية: /tmp/seo-current.json
- لقطة أساسية: .claude/snapshots/seo-baseline.json
## Comparison Rules
### Title Tags
- إذا تغير العنوان و كانت حركة مرور البحث العضوي للصفحة (من بيانات الأساس) > 1000 جلسة/شهر، ضع علم كـ HIGH.
- إذا كان العنوان الآن فارغاً أو يطابق عنوان صفحة أخرى، ضع علم كـ CRITICAL.
- إذا تغير العنوان في صفحة منخفضة حركة المرور، ضع علم كـ MEDIUM.
### Canonical URLs
- أي تغيير لـ canonical URL هو HIGH.
- canonical يشير إلى مجال مختلف هو CRITICAL.
- canonical مفقود (كان موجوداً، الآن ذهب) هو HIGH.
### Robots Meta
- أي صفحة اكتسبت "noindex" هي CRITICAL.
- أي صفحة اكتسبت "nofollow" على الروابط الداخلية هي HIGH.
### صفحات جديدة
- الصفحات في الحالية لكن ليست في الأساس هي INFO (متوقع للمحتوى الجديد).
- لكن تحقق من أن لديها: عنوان و وصف meta و canonical و على الأقل h1 واحد.
### الصفحات المحذوفة
- الصفحات في الأساس لكن ليست في الحالية هي HIGH.
- قد تشير إلى حذف مسار عرضي.
يشفر هذا ملف skill أشهراً من استجابة حادثة SEO في صيغة يمكن لـ Claude أن تتبعها بشكل موثوق. بدونه، كان الوكيل سيصدر أحكاماً معقولة لكن غير متسقة حول ما يشكل انحداراً.
أربع حوادث اكتشفها النظام
الحادثة 1: noindex عرضي على 47 منشور مدونة
العميل: شركة SaaS B2B و 200 صفحة و 60 ألف جلسة عضوية/شهر.
حدّث مطور مكون <Head> في قالب المدونة لإضافة علامة meta جديدة. نسخوا من إعدادات التدريج، التي كانت تحتوي على <meta name="robots" content="noindex, nofollow"> مشفرة. مرت التغيير عبر مراجعة الرمز لأن المراجع ركز على العلامة الجديدة وليس الموجودة.
وضعت subagent انحدار SEO 47 صفحة كـ CRITICAL -- تغير robots meta إلى noindex. تم حجب النشر.
الوقت للكشف: دقيقتان و 14 ثانية بعد الدفع. بدون النظام، كان سيتم اكتشافه عندما أظهرت Search Console انخفاض التغطية بعد 3-7 أيام.
التأثير المقدر الذي تم تجنبه: تحركت تلك ال 47 منشور حوالي 14000 دولار/شهر في خط الأنابيب. حتى حدث deindex لمدة أسبوع واحد كان يمكن أن يكلف 3500 دولار+.
الحادثة 2: انحدار CLS من صورة بطل جديدة
العميل: علامة تجارية للتجارة الإلكترونية و واجهة أمامية Next.js 14 على Shopify Hydrogen.
استبدل فريق التصميم بطل الصفحة الرئيسية بصورة جديدة بنسبة أبعاد مختلفة لكن لم يحدّثوا سمات العرض/الارتفاع على مكون <Image>. تحملت الصورة بشكل جيد لكن سببت CLS من 0.34 -- أعلى بكثير من حد 0.1.
قالت subagent اختبار دخان CWV عن انحدار CLS في الصفحة الرئيسية. الملخص دعا بشكل محدد: "يسبب CLS بـ عنصر img.hero-banner يتحول 0.34 تراكمي. الصورة الأبعاد (1920x800) لا تطابق نسبة أبعاد الحاوية (16:9 = 1920x1080). أضف العرض الصريح={1920} الارتفاع={800} أو حدّث الحاوية."
الوقت للكشف: دقيقة و 47 ثانية.
الحادثة 3: روابط داخلية معطلة بعد إعادة هيكلة URL
العميل: شركة خدمات احترافية و 80 صفحة.
أعدنا هيكلة صفحات الخدمة الخاصة بهم من /services/[name] إلى /[category]/[name]. كانت إعادات التوجيه في مكانها، لكن ثلاث منشورات مدونة كانت تحتوي على روابط مشفرة للعناوين القديمة و كان لديها الملاحة التي تحركها CMS إدخال مخزن مؤقت يشير إلى صفحة محذوفة.
وجد فحص الرابط المكسور 4 404s داخلية. لاحظ ملخص subagent أن 3 من ال 4 كانوا في محتوى نص منشور المدونة (وليس الملاحة) مما يعني أنهم فاتهم بواسطة تدقيق إعادة التوجيه.
الوقت للكشف: 3 دقائق و 8 ثوانٍ. زحف linkinator هو الجزء الأبطأ.
الحادثة 4: تاريخ معدل مفقود في Article schema
العميل: شركة إعلام و 2000 مقالة.
فقدت هجرة CMS من WordPress إلى Sanity تعيين الحقل dateModified. انعكف رمز توليد schema إلى null لـ dateModified الذي أنتج JSON-LD غير صحيح.
وضعت subagent التحقق من schema علم على كل صفحة مقالة كـ HIGH -- حقل dateModified المطلوب مفقود. الملخص شرح: "يتطلب Google dateModified لبيانات Article المنظمة ليكون مؤهلاً لقصص الويب الرئيسية و النتائج الغنية. تتأثر جميع صفحات المقالات ال 2147."
الوقت للكشف: 4 دقائق و 22 ثانية (sitemap كبير).
العائد على الاستثمار: دقائق محفوظة لكل شحنة و دولارات شهرية
إليك الحسابات الخاصة بنا:
| Metric | Before (CI + manual) | After (subagents) | Delta |
|---|---|---|---|
| الفحوصات لكل نشر | 4 أدوات و مراجعة يدوية | 5 وكلاء و متوافق | +1 فحص و -100% مراجعة يدوية |
| الوقت لتشغيل جميع الفحوصات | 8-12 دقيقة (CI متسلسل) | 3-5 دقائق (subagents متوازي) | -60% |
| الوقت لفهم الأخطاء | 20-40 دقيقة لكل فشل | 1-2 دقيقة (ملخص سياقي) | -90% |
| النشر في الأسبوع (جميع العملاء) | 18 | 18 | نفسه |
| معدل الإيجابي الخاطئ | ~15% (Lighthouse صاخب) | ~4% (تصفية الاستدلال الضوضاء) | -73% |
دقائق محفوظة لكل شحنة: معدل 25 دقيقة عند فشل فحص (30% من النشر). هذا 25 × 5.4 نشر فاشل/أسبوع = 135 دقيقة/أسبوع = 9 ساعات/شهر.
تكلفة النظام:
- تكاليف Claude API للوكلاء الفرعيين: ~$0.12 لكل تشغيل بوابة نشر كامل (5 وكلاء و Sonnet و متوسط 6000 token لكل وكيل)
- 18 نشر/أسبوع × 4.3 أسابيع × $0.12 = $9.29/شهر في تكاليف API
- بنية Puppeteer/Lighthouse: تعمل على نسخ البناء الموجودة Vercel و لا تكلفة إضافية
- وقت الصيانة: ~ساعتين/شهر لتحديث ملفات skill و الحدود
القيمة الدولارية لوقت المهندس المحفوظ: 9 ساعات/شهر × $85/ساعة (معدل مختلط لفريقنا) = $765/شهر محفوظ.
القيمة الدولارية للحوادث التي تم منعها: بناءً على الحوادث الأربع أعلاه، كان الحادث noindex وحده يمكن أن يكلف 3500 دولار. إذا منعنا حادثة واحدة مثل هذا كل ربع سنة، فهذا $1166/شهر في تأثير العميل المتجنب.
صافي العائد على الاستثمار: $1920/شهر في القيمة مقابل $9.29/شهر في تكاليف API. هذا عائد 206 مرة. حتى لو أضعفت تكاليف API بـ 10 مرات لفريق أكبر، فإنه لا يزال مواتياً.
الفجوات وما كنا سنغيره
هذا النظام ليس مثالياً. إليك ما لا يزال خشناً:
لا اختبار انحدار بصري. يمكن للوكلاء الفرعيين تشغيل Lighthouse و pa11y لكن لا يمكنهم النظر إلى لقطات الشاشة و القول "قسم البطل مكسور." نحن نراقب قدرات رؤية Claude على هذا.
انجراف الأساس. يحدّث الأساس SEO عند النشر الناجح و لكن إذا شحنت انحداراً لم يلتقطه النظام *، فإنه يصبح الأساس الجديد. نحن نراجع الأساسيات يدويًا شهريًا.
عدم استقرار الرابط الخارجي. Twitter/X و LinkedIn و بعض المواقع الحكومية تحجب الزحف أو تحد بشكل عدواني. نحتفظ بقائمة الاستبعاد و لكن تحتاج إلى تحديثات يدوية.
وقت البداية البارد. يستغرق التشغيل الأول بعد نسخ repo وقتاً أطول لأن npx يحتاج إلى جلب الحزم. نحن نفكر في تثبيت مسبق لأدوات CLI في طبقة Docker.
حدود معدل Anthropic. قد يؤدي توليد 5 وكلاء فرعيين بشكل متزامن إلى ضرب حدود معدل Claude API أحياناً خلال ساعات الذروة. أضفنا تبعثر بـ 2 ثانية بين التوليد، والذي يعمل لكنه غير أنيق.
تنتج تعريفات الوكيل الأطول لدينا (التحقق من schema هو 400 كلمة) أحياناً مخرجات أقل تنظيماً من الأقصر. نحن نفكر في تقسيم وكيل التحقق من schema إلى sub-subagents لكل نوع.
الأسئلة الشائعة
هل تعمل subagents Claude Code مع أي LLM أم فقط Claude؟
Subagents هي ميزة Claude Code مرتبطة بـ Anthropic API. تحتاج إلى مفتاح Claude API مع الوصول إلى Claude Code. تنسيق تعريف الوكيل محدد لاتفاقية دليل .claude/ الخاصة بـ Claude Code و ليس معياراً عاماً.
كم تكلف تشغيل خمسة وكلاء فرعيين لكل نشر في رسوم API؟
بمقياسنا، تقريباً $0.12 لكل تشغيل بوابة نشر كامل باستخدام Claude Sonnet. هذا حوالي $9-10/شهر لـ 18 نشر في الأسبوع. كان Opus سيكلف حوالي 5 مرات أكثر لكننا لم نجد ذلك ضروريًا لهذه المهام.
هل يمكن لـ subagents تشغيل في أنابيب CI/CD مثل GitHub Actions؟
نعم. يمكنك استدعاء Claude Code بدون رؤوس في بيئة CI. نحن نشغل لنا عند اكتمال نشر Vercel preview عبر webhook يستدعي claude-code run .claude/agents/deploy-gate.md مع عنوان URL الـ preview كمتغير بيئة.
ما الفرق بين مهارة Claude Code و subagent؟
مهارة هي ملف تعليمات markdown يعلم Claude كيفية القيام بشيء ما -- مثل الوصفة. subagent هي نسخة Claude معزولة يمكن توليدها بسياقها الخاص والأدوات. الوكلاء الفرعيين استخدام المهارات. فكر في المهارات كموثق و الوكلاء كعمال.
هل تحتاج إلى ميزة Anthropic Routines أم أن subagents الخام كافية؟
بالنسبة لسير عمل deploy gate الخاص بنا، subagents الخام بالإضافة إلى hooks في settings.json كافية. تضيف Routines طبقة تنسيق أعلى مستوى مفيدة لسير عمل أكثر تعقيداً. قد نعتمد Routines إذا نمت فحوصات النشر الخاصة بنا بما يتجاوز ستة وكلاء.
كيف تتعامل مع فشل subagent أو انتهاء المهلة الزمنية؟
لكل subagent حد انتهاء مهلة 120 ثانية. إذا فشل subagent أو انتهت المهلة الزمنية، فإن منسق بوابة النشر يعامله كـ WARN و ليس BLOCK. نحن نفضل الشحن مع فحص غير مكتمل بدلاً من حجب النشر لأن Lighthouse تعثرت. يلاحظ الملخص أي فحوصات لم تكتمل.
هل يمكن لهذا النهج استبدال الأدوات المخصصة مثل Lighthouse CI أو pa11y؟
لا -- إنه يلفها. يستدعي subagents هذه الأدوات عبر bash ثم يستدل حول الإخراج. ما تزال بحاجة إلى الأدوات الأساسية المثبتة. القيمة موجودة في طبقة التنسيق و الارتباط و التقارير باللغة الطبيعية و ليس في استبدال الماسحات الضوئية نفسها.