داشبورد تیم سبز است: پوشش تست ۸۵٪، همهٔ User Storyها دارای Acceptance Criteria، خودکارسازی رگرسیون ۷۰٪ و پیچیدگی کد زیر ۱۰ است. دو انتشار بعد هم نقص‌های بحرانی پروداکشن از ۱۰ به ۴ رسیده‌اند. آیا این اعداد ثابت می‌کنند چهار معیار اول «شاخص پیشرو» بوده‌اند و باعث کاهش نقص شده‌اند؟ نه. فعلاً فقط چند مشاهده، یک ترتیب زمانی و یک هم‌زمانی داریم؛ نه تعریف پایدار، نه آزمون قدرت پیش‌بینی و نه شاهد علّی.

شاخص پیشرو و پسرو در QA برچسب ذاتی یک متریک نیست. یک معیار فقط نسبت به پیامد مشخص، جمعیت، افق زمانی و تصمیم مشخص پیشرو یا پسرو می‌شود. حتی یک معیار DORA می‌تواند نسبت به شیوه‌های توسعه «پسرو» و نسبت به عملکرد سازمانی «پیشرو» باشد. بنابراین پرسش حرفه‌ای این نیست که «لیست Leading Indicatorهای تست چیست؟»؛ پرسش این است: «کدام فرضیهٔ Indicator برای این تصمیم، در این دامنه و تا این تاریخ اعتبار کافی دارد؟»

پاسخ کوتاه: Leading بودن یک ادعای قابل‌آزمون است، نه نامی که روی Coverage، Automation یا Code Review می‌گذاریم. تقدم زمانی لازم است؛ اما تا وقتی تعریف، سازوکار، Baseline، دادهٔ اعتبارسنجی، خطاهای هشدار، Lead time قابل‌اقدام و سیاست تصمیم ثبت نشده‌اند، آن معیار فقط Candidate Indicator است.

این راهنما دقیقاً چه مسئله‌ای را حل می‌کند؟

این راهنما برای QA Lead، Test Manager، مهندس کیفیت، Product Manager و تحلیل‌گری است که می‌خواهد از معیارها برای دیدن ریسک آینده استفاده کند، بدون آنکه از همبستگی، داستان علّی بسازد. خروجی کار یک نمودار زیبا نیست؛ یک Indicator Hypothesis نسخه‌دار و قابل‌ابطال است که معلوم می‌کند چه چیزی را، برای کدام تصمیم، با چه خطایی و تا چه زمانی می‌توان استفاده کرد.

اگر به فهرست و تعریف متریک‌ها نیاز دارید، راهنمای متریک‌های تست نرم‌افزار مالک آن موضوع است. اگر سؤال شما تشخیص Noise از Signal در سری زمانی است، به تحلیل روند معیارهای تست بروید. این صفحه فقط رابطهٔ فرضی «Indicator زودتر ← Outcome دیرتر» و اعتبار تصمیمی آن را مالک می‌شود.

تعریف عملی شاخص پیشرو و پسرو

نوعتعریف محدودآنچه ثابت نمی‌کند
Leading Indicatorاندازه‌ای که پیش از Outcome مرجع مشاهده می‌شود و برای پیش‌بینی یا اقدام زودهنگام، در دامنه و افق تعریف‌شده اعتبارسنجی شده استعلت Outcome، تضمین پیشگیری یا اعتبار دائمی
Lagging Indicatorاندازه‌ای که Outcome یا پیامد تحقق‌یافته را در Cutoff تعریف‌شده ثبت یا تأیید می‌کندبی‌فایده، ذاتاً دیرهنگام یا صرفاً واکنشی بودن
Candidate Indicatorمعیاری با سازوکار محتمل و تقدم زمانی که هنوز قدرت پیش‌بینی آن تأیید نشده استاجازهٔ تصمیم خودکار یا ادعای «پیش‌بینی‌کننده»

عبارت «پیش از Outcome» نسبی است. زمان شکست یک تست، نسبت به Commit قبلی یک Outcome پسرو است؛ همان شکست نسبت به تصمیم انتشار فردا می‌تواند یک ورودی زودهنگام باشد. جایگاه زمانی به‌تنهایی آن را پیش‌بینی‌کننده نمی‌کند؛ باید معلوم شود این ورودی با چه دقتی و چند ساعت یا چند روز زودتر به تصمیم کمک می‌کند.

چرا برچسب Leading یا Lagging ذاتی نیست؟

راهنمای رسمی DORA Metrics نمونهٔ روشنی ارائه می‌کند: معیارهای تحویل نرم‌افزار می‌توانند برای عملکرد سازمان و بهزیستی کارکنان نقش Leading داشته باشند، اما نسبت به شیوه‌های توسعه و تحویل، Lagging باشند. این مثال یک نکتهٔ بنیادی را روشن می‌کند: Indicator یک رابطه است، نه ویژگی دائمی ستون دیتابیس.

معیار مشاهده‌شدهOutcome مرجعنقش احتمالیوضعیت درست پیش از اعتبارسنجی
Test failure در Build B42تغییر کد همان Buildپسرو؛ پیامد تغییر و اجرای تستObserved Outcome
Test failure در Build B42Rollback پس از انتشار B42نامزد پیشروCandidate، نه Prediction
نقص پروداکشن نسخهٔ ۷کیفیت نسخهٔ ۷پسروOutcome Measure
نقص پروداکشن نسخهٔ ۷ریسک تکرار در نسخهٔ ۸نامزد پیشرونیازمند تعریف Cohort و Horizon
زمان Code Reviewتاخیر همان Pull RequestپسروProcess Outcome
زمان Code Reviewنقص Escape شدهٔ انتشار بعدنامزد پیشرو با رابطهٔ احتمالاً غیرخطیHypothesis

پنج جزء اجباری هر برچسب Indicator

  1. Outcome: دقیقاً کدام پیامد دیرتر قرار است پیش‌بینی یا تأیید شود؟
  2. Population: رابطه برای کدام سرویس، Journey، Build، تیم، نوع تغییر یا Cohort ادعا می‌شود؟
  3. Horizon: چند ساعت، روز، Sprint یا Release جلوتر؟
  4. Decision: مشاهدهٔ Indicator قرار است چه تصمیمی را تغییر دهد؟
  5. Validity window: اعتبار از چه نسخه و تاریخی شروع می‌شود و چه زمانی باید بازبینی شود؟

جملهٔ «Coverage یک Leading Indicator کیفیت است» هر پنج جزء را حذف می‌کند. صورت قابل‌آزمون‌تر چنین است: «برای تغییرات جدید سرویس تسویه در Buildهای واجدشرایط، نسبت پوشش Branch مسیرهای پرریسک در هفت روز پیش از Cutoff، نامزد پیش‌بینی وجود حداقل یک Reconciliation mismatch تأییدشده تا ۱۴ روز پس از انتشار است؛ نتیجه فقط برای تصمیم ورود به Shadow Pilot استفاده می‌شود.» این جمله هنوز حقیقت نیست، اما دست‌کم قابل‌ردشدن است.

Metric، Measure، Indicator، Target و Signal یکی نیستند

واژهکارکردمثال محدود
Measureمشاهده یا مقدار خام با واحد۲۴ Failure در Run R42
Metricقاعدهٔ محاسبه روی جمعیت و Window تعریف‌شدهFailure rate بر Attemptهای واجدشرایط
IndicatorMetric تفسیرشده نسبت به Outcome و Decisionنامزد هشدار ریسک Rollback طی ۷ روز
Targetسطح مطلوب یا تعهد مدیریتیکمتر از ۲٪؛ نه Control Limit و نه Forecast
Thresholdمرز ورود به Action policyدو Observation متوالی بالاتر از مقدار ثبت‌شده
Signalالگوی غیرعادی طبق Rule ازپیش‌تعریف‌شدهTrigger برای Investigation؛ نه اثبات Cause
Outcomeپیامد مرجع با Cutoff و قرارداد خودشRollback تأییدشده تا هفت روز پس از Release

