ساعت ۱۰:۰۲، کاربر پرداخت را تأیید می‌کند؛ PSP مبلغ را ثبت می‌کند اما پاسخ در شبکه گم می‌شود. سرویس Checkout، Timeout را «عدم پرداخت» می‌فهمد و با مرجع تازه دوباره درخواست می‌فرستد. ساعت ۱۰:۰۴، مشتری دو برداشت می‌بیند. نوشتن «علت ریشه‌ای: خطای برنامه‌نویس در Retry» سریع است، اما توضیح نمی‌دهد چرا State مبهم بود، چرا مرجع تازه مجاز شد، چرا Reconciliation قبل از Retry وجود نداشت، چرا تست Timeout-after-commit غایب بود و چرا Alert اختلاف Ledger را دیر دید.

تحلیل علت ریشه‌ای (Root Cause Analysis یا RCA) فرایندی Evidence-led برای بازسازی رخداد، آزمودن چند فرضیهٔ علّی و تبدیل یادگیری به کنترل قابل‌راستی‌آزمایی است. خروجی خوب، داستان متقاعدکننده یا نام یک مقصر نیست؛ زنجیره‌ای از Fact→Causal hypothesis→Evidence for/against→Action→Effectiveness verification است. این راهنما RCA را برای نقص‌ها، رخدادهای Production و Near missهای نرم‌افزاری از ابتدا تا بسته‌شدن اقدام‌ها اجرا می‌کند.

تحلیل علت ریشه‌ای چیست و چه چیزی نیست؟

RCA عنوان جمعی برای روش‌هایی است که می‌کوشند بفهمند یک پیامد نامطلوب چگونه و تحت چه شرایطی ممکن شد و چه تغییر کنترل‌شده‌ای احتمال یا شدت تکرار آن را کاهش می‌دهد. در سیستم توزیع‌شده، معمولاً «یک ریشه» وجود ندارد؛ Trigger، شرایط نهفته، کنترل غایب، عامل تشدیدکننده و شکاف تشخیص ممکن است با هم Incident را بسازند.

RCA با Fix باگ یکی نیست

Fix رفتار معیوب فعلی را اصلاح می‌کند؛ RCA می‌پرسد چرا آن رفتار ایجاد، پذیرفته، منتشر، دیر کشف یا سخت بازیابی شد. همهٔ باگ‌ها به RCA کامل نیاز ندارند و هر RCA نیز الزاماً به تغییر کد ختم نمی‌شود. برای گردش یک Defect از ثبت تا Verification، راهنمای مدیریت نقص نرم‌افزار را ببینید؛ این مقاله نقطهٔ عمیق یادگیری پس از Triggerهای تعریف‌شده را مالک است.

RCA با Troubleshooting یکی نیست

Troubleshooting در لحظه می‌پرسد «چه چیزی را تغییر دهیم تا سرویس برگردد؟». RCA پس از تثبیت می‌پرسد «چه ترکیبی از شرایط و کنترل‌ها این رخداد و این Impact را ممکن کرد؟». Restart ممکن است Recovery مؤثر باشد، اما علت و اقدام پیشگیرانه نیست.

RCA با Postmortem یکی نیست

Postmortem یک Artifact وسیع‌تر است: Summary، Impact، Timeline، Detection، Response، آنچه خوب/بد پیش رفت، عوامل علّی، جاهایی که خوش‌شانس بودیم و Action itemها. RCA بخش تحلیل علّی آن است. یک Defect مهم بدون Incident نیز می‌تواند RCA داشته باشد؛ یک Postmortem نیز ممکن است چند مسیر علّی داشته باشد.

RCA با Retrospective و FMEA یکی نیست

Retrospective چرخهٔ عمومی بازاندیشی تیم است؛ RCA حول یک Event یا Cluster شواهدی شکل می‌گیرد. FMEA و Threat modeling آینده‌نگرند و Failure modeهای ممکن را پیش از رخداد تحلیل می‌کنند؛ RCA عمدتاً پس‌نگر است. یادگیری RCA باید مدل‌های آینده‌نگر را به‌روزرسانی کند، نه اینکه جای آن‌ها را بگیرد.

ابتدا مهار؛ تحلیل عمیق بعد از تثبیت

در زمان Incident، اولویت با ایمنی کاربر، محدودکردن Blast radius، توقف زیان، Recovery و ارتباطات است. جلسهٔ طولانی «پنج چرا» هنگام برداشت تکراری یا نشت داده، Attention پاسخ‌گوها را مصرف می‌کند.

سه جریان را از هم جدا کنید

  1. Response: Detect، Triage، Contain، Mitigate، Recover و Communicate؛
  2. Evidence preservation: حفظ لاگ، Trace، Snapshot پیکربندی، فرمان‌ها و Decision log بدون ایجاد خطر تازه؛
  3. Learning: Timeline، RCA، اقدام، Verification و انتشار متناسب پس از تثبیت.

NIST در SP 800-61 Revision 3 Incident response را بخشی از Cybersecurity risk management می‌بیند و بر بهبود آمادگی، Detection، Response و Recovery تأکید می‌کند. برای رخداد امنیتی، الزامات قانونی/قراردادی، Evidence handling و افشای هماهنگ را با تیم Security/Legal تعیین کنید؛ این مقاله مشاورهٔ حقوقی نیست.

Fix فوری را با Cause اشتباه نگیرید

Mitigation: Retry پرداخت موقتاً خاموش شد.
Recovery: تراکنش‌های مبهم Reconcile و مبالغ تکراری بازگردانده شد.
Correction: State machine رفتار Unknown را اصلاح کرد.
Corrective action: Retry فقط با همان Operation ID و پس از lookup مجاز شد.
Detection action: اختلاف PSP↔Ledger ظرف ۵ دقیقه Alert می‌شود.
Systemic action: همین قرارداد در تمام Adapterهای پرداخت Audit شد.

هر شش مورد ارزش دارند، اما نقش یکسان ندارند. خاموش‌کردن Retry Incident را مهار می‌کند؛ به‌تنهایی اثبات نمی‌کند Failure class برطرف شده است.

چه زمانی RCA کامل ارزش دارد؟

اگر هر Bug یک جلسهٔ چندساعته بسازد، فرایند به تشریفات تبدیل می‌شود. Triggerها را پیش از رخداد تعریف و عمق تحلیل را با Risk متناسب کنید.

Triggerهای مناسب

  • Impact کاربر یا کسب‌وکار از آستانهٔ تعریف‌شده عبور کرده است؛
  • از دست‌رفتن/خرابی داده، زیان مالی، Security/Privacy یا Safety مطرح است؛
  • Rollback، Failover، مداخلهٔ On-call یا Recovery طولانی لازم شده است؛
  • Monitoring شکست خورده و مشتری یا عملیات رخداد را زودتر دیده است؛
  • Defect یا Failure mechanism در چند محصول/تیم تکرار یا Cluster شده است؛
  • Near miss نشان داده فقط شانس، ساعت روز یا حضور فرد خاص مانع Impact شده است؛
  • Stakeholder مجاز بر پایهٔ Risk درخواست تحلیل کرده است.