ممکن است Metric از Target عبور کند ولی Signal آماری نباشد؛ یا Signal رخ دهد اما هنوز Outcome آینده را خوب پیش‌بینی نکند. همچنین Threshold عملیاتی لزوماً بهترین مرز آماری نیست؛ انتخاب آن باید هزینهٔ False alert و False miss را منعکس کند.

Activity، Output، Intermediate Outcome و Outcome نهایی

بسیاری از «Leading Indicator»های رایج فقط Activity هستند: تعداد جلسه، ساعت تست، تعداد Test Case یا درصد خودکارسازی. Activity می‌تواند ورودی یک Theory of Change باشد، اما رابطهٔ آن با Outcome باید توضیح داده و آزموده شود. زنجیرهٔ ساده چنین است:

لایهنمونهٔ Checkout ساختگیخطر تفسیر
Inputزمان و محیط تست Stubمنبع بیشتر مساوی کیفیت بیشتر نیست
Activityاجرای سناریوی Callback تکراریاجرا، Evidence پذیرفته‌شده نیست
OutputEvidence معتبر برای سه Retry patternCoverage محدود، نبود نقص را ثابت نمی‌کند
Intermediate outcomeکشف mismatch پیش از انتشارکشف بیشتر می‌تواند نتیجهٔ مشاهده‌پذیری بهتر باشد
Final outcomeکاهش mismatch تأییدشده پس از انتشارعوامل هم‌زمان و تغییر جمعیت باید کنترل شوند

Magenta Book دولت بریتانیا در بحث Theory of Change بر زنجیرهٔ علّی مورد انتظار، فرض‌ها، شواهد پشتیبان، Context و پیامدهای میانی تأکید می‌کند. این منبع قالب QA ارائه نمی‌دهد؛ ما فقط اصل «سازوکار را آشکار و قابل‌آزمون کن» را برای طراحی فرضیهٔ Indicator اقتباس می‌کنیم.

تقدم زمانی لازم است، اما کافی نیست

اگر X پس از Y ثبت شود، X نمی‌تواند Y را پیش‌بینی کند؛ پس Temporal precedence یک Entry criterion است. اما X قبل از Y نیز ممکن است کاملاً بی‌ربط باشد، با یک عامل سوم حرکت کند یا فقط از تغییر تعریف داده خبر دهد. مثال: افزایش Automation rate پیش از کاهش نقص ممکن است هم‌زمان با کوچک‌شدن Scope، تعویض تیم، بهترشدن Observability یا تغییر روش شمارش Defect رخ داده باشد.

  • Before: فقط ترتیب زمانی را نشان می‌دهد.
  • Associated: حرکت آماری مشترک را در دادهٔ تعریف‌شده نشان می‌دهد.
  • Predictive: روی دادهٔ ندیده‌شده و Horizon مشخص، برای تصمیم ارزش دارد.
  • Causal: تغییر X در شرایط تعریف‌شده واقعاً Y را تغییر می‌دهد؛ ادعایی قوی‌تر و نیازمند طراحی مناسب.

Early Metric با Leading Indicator چه تفاوتی دارد؟

Early Metric زود در چرخه قابل‌مشاهده است؛ Leading Indicator علاوه بر زودبودن باید برای Outcome مرجع قدرت پیش‌بینی قابل‌استفاده داشته باشد. «درصد Storyهای دارای Acceptance Criteria در Refinement» یک Early Process Metric است. تا وقتی نشان نداده‌ایم تغییر این درصد، با تعریف ثابت، پیش از Rework یا Defect بعدی ظاهر می‌شود و برای انتخاب اقدام مفید است، نام درست آن Candidate Indicator است.

سه نقش متفاوت: Driver، Confirmation و Guardrail

یک Portfolio متعادل همه‌چیز را Leading/Lagging نمی‌نامد. Driver متریکی است که تیم انتظار دارد با Intervention تغییر کند؛ Confirmation Outcome تحقق‌یافته را می‌سنجد؛ Guardrail آسیب جانبی یا بازی‌دادن سیستم را آشکار می‌کند. ممکن است یک Driver هنوز Indicator معتبر نباشد و فقط برای یادگیری در Pilot رصد شود.

نقشپرسشنمونه
Driver candidateچه چیزی را زودتر می‌توان تغییر داد؟Coverage مسیرهای Risk-tagged، نه کل کد
Outcome confirmationپیامد موردنظر واقعاً چه شد؟Mismatch تأییدشده بر جمعیت ثابت
Guardrailبرای بهترشدن عدد چه آسیبی ممکن است پنهان شود؟Flaky rate، زمان بازخورد، Escaped risk
Data-healthآیا خود اندازه‌گیری سالم است؟Missing، Duplicate، Late، Join failure
Contextچه تغییر بیرونی بر رابطه اثر گذاشت؟Runner version، Scope، Traffic mix

چرخهٔ Indicator Hypothesis

چرخهٔ پیشنهادی این مقاله چنین است: Decision و Outcome → Theory/Mechanism → Candidate → Temporal contract → Metric/Data contract → Baseline → Validation → Action policy → Shadow use → Revalidation → Retire یا Correct. این چرخه تلفیق تحلیلی همین راهنماست و قالب رسمی DORA، GOV.UK یا NIST محسوب نمی‌شود.

Indicator lifecycle states
DRAFT → CANDIDATE → DATA_READY → VALIDATION_READY → SHADOW_VALIDATED
      → DECISION_APPROVED → ACTIVE → UNDER_REVIEW → RETIRED
                                             ↘ CORRECTED / REJECTED

Forbidden shortcuts:
CANDIDATE ≠ PREDICTIVE
ASSOCIATED ≠ CAUSAL
ACTIVE ≠ PERMANENT
RETIRED ≠ DELETE_HISTORY

گام اول: تصمیم را پیش از متریک بنویسید

«بهبود کیفیت» تصمیم نیست. تصمیم باید گزینه، Authority، Deadline و Evidence need داشته باشد: آیا Checkout جدید وارد Shadow traffic شود؟ آیا Verification اضافی برای تغییرات High-risk لازم است؟ آیا فرضیه برای یک Cycle دیگر تمدید شود؟ اگر با تغییر Indicator هیچ Action متفاوتی رخ نمی‌دهد، ساخت آن احتمالاً هزینهٔ گزارش‌دهی بدون ارزش تصمیمی است.

decision_id: DEC-SYN-042
question: "آیا فرضیه برای یک Shadow Pilot سی‌روزه پذیرفته شود؟"
options: [REJECT, SHADOW_PILOT, REDESIGN]
authority_role: ROLE-QUALITY-DECISION
decision_due: 2026-09-01T09:00:00Z
required_evidence: [indicator-contract, validation-report, error-costs]
not_deciding: [release, risk-acceptance, production-change]

گام دوم: Outcome را مثل یک متریک مستقل قرارداد کنید

Outcome مبهم، Leading Indicator کاذب تولید می‌کند. «باگ پروداکشن» باید نوع Defect، منبع تأیید، Severity vocabulary، واحد جمعیت، Attribution window، Duplicate policy، Reopen و Cutoff داشته باشد. اگر Outcome از Release به Release تغییر تعریف دهد، رابطهٔ تاریخی قابل‌مقایسه نیست.

outcome_ref: OUT-SYN-RECON-v3
subject: "reconciliation mismatch confirmed by synthetic oracle"
population: eligible fake PaymentAttempt per release cohort
unit: confirmed mismatch / 1,000 eligible attempts
window: release_at → release_at + 14d
cutoff_rule: event_time <= cutoff; late events provisional
exclusions: corrupted fixture, unknown build, duplicate event
not_claimed: real payments, customer harm, financial impact

گام سوم: Theory و Mechanism را قابل‌ردشدن کنید

Mechanism توضیح می‌دهد چرا انتظار داریم Indicator قبل از Outcome حرکت کند. برای مثال: «نقض قرارداد Callback در تست Stub، اگر همان State transition و Idempotency rule محصول را پوشش دهد، ممکن است الگوهای مستعد mismatch را پیش از انتشار آشکار کند.» سپس باید شرایط شکست Theory را نوشت: Stub با Production contract فاصله دارد؛ تست‌ها فقط Happy path را می‌بینند؛ Outcome از خطای عملیاتی می‌آید؛ یا تغییر Observability فقط کشف را بیشتر کرده است.

نوشتن Negative Theory از خوش‌بینی جلوگیری می‌کند: چه شرایطی باعث می‌شود Indicator بهتر شود ولی Outcome بدتر بماند؟ چه عاملی هر دو را هم‌زمان تغییر می‌دهد؟ کدام مشاهده سازوکار را رد خواهد کرد؟ اگر پاسخ «هیچ‌چیز» باشد، فرضیه علمی و مدیریتی نیست؛ روایت غیرقابل‌ابطال است.

گام چهارم: Candidate Indicator را انتخاب کنید

Candidate را به دلیل دسترس‌بودن داده انتخاب نکنید. از Outcome به عقب برگردید: چه تغییر قابل‌مشاهده‌ای در زنجیرهٔ سازوکار، پیش از پیامد رخ می‌دهد؟ آیا تیم فرصت و Authority اقدام دارد؟ آیا اندازه‌گیری قابل‌اعتماد است؟ آیا Indicator با یک Countermetric همراه می‌شود؟

  • به Outcome نزدیک باشد، اما آن‌قدر دیر نباشد که زمان اقدام از دست برود.
  • برای Population مشخص قابل‌محاسبه و قابل‌تکرار باشد.
  • با تغییر رفتار نمایشی یا Gaming به‌سادگی سبز نشود.
  • به تصمیمی متصل باشد که تیم واقعاً مجاز به اجرای آن است.
  • هزینهٔ جمع‌آوری، بررسی و خطا با ارزش تصمیم متناسب باشد.

گام پنجم: Lead horizon و Actionable lead time

Lead horizon می‌گوید Outcome چند وقت بعد ارزیابی می‌شود؛ Actionable lead time فاصلهٔ واقعی میان آماده‌شدن Indicator و آخرین زمان مفید برای اقدام است. اگر داده سه روز دیر Ingest شود و تصمیم چهار ساعت بعد لازم باشد، Indicator از نظر تقویمی زودتر است اما از نظر عملیاتی پیشرو نیست.

زمانمعناخطای رایج
event_timeرخداد واقعاً چه زمانی اتفاق افتاد؟جایگزینی با زمان ورود به داشبورد
observed_atسیستم اندازه‌گیری چه زمانی دید؟نادیده‌گرفتن Out-of-order
ingested_atچه زمانی وارد Pipeline شد؟پنهان‌کردن تأخیر جمع‌آوری
computed_atIndicator چه زمانی محاسبه شد؟محاسبهٔ جدید روی Snapshot قدیمی
decision_dueآخرین زمان تصمیم چه بود؟نامیدن گزارش دیررس به‌عنوان Leading
outcome_cutoffOutcome تا چه زمانی بالغ می‌شود؟برچسب صفر به Caseهای هنوز باز

قرارداد کامل Indicator Hypothesis

indicator_review_id: IND-042-v1
decision_ref: DEC-SYN-042
outcome_ref: OUT-SYN-RECON-v3
candidate_metric_ref: M-CALLBACK-CONTRACT-v2
population_ref: POP-SYN-CHECKOUT-v4
mechanism: "contract violation may precede reconciliation mismatch"
expected_direction: positive
expected_shape: not assumed; compare preregistered bins
lead_horizon: 14d
minimum_actionable_lead: 48h
confounders: [fixture-version, scope-mix, runner-version, oracle-change]
countermetrics: [join-failure-rate, flaky-rate, feedback-latency]
validation_plan_ref: VAL-042-v1
action_policy_ref: ACT-042-v1
not_claimed: [causality, release-readiness, product-quality, real-user-risk]
owner_role: ROLE-METRIC-STEWARD
review_due: 2026-10-01T09:00:00Z
correction_policy: supersede; never silent-edit

Metric Contract را از Indicator Contract جدا کنید

Metric Contract فقط محاسبه را پایدار می‌کند: واحد تحلیل، Eligibility، Numerator، Denominator، Window، Join، Dedup، Missing و Version. Indicator Contract تفسیر آن Metric نسبت به Outcome و Decision را نگه می‌دارد. یک Metric پایدار می‌تواند در چند فرضیه استفاده شود؛ تغییر تفسیر نباید بی‌صدا فرمول را عوض کند.

Metric ContractIndicator Contract
چه چیزی و چگونه محاسبه می‌شود؟نسبت به کدام Outcome چه ادعایی داریم؟
Population، unit، numerator، denominatorDecision، horizon، mechanism، expected relation
Missing، duplicate، late، joinValidation، error costs، threshold، action
Version و Source lineageValidity window، revalidation، retirement

جهت رابطه و شکل رابطه را حدس نزنید

«بیشتر بهتر است» اغلب نادرست است. Review time بسیار کم می‌تواند نشانهٔ مرور سطحی باشد و بسیار زیاد می‌تواند از Scope بزرگ یا Bottleneck خبر دهد. Coverage ممکن است پس از حدی بازده نزولی داشته باشد. Automation rate می‌تواند بالا برود چون Caseهای سخت حذف شده‌اند. جهت، شکل خطی/آستانه‌ای/U شکل و Lag باید پیش از دیدن نتیجه ثبت یا دست‌کم صریحاً Exploratory اعلام شود.

Population و هویت‌ها را ثابت نگه دارید

اگر Indicator روی Test Case محاسبه شود و Outcome روی Release، Join rule باید مشخص کند کدام Case به کدام تغییر و Release تعلق دارد. مقایسهٔ یک ماه از Attemptهای ریز با ماه بعد از Suiteهای درشت، Simpson’s paradox و تغییر ترکیب جمعیت می‌سازد. حداقل هویت‌های Subject، Change، Build، Run، Environment، Data snapshot و Outcome cohort را نگه دارید.

Data Snapshot پیش از مدل و نمودار

هر Validation باید به Snapshot تغییرناپذیر متصل شود: Extract time، Event cutoff، Query digest، Source version، تعداد Eligible، Missing، Duplicate، Late، Quarantined و Join failure. Missing هرگز خودکار صفر نیست. اگر Outcome هنوز بالغ نشده، رکورد Censored یا Provisional است؛ نباید آن را «بدون نقص» شمرد.

snapshot_id: SNAP-SYN-042
event_cutoff: 2026-08-01T00:00:00Z
extract_at: 2026-08-03T09:00:00Z
query_digest: sha256:fictional-demo-only
source_versions: [runner-v5, oracle-v3, registry-v4]
eligible: 240
missing: 3
duplicates_quarantined: 4
late_provisional: 6
join_failures: 2
fitness: HOLD_IF join_failure_rate > 0.02
limitations: synthetic, offline, non-representative

Baseline برای رابطه است، نه فقط مقدار

Baseline Indicator باید دوره‌ای را پوشش دهد که تعریف Candidate و Outcome پایدار بوده‌اند. فقط میانگین Coverage گذشته کافی نیست؛ توزیع مشترک Indicator، Outcome، Lag و Context لازم است. تغییر Runner، Oracle، Scope یا Defect taxonomy در میانهٔ Baseline باید Annotate، Segment یا Exclude شود و تصمیم آن ثبت بماند.

Retrospective validation و Prospective validation