راهنمای فرهنگ Postmortem در Google SRE نیز معیارهایی مانند اختلال کاربر، Data loss، مداخلهٔ On-call، زمان رفع بالا و Monitoring failure را مثال می‌زند و توصیه می‌کند Triggerها از قبل روشن باشند.

سه عمق عملی

عمق مناسب برای حداقل خروجی
Learning note نقص کم‌اثر و تک‌موردی با Mechanism روشن Fact، Cause hypothesis، Fix، Regression evidence
Mini RCA تکرار، Near miss یا Risk متوسط Timeline کوتاه، چند فرضیه، Action/Owner/Verification
Full RCA/Postmortem Impact شدید، داده/مالی/امنیت یا چندسیستمی Scope، Impact، Timeline، Causal graph، Response review، Action portfolio، review

Severity به‌تنهایی تعیین‌کننده نیست. Incident کم‌اثر که فقط با خوش‌شانسی کوچک مانده، ممکن است یادگیری عمیق‌تری از یک Failure پراثر اما کاملاً شناخته‌شده داشته باشد.

تیم RCA و حق تصمیم

RCA نباید گزارش انفرادی کسی باشد که قرار است از تصمیم خودش دفاع کند. تیم کوچک اما چنددیدگاهی تشکیل دهید و Scope/Authority را از ابتدا روشن کنید.

نقش‌های پیشنهادی

  • Facilitator: فرایند، زبان بی‌طرف، Timebox و تفکیک Fact/Hypothesis را نگه می‌دارد؛
  • Incident/Defect owner: Timeline و زمینهٔ Response را ارائه می‌کند؛
  • Service/Engineering owner: Mechanism و معماری را بررسی می‌کند؛
  • QA/Test: Test basis، Evidence gap، Oracle و بازتولید را می‌آورد؛
  • SRE/Ops/Data/Security: Telemetry، تغییر، ظرفیت، داده و تهدید مربوط را بررسی می‌کند؛
  • Product/Support/Business: Impact واقعی و Journey مشتری را اصلاح می‌کند؛
  • Action owner: تحویل و Evidence اثر هر اقدام را می‌پذیرد؛
  • Risk/decision owner: Residual risk، بودجه و استثنا را می‌پذیرد یا رد می‌کند.

مسئولیت کیفیت و اقدام‌ها بین نقش‌ها توزیع می‌شود؛ مدل عملی در رهبری کیفیت با مالکیت همگانی توضیح داده شده است.

Blameless یعنی بدون مسئولیت نیست

Blameless یعنی رفتار افراد را در اطلاعات، ابزار، فشار، Incentive و Guardrail همان لحظه تحلیل کنیم و زبان تحقیرآمیز به کار نبریم. Action owner، Due date، Escalation و Risk acceptance همچنان لازم‌اند. رفتار عمدی زیان‌بار یا مسائل انضباطی ممکن است مسیر مستقل سازمانی داشته باشد، اما نباید بهانه‌ای برای توقف تحلیل System factors شود.

Evidence Pack را قبل از فراموشی بسازید

حافظه پس از Incident با Outcome و روایت‌های دیگران تغییر می‌کند. ابتدا دادهٔ خام و محدودیت آن را حفظ کنید؛ سپس جلسهٔ مشترک را برگزار کنید.

حداقل بستهٔ شواهد

{
  "case_id": "INC-PAY-2026-0812",
  "scope": "checkout → payment adapter → PSP → ledger",
  "build_commit": "checkout-2841@a4c91e7",
  "config_flags_hash": "sha256:...",
  "environment": "production-ir-2",
  "time_basis": "UTC; display=Asia/Tehran",
  "impact_window_utc": ["06:31:02Z", "06:48:19Z"],
  "affected": { "orders": 27, "confirmed_duplicate_charges": 3 },
  "correlation_keys": ["order_id", "payment_operation_id", "psp_reference"],
  "evidence": ["trace", "app_log", "audit_log", "deploy", "psp_export", "ledger"],
  "redactions": ["card", "mobile", "token"],
  "known_gaps": ["PSP network trace unavailable"]
}

Evidence فرّار را اولویت دهید

  • Log/Traceهایی که Retention کوتاه دارند؛
  • Config، Feature flag، Secret version و Runtime image در زمان رخداد؛
  • Deploy، Migration، Dependency status و Vendor notice؛
  • Queue offset، DB state، Cache state و Replica lag؛
  • فرمان‌های دستی و Decisionهای Incident channel با Timestamp؛
  • Ticketهای Support و Impact تأییدشده، نه تخمین تکراری؛
  • نمونهٔ Sanitized Request/Response با Correlation ID.

Evidence safety

شماره کارت، موبایل، Token، Cookie، Secret و دادهٔ هویتی را در Postmortem عمومی کپی نکنید. دسترسی، Retention، Redaction و Audit را متناسب با حساسیت تعریف کنید. فایل Vendor را با Source، زمان دریافت و Hash نگه دارید؛ نبود داده را «Unknown» ثبت کنید، نه اینکه با حدس پر شود.

Timeline را با Fact بسازید، نه داستان

Timeline ستون فقرات RCA است. برای هر ردیف، زمان Event، زمان مشاهده، Source و Confidence را ثبت کنید. Log timestamp ممکن است زمان ثبت باشد نه زمان واقعی وقوع؛ Clock skew و timezone باید معلوم باشند.

سه برچسب اجباری

  • Observation: «PSP export دو Reference موفق برای Order O-۷۳۱ دارد.»
  • Inference: «احتمالاً Retry دوم پس از Timeout باعث Reference دوم شده است.»
  • Unknown: «نمی‌دانیم پاسخ اول در PSP edge یا شبکهٔ بین‌راهی گم شد.»

عبارت «PSP خراب شد» نه Observation دقیق است و نه Mechanism اثبات‌شده.

Timeline نمونه

UTC Observation Source معنا/وضعیت
06:31:02.114 Operation P-۷۳۱ ایجاد شد Audit log Fact
06:31:03.408 PSP Reference R-A موفق شد PSP export Fact
06:31:08.409 Client timeout ثبت شد؛ Local state=FAILED Trace/App log Fact؛ State classification مشکوک
06:31:09.021 Retry با Operation P-۷۳۲/Reference تازه ارسال شد Audit/Trace Fact
06:31:10.206 PSP Reference R-B موفق شد PSP export Fact
06:31:12.050 Callback C-A پردازش شد Inbox/Ledger Fact
06:31:12.330 Callback C-A دوباره پردازش شد Inbox/Ledger Fact؛ dedupe غایب
06:46:41.002 Support نخستین گزارش مشتری را ثبت کرد CRM Detection gap

زمان ذخیره‌شده UTC و نمایش تهران باید جدا باشد. Timestamp جلالی یا متن فارسی برای ارتباط مفید است، اما Join فنی میان App، PSP و Ledger باید بر Instant و Correlation ID پایدار تکیه کند.

Problem Statement و Impact را قابل آزمون بنویسید

«سیستم پرداخت مشکل داشت» محدوده و Oracle ندارد. Problem statement باید Condition، رفتار مشاهده‌شده، Expected behavior، Scope، Impact، Window و Unknown را روشن کند.

قالب Problem statement

Between [start/end, clock basis], for [cohort/environment/build],
when [condition/event], the system [observed behavior]
instead of [expected invariant], resulting in [verified impact].

Confirmed scope: ...
Potential scope: ...
Excluded by evidence: ...
Unknown: ...

نمونهٔ پرداخت

بین ۰۶:۳۱ تا ۰۶:۴۸ UTC در Build ۲۸۴۱، برای سفارش‌هایی که PSP پس از Commit پاسخشان Timeout شد، Checkout وضعیت را Failed و Retry را با Operation تازه مجاز کرد؛ در سه سفارش از ۲۷ مورد بررسی‌شده دو برداشت موفق تأیید شد، برخلاف Invariant «حداکثر یک Capture موفق برای هر Payment intent». دامنهٔ Vendorهای دیگر هنوز Unknown است.

واژگان علّی را دقیق کنید

بحث «این Root cause است یا نه؟» زمانی بی‌پایان می‌شود که واژگان قرارداد ندارند. یک Taxonomy عملی انتخاب و در Template ثبت کنید.

Trigger

Event آغازگر نزدیک به رخداد است: Deployment، Timeout، Spike، پیام تکراری یا Expired certificate. Trigger ممکن است کاملاً عادی باشد؛ سیستم باید آن را تحمل می‌کرده است.

Causal factor

شرط یا رویدادی است که از طریق Mechanism مشخص در پیامد سهم داشته است. «مرجع تازه در Retry» Causal factor است اگر Timeline و Replay نشان دهد مسیر برداشت دوم را باز کرده است.

Contributing condition

احتمال یا شدت را بیشتر می‌کند اما به‌تنهایی مسیر را کامل نمی‌سازد: فشار Release، مستندات مبهم Vendor، Visibility کم یا Coupling بالا.

Latent/system condition

ضعفی است که پیش از Trigger وجود داشته: State machine بدون Unknown، نبود DB constraint، Review checklist ناقص یا مالک نامعلوم Contract.

Detection، mitigation و recovery gap

این‌ها شاید رخداد را ایجاد نکرده باشند، اما Impact را بزرگ کرده‌اند: Alert فقط HTTP 5xx را دیده، Kill switch وجود نداشته، Runbook قدیمی بوده یا Reconciliation دیر اجرا شده است.

Actionable root/system cause

عامل سطح سیستمیِ دارای Mechanism و Evidence است که با تغییر آن می‌توان مسیر مشابه را به‌طور معنادار دشوارتر یا کم‌اثرتر کرد. یک RCA می‌تواند چند عامل از این نوع داشته باشد؛ واژهٔ Root نباید وانمود کند شبکهٔ علّی فقط یک انتها دارد.

فرضیهٔ علّی را مثل Test case مدیریت کنید

جلسهٔ Brainstorming علت تولید می‌کند، نه حقیقت. هر Candidate باید شناسه، Mechanism، شواهد موافق/مخالف، Alternative و آزمون داشته باشد.

کارت فرضیه

id: H-PAY-02
statement: >
  وقتی PSP پس از Commit پاسخ نداد، طبقه‌بندی Timeout به FAILED
  و ساخت Operation ID تازه، Retry دوم را مانند پرداخت مستقل پذیرفت
  و امکان Capture دوم را ایجاد کرد.
mechanism: ambiguous-outcome → false-failure → new-identity → second-capture
evidence_for:
  - PSP export shows R-A and R-B successful for the same order
  - audit log shows new operation before R-B
evidence_against:
  - no duplicate on 24 timeout-before-commit cases
alternatives:
  - PSP duplicated one request internally
counterfactual:
  - same operation + reconcile-before-retry should yield one capture
test:
  - replay timeout-after-commit against PSP contract stub and sandbox sample
confidence: medium
owner: payments-team
status: open

صورت‌بندی علّی بی‌طرف

When [operating condition], [control/design state]
allowed [mechanism], which contributed to [observable outcome].

Evidence: [for / against / gap]
Counterfactual: if [control], we expect [observable difference].

«توسعه‌دهنده فراموش کرد Idempotency بگذارد» Mechanism، شرایط تصمیم و Control system را حذف می‌کند. صورت بهتر: «وقتی Outcome شبکه مبهم بود، API داخلی State=FAILED و Operation ID تازه را مجاز کرد؛ هیچ Contract test یا constraintی این Transition را رد نکرد.»

Evidence علّی را درجه‌بندی کنید

هم‌زمانی یا وقوع پس از یک Deploy، به‌تنهایی علت را اثبات نمی‌کند. قدرت Evidence را صریح ثبت کنید.

نردبان عملی Evidence

  1. Temporal association: عامل پیش از پیامد دیده شده است؛
  2. Covariation: Cohort دارای عامل، Failure بیشتری از Cohort مقایسه دارد؛
  3. Mechanism trace: Trace/State transition مسیر اثر را نشان می‌دهد؛
  4. Reproduction: همان شرایط Outcome را در محیط کنترل‌شده تولید می‌کند؛
  5. Counterfactual/intervention: با حذف یا کنترل عامل، Outcome تحت همان شرایط رخ نمی‌دهد؛
  6. Field confirmation: پس از تغییر، در فرصت‌های کافی و مشابه، Signal هدف بهتر و Guardrail سالم می‌ماند.

این نردبان رتبه‌بندی دانشگاهی یا اثبات قطعی نیست؛ ابزاری برای نمایش عدم‌قطعیت است. Reproduction آزمایشگاهی ممکن است Fidelity محدود داشته باشد و Field confirmation نیز با تغییرات هم‌زمان Confound شود.

Evidence مخالف را اجباری کنید

برای هر Hypothesis بپرسید چه چیزی آن را رد می‌کند. اگر هیچ مشاهده‌ای نمی‌تواند فرضیه را False کند، احتمالاً ادعا بیش از حد کلی است. کنترل سوگیری شناختی در تست نرم‌افزار برای Anchoring، Hindsight و Premature closure در RCA حیاتی است.

پنج چرا را شاخه‌ای و شواهدمحور اجرا کنید

Five Whys یک ابزار Drill-down است، نه شمارنده و نه اثبات. مستندات ASQ دربارهٔ Five Whys نیز تصریح می‌کند رسیدن به جزئیات ممکن است کمتر یا بیشتر از پنج پرسش بخواهد.

روش صحیح

  1. از Problem statement قابل مشاهده آغاز کنید.
  2. برای هر «چرا»، Evidence source و Owner سؤال را ثبت کنید.
  3. وقتی چند پاسخ هم‌زمان معتبرند، شاخه بسازید؛ یکی را دلخواه انتخاب نکنید.
  4. Trigger، Creation، Escape، Detection و Recovery را در شاخه‌های جدا دنبال کنید.
  5. در «خطای انسانی»، «فرایند ضعیف» یا «آموزش ناکافی» توقف نکنید.
  6. وقتی Cause به Control قابل‌آزمون رسیده و شاخه‌های مهم Evidence دارند، Stop کنید؛ نه صرفاً در Why شمارهٔ پنج.