طراحیکاربردمحدودیت
Retrospectiveغربال Candidateها با دادهٔ تاریخیتعریف‌های ناپایدار، Leakage و انتخاب پس از دیدن نتیجه
Prospective shadowثبت Prediction پیش از Outcome بدون تغییر تصمیم واقعیزمان‌بر؛ هنوز اثر Intervention را ثابت نمی‌کند
Controlled experimentسنجش اثر تغییر Process بر Outcomeنیازمند طرح، توان، اخلاق و کنترل مناسب
Natural/quasi-experimentوقتی Randomization ممکن نیستفرض‌های قوی و Confounding باقی می‌ماند

دادهٔ تاریخی برای ساخت فرضیه مفید است، اما انتخاب Candidate و Threshold روی همان داده و سپس گزارش عملکرد روی همان نمونه، خوش‌بینی ایجاد می‌کند. بهترین شروع عملی معمولاً یک دورهٔ Shadow است: Prediction و Action پیشنهادی پیش از Cutoff ثبت می‌شوند، اما Authority واقعی هنوز به آن Indicator واگذار نمی‌شود.

زمان را در Train، Validation و Holdout حفظ کنید

برای Indicator زمانی، Split تصادفی ممکن است اطلاعات آینده را به گذشته نشت دهد. Windowهای قدیمی‌تر برای کشف و تنظیم، Window بعدی برای Validation و تازه‌ترین Window دست‌نخورده برای Holdout مناسب‌ترند. اگر یک Release در چند ردیف تکرار شده، همهٔ ردیف‌های آن باید در یک Split بمانند.

  • Threshold را پس از دیدن Holdout تغییر ندهید و همان عملکرد را مستقل ننامید.
  • Outcomeهای هنوز بالغ‌نشده را از Negative واقعی جدا کنید.
  • Featureهایی که فقط پس از Outcome در دسترس‌اند حذف کنید.
  • نسخهٔ Query، کد و Seed ساختگی را ثبت کنید.
  • چند Candidate آزموده‌شده و Selection process را پنهان نکنید.

R² بالا یا همبستگی زیبا کافی نیست

راهنمای NIST دربارهٔ اعتبارسنجی مدل صریحاً هشدار می‌دهد که R² بالا تضمین نمی‌کند مدل به‌خوبی با داده سازگار است و Residual analysis را ابزار اصلی بررسی برازش معرفی می‌کند. این صفحه دربارهٔ مدل‌سازی فرایند است، نه نسخهٔ آماده برای QA؛ کاربرد محدود ما این است که هیچ Summary statistic واحدی را «اعتبار Indicator» ننامیم.

رابطه باید در دادهٔ ندیده‌شده، Segmentهای معنادار و Window زمانی آینده بررسی شود. Residual، Drift، Missingness، Seasonality و Base rate را ببینید. نتیجهٔ «از ۱۰ به ۴» با دو نقطه نه Trend معتبر است، نه Calibration، نه دلیل استراتژی درست.

اعتبار پیش‌بینی را با یک سبد آزمون بسنجید

آزمونپرسشمرز تفسیر
Temporal precedenceIndicator پیش از Decision و Outcome آماده بود؟فقط شرط زمانی
Associationرابطهٔ مشاهده‌شده با روش و عدم‌قطعیت چیست؟علت نیست
DiscriminationCaseهای Outcome و non-Outcome را چقدر جدا می‌کند؟احتمال‌ها را کالیبره نمی‌کند
Calibrationریسک پیش‌بینی‌شده با فراوانی مشاهده‌شده سازگار است؟در یک Segment ممکن است خوب و در دیگری بد باشد
Lead-time distributionچقدر زودتر و با چه پراکندگی هشدار می‌دهد؟میانگین، Tail را پنهان می‌کند
Stabilityدر Window/Version/Segment بعدی می‌ماند؟اعتبار دائمی نیست
Decision utilityپس از هزینهٔ خطا، Action بهتری می‌سازد؟دقت آماری مساوی ارزش عملیاتی نیست

Sensitivity، Specificity و Precision به زبان تصمیم

وقتی Indicator هشدار دودویی می‌دهد، جدول چهارخانه بسازید. Sensitivity/Recall می‌پرسد چه سهمی از Outcomeهای واقعی زودتر هشدار داشته‌اند. Specificity می‌پرسد چه سهمی از non-Outcomeها بی‌هشدار مانده‌اند. Precision می‌پرسد از هشدارهای صادرشده، چند مورد واقعاً به Outcome منتهی شده‌اند.

Outcome رخ دادOutcome رخ نداد
Alert صادر شدTrue positiveFalse alert
Alert صادر نشدFalse missTrue negative

Base rate اهمیت دارد. اگر Outcome بسیار نادر باشد، حتی Indicator با Sensitivity و Specificity ظاهراً مناسب می‌تواند Precision پایین و هشدارهای بی‌ثمر فراوان داشته باشد. به همین دلیل «۹۰٪ Accuracy» بدون Confusion matrix، جمعیت و هزینهٔ خطا برای تصمیم کافی نیست.

Lead-time distribution را به یک میانگین تقلیل ندهید

میانهٔ Lead time شاید ۷۲ ساعت باشد، اما ۲۵٪ هشدارها پس از Deadline تصمیم برسند. P10/P50/P90، نسبت هشدارهای actionable و تأخیر Data pipeline را گزارش کنید. یک Indicator با Precision کمی پایین‌تر ولی ۴۸ ساعت فرصت پایدار، ممکن است از Indicator دقیق‌تری که پنج دقیقه پیش از Outcome هشدار می‌دهد ارزشمندتر باشد.

Calibration و Discrimination دو سؤال جدا هستند

Discrimination رتبه‌بندی ریسک را می‌سنجد: آیا موارد پرریسک بالاتر از کم‌ریسک قرار می‌گیرند؟ Calibration دربارهٔ مقدار احتمال است: وقتی مدل ۳۰٪ می‌گوید، آیا تقریباً ۳۰٪ آن گروه Outcome دارند؟ اگر خروجی فقط رنگ قرمز/سبز است، ادعای Calibration probability نکنید. اگر نمونه کوچک است، بازهٔ عدم‌قطعیت و گروه‌بندی ازپیش‌تعریف‌شده لازم است.

هزینهٔ False alert و False miss متقارن نیست

False alert ممکن است Review اضافی، تأخیر یا Alert fatigue ایجاد کند؛ False miss ممکن است فرصت بررسی یک ریسک مهم را از بین ببرد. هزینه را با عدد ساختگی دقیق جلوه ندهید. می‌توانید رتبه، بازه یا سناریوی شفاف ثبت کنید و Authority کسب‌وکار/فنی را در تعیین Trade-off دخیل سازید.

action_policy: ACT-042-v1
IF alert=true AND data_fitness=PASS AND actionable_lead>=48h
THEN request focused evidence review
ELSE keep UNKNOWN/HOLD; do not infer safety

false_alert_response: review threshold and burden; preserve history
false_miss_response: incident review independent of indicator status
automatic_release_block: false
automatic_people_score: false
authority_role: ROLE-QUALITY-DECISION

Threshold باید به Action policy متصل باشد

Threshold بدون Action فقط رنگ است. برای هر سطح بنویسید چه کسی چه اقدامی را تا چه زمانی انجام می‌دهد، چه Evidence تازه‌ای لازم است، چه چیزی خودکار نیست و چه شرایطی Alert را منقضی می‌کند. «قرمز = انتشار ممنوع» نباید از دل داشبورد و بدون Authority، Scope و Risk decision بیرون بیاید. تصمیم انتشار همچنان باید در چارچوب مستقلی مانند تصمیم کیفیت به‌اندازهٔ کافی خوب انجام شود.

Association را Cause اعلام نکنید