پنج چرای شاخه‌ای برای پرداخت

Outcome: دو Capture موفق برای یک Payment intent
├─ چرا Capture دوم ایجاد شد؟
│  └─ Retry با Operation/Reference تازه ارسال شد. [audit + PSP export]
│     ├─ چرا تازه؟ Timeout به FAILED قطعی نگاشت شد. [state transition]
│     │  └─ چرا Unknown نبود؟ Contract نتیجه مبهم را مدل نکرده بود. [spec/code]
│     └─ چرا قبل از Retry lookup نشد؟ Reconciliation API/flow وجود نداشت. [design]
├─ چرا Control جلوی آن را نگرفت؟
│  ├─ Unique business constraint روی active capture نبود. [schema]
│  └─ PSP idempotency semantics در Adapter contract نشده بود. [contract gap]
└─ چرا پیش از مشتری کشف نشد؟
   ├─ تست timeout-after-commit در suite نبود. [test inventory]
   └─ Alert فقط HTTP error را دید، نه PSP↔Ledger mismatch. [monitor config]

خطای رایج

پرسش هدایت‌کننده مثل «چرا QA این را نگرفت؟» مسیر را از قبل به یک نقش می‌بندد. سؤال بهتر: «چه Evidence پیش از Release برای این Failure mechanism وجود داشت، چرا کافی نبود و چه Signals دیگری می‌توانستند آن را Detect یا Mitigate کنند؟»

Fishbone فرضیه تولید می‌کند، نه Cause اثبات‌شده

نمودار Ishikawa یا Cause-and-effect برای بازکردن فضای جست‌وجو مفید است. دسته‌ها باید با Software context سازگار شوند؛ الزاماً People/Process/Technology کافی نیست.

دسته‌های پیشنهادی نرم‌افزار

  • Requirement/Decision؛
  • Design/Architecture/State؛
  • Code/Dependency/Configuration؛
  • Test/Data/Environment/Oracle؛
  • Deployment/Operation/Capacity؛
  • Monitoring/Alert/Response؛
  • Vendor/Network/External contract؛
  • Organization/Ownership/Incentive/Workload.

بعد از Brainstorm چه کنیم؟

هر استخوان فقط Candidate است. Duplicateها را ادغام، ادعاهای بدون Mechanism را بازنویسی، Evidence جمع و Alternativeها را آزمایش کنید. رأی اکثریت یا حضور یک علت روی نمودار، آن را واقعی نمی‌کند.

Timeline، Change analysis، Barrier analysis و Fault tree

ابزار را بر اساس سؤال انتخاب کنید؛ «بهترین تکنیک RCA» مستقل از مسئله وجود ندارد.

ابزار بهترین سؤال خروجی محدودیت
Timeline چه رخ داد و کدام تصمیم چه زمانی بود؟ توالی Fact/Unknown به‌تنهایی علت را ثابت نمی‌کند
Five Whys این مسیر چگونه از علامت به Control رسید؟ زنجیره/شاخهٔ پرسش Anchoring و تک‌علتی‌شدن
Fishbone چه خانواده‌هایی از Hypothesis جا مانده‌اند؟ فضای Candidate فهرست، Evidence نیست
Change analysis چه چیز میان Cohort سالم و معیوب تغییر کرد؟ Deltaهای قابل آزمون تغییر هم‌زمان ≠ Cause
Barrier analysis چه Controlهایی باید Prevent/Detect/Mitigate می‌کردند؟ Barrier gap/degradation ممکن است Trigger را کم‌رنگ کند
Fault tree چه AND/OR ترکیبی Top event را ممکن می‌کند؟ منطق و Minimal cut set به Model/Evidence خوب وابسته است
Pareto کدام Cluster بیشترین حجم/Impact را دارد؟ اولویت Investigation قانون ۸۰/۲۰ و Cause را اثبات نمی‌کند

Pareto را قانون طبیعت ندانید

ممکن است ۲۰٪ Categoryها ۸۰٪ Impact را بسازند، ممکن هم هست نسازند. Category باید Mutually meaningful، داده باید Canonical و Impact باید وزن‌دار باشد. Pareto می‌گوید از کجا شروع کنیم؛ نمی‌گوید چرا رخداد اتفاق افتاد.

Barrier map پرداخت

Prevent:
  stable business operation identity      → absent
  explicit UNKNOWN state                  → absent
  uniqueness/transition constraint        → absent

Detect:
  PSP↔Ledger near-real-time reconciliation → delayed
  duplicate-capture invariant alert        → absent

Mitigate:
  retry kill switch                        → present, manual
  refund workflow                          → present, slow

Recover/Learn:
  transaction replay fixture               → absent
  incident trigger and action owner         → partial

در «Human error» توقف نکنید

OSHA در راهنمای Incident Investigation هشدار می‌دهد نتیجه‌گیری‌هایی مانند Carelessness یا رعایت‌نشدن Procedure، عوامل زیربنایی و تغییرات سیستمی لازم را پنهان می‌کنند. این اصل از ایمنی صنعتی آمده، اما پرسش سیستمی آن برای نرم‌افزار نیز مفید است.

پرسش‌های جایگزین

  • فرد در لحظه چه اطلاعات و Constraintsی داشت؟
  • آیا Safe action آسان‌تر از Unsafe action بود؟
  • چه Validation خودکاری می‌توانست حالت خطرناک را ناممکن یا آشکار کند؟
  • آیا Procedure قابل اجرا، به‌روز، تمرین‌شده و در دسترس بود؟
  • آیا Deadline، Queue، Alert fatigue یا Incentive تصمیم را شکل داد؟
  • چرا Review/Test/Deploy/Monitorهای چندلایه اثر را متوقف نکردند؟

Accountability واقعی

زبان سیستمی به معنی پاک‌کردن Decision log یا Owner نیست. ثبت می‌کنیم چه کسی در چه نقش و با چه داده‌ای تصمیم گرفت، اما Action را به «آدم دقیق‌تری باش» تقلیل نمی‌دهیم. مسئولیت‌پذیری سالم یعنی Owner اقدام، موعد، Evidence اثر و Escalation روشن باشد.

از علت به اقدام: RCA بدون Action ناقص است

منبع RCA² مؤسسه IHI در حوزهٔ ایمنی بیمار، با افزودن Actions به نام روش تأکید می‌کند که هدف نهایی پیشگیری از آسیب است. حوزهٔ سلامت با نرم‌افزار یکسان نیست، اما اصل انتقال‌پذیر مهم است: اقدام‌های سیستمی که اتکای کمتری به حافظه دارند، معمولاً از آموزش/هشدار تنها قوی‌ترند.

انواع اقدام را جدا کنید

  • Correction: رفع نمونهٔ فعلی؛
  • Corrective: بستن همان مسیر علّی؛
  • Preventive/systemic: یافتن و بستن مسیر مشابه در Scopeهای دیگر؛
  • Detection: کوتاه‌کردن زمان کشف؛
  • Mitigation/recovery: کم‌کردن Impact و زمان بازگشت؛
  • Learning: حفظ Knowledge و به‌روزرسانی Test/Risk/Runbook.

نردبان قدرت اقدام

قدرت نسبی مثال نرم‌افزاری ریسک/ملاحظه
قوی‌تر حذف State خطرناک؛ DB constraint؛ forcing function؛ idempotent state machine؛ کاهش Coupling پیچیدگی Migration و Failure mode تازه
قوی/میانی Validation خودکار؛ Contract test؛ reconciliation؛ circuit/limit؛ independent alert False positive، هزینه و Coverage gap
میانی Checklist در Workflow؛ peer approval هدفمند؛ Runbook تمرین‌شده؛ ظرفیت/On-call بهتر هنوز به اجرا و نگهداری انسان وابسته
ضعیف‌تر ایمیل، Warning، Policy، «دقت بیشتر»، آموزش یک‌باره، double-check دستی Decay، Alert fatigue و دورزدن

ضعیف‌تر یعنی بی‌ارزش نیست؛ Training برای Skill gap لازم است، اما اگر UI یک Operation خطرناک را آزادانه مجاز می‌کند، آموزش تنها Control کافی نیست.

قرارداد Action item

action_id: A-PAY-04
causal_links: [H-PAY-02, H-PAY-05]
type: corrective+detection
change: >
  introduce UNKNOWN state; reuse immutable operation_id;
  reconcile before any retry; alert duplicate-capture invariant
scope: all PSP adapters
owner: payments-platform
approver: financial-risk-owner
due: 2026-09-05
rollout: shadow → 5% → 25% → 100%
rollback: disable new adapter path, preserve reconciliation
implementation_evidence: code + migration + config hash
effectiveness_test: timeout-after-commit replay + sandbox sample
success_oracle: one capture and one ledger effect per payment intent
guardrails: false-block rate, checkout completion, reconcile latency
residual_risk: PSP without lookup contract remains partially controlled
review_at: 2026-10-05

آزمایش قطعی: Counterfactual replay پرداخت

برای نشان‌دادن تفاوت «Fix ظاهری» و کنترل مسیر علّی، یک Event sequence ساختگی را Replay می‌کنیم: PSP درخواست اول را Commit می‌کند ولی پاسخ Timeout می‌شود؛ برنامه Retry می‌کند؛ Callback اول نیز دوبار تحویل می‌شود. چهار پیکربندی با همان توالی مقایسه می‌شوند.

کد قابل‌بازتولید

function replay({ reconcileBeforeRetry, callbackInboxDedupe }) {
  const pspCaptures = [];
  const callbackInbox = new Set();
  const ledger = [];

  const capture = reference => pspCaptures.push(reference);
  const onCallback = event => {
    if (callbackInboxDedupe && callbackInbox.has(event.id)) return;
    callbackInbox.add(event.id);
    ledger.push({ event: event.id, reference: event.reference });
  };

  capture('R-A');                         // PSP committed
  const clientObserved = 'TIMEOUT';       // response lost after commit

  if (clientObserved === 'TIMEOUT') {
    const found = reconcileBeforeRetry && pspCaptures.includes('R-A');
    if (!found) capture('R-B');            // unsafe new attempt
  }

  onCallback({ id: 'C-A', reference: 'R-A' });
  onCallback({ id: 'C-A', reference: 'R-A' }); // duplicate delivery
  if (pspCaptures.includes('R-B'))
    onCallback({ id: 'C-B', reference: 'R-B' });

  return {
    captures: pspCaptures.length,
    duplicateCaptures: Math.max(0, pspCaptures.length - 1),
    ledgerEffects: ledger.length,
    duplicateLedgerEffects: Math.max(0, ledger.length - 1),
  };
}

خروجی Replay

پیکربندی Capture Capture تکراری Ledger effect Ledger effect تکراری
Baseline ۲ ۱ ۳ ۲
فقط Reconcile-before-retry ۱ ۰ ۲ ۱
فقط Callback inbox dedupe ۲ ۱ ۲ ۱
هر دو کنترل ۱ ۰ ۱ ۰

Baseline دو Capture و سه اثر Ledger می‌سازد. Reconciliation مسیر Charge دوم را می‌بندد اما Duplicate callback هنوز یک اثر اضافه می‌سازد. Inbox dedupe تحویل تکراری یک Event را مهار می‌کند، ولی دو Capture مستقل را یکی نمی‌پندارد. فقط ترکیب دو Control در این Event sequence هر دو Invariant را نگه می‌دارد.

این آزمایش چه چیزی را اثبات نمی‌کند؟

مدل ساختگی و Deterministic است؛ رفتار PSP واقعی، Race، Crash، Out-of-order callback، Refund و Concurrency را کامل شبیه‌سازی نمی‌کند. نتیجه فقط Mechanism و نیاز به دفاع چندلایه را نشان می‌دهد؛ علت سازمانی، نرخ تکرار Production یا اثر همهٔ Vendorها را ثابت نمی‌کند. پیاده‌سازی واقعی باید با Contract رسمی PSP، Stub، Sandbox محدود و Reconciliation مستقل آزموده شود.

مثال کامل RCA برای Checkout ایرانی

Scope و Invariant

Scope: Checkout → Payment intent → PSP adapter → Callback inbox → Ledger
Invariant 1: برای هر Payment intent حداکثر یک Capture موفق مجاز است.
Invariant 2: هر Callback event حداکثر یک اثر Ledger دارد.
Invariant 3: مبلغ Canonical به IRR است؛ تومان فقط نمایش است.
Invariant 4: Outcome مبهم باید UNKNOWN باشد، نه FAILED قطعی.
Invariant 5: Reconciliation باید PSP، Order و Ledger را همگرا کند.

Cause portfolio

  • Trigger: Timeout پس از Commit در مسیر پاسخ؛
  • Creation factor: نگاشت Timeout به FAILED و Operation تازه در Retry؛
  • Control gap: نبود Reconcile-before-retry و constraint حالت؛
  • Secondary path: Callback inbox فاقد uniqueness بر Event ID؛
  • Escape factor: تست‌ها فقط Timeout-before-commit را مدل کرده بودند؛
  • Detection gap: Alert بر HTTP error بود، نه Invariant مالی؛
  • Impact amplifier: Runbook بازپرداخت و مالک Risk مبهم بود؛
  • Unknown: Contract lookup همهٔ PSPها یکسان نیست.