اگر Coverage بالا رفت و Defect کم شد، حداقل توضیح‌های جایگزین را ثبت کنید: Scope ساده‌تر، کاهش Traffic، تغییر Severity، بهبود Review، حذف Code قدیمی، Detection lag یا تغییر Defect intake. Association می‌تواند برای Prediction مفید باشد حتی اگر Cause شناخته نشده باشد؛ اما Action روی یک Proxy غیرعلّی ممکن است Outcome را تغییر ندهد.

برای ادعای اثر، Experiment یا Contribution Evaluation لازم است

پرسش «آیا Indicator پیش‌بینی می‌کند؟» با «آیا Intervention ما Outcome را بهتر کرد؟» متفاوت است. دومی به طراحی آزمایش و بهبود مستمر مبتنی بر Experiment یا، در سیستم چندعاملی، به Contribution Evaluation در QA نیاز دارد. پایین‌آمدن Lagging metric به‌تنهایی اثر برنامهٔ QA را ثابت نمی‌کند.

Confounder، Mediator و Countermetric را جدا کنید

نوع متغیرنقشنمونهٔ ساختگی
Confounderهم Candidate و هم Outcome را تغییر می‌دهدکوچک‌شدن Scope تغییرات
Mediatorبخشی از مسیر سازوکار استکشف زودتر mismatch پس از اجرای سناریوی جدید
Moderatorقدرت رابطه را در Segmentها تغییر می‌دهدتغییرات High-risk در برابر Low-risk
Countermetricآسیب یا Gaming را آشکار می‌کندFlaky rate همراه Automation rate
Data-health metricسلامت مشاهده را می‌سنجدJoin failure و Late-event rate

کنترل مکانیکی همهٔ متغیرها درست نیست؛ اگر Mediator را به‌عنوان Confounder حذف کنید، بخشی از مسیر واقعی را می‌بندید. Diagram سادهٔ فرضی، زمان‌بندی و نظر Domain expert کمک می‌کند نقش‌ها پیش از تحلیل روشن شوند.

Coverage یک Candidate است، نه تضمین کاهش باگ

Code coverage فقط نشان می‌دهد کدام ساختار در یک اجرای مشخص لمس شده است؛ کیفیت Assertion، Oracle، Data، Interaction و Risk coverage را تضمین نمی‌کند. تعریف دقیق Branch/Condition/Path، Scope کد، Generated code، Build و Test suite لازم است. Candidate قوی‌تر ممکن است «پوشش مسیرهای Risk-tagged با Oracle معتبر» باشد، همراه Mutation score یا Defect escape به‌عنوان Countermetric؛ باز هم نیازمند اعتبارسنجی است.

Cyclomatic Complexity یک آلارم زمینه‌ای است

پیچیدگی بالاتر می‌تواند Testing و Review را دشوار کند، اما Threshold جهانی «کمتر از ۱۰» حقیقت عمومی نیست. زبان، ابزار، ساختار، Generated code، اندازهٔ تابع و Domain روی تفسیر اثر دارند. آن را ابتدا برای Sampling یا Review عمیق‌تر به‌کار ببرید و رابطهٔ محلی با Outcome تعریف‌شده را بررسی کنید؛ امتیاز فردی توسعه‌دهنده نسازید.

Acceptance Criteria completeness با کیفیت نیازمندی برابر نیست

وجود یک فیلد غیرخالی، وضوح، صحت یا Testability را تضمین نمی‌کند. Indicator نامزد می‌تواند درصد Storyهای واجد معیارهای نسخه‌دار، قابل‌آزمون و Reviewشده باشد؛ اما باید Sampling semantic و پیامد بعدی مثل Rework یا Ambiguity defect تعریف شود. تیم نباید با متن‌های قالبی و بی‌معنا به ۱۰۰٪ برسد.

Code Review time رابطه‌ای غیرخطی دارد

زمان کمتر ممکن است Flow بهتر یا Review سطحی باشد؛ زمان بیشتر ممکن است دقت بیشتر، PR بزرگ‌تر یا Queue باشد. Cycle time را به Waiting و Active review تفکیک کنید، اندازه و ریسک Change را نگه دارید و Outcome مناسب انتخاب کنید. هدف‌گذاری خام زمان می‌تواند Reviewer را به کلیک سریع وادار کند.

Automation percentage به‌تنهایی Driver خوبی نیست

Numerator و Denominator خودکارسازی معمولاً ناپایدارند: Case، Scenario، Risk یا Execution؟ Caseهای آسان می‌توانند عدد را بالا ببرند و Maintenance cost، Flakiness و Feedback latency را بدتر کنند. اگر Candidate می‌سازید، Population را بر Risk/Flow تعریف و Countermetricهای Flaky rate، Time-to-signal، Maintenance burden و Escaped risk را اضافه کنید.

Production defects همیشه فقط Lagging نیست

نقص نسخهٔ جاری نسبت به همان نسخه Outcome پسرو است؛ اما نسبت به تصمیم Patch، Prioritization یا ریسک نسخهٔ بعد می‌تواند Candidate پیشرو باشد. Severity، Discovery channel، Duplicate، Exposure و Attribution window را ثابت کنید. «تعداد بالا = ضعف QA» ادعایی غیرمنصفانه و علّی است؛ تغییر Product، Operations، Requirement و Observability نیز اثر دارند.

Test Failure Rate و MTTR را نسبی بخوانید

Failure rate نسبت به تغییر قبلی Outcome است و نسبت به Release بعدی ممکن است Candidate باشد. MTTR نسبت به Incident بسته‌شده Lagging است، اما توزیع MTTRهای اخیر شاید برای Capacity planning آینده اطلاعاتی بدهد. هیچ‌کدام بدون Build، Attempt، Retry، Quarantine، Severity، Open/censored work و Window قابل‌مقایسه نیستند.

Portfolio متعادل شاخص‌ها چگونه ساخته می‌شود؟

جایگاهحداقل یک موردسؤال کنترلی
Outcomeپیامد کاربر/سیستم با Contractآیا بالغ و قابل‌نسبت‌دادن به Cohort است؟
Leading candidateMetric زودهنگام با Mechanismآیا Lead time قابل‌اقدام دارد؟
ConfirmationLagging Outcome measureآیا نتیجهٔ واقعی را تأیید می‌کند؟
Guardrailهزینه یا آسیب جانبیآیا بهبود Proxy چیزی را خراب کرده؟
Data healthMissing/Late/Join/Versionآیا سبزی نمودار از خرابی داده می‌آید؟
ContextScope/Build/Traffic/Tool changeآیا رابطه هنوز قابل‌مقایسه است؟

داشبورد باید Hypothesis Registry را نمایش دهد

داشبورد Indicator نباید فقط مقدار و رنگ نشان دهد. شناسهٔ فرضیه، Outcome، Population، Horizon، Validity state، Data cutoff، Lead-time، Threshold version، False alerts/misses، Owner، Next review و Not claimed را قابل‌مشاهده کند. اصول Semantic layer و نمایش تصمیم‌محور را در راهنمای طراحی داشبورد گزارش تست دنبال کنید.

وضعیتمعنای مجازنمایش ممنوع
CANDIDATEMechanism و طرح آزمون ثبت شدهPredictive/Validated
SHADOW_VALIDATEDمعیارهای ازپیش‌تعریف‌شده در Shadow پاس شده‌اندCausal/Release-ready
ACTIVEAuthority استفادهٔ محدود را تأیید کردهتضمین Outcome
UNDER_REVIEWDrift یا تغییر Contract در حال بررسی استسبز/قرمز قطعی
RETIREDبرای تصمیم جدید استفاده نمی‌شودحذف تاریخچه
UNKNOWNداده یا بلوغ Outcome کافی نیستصفر یا Pass

حلقهٔ بازخورد را بدون Closed-loop theater ببندید