Action portfolio

  1. State machine نتیجهٔ Payment را Pending/Unknown/Failed/Success با Transitionهای معتبر مدل می‌کند.
  2. Payment operation identity در Retry ثابت و ارتباط Order/Attempt/PSP reference غیرقابل‌ابهام می‌شود.
  3. پیش از تلاش تازه، Outcome از PSP/Callback/Ledger Reconcile می‌شود؛ برای Vendor بدون lookup، Risk/flow جدا تعریف می‌شود.
  4. Callback inbox روی Vendor+Event ID یا کلید قراردادشده Idempotent می‌شود.
  5. DB constraint و Transaction boundary جلوی دو اثر کسب‌وکاری را می‌گیرد؛ فقط UI check کافی نیست.
  6. تست timeout-before/after-commit، duplicate/late/out-of-order callback و crash-between-write-and-ack افزوده می‌شود.
  7. Alert بر Capture-per-intent و PSP↔Ledger mismatch همراه Runbook/Owner ساخته می‌شود.
  8. Adapterهای دیگر با همان Failure mechanism، نه صرفاً همان خط کد، Audit می‌شوند.

جزئیات ایران که RCA را منحرف می‌کند

  • ریال Canonical و تومان نمایشی را مخلوط نکنید؛ اختلاف ۱۰× ممکن است Cause مستقل باشد.
  • اعداد فارسی/عربی/لاتین و Unicode normalization را در Correlation و Data join کنترل کنید.
  • زمان PSP، سرور و CRM را به UTC همگرا و Asia/Tehran را فقط نمایش دهید.
  • قطعی/کندی شبکه و محدودیت دسترسی Vendor را Fact کنید؛ «اینترنت ایران» Cause کافی نیست.
  • شماره موبایل، کارت، Token و متن پیامک را در Artifact عمومی Mask کنید.
  • اگر Sandbox از Production fidelity ندارد، محدودیت را در Confidence و Residual risk ثبت کنید.

برای آزمودن Timeout، Retry، Idempotency و Recovery با Safety gate، راهنمای تست تاب‌آوری سیستم مکمل مستقیم این RCA است.

Verification: پیاده‌سازی اقدام با اثربخشی آن فرق دارد

بسته‌شدن Ticket فقط نشان می‌دهد کاری انجام شده؛ نشان نمی‌دهد مسیر Failure بسته شده است.

چهار لایهٔ راستی‌آزمایی

  1. Implementation: تغییر با Build/Config/Migration identity واقعاً Deploy شده است؟
  2. Mechanism: Replay یا Fault injection نشان می‌دهد Control دقیقاً مسیر هدف را می‌بندد؟
  3. Guardrail: Checkout completion، latency، false block یا عملیات دستی بدتر نشده است؟
  4. Sustainability/field: در فرصت‌های کافی و مشابه، Recurrence/Impact/Detection signal مطابق انتظار است؟

عدم‌تکرار فوری، اثبات نیست

اگر Failure ماهی یک بار فرصت وقوع دارد، «هفت روز بدون Incident» Evidence ضعیفی است. Opportunity denominator بسازید: تعداد Timeout-after-commit، تعداد Callback duplicate، تعداد Release با همان مسیر یا تعداد تراکنش واجد شرایط. صفر رخداد بدون فرصت، معنای محدودی دارد.

اگر بازتولید ممکن نیست

Evidence را جعل نکنید. از State/model test، Contract stub، Trace replay، property/invariant test، Canary و Monitoring استفاده و Fidelity gap را بنویسید. وضعیت Action می‌تواند Implemented-but-effectiveness-partial باشد؛ Closure باید Residual risk و مرجع پذیرش داشته باشد.

تعریف Done برای RCA

Report منتشرشده پایان کار نیست. Done باید Gate داشته باشد.

RCA Done when:
  scope/impact/timeline reviewed
  facts, inferences and unknowns separated
  major alternatives considered
  causal statements have evidence and mechanism
  trigger/creation/escape/detection/recovery factors distinguished
  every material causal path has mitigate/accept rationale
  actions have owner, due, rollout, oracle and guardrail
  critical implementation evidence exists
  effectiveness verified or explicitly pending with review date
  residual risk accepted by authorized owner
  sanitized learning shared to intended audience

AWS در راهنمای Post-incident analysis بر دادهٔ پشتیبان علت، مالک روشن، اقدام اصلاحی، بررسی اینکه چرا تست مسئله را نیافته و مخزن Lessons learned تأکید می‌کند.

قالب آمادهٔ RCA/Postmortem نرم‌افزار

# Identity
Case ID / owner / facilitator / reviewers / classification / access

# Executive summary
What happened / verified impact / current state / residual risk

# Scope and invariants
Systems, cohorts, builds, configs, clocks, expected properties

# Trigger criteria
Why this depth of review was selected

# Timeline
Event time / observed time / fact / source / confidence / decision

# Impact
Confirmed / potential / excluded / unknown; user, finance, data, security

# Detection and response
How detected / contain / mitigate / recover / communicate

# Causal analysis
Trigger / causal factors / contributing conditions / control gaps
Detection / mitigation / recovery gaps / alternative hypotheses
Evidence for / evidence against / unknowns / counterfactual tests

# What went well / poorly / where we got lucky
Mechanism and evidence, without personal judgment

# Actions
Cause link / type / strength / owner / due / rollout / rollback
Success oracle / verification / guardrail / residual risk / review date

# Review and learning
Approvals / redaction / sharing scope / taxonomy / related cases

Google Cloud در راهنمای Conduct thorough postmortems چرخهٔ Capture facts→Identify/analyze causes→Plan→Execute را پیشنهاد می‌کند و هشدار می‌دهد راه‌حل بیش‌ازحد پیچیده برای رخداد کم‌احتمال می‌تواند ناپایداری تازه بسازد.

جلسهٔ RCA را چگونه تسهیل کنیم؟

پیش از جلسه

  • Incident stabilized و Evidence Pack آماده باشد.
  • Problem statement، Scope، Timeline draft و Unknownها از قبل توزیع شوند.
  • افراد نزدیک به Event و صاحبان سیستم/Impact دعوت شوند؛ جلسه را بیش‌ازحد بزرگ نکنید.
  • Facilitator بی‌طرف و Recorder مشخص باشد.
  • Security/Privacy access و Redaction پیش از نمایش Artifact کنترل شود.

در جلسه

  1. هدف و قواعد Blameless/accountable را مرور کنید.
  2. Impact و Invariant را پیش از Cause تأیید کنید.
  3. Timeline را Event به Event و Source به Source بازبینی کنید.
  4. Silent-first، هر نفر Candidate/Unknown خود را مستقل بنویسد تا Anchoring کم شود.
  5. Hypothesisها را به Creation/Escape/Detection/Recovery تقسیم کنید.
  6. برای هر مسیر Evidence موافق/مخالف و Next test تعیین کنید.
  7. اقدام را فقط پس از توافق نسبی روی Mechanism طراحی کنید.
  8. موارد حل‌نشده را با Owner و موعد، نه با اجماع مصنوعی، خارج کنید.

پس از جلسه

Draft باید توسط فرد فنی، نمایندهٔ Impact و Owner اقدام Review شود. Commentهای باز بسته، نسخه منتشر، Actionها وارد سیستم کار و Critical actionهای عقب‌افتاده Escalate شوند. Postmortem بدون پیگیری، Knowledge base تزئینی است.

متریک‌های سالم برای فرایند RCA

تعداد RCA یا تعداد Action، Outcome کیفیت نیست. Metric باید سؤال و Denominator داشته باشد.

کیفیت Analysis

  • درصد RCAهای دارای Timeline source-linked و تفکیک Fact/Hypothesis؛
  • درصد Causeهای مادی با Evidence مخالف/Alternative و Verification plan؛
  • درصد Actionها که به Causal statement مشخص متصل‌اند؛
  • درصد Reportهای Reviewشده پیش از Publication.

کیفیت Action

  • Action aging و درصد Critical action overdue؛
  • نسبت اقدام‌های سیستمی/خودکار به Training/Policy-only، با تفسیر زمینه‌ای؛
  • Implementation-verified و Effectiveness-verified به‌صورت جدا؛
  • Lead time از RCA approval تا Control فعال؛
  • Residual riskهای پذیرفته‌شده و منقضی‌شده.

Outcome و Guardrail

  • Recurrence per comparable opportunity برای Failure cluster؛
  • Impact severity/exposure و Detection time در فرصت‌های مشابه؛
  • درصد مشابهت‌هایی که Action systemic پوشش داده است؛
  • Regression/availability/latency/cost پس از Control؛
  • نرخ گزارش Near miss و کیفیت Psychological safety survey، بدون Target اجباری برای افزایش/کاهش Incident count.

کاهش Incident count ممکن است به‌علت کاهش Traffic یا گزارش‌نکردن باشد؛ افزایش آن نیز شاید Detection بهتر باشد. برای طراحی Numerator/Denominator و ضدبازی، راهنمای متریک‌های تست نرم‌افزار را به کار بگیرید.

از یک RCA به یادگیری سازمانی

ارزش واقعی زمانی ایجاد می‌شود که Patternها از مرز یک Ticket عبور کنند.

Taxonomy برای Trend، نه رتبه‌بندی افراد

Causeها را با واژگان چندبرچسبی مانند State/identity، Dependency contract، Data integrity، Change/config، Test/Oracle gap، Detection، Capacity، Ownership و Recovery ثبت کنید. یک Case می‌تواند چند Tag داشته باشد. «Developer error» یا «QA miss» Category قابل‌آموزش نیست.

Action را به سیستم‌های دیگر تعمیم دهید

اگر Failure mechanism «Outcome مبهم + Retry با Identity تازه» است، فقط همان Endpoint را Patch نکنید؛ Refund، Wallet top-up، Shipment booking، SMS billing و Job consumers را برای همان Pattern جست‌وجو کنید. Scope expansion باید Risk-based و دارای Owner باشد، نه بازنویسی بی‌پایان همه‌چیز.

حلقهٔ بستهٔ بهبود

Incident/Defect/Near miss
→ Evidence-led RCA
→ Action portfolio
→ Pilot/rollout
→ Mechanism + field verification
→ Standard/Test/Risk/Runbook update
→ Trend review
→ Adapt / scale / rollback / accept residual risk

برای تبدیل یافته‌ها به Experiment و Standard پایدار، سیستم بهبود مستمر QA مسیر کامل‌تری ارائه می‌دهد.

ابزار و هوش مصنوعی در RCA

ابزار می‌تواند جمع‌آوری Timeline، Join بر Correlation ID، Link کردن Deploy، خوشه‌بندی Failure signature، پیگیری Action و یادآوری Due date را آسان کند. اما Tool نمی‌تواند Cause معتبر را از Log ناقص «استخراج» کند.

کارهای مناسب برای Automation/AI

  • نرمال‌سازی Timestamp و پیشنهاد Timeline با Citation به Source؛
  • خوشه‌بندی Incidentهای مشابه برای Review انسانی؛
  • پیداکردن Actionهای Overdue و Scopeهای مشابه؛
  • Redaction پیشنهادی PII/Secret با بازبینی؛
  • تولید پرسش یا Alternative hypothesis، نه اعلام Root cause.

Guardrailهای AI

  • Log، کد، مشتری و Security evidence را بدون مجوز به سرویس بیرونی نفرستید.
  • هر ادعا باید Citation به Artifact و Confidence داشته باشد.
  • Hallucinated timestamp، Actor یا Action قابل پذیرش نیست.
  • مدل نباید Owner، تقصیر یا Risk acceptance را تعیین کند.
  • نمونه‌ای از موارد خوشه‌بندی‌نشده برای False negative بازبینی شود.
  • Prompt/model/version و تغییر انسانی در Audit باقی بماند.

برنامهٔ ۳۰روزه برای راه‌اندازی RCA

روزهای ۱ تا ۵: Policy و Trigger

  • Learning note/Mini/Full RCA و Trigger هرکدام را تعریف کنید.
  • نقش Facilitator، Case owner، Action owner و Risk owner را مشخص کنید.
  • Access/Redaction/Retention و Security escalation را تصویب کنید.

روزهای ۶ تا ۱۰: Template و Evidence

  • قالب Identity/Impact/Timeline/Hypothesis/Action/Verification را بسازید.
  • Correlation ID و Deploy/Config identity را در سامانه‌ها Audit کنید.
  • یک Runbook حفظ Evidence فرّار بنویسید.

روزهای ۱۱ تا ۱۵: Pilot

  • یک Incident بسته‌شدهٔ متوسط و Sanitized را انتخاب کنید.
  • Timeline را مستقل بسازید و جلسه را با Facilitator اجرا کنید.
  • حداقل دو Alternative hypothesis و Evidence مخالف ثبت کنید.

روزهای ۱۶ تا ۲۰: Action و Verification

  • هر Action را به Cause link و Action hierarchy وصل کنید.
  • یک Replay/Fault injection با Success oracle و Guardrail اجرا کنید.
  • Implemented و Effective را دو Status جدا در Tracker قرار دهید.

روزهای ۲۱ تا ۲۵: Review و Sharing

  • Technical، Impact و Privacy review را اجرا کنید.
  • نسخهٔ Sanitized را در Repository قابل جست‌وجو منتشر کنید.
  • Critical overdue action و Risk acceptance expiry را Alert کنید.

روزهای ۲۶ تا ۳۰: Calibration

  • زمان/Toil، کیفیت Evidence، Action strength و Feedback شرکت‌کنندگان را ببینید.
  • Triggerهای خیلی حساس یا خیلی کم‌حساس را اصلاح کنید.
  • Taxonomy و Template را Version کنید.
  • تصمیم Adopt/Adapt/Continue/Stop و بازبینی ۶۰روزه ثبت شود.

نمونهٔ Before/After معتبر

این قالب، دادهٔ واقعی سایت نیست و نباید به‌عنوان Benchmark استفاده شود:

Scope: payment incidents with ambiguous PSP outcome
Before window: 8 comparable events / 14 weeks
After window: 9 comparable opportunities / 16 weeks

Change:
  UNKNOWN state + reconcile-before-retry + callback inbox uniqueness

Before:
  duplicate capture = 3/8 opportunities
  median detection = 19 min
  actionable RCA actions effectiveness-verified = 1/6

After:
  duplicate capture = 0/9 opportunities
  median detection = 4 min
  actionable RCA actions effectiveness-verified = 5/6