Alert باید به Investigation، Decision، Action، Observation بعدی و Correction متصل شود. صرف ارسال پیام یا ساخت Ticket حلقه را نمی‌بندد. الگوی جامع Signal تا اقدام و یادگیری در Quality Feedback Loop در SDLC توضیح داده شده است. اینجا فقط باید مشخص کنیم Indicator چه Trigger محدودی ایجاد کرده و نتیجهٔ Action چگونه به Registry برمی‌گردد.

نقش‌ها و اختیارها را از هم جدا کنید

قابلیتمسئولیتاختیار ندارد مگر صریحاً واگذار شود
Metric stewardContract، lineage، quality و versionRisk acceptance
Indicator analystValidation، error analysis، limitationتغییر Outcome برای بهترشدن نتیجه
Domain ownerMechanism و Contextتأیید مستقل تحلیل خودش
Decision authorityThreshold trade-off و Action approvalبازنویسی Evidence
Independent reviewerLeakage، assumptions و reproducibilityمالکیت نتیجهٔ کسب‌وکار
Data/security ownerAccess، minimization، retentionاستفادهٔ ثانویهٔ نامحدود

از Indicator برای امتیازدهی افراد استفاده نکنید

Coverage، Defect count، Review time، Automation rate و Escaped defects زمینهٔ تیمی و سیستمی دارند. اتصال مستقیم آن‌ها به رتبه‌بندی، پاداش یا تنبیه فردی باعث Gaming، پنهان‌کردن Defect، شکستن Caseها یا حذف کار سخت می‌شود. واحد تحلیل و کاربرد مجاز را در Contract محدود کنید و People scoring را صریحاً false قرار دهید.

Automation و AI چه کاری می‌توانند انجام دهند؟

  • Schema، identity، time ordering، version و Missing را به‌صورت قطعی کنترل کنند.
  • Split زمانی، محاسبهٔ Confusion matrix و Reproducible report را اجرا کنند.
  • Drift و Expiry را Alert کنند، بدون اعلام خودکار Cause.
  • AI می‌تواند Candidate mechanism یا توضیح ساده پیشنهاد کند، اما منبع و عدم‌قطعیت باید حفظ شود.
  • AI نباید دادهٔ واقعی محرمانه را بدون مجوز ببیند، Threshold را پنهانی تنظیم کند یا Release/Risk decision صادر کند.

خروجی مدل زبانی Evidence نیست. اگر AI خلاصهٔ Validation می‌نویسد، اعداد باید از Artifact قطعی و نسخه‌دار وارد شوند؛ هر Claim به جدول/کد منبع پیوند داشته باشد و بازبین انسانی حق Challenge و Correction داشته باشد.

امنیت، حریم خصوصی و Data minimization

برای ساخت Indicator معمولاً نیازی به نام فرد، ایمیل، IP، متن کامل Ticket، Screenshot یا Payload واقعی نیست. شناسه‌های Pseudonymous، Aggregate حداقلی و Retention محدود را ترجیح دهید. Purpose، lawful/organizational basis، Access، Export، Redaction، deletion و incident response باید با سیاست سازمان و مشاوران مسئول بررسی شود؛ این مقاله مشاورهٔ حقوقی یا امنیتی نیست.

Drift چگونه اعتبار Indicator را منقضی می‌کند؟

رابطه ممکن است با تغییر معماری، Runner، تیم، Scope mix، Test strategy، Feature flag، Traffic یا Outcome taxonomy جابه‌جا شود. سه نوع را جدا کنید: Data drift در توزیع ورودی، Concept drift در رابطهٔ Indicator–Outcome و Measurement drift در تعریف/ابزار. هرکدام Trigger و پاسخ متفاوت دارد.

  • Measurement drift: استفاده را HOLD، lineage را تعمیر و تاریخچه را Correct کنید.
  • Data drift: Segment و Population fitness را بازبینی کنید؛ فوراً Threshold تازه نسازید.
  • Concept drift: Shadow revalidation و احتمال Retirement.
  • Operational drift: اگر Lead time دیگر قابل‌اقدام نیست، Indicator حتی با دقت مشابه بی‌فایده شده است.

Revalidation و Expiry از ابتدا تعیین شوند

Active شدن پایان کار نیست. بازبینی دوره‌ای و Event-driven لازم است: تغییر Contract، افت Precision، افزایش False miss، تغییر Base rate، عبور Data-health از حد، تغییر تصمیم یا پایان Horizon. تا وقتی Revalidation تمام نشده، وضعیت UNDER_REVIEW یا UNKNOWN را نمایش دهید؛ از مقدار قدیمی به‌عنوان حقیقت زنده استفاده نکنید.

چه زمانی Indicator را Retire کنیم؟

  • دیگر تصمیمی را تغییر نمی‌دهد یا Action قابل‌اجرا ندارد.
  • Lead time از Deadline تصمیم کوتاه‌تر شده است.
  • هزینهٔ False alert/miss از ارزش عملیاتی عبور کرده است.
  • تعریف Outcome یا Population بنیادی عوض شده و Bridge معتبر نداریم.
  • Gaming یا آسیب جانبی با Guardrail قابل‌کنترل نیست.
  • Candidate در Holdout یا Shadow criteria شکست خورده است.

Retirement به معنای پاک‌کردن نیست. آخرین نسخه، علت، تاریخ، تصمیم‌های متاثر، جایگزین و Correctionهای لازم را نگه دارید. Dashboard تاریخی باید نشان دهد آن Indicator در آن زمان چه Status و Validity داشته است.

Correction باید قابل‌ردیابی باشد

correction_id: COR-IND-042-02
corrects: IND-042-v1 / validation-report-v1
reason: outcome cutoff excluded six late events incorrectly
affected_windows: [2026-W28, 2026-W29]
old_claim: SHADOW_VALIDATED
new_claim: UNDER_REVIEW
affected_decisions: [DEC-SYN-042]
owner: ROLE-METRIC-STEWARD
issued_at: 2026-08-05T11:00:00Z
superseding_artifacts: [IND-042-v2, validation-report-v2]
silent_edit: false

آزمایش اجرایی: داشبورد سبز در برابر قرارداد Indicator

آزمایش زیر کاملاً ساختگی، آفلاین و بدون وابستگی است. Checker سطحی فقط پنج عدد محبوب را می‌بیند و نتیجه را معتبر اعلام می‌کند. ممیزی قراردادی ۴۴ جزء لازم را می‌سنجد. عدد ۴۴ Benchmark صنعت، Score بلوغ یا توصیهٔ عمومی نیست؛ فقط تعداد Ruleهای همین Fixture نسخه‌دار است.

const draft = {
  dashboard: {
    coverage: 85,
    acceptance_criteria: 100,
    automation: 70,
    complexity: 9,
    critical_defects: [10, 4]
  },
  declared_status: "LEADING_INDICATORS_VALIDATED",
  people_scoring: false
};

const present = (v) =>
  v !== undefined && v !== null &&
  !(typeof v === "string" && v.trim() === "") &&
  !(Array.isArray(v) && v.length === 0);

const rules = [
  ["IR-01 review_id", x => present(x.review_id)],
  ["IR-02 revision", x => present(x.revision)],
  ["IR-03 supersedes", x => present(x.supersedes)],
  ["IR-04 decision", x => present(x.decision)],
  ["IR-05 authority", x => present(x.authority)],
  ["IR-06 decision_due", x => present(x.decision_due)],
  ["IR-07 outcome_ref", x => present(x.outcome_ref)],
  ["IR-08 outcome_metric_contract", x => present(x.outcome_metric_contract)],
  ["IR-09 outcome_horizon", x => present(x.outcome_horizon)],
  ["IR-10 outcome_population", x => present(x.outcome_population)],
  ["IR-11 indicator_metric_contract", x => present(x.indicator_metric_contract)],
  ["IR-12 mechanism", x => present(x.mechanism)],
  ["IR-13 temporal_precedence", x => present(x.temporal_precedence)],
  ["IR-14 expected_direction", x => present(x.expected_direction)],
  ["IR-15 expected_shape", x => present(x.expected_shape)],
  ["IR-16 lead_horizon", x => present(x.lead_horizon)],
  ["IR-17 minimum_actionable_lead", x => present(x.minimum_actionable_lead)],
  ["IR-18 confounders", x => present(x.confounders)],
  ["IR-19 countermetric", x => present(x.countermetric)],
  ["IR-20 not_claimed", x => present(x.not_claimed)],
  ["IR-21 snapshot_id", x => present(x.snapshot_id)],
  ["IR-22 source_versions", x => present(x.source_versions)],
  ["IR-23 baseline_window", x => present(x.baseline_window)],
  ["IR-24 validation_window", x => present(x.validation_window)],
  ["IR-25 holdout_window", x => present(x.holdout_window)],
  ["IR-26 freshness_sla", x => present(x.freshness_sla)],
  ["IR-27 missing_policy", x => present(x.missing_policy)],
  ["IR-28 dedup_policy", x => present(x.dedup_policy)],
  ["IR-29 leakage_check", x => present(x.leakage_check)],
  ["IR-30 association_method", x => present(x.association_method)],
  ["IR-31 discrimination_method", x => present(x.discrimination_method)],
  ["IR-32 calibration_method", x => present(x.calibration_method)],
  ["IR-33 sensitivity", x => present(x.sensitivity)],
  ["IR-34 specificity", x => present(x.specificity)],
  ["IR-35 precision", x => present(x.precision)],
  ["IR-36 false_alert_count", x => present(x.false_alert_count)],
  ["IR-37 false_miss_count", x => present(x.false_miss_count)],
  ["IR-38 lead_time_distribution", x => present(x.lead_time_distribution)],
  ["IR-39 threshold", x => present(x.threshold)],
  ["IR-40 action_policy", x => present(x.action_policy)],
  ["IR-41 action_authority", x => present(x.action_authority)],
  ["IR-42 revalidation_trigger", x => present(x.revalidation_trigger)],
  ["IR-43 expiry", x => present(x.expiry)],
  ["IR-44 correction_policy", x => present(x.correction_policy)],
  ["IR-45 people_scoring_prohibited", x => x.people_scoring !== true]
];

const audit = (x) => rules.filter(([, ok]) => !ok(x)).map(([id]) => id);
const superficial = Object.values(draft.dashboard).every(present);
console.log("SUPERFICIAL", superficial ? "PASS" : "HOLD", draft.declared_status);
console.log("CONTRACT", audit(draft).length ? "HOLD" : "READY", audit(draft).length);

const corrected = {
  review_id: "SYN-IND-042", revision: "v1", supersedes: "none:first-revision",
  decision: "whether to start a 30-day shadow pilot",
  authority: "ROLE-QUALITY-DECISION", decision_due: "2026-09-01T09:00:00Z",
  outcome_ref: "OUT-SYN-RECON-v3", outcome_metric_contract: "M-OUT-v3",
  outcome_horizon: "14d", outcome_population: "POP-SYN-v4",
  indicator_metric_contract: "M-CALLBACK-v2",
  mechanism: "contract violation may precede synthetic mismatch",
  temporal_precedence: "computed >=48h before decision and before outcome cutoff",
  expected_direction: "positive", expected_shape: "preregistered bins; no linear claim",
  lead_horizon: "14d", minimum_actionable_lead: "48h",
  confounders: ["scope_mix", "runner_version", "oracle_version"],
  countermetric: ["flaky_rate", "join_failure_rate"],
  not_claimed: ["causality", "release-readiness", "real-user-risk"],
  snapshot_id: "SNAP-SYN-042", source_versions: ["runner-v5", "oracle-v3"],
  baseline_window: "2026-W01..W12", validation_window: "2026-W13..W18",
  holdout_window: "2026-W19..W24", freshness_sla: "24h",
  missing_policy: "UNKNOWN; never zero", dedup_policy: "event_id first-write quarantine",
  leakage_check: "time split; release groups kept intact; outcome fields excluded",
  association_method: "preregistered synthetic contingency analysis",
  discrimination_method: "holdout confusion matrix",
  calibration_method: "descriptive preregistered risk bins with uncertainty",
  sensitivity: 0.71, specificity: 0.82, precision: 0.44,
  false_alert_count: 14, false_miss_count: 4,
  lead_time_distribution: {p10: "49h", p50: "76h", p90: "121h"},
  threshold: "TH-SYN-v1", action_policy: "focused evidence review only",
  action_authority: "ROLE-QUALITY-DECISION",
  revalidation_trigger: ["contract_change", "precision_below_0.35", "concept_drift"],
  expiry: "2026-10-01T09:00:00Z", correction_policy: "supersede; no silent edit",
  people_scoring: false
};

const findings = audit(corrected);
console.log("CORRECTED", findings.length ? "HOLD" : "READY_FOR_INDICATOR_REVIEW", findings.length);

خروجی مستقل Fixture و تفسیر درست آن

SUPERFICIAL PASS LEADING_INDICATORS_VALIDATED
CONTRACT HOLD 44
CORRECTED READY_FOR_INDICATOR_REVIEW 0

نسخهٔ اول هر پنج عدد را دارد، اما Review identity، Decision، Outcome، Mechanism، Horizon، Contract، Snapshot، Windowهای مستقل، معیارهای خطا، Action، Revalidation و Correction ندارد؛ بنابراین دقیقاً ۴۴ Finding ساختاری می‌گیرد. Rule چهل‌وپنجم People scoring را منع می‌کند و چون مقدار false است Finding نمی‌سازد. نسخهٔ اصلاح‌شده از نظر Schema صفر Finding دارد، اما این نتیجه صحت داده، کفایت نمونه، اعتبار روش آماری، قدرت پیش‌بینی واقعی، رابطهٔ علّی، کیفیت محصول، آمادگی انتشار یا درستی تصمیم را ثابت نمی‌کند. نام خروجی عمداً READY_FOR_INDICATOR_REVIEW است، نه VALIDATED.

آزمایشگاه آفلاین فارسی برای Checkout ساختگی

برای تمرین، یک Lab کاملاً جدا از Production بسازید: Order، PaymentAttempt، PSP Stub جعلی، Callback، Ledger، Reconciliation و اعلان ساختگی. سناریوها شامل Timeout پیش و پس از Fake commit، Retry، Callback تکراری/دیررس/جابه‌جا، قطع Collector، Outcome نارس و تغییر نسخهٔ Oracle باشند. هیچ اتصال شبکه، کاربر، سفارش، پول یا PSP واقعی وارد Lab نشود.

lab_id: SYN-IR-CHECKOUT-INDICATOR-01
network: disabled
production_data: forbidden
identities: [Tenant, Order, Attempt, Event, Build, Run, Snapshot, Cohort]
canonical_currency: fictional IRR only
toman_view: presentation-only and explicitly labelled
digits: [Persian, Arabic, Latin]
unicode_pairs: [ی/ي, ک/ك]
event_time: ISO-8601 UTC
display_timezone: Asia/Tehran
jalali_date: presentation-only
forbidden: [real PSP, bank, PAN, CVV2, OTP, account, mobile, email,
            IP, cookie, token, credential, production log, screenshot]
claims: synthetic, non-representative, no legal/financial/security conclusion

برای ریال/تومان یک ستون Canonical با IRR ساختگی نگه دارید و View تومان را فقط نمایشی و برچسب‌دار بسازید؛ Conversion را در منطق Indicator پنهان نکنید. ارقام فارسی/عربی/لاتین و تفاوت ی/ی و ک/ک را در Normalize آزمایش کنید. زمان Canonical را UTC نگه دارید، Asia/Tehran را View و تاریخ جلالی را Presentation بدانید. هیچ ادعای بانکی، حقوقی، مالی، امنیتی یا نمایندگی بازار ایران از این Lab مجاز نیست.