Guardrails:
  checkout completion unchanged within stated uncertainty
  p95 confirmation latency +6s during reconciliation

Limits:
  small samples; PSP mix changed; no claim of universal causality;
  continue monitoring through 40 opportunities.

کاهش صفر تا سه با Sample کوچک قطعیت نمی‌سازد. Context، Opportunity، Confounder، Latency cost و بازهٔ بازبینی باید همراه نتیجه منتشر شوند.

Anti-patternهای تحلیل علت ریشه‌ای

  1. یک Root cause برای سیستم پیچیده: شبکهٔ علّی به داستان خطی تبدیل می‌شود.
  2. شروع از مقصر: Evidence پنهان و گزارش‌دهی کمتر می‌شود.
  3. پنج Why دقیقاً: تحلیل زود یا دیر و بدون معیار Stop تمام می‌شود.
  4. Fishbone به‌عنوان نتیجه: Candidateها بدون Verification Cause اعلام می‌شوند.
  5. Deploy قبلی=Cause: Temporal correlation جای Mechanism می‌نشیند.
  6. Pareto ۸۰/۲۰ قطعی: نسبت فرضی جای داده و علت را می‌گیرد.
  7. Human error: ابزار، فشار، اطلاعات و Guardrailها حذف می‌شوند.
  8. Training-only: Hazard در طراحی باقی می‌ماند و فقط حافظه مسئول می‌شود.
  9. RCA پیش از مهار: Attention از کاربر و Recovery دور می‌شود.
  10. بستن با انتشار Report: Actionها بدون Owner/Verification فراموش می‌شوند.
  11. صفر Recurrence بدون Opportunity: نبود فرصت با اثر اقدام اشتباه می‌شود.
  12. RCA برای هر Bug: Toil زیاد و تحلیل‌های مهم سطحی می‌شوند.
  13. مخزن محرمانه و غیرقابل جست‌وجو برای همه: یا دانش حبس می‌شود یا PII نشت می‌کند؛ Sharing باید لایه‌بندی شود.
  14. AI به‌عنوان داور علت: روایت بی‌منبع با لحن مطمئن ساخته می‌شود.

چک‌لیست کیفیت RCA

  • آیا Incident پیش از تحلیل تثبیت شده است؟
  • آیا Trigger عمق RCA از قبل تعریف شده بود؟
  • آیا Scope، Build، Config، Environment و Clock روشن است؟
  • آیا Impact تأییدشده از Potential/Unknown جداست؟
  • آیا PII/Secret در Evidence و Report محافظت شده است؟
  • آیا Timeline به Source لینک و Clock skew بررسی شده است؟
  • آیا Observation، Inference و Unknown برچسب دارند؟
  • آیا Trigger با Cause اشتباه نشده است؟
  • آیا Creation/Escape/Detection/Mitigation/Recovery جدا تحلیل شده‌اند؟
  • آیا چند Alternative hypothesis بررسی شده است؟
  • آیا Evidence موافق و مخالف هر Cause مهم ثبت شده است؟
  • آیا Human error به System factors شکافته شده است؟
  • آیا Five Whys شاخه دارد و با عدد پنج متوقف نشده است؟
  • آیا Fishbone فقط Candidate generator تلقی شده است؟
  • آیا Counterfactual یا Reproduction plan وجود دارد؟
  • آیا هر Action به Causal link مشخص متصل است؟
  • آیا حداقل یک Control سیستمی متناسب بررسی شده است؟
  • آیا Owner، Due، Rollout، Rollback و Risk owner روشن‌اند؟
  • آیا Success oracle و Guardrail پیش از اجرا تعریف شده‌اند؟
  • آیا Implementation و Effectiveness جدا Verify می‌شوند؟
  • آیا Field outcome بر Opportunity denominator تکیه دارد؟
  • آیا Residual risk و Unknown منقضی/بازبینی می‌شود؟
  • آیا Learning به Test، Risk model، Runbook یا Standard برگشته است؟

پرسش‌های متداول تحلیل علت ریشه‌ای

۱. تحلیل علت ریشه‌ای یا RCA چیست؟

RCA فرایندی ساختاریافته برای بازسازی یک مشکل یا Incident، شناسایی و آزمودن عوامل علّی و طراحی اقدام‌هایی است که احتمال یا Impact تکرار را کاهش دهند. خروجی معتبر، Cause ادعایی را به Evidence، Mechanism، اقدام و Verification متصل می‌کند.

۲. آیا هر باگ به RCA نیاز دارد؟

خیر. Triggerها را بر اساس Impact، تکرار، Near miss، داده/مالی/امنیت، Detection failure و فرصت یادگیری تعریف کنید. باگ کم‌اثر با Mechanism روشن شاید فقط Learning note بخواهد؛ رخداد چندسیستمی یا مالی Full RCA/Postmortem.

۳. تفاوت ۵ Whys و Fishbone چیست؟

Five Whys یک مسیر را با پرسش‌های متوالی عمیق می‌کند و باید در علت‌های متعدد شاخه بسازد؛ Fishbone خانواده‌های Candidate cause را گسترده می‌کند. هیچ‌کدام بدون Evidence، Alternative و Verification علت را اثبات نمی‌کند.

۴. Blameless RCA یعنی هیچ‌کس پاسخ‌گو نیست؟

خیر. Blameless از تحقیر و تقلیل Cause به فرد جلوگیری می‌کند تا Factها آشکار شوند؛ در عین حال Role، Decision، Action owner، Due date، Review و Risk acceptance دقیق ثبت می‌شوند. ایمنی روانی و مسئولیت‌پذیری مکمل یکدیگرند.

۵. چگونه بفهمیم اقدام RCA مؤثر بوده است؟

اول Deploy/پیاده‌سازی را تأیید، سپس همان Failure mechanism را با Replay، Fault injection یا Test مناسب فعال و Oracle/Guardrail را بررسی کنید. بعد در فرصت‌های واقعی و قابل مقایسه، Recurrence، Impact و Detection را با Denominator بسنجید و Confounder/Residual risk را گزارش کنید.

جمع‌بندی

RCA خوب از «چه کسی اشتباه کرد؟» به «چه شرایط، تصمیم‌ها و کنترل‌هایی این پیامد را ممکن کردند و کدام تغییر آن مسیر را می‌بندد؟» حرکت می‌کند. برای این کار، مهار را از یادگیری جدا، Evidence را پیش از روایت حفظ، Timeline را بر Clock واحد بنا، فرضیه‌ها را با شواهد موافق و مخالف آزمون و چند مسیر Creation/Escape/Detection/Recovery را نگه دارید.

مهم‌تر از نام تکنیک، بسته‌شدن حلقه است: Cause بدون Action فقط توضیح است؛ Action بدون Causal link حدس است؛ و Action بسته‌شده بدون Effectiveness verification فقط فعالیت ثبت‌شده است. وقتی این سه اتصال برقرار شوند، تحلیل علت ریشه‌ای از جلسهٔ پس از بحران به یک سامانهٔ یادگیری و پیشگیری تبدیل می‌شود.

دیدگاهتان را بنویسید