Pilot سی‌روزه برای اعتبارسنجی بدون قفل‌کردن تصمیم

  1. روز ۱ تا ۵: Decision، Outcome، Contract، Theory، Candidate و Not claimed را Review کنید.
  2. روز ۶ تا ۱۰: Snapshot/Data-quality gate، Baseline و Split زمانی را Freeze کنید.
  3. روز ۱۱ تا ۲۰: Predictionها را پیش از Outcome به‌صورت Shadow ثبت کنید؛ هیچ Release Gate خودکار نسازید.
  4. روز ۲۱ تا ۲۶: Outcomeهای بالغ، False alert/miss، Lead-time و Segmentها را بررسی کنید.
  5. روز ۲۷ تا ۳۰: مستقل Review کنید و یکی از REJECT، REDESIGN، EXTEND_SHADOW یا LIMITED_ACTIVE را با Authority ثبت کنید.

اگر Outcome در سی روز بالغ نمی‌شود، Pilot را به‌زور «موفق» اعلام نکنید؛ مدت مشاهده را بر Horizon واقعی تنظیم کنید. خروجی ممکن است UNKNOWN یا EXTEND_SHADOW باشد. یادگیری معتبر از تصمیم سریع ارزشمندتر است.

ضدالگوهای رایج در شاخص‌های پیشرو و پسرو

  • ساخت لیست ثابت Leading metrics برای همهٔ تیم‌ها و محصولات
  • برچسب Predictive فقط چون Metric زودتر ثبت می‌شود
  • تبدیل همبستگی دو Release به اثبات استراتژی
  • استفاده از Coverage، Automation یا AC=۱۰۰% به‌عنوان تضمین کیفیت
  • اعلام «کمتر از ۱۰» برای Complexity بدون Context
  • تنظیم Threshold پس از دیدن Holdout و گزارش همان عملکرد به‌عنوان مستقل
  • شمردن Outcome نارس یا Missing به‌عنوان صفر
  • نادیده‌گرفتن Base rate، False miss و Alert fatigue
  • یکی‌گرفتن Target، Control limit، Threshold و Forecast
  • استفادهٔ مستقیم از Indicator برای رتبه‌بندی افراد
  • تغییر Denominator برای سبزکردن Dashboard
  • Re-baseline پس از هر Signal بدون حفظ تاریخچه
  • اعلام Cause از روی Trend یا Storytelling
  • واگذاری Risk acceptance یا Release به Rule خودکار
  • Silent edit گزارش پس از کشف خطای داده
  • حفظ Indicator بدون Expiry چون «همیشه استفاده شده»

چک‌لیست Owner پیش از فعال‌کردن Indicator

  1. Decision، options، Authority و Deadline ثبت شده‌اند.
  2. Outcome Contract، Population، Window و Cutoff نسخه دارند.
  3. Candidate metric Contract مستقل و Reproducible دارد.
  4. Mechanism، Negative theory و Alternative explanations نوشته شده‌اند.
  5. تقدم زمانی و Minimum actionable lead آزمون‌پذیرند.
  6. Expected direction/shape پیش‌ثبت یا Exploratory برچسب خورده است.
  7. هویت Subject/Change/Build/Run/Cohort پایدار است.
  8. Snapshot شامل Missing/Duplicate/Late/Join و Source version است.
  9. Baseline از Intervention و تغییر تعریف آلوده نشده است.
  10. Train/Validation/Holdout یا Shadow plan زمان را حفظ می‌کند.
  11. Leakage و Outcome maturity بررسی شده‌اند.
  12. Association، discrimination، calibration متناسب و عدم‌قطعیت روشن‌اند.
  13. Sensitivity، specificity، precision و Base rate گزارش شده‌اند.
  14. False alert/miss و هزینه‌های تصمیمی مرور شده‌اند.
  15. Lead-time distribution و Data latency ثبت شده‌اند.
  16. Threshold به Action، Authority، Due و Expiry وصل است.
  17. Guardrail، Countermetric و Data-health کنار Candidate هستند.
  18. People scoring، Causal claim و Release auto-decision ممنوع شده‌اند.
  19. Drift، Revalidation، Retirement و Correction policy وجود دارد.
  20. Independent review، Security، access و Retention کامل‌اند.

پرسش‌های متداول درباره Leading و Lagging Indicator در QA

آیا Test Coverage همیشه شاخص پیشرو است؟

خیر. Coverage یک Metric است. فقط وقتی نسبت به Outcome، Population، Horizon و Decision مشخص، با تعریف پایدار و دادهٔ ندیده‌شده قدرت پیش‌بینی و Lead time قابل‌اقدام نشان دهد، می‌توان آن را در همان دامنه Leading Indicator نامید. حتی آن زمان نیز علت یا تضمین کیفیت نیست.

آیا شاخص پسرو بی‌فایده و صرفاً واکنشی است؟

خیر. Lagging Indicator پیامد واقعی را تأیید می‌کند، Candidateهای پیشرو را کالیبره و خطاهای آن‌ها را آشکار می‌سازد. همان Outcome تحقق‌یافته ممکن است برای تصمیم دیگری در آینده Candidate پیشرو شود. ارزش آن به Decision و Contract بستگی دارد، نه برچسب زمانی.

چند Release برای اعتبارسنجی Indicator کافی است؟

عدد جهانی وجود ندارد. Base rate، واحد تحلیل، استقلال مشاهدات، اندازهٔ اثر، عدم‌قطعیت قابل‌قبول، تعداد Segmentها، طول Horizon و هزینهٔ خطا تعیین‌کننده‌اند. دو Release و کاهش ۱۰ به ۴، به‌تنهایی Validation نیست. طرح و کفایت نمونه را با فرد دارای صلاحیت آماری/دامنه‌ای بررسی کنید.

اگر Leading Indicator بهتر شد ولی Outcome بدتر ماند چه کنیم؟

فوراً تیم را مقصر یا Threshold را جابه‌جا نکنید. سلامت داده، تغییر Contract/Population، Lag، Outcome maturity، Confounder، Gaming و شکستن Mechanism را بررسی کنید. وضعیت را UNDER_REVIEW بگذارید و بر اساس Evidence، Hypothesis را Redesign، Retire یا Correct کنید.

آیا می‌توان Indicator را مستقیماً Release Gate کرد؟

به‌طور پیش‌فرض نه. ابتدا Shadow validation، خطاها، Lead time، Guardrail، Authority و Action policy را تثبیت کنید. حتی Active Indicator یک ورودی محدود به Evidence review است؛ Risk acceptance و Release decision باید با Scope، Unknownها، گزینه‌ها و اختیار روشن ثبت شوند.

جمع‌بندی: Indicator را فرضیه نگه دارید، نه حقیقت سازمانی

تفاوت شاخص پیشرو و پسرو با دو ستون «آینده/گذشته» تمام نمی‌شود. هر دو نسبت به Outcome و Decision معنا می‌گیرند. Leading بودن نیازمند تقدم زمانی، Mechanism، Metric/Data contract، Validation مستقل، خطاهای قابل‌قبول، Lead time قابل‌اقدام و تاریخ انقضاست. Lagging metric نیز برای دیدن Outcome واقعی و تصحیح فرضیه ضروری است.

از Candidate شروع کنید، نه از ادعای Prediction. تعریف‌ها را Freeze، Prediction را در Shadow ثبت، False alert/miss را آشکار، تصمیم را از داشبورد جدا و Drift/Correction را حفظ کنید. تیم بالغ کیفیت آینده را «پیش‌گویی» نمی‌کند؛ فرضیه‌ای محدود می‌سازد، آن را منصفانه می‌آزماید و وقتی داده مخالفت کرد، بدون پاک‌کردن تاریخچه کنار می‌گذارد.

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