تیم از مدل پروژه‌ای به Scrum مهاجرت کرده است. داشبورد قدیمی سه عدد دارد: ۱۲۰ تست اجراشده، ۱۸ نقص و Pass rate برابر ۹۵٪. مدیر می‌خواهد آن‌ها را حذف کند و به‌جایش Velocity، Cycle time و Defect escape بگذارد. اما هیچ‌کس Consumer و Decision هر عدد، تعریف Start/Finish، Population، Window، Source، Baseline یا اثر حذف آن بر گزارش Release را نمی‌داند. این «Agile Metrics» نیست؛ تعویض برچسب روی یک سیستم اندازه‌گیری ناشناخته است.

مهاجرت معیارهای تست به Agile یعنی سنجه‌ها، قراردادهای معنایی، داده‌ها، تصمیم‌ها و مصرف‌کنندگان فعلی را Inventory کنید؛ برای هر مورد Keep، Adapt، Replace یا Retire را با دلیل انتخاب کنید؛ Future state را از Goal/Question بسازید؛ سنجه‌های قدیم و جدید را در Dual-run مقایسه کنید؛ Break/Bridge را ثبت و Cutover را با Rollback انجام دهید. خروجی، «فهرست بهترین KPIهای Agile» نیست؛ یک Measurement system قابل‌ردیابی و اصلاح‌پذیر است.

پاسخ کوتاه: معیارها را یک‌شبه عوض نکنید

  1. Trigger، Scope، Decision Authority و تاریخ احتمالی Cutover را ثبت کنید.
  2. Metric، گزارش، Alert، Target، Consumer، Source و استفادهٔ واقعی را Inventory کنید.
  3. هر سنجه را با Keep، Adapt، Replace، Retire یا Investigate طبقه‌بندی کنید.
  4. Future state را از Objective/Question/Decision بسازید، نه از فهرست آمادهٔ Agile.
  5. Semantic contract، Event/Identity/Data mapping و Success/Guardrail را نسخه‌دار کنید.
  6. Old/New را در Shadow و Dual-run روی Snapshotهای ثابت مقایسه کنید.
  7. Comparable، Bridged، Broken یا Unknown بودن تاریخچه را صریح اعلام کنید.
  8. Cutover را Rehearse کنید؛ Owner، Communication، Rollback و Correction داشته باشید.
  9. منبع قدیمی را پس از تثبیت بازنشسته کنید، اما تاریخچه و Decision provenance را پاک نکنید.

Intent و کلیدواژه‌های این راهنما

جزءانتخاب
Intent اصلیاطلاعاتی/اجرایی؛ بازطراحی و مهاجرت سیستم سنجش QA هنگام Agile transformation
کلمهٔ کلیدی اصلیمعیارهای تست چابک
کلیدواژه‌های فرعیAgile Testing Metrics، معیارهای QA در Agile، مهاجرت KPI تست، Flow Metrics، Velocity و کیفیت
لانگ‌تیلتفاوت معیارهای تست سنتی و چابک، چگونه KPIهای QA را به Agile مهاجرت دهیم، جایگزین تعداد باگ در Agile، Cutover داشبورد QA، Dual-run متریک
پاسخ کوتاهروش سنجش را با Workflow و Decision جدید هم‌معنا کنید؛ Metric قدیمی را صرفاً با Metric مد روز عوض نکنید.

مالکیت این مقاله و مرز با صفحات دیگر

این صفحه مالک QA Measurement Migration است: Current-state Inventory → Consumer/Decision map → Keep/Adapt/Replace/Retire → Future-state contracts → Data mapping → Dual-run/Bridge → Cutover/Rollback → Retirement/Correction. فهرست و قرارداد سنجه‌ها در راهنمای متریک‌های تست، انتخاب KPI در KPI Governance و خواندن Signal سری زمانی در تحلیل روند معیارهای تست مالک مستقل دارند.

مقالهٔ تله‌های جمع‌آوری و تفسیر Metric خطاهای Measurement را بررسی می‌کند؛ بهبود فرایند تست از Chaos تا Flow خود Workflow را تثبیت می‌کند؛ بهبود مستمر QA Experiment را اجرا می‌کند و ارزیابی اثربخشی QA ادعای Contribution را می‌سنجد. Migration هیچ‌کدام را جایگزین نمی‌کند.

دوگانهٔ «سنتی بد، Agile خوب» را کنار بگذارید

Waterfall همیشه به معنای تست فقط در انتهای پروژه نیست و Agile نیز تضمین نمی‌کند Feedback سریع، کیفیت بالا یا همکاری واقعی دارید. یک Metric قدیمی ممکن است برای Audit، قرارداد، Support یا Trend بلندمدت ضروری باشد؛ یک Flow metric تازه نیز با Start/Finish مبهم بی‌معناست. مسئله قدمت عدد نیست؛ Fitness آن برای Decision فعلی است.

Agile یک کاتالوگ KPI اجباری نیست

اصول Agile Manifesto بر تحویل پیوستهٔ ارزش، نرم‌افزار کارا به‌عنوان Measure اصلی پیشرفت، توسعهٔ پایدار، تعالی فنی و بازاندیشی منظم تأکید می‌کند؛ Velocity، Defect escape، NPS یا Automation ratio را به‌عنوان KPI اجباری تجویز نمی‌کند. این اصول جهت می‌دهند، اما Metric Contract سازمان شما نیستند.

Scrum نیز Velocity را الزام نمی‌کند

Scrum Guide 2020 Scrum را بر Empiricism و Lean thinking، Transparency، Inspection و Adaptation بنا می‌کند و Product/Sprint Goal و Increment را تعریف می‌کند. Velocity جزء تعریف Scrum نیست. تیم می‌تواند برای Forecast داخلی از Estimate history استفاده کند، اما نام آن را بهره‌وری، کیفیت یا KPI مقایسهٔ تیم‌ها نگذارد.

Kanban Flow Metrics به Definition of Workflow وابسته‌اند

Kanban Guide مه ۲۰۲۵ WIP، Throughput، Work Item Age و Cycle Time را حداقل Flow metrics می‌داند، اما آن‌ها را به Definition of Workflow، Work item و نقاط Started/Finished متصل می‌کند. کپی‌کردن «Cycle time» بدون این قرارداد، کاربرد Kanban نیست. خود راهنما نیز می‌گوید این Metricها بدون کمک به Practiceهای Kanban بی‌معنا هستند.

SPACE را Scorecard آمادهٔ QA ندانید

پژوهش SPACE دربارهٔ Developer Productivity نشان می‌دهد Productivity را نمی‌توان با یک Metric یا Dimension سنجید. این بینش برای جلوگیری از Activity-score مفید است، اما پنج بُعد SPACE فهرست اجباری KPI تست یا مجوز امتیازدهی افراد نیست.

چارچوب را با Goal سازمان انتخاب کنید

پژوهش DORA ۲۰۲۵ دربارهٔ Measurement Frameworks بر تناسب چارچوب با اهداف سازمانی و Goal-first بودن تأکید دارد. DORA، SPACE، GQM یا Flow می‌توانند Lens بدهند؛ هیچ‌کدام را بدون سؤال، Context و Contract به «داشبورد استاندارد QA» تبدیل نکنید.

چه چیزی واقعاً در Migration جابه‌جا می‌شود؟

لایهنمونهٔ تغییرریسک پنهان
Decisionگزارش Completion پروژه → مدیریت Flow/ریسک روزانهConsumer قدیمی هنوز گزارش می‌خواهد
SemanticTest cycle → Work item cycleStart/Finish و Unit متفاوت‌اند
DataSpreadsheet snapshot → Event streamDuplicate/late/missing event
PortfolioActivity count → Outcome/Flow/Guardrailحذف Evidence لازم یا افزودن Vanity metric
Actionگزارش فصلی → Alert/Review پیوستهThreshold و Authority نامشخص
Governanceمالک ابزار → Owner/Steward/Authority چندنقشیتغییر خاموش Contract
Historyیک Trend طولانی → Series break/Bridgeمقایسهٔ جعلی قبل/بعد

QA Measurement Migration Loop

Trigger / Mandate / Scope / Decision
→ current Metric + Consumer + Action inventory
→ semantic / data / behavior / risk audit
→ KEEP | ADAPT | REPLACE | RETIRE | INVESTIGATE
→ future Goal / Question / Portfolio / Contract
→ source + identity + event + transform mapping
→ backfill assessment + frozen validation snapshots
→ SHADOW + DUAL_RUN + discrepancy triage
→ COMPARABLE | BRIDGED | BREAK | UNKNOWN
→ cutover rehearsal + gate + communication
→ CUTOVER | ROLLBACK | HOLD
→ stabilization + legacy retirement + correction

Trigger مهاجرت را مشخص کنید

«Agile شدیم» Trigger کافی نیست. Trigger ممکن است تغییر Workflow، محصول/Value stream، Consumer/Decision، ابزار/Schema، الزام قراردادی، رفتار Gaming، ادغام تیم‌ها یا ناتوانی Metric در پاسخ به سؤال باشد. Trigger مرز Scope و فوریت را تعیین می‌کند؛ بدون آن، پروژه به تعویض Dashboard گسترش می‌یابد.

Migration Charter را پیش از تغییر بسازید

migration_id / revision / supersedes / status / as_of
trigger / problem / scope / out_of_scope
current_system_ref / target_operating_model_ref
decisions / consumers / authority / due
legacy_inventory_ref / future_portfolio_ref
data_sources / dependencies / downstream_consumers
dual_run_window / cutover_gate / rollback_triggers
history_policy / retention / privacy_access
owners / communication / training / support
risks / guardrails / not_claimed / correction_policy

Current State را از واقعیت بسازید، نه از Dashboard

Dashboard فقط View است. Inventory باید Query، Export، Sheet، ایمیل دستی، اسلاید، Alert، API، Target، Bonus، Gate و تصمیم‌های خارج از ابزار را کشف کند. با Consumerها مصاحبه کنید: این عدد را کجا می‌بینند؟ اگر فردا حذف شود چه تصمیمی می‌شکند؟ آیا واقعاً استفاده می‌شود یا فقط تولید می‌شود؟

قالب Legacy Metric Inventory

legacy_metric_id / label / aliases / version
purpose / question / consumer / decision / action
owner / source / query / transform / refresh
entity / population / inclusion / exclusion / unit
event_time / window / denominator / attempt_policy
baseline / target / threshold / alert / dashboard
downstream_report / automation / contract / retention
known_issues / gaming / privacy / criticality
last_used / proposed_disposition / evidence / approver

Metric Lineage و Consumer Graph رسم کنید

یک فیلد `pass_rate` ممکن است از سه Query با Attempt policy متفاوت وارد Dashboard، گزارش Closure، Alert و Bonus شود. Source→Transform→Metric→View→Claim→Decision→Action را رسم کنید. حذف Node بدون شناخت Edge، Silent failure می‌سازد. Consumer بدون Owner را `ORPHAN` و استفادهٔ ناشناخته را `UNKNOWN` ثبت کنید.

تصمیم پنج‌حالته: Keep، Adapt، Replace، Retire، Investigate

Dispositionزمان مناسبتعهد
KEEPDecision و Semantic و Data همچنان Fit هستندContract/Owner/Review را تثبیت کنید
ADAPTQuestion پابرجاست اما Scope/روش تغییر می‌کندRevision و Bridge/Break لازم است
REPLACEMeasure جدید همان Decision را بهتر پشتیبانی می‌کندDual-run و Consumer acceptance
RETIREDecision/Consumer حذف یا Harm بیشتر از Value استDependency check، archive و sunset
INVESTIGATEمصرف، معنا یا کیفیت داده نامعلوم استتا رفع Unknown، حذف یا Cutover نکنید

قدیمی بودن دلیل Retire نیست

یک سنجهٔ قدیمی ممکن است برای قرارداد مشتری، Audit، SLO، Capacity یا تحلیل تاریخی ضروری باشد. در مقابل، یک Metric تازه ممکن است Consumer یا Action نداشته باشد. Disposition را با Fitness، Cost، Harm، Dependency و Decision evidence توجیه کنید، نه با واژه‌های Legacy/Modern.

Future State را از Goal و Question طراحی کنید

ابتدا بپرسید: برای کدام Objective و تصمیم چه باید بدانیم؟ سپس Candidate measure انتخاب کنید. «به Agile رفتیم، پس Velocity لازم است» Metric-first است. شاید سؤال واقعی «کدام Evidence بیش از SLE منتظر است؟»، «چه Riskی بدون Oracle مانده؟» یا «کدام Slice پس از Release آسیب دیده؟» باشد.

Portfolio آینده را متوازن اما کوچک نگه دارید

  • Outcome: نتیجهٔ مورد نظر Stakeholder یا Product در Scope مشخص؛
  • Flow/Predictability: حرکت Work/Evidence در Workflow تعریف‌شده؛
  • Quality/Risk Evidence: شواهد محدود دربارهٔ Product/Service risk؛
  • Capability/Feedback: توان ساخت Feedback معتبر در زمان مناسب؛
  • Guardrail/Harm: پیامد ناخواسته، Gaming، امنیت، دسترس‌پذیری یا فشار؛
  • Data health: Completeness، Freshness، Duplicate و lineage؛
  • Context/Diagnostic: توضیح Investigation، نه KPI دائمی.

Activity را با Outcome جایگزین نکنید؛ رابطه را بسازید

تعداد Test case و Defect فعالیت/Observation هستند؛ Cycle time و Throughput نیز Outcome کسب‌وکار نیستند. Metric جدید فقط به‌خاطر Flow بودن «بهتر» نیست. Theory/Hypothesis و Guardrail لازم است تا نشان دهد تغییر چه مکانیسمی دارد و چه چیزی را ادعا نمی‌کند.

Velocity: Forecast محلی، نه امتیاز عملکرد

Story point مقیاس قراردادی همان تیم است و با تغییر Refinement، Composition، Definition of Done، Item split یا Scale جابه‌جا می‌شود. Velocity می‌تواند ورودی Forecast داخلی باشد؛ مقایسهٔ تیم‌ها، Target افزایشی، تبدیل به ساعت یا نسبت‌دادن مستقیم به Value/Quality آن را مستعد Gaming می‌کند. در Migration، استفادهٔ قدیم/جدید و ممنوعیت‌های آن را صریح بنویسید.

Burndown کیفیت یا ارزش را نشان نمی‌دهد

Burndown کار باقی‌مانده طبق یک Scope/Estimate را نمایش می‌دهد. خط زیبا نمی‌گوید Increment قابل‌استفاده، Risk پوشش داده، Goal محقق یا Outcome ایجاد شده است. تغییر Scope، Split و Estimate هم شکل نمودار را عوض می‌کند. اگر نگه می‌دارید، Claim آن را به Tracking محدود کنید.

Cycle Time بدون Start/Finish قرارداد ندارد

Start می‌تواند Selected، In Development، Ready for Test یا First Evidence باشد؛ Finish می‌تواند Code complete، Done، Accepted یا Released باشد. Item type، blocked time، reopened item، cancellation و timezone نیز نتیجه را تغییر می‌دهند. «کاهش Cycle time» بدون ثابت‌بودن این معنا، Improvement نیست.

WIP و Work Item Age به Identity سالم نیاز دارند

اگر یک Risk، Story، Bug و Test request در یک Item ادغام یا چندبار Clone شوند، WIP جعلی می‌شود. Work Item Age نیز با Reset کردن Start هنگام انتقال Board پاک می‌شود. Stable identity، State transition history و Definition of Workflow را پیش از مهاجرت Flow metric برقرار کنید.

Throughput اندازهٔ Value نیست

Throughput تعداد Item تمام‌شده در زمان است، نه مجموع ارزش، پیچیدگی یا کیفیت. Split کردن کار می‌تواند آن را بالا ببرد. برای Forecast Flow مفید است، اما باید Item type/Mix و policy ثابت یا قابل‌مشاهده باشد. Value evidence و Outcome را جدا نگه دارید.

Defect Count و Escape را با انتقال State اصلاح کنید

Bug count به Opportunity، Detection channel، Duplicate policy، Severity، Release exposure و Reporting behavior وابسته است. Escape فقط وقتی معنا دارد که Defect، Detection boundary، Population/Denominator و Window تعریف شوند. کاهش آن به‌تنهایی اثربخشی QA یا کیفیت بالاتر را ثابت نمی‌کند؛ گزارش کمتر، Exposure کمتر یا تغییر Taxonomy می‌تواند عامل باشد.

Defect Density را بر Story Point تقسیم نکنید

Story point Size فنی قابل‌مقایسهٔ محصول نیست. چگالی نقص فقط با Defect/Size/Observation و Comparability contracts معتبر است. تغییر KLOC، Function point، Module یا Story point Series break می‌سازد. Metric را به‌خاطر داشتن یک Denominator «نرمال‌شده» ننامید.

Coverage Evidence است، نه Risk score

Line/Branch/Requirement/Risk/State coverage Universe و Denominator متفاوت دارند. Coverage پایین به‌تنهایی «ریسک جدی» و Coverage بالا «اطمینان» نیست. اگر Coverage را منتقل می‌کنید، Contract و Claim آن را حفظ کنید؛ برای مرزهای دقیق از راهنمای Coverage Claim استفاده کنید.

Automation Ratio بلوغ نیست

نسبت Automated/Manual به تعریف Check، Scope و Counting unit وابسته است؛ بالا رفتن آن می‌تواند از افزودن Checkهای کم‌ارزش یا حذف Exploration بیاید. Candidate selection، Signal، Flake، Maintenance، Cost و Evidence fitness مهم‌تر از درصد خام‌اند. آن را Target سازمانی یا جایگزین قضاوت انسانی نکنید.

NPS و رضایت «معیار نهایی QA» نیستند

رضایت به قیمت، Support، Brand، انتظار، Sample و Self-selection وابسته است. QA فقط یکی از Contributorهای احتمالی است. Feedback مستقیم ارزشمند است، اما به Construct/Population/Question مشخص نیاز دارد. عدد رضایت را حقیقت نهایی Product یا اثربخشی تست ننامید.

Semantic Diff را Field-by-field ثبت کنید

semantic_mapping_id / old_metric_ref / new_metric_ref
same_question / same_entity / same_population / same_unit
old_start_finish / new_start_finish
old_window / new_window / old_attempt / new_attempt
old_inclusion_exclusion / new_inclusion_exclusion
old_source_transform / new_source_transform
known_delta / expected_direction / tolerance
comparability_class / bridge_method / approver

Identity و Event Contract را قبل از Backfill ببندید

Project ID، Sprint ID، Work item، Test case، Execution، Attempt، Defect، Build، Release و Deployment را یکی نگیرید. Event باید event_id، entity_id/type، state_from/to، event_time، ingested_at، source، schema_version و correction link داشته باشد. Late، duplicate، reordered و missing event Policy لازم دارد.

Backfill همیشه ممکن یا صادقانه نیست

Snapshotهای قدیمی ممکن است transition history، Attempt، Deleted item یا exact timestamp نداشته باشند. پرکردن Start با Created time یا Missing با صفر، تاریخ جعلی می‌سازد. Backfill را `FULL`، `PARTIAL`، `MODELLED` یا `NOT_POSSIBLE` طبقه‌بندی و دورهٔ غیرقابل‌مقایسه را علامت‌گذاری کنید.

Frozen Validation Pack بسازید

برای تست Transform، Dataset مصنوعی با caseهای Normal، Cancelled، Reopened، Duplicate، Late، Missing، Out-of-order، DST/timezone و Schema-version بسازید. Expected output مستقل از Query تولیدی باشد. دادهٔ زندهٔ متغیر Oracle خوبی برای Migration نیست.

Dual-run چیست؟

در Dual-run، Pipeline قدیم و جدید برای Window محدود روی Populationهای تا حد ممکن هم‌راستا اجرا می‌شوند. هدف برابرشدن عددها نیست؛ توضیح‌پذیری Delta و Fitness تصمیم است. برای Replace با Semantic متفاوت، اختلاف انتظار می‌رود. Dual-run باید هزینه، Window، Sample، Acceptance، Triage و Stop داشته باشد.

dual_run_id / old_revision / new_revision / snapshot_ids
window / population_alignment / exclusions
expected_delta / tolerance_basis / discrepancy_taxonomy
data_health / owner / daily_review
acceptance / stop / extension / evidence_pack

هر اختلافی Defect نیست

کلاس Deltaمثالاقدام
EXPECTED_SEMANTICFinish قدیم=Test complete، جدید=DoneBridge/Break و توضیح Consumer
DATA_QUALITYEvent گمشده یا DuplicateFix source/ingestion و Replay
TRANSFORM_DEFECTTimezone یا Attempt filter اشتباهFix، rerun، Correction
SCOPE_MISMATCHBug با Story در Population مخلوط استAlign/Separate
LEGACY_DEFECTQuery قدیم Cancelled را Count می‌کرداثر Claimهای گذشته را بررسی کنید
UNKNOWNProvenance کافی نیستHold؛ اختلاف را صفر نکنید

Comparable، Bridged، Break و Unknown

  • COMPARABLE: Semantic/Data هم‌معنا و اختلاف در حد ازپیش‌توجیه‌شده است.
  • BRIDGED: رابطهٔ محدود در دورهٔ هم‌پوشان برآورد و دامنهٔ کاربرد آن ثبت شده است.
  • SERIES_BREAK: مقایسهٔ مستقیم گمراه‌کننده است؛ خط مرزی نمایش دهید.
  • UNKNOWN: Evidence برای یکی از سه ادعای بالا کافی نیست.

Bridge به معنای تبدیل جهانی نیست

رابطهٔ Old/New در یک تیم، Item mix و Window ممکن است جای دیگر معتبر نباشد. Bridge باید Method، Overlap period، Residual/uncertainty، Population و Expiry داشته باشد. Story point را به ساعت، Velocity را به Throughput یا Test-cycle time را به Delivery cycle time با ضریب ثابت تبدیل نکنید.

Baseline را وسط Migration بازنویسی نکنید

Baseline قدیم، Baseline جدید و Bridge period سه Snapshot جدا هستند. اگر Semantic تغییر کرده، Trend قبلی را با فرمول تازه Restate نکنید مگر Raw data، روش قابل‌دفاع و برچسب Restated دارید. Original series را نگه دارید و اثر تصمیم‌های گذشته را حفظ کنید.

Target و Threshold نیز مهاجرت می‌کنند

Target قدیم را به مقیاس جدید کپی نکنید. ابتدا Baseline و رفتار Metric جدید را در Shadow ببینید، Cost/Harm و Action را تعیین و Target/Threshold را با Revision تصویب کنید. Control limit، SLE، Target و Alert threshold مفاهیم متفاوت‌اند.

Dashboard، Alert و Report را همزمان ممیزی کنید

Cutover Data بدون Cutover View ممکن است Label قدیمی را روی Semantic جدید نشان دهد. Title، Definition tooltip، As-of، Population، Unit، Break marker، Unknown state، Accessible table، Export و API contract را بررسی کنید. Alert باید Trigger، Owner، SLA و Action جدید داشته باشد.

Automated decisionهای پایین‌دستی را پیدا کنید

Metric ممکن است Release gate، Pager، Bonus، Capacity forecast یا Vendor report را تغذیه کند. تغییر Field/Unit یا Null semantics می‌تواند تصمیم خودکار را بی‌صدا عوض کند. Contract test، Consumer acknowledgment و Kill switch برای استفاده‌های پرریسک لازم است.

Cutover Gate چه چیزی را بررسی می‌کند؟

  • Migration Charter و Dispositionها Approved-for-cutover هستند؛
  • Metric/Data/View/Alert contract نسخه‌دار و Ownerدار است؛
  • Frozen pack و Dual-run بدون Finding بحرانی باز اجرا شده‌اند؛
  • Deltaهای باقی‌مانده Disposition و Consumer impact دارند؛
  • Comparability/Bridge/Break در همهٔ Viewها آشکار است؛
  • Target/Threshold/Action جدید تصویب یا عمداً غیرفعال است؛
  • Consumerها Acknowledge و Training/Support آماده‌اند؛
  • Backup، Rollback trigger، Kill switch و On-call آماده است؛
  • Privacy/Access/Retention و Data health Gate پاس شده‌اند؛
  • Not claimed و تاریخ Stabilization review ثبت شده است.

Cutover موفق یعنی Pipeline عوض شده، نه کیفیت بهتر شده

`CUTOVER_COMPLETED` فقط می‌گوید Producer/Consumer طبق برنامه به نسخهٔ جدید منتقل شده‌اند. نه Improvement، نه Agile maturity، نه Product quality و نه ارزش مشتری را ثابت می‌کند. این ادعاها به Evidence و ارزیابی مستقل نیاز دارند.

Rollback را قبل از Cutover تمرین کنید

Rollback باید Version، Data write، Cache، Dashboard، Alert، Consumer API و Decision log را پوشش دهد. مشخص کنید چه چیزی برگشت‌پذیر نیست—مثلاً تصمیمی که بر Metric غلط گرفته شده—و چگونه Correction/Notification می‌شود. «Query قدیم هنوز هست» Runbook Rollback نیست.

rollback_id / trigger / authority / max_time
producer_version / consumer_version / data_snapshot
disable_new_alerts / restore_old_view / replay_policy
decision_freeze / notification / validation / closure
irreversible_effects / correction_links

Stabilization Window پس از Cutover

پس از Cutover، Data freshness/completeness، Query cost، Alert noise، Consumer confusion، Gaming، Unknown rate و Action quality را پایش کنید. Legacy pipeline را فوراً حذف نکنید، اما دو Truth دائمی هم نسازید. تاریخ Exit از Stabilization و شرط Extension/Abort روشن باشد.

Retirement یعنی Sunset کنترل‌شده

Producer قدیم را read-only کنید، Write/refresh را متوقف، API/View را Deprecate، Consumer باقی‌مانده را مسدود یا Exception کنید و Archive/Retention را اعمال کنید. Definition، Query، Revision، History، Decisions و Correction chain را نگه دارید. پاک‌کردن تاریخچه شفافیت نمی‌سازد.

Communication فقط اعلام Dashboard جدید نیست

مخاطبباید بداندAcknowledgment
تیم Delivery/QASemantic، Use/Non-use، Gaming، ActionScenario review
مدیر/PortfolioSeries break، Target، محدودیت ForecastDecision receipt
Data/PlatformSchema، SLA، lineage، replay، costContract acceptance
Audit/CustomerContinuity، Retention، Report changeFormal sign-off if required
Support/On-callFailure mode، rollback، escalationRehearsal evidence

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

Velocity، Throughput، Defect count، Cycle time، Coverage و Automation ratio زمینهٔ سیستمی دارند. اتصال آن‌ها به Bonus، Ranking، Headcount یا فشار فردی رفتار را عوض و Migration evidence را آلوده می‌کند. `people_scoring=false`، unit of analysis، use limitation و Countermetric سلامت تیم را در Charter ثبت کنید.

Privacy و Security در Measurement Migration

Join کردن Git، Ticket، Test، Chat و HR می‌تواند نظارت فردی و Re-identification بسازد. Purpose limitation، حداقل Field، Aggregation، Pseudonymization، least privilege، retention/deletion، export control و Audit log لازم است. دادهٔ قدیم را فقط چون «برای Trend خوب است» نامحدود نگه ندارید.

Correction پس از کشف خطای Migration

correction_id / discovered_at / owner
affected_metric_revisions / windows / views / exports
affected_claims / alerts / decisions / consumers
cause_class / corrected_values / confidence
supersedes / notification / replay / remediation
rollback_or_continue / revalidation / closure

آزمایش اجرایی: سه عدد قدیمی و Cutover فوری

Fixture زیر کاملاً ساختگی و آفلاین است. Checker سطحی سه Metric موجود و برچسب `AGILE_CUTOVER_READY` را می‌بیند. ممیزی Migration دارای ۶۲ Rule است؛ ۶۱ جزء مهاجرت غایب‌اند و Rule آخر People scoring را منع می‌کند. چون false است، نسخهٔ خام دقیقاً ۶۱ Finding می‌گیرد. Rule count Benchmark یا مدل بلوغ نیست.

const draft = {
  legacy_dashboard: { executed_tests: 120, defects: 18, pass_rate: 95 },
  proposed: ["velocity", "cycle_time", "defect_escape"],
  declared_status: "AGILE_CUTOVER_READY",
  people_scoring: false
};

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

const rules = [
  ["MM-01 migration_id", x => present(x.migration_id)],
  ["MM-02 revision", x => present(x.revision)],
  ["MM-03 supersedes", x => present(x.supersedes)],
  ["MM-04 as_of", x => present(x.as_of)],
  ["MM-05 trigger", x => present(x.trigger)],
  ["MM-06 problem", x => present(x.problem)],
  ["MM-07 scope", x => present(x.scope)],
  ["MM-08 out_of_scope", x => present(x.out_of_scope)],
  ["MM-09 current_system_ref", x => present(x.current_system_ref)],
  ["MM-10 target_model_ref", x => present(x.target_model_ref)],
  ["MM-11 decisions", x => present(x.decisions)],
  ["MM-12 consumers", x => present(x.consumers)],
  ["MM-13 authority", x => present(x.authority)],
  ["MM-14 due", x => present(x.due)],
  ["MM-15 legacy_inventory", x => present(x.legacy_inventory)],
  ["MM-16 metric_lineage", x => present(x.metric_lineage)],
  ["MM-17 consumer_graph", x => present(x.consumer_graph)],
  ["MM-18 dispositions", x => present(x.dispositions)],
  ["MM-19 disposition_evidence", x => present(x.disposition_evidence)],
  ["MM-20 future_goals", x => present(x.future_goals)],
  ["MM-21 future_questions", x => present(x.future_questions)],
  ["MM-22 future_portfolio", x => present(x.future_portfolio)],
  ["MM-23 metric_contracts", x => present(x.metric_contracts)],
  ["MM-24 semantic_mappings", x => present(x.semantic_mappings)],
  ["MM-25 entity_identity", x => present(x.entity_identity)],
  ["MM-26 workflow_definition", x => present(x.workflow_definition)],
  ["MM-27 start_finish", x => present(x.start_finish)],
  ["MM-28 population_windows", x => present(x.population_windows)],
  ["MM-29 attempt_policy", x => present(x.attempt_policy)],
  ["MM-30 event_contract", x => present(x.event_contract)],
  ["MM-31 source_mapping", x => present(x.source_mapping)],
  ["MM-32 transform_versions", x => present(x.transform_versions)],
  ["MM-33 data_quality", x => present(x.data_quality)],
  ["MM-34 backfill_policy", x => present(x.backfill_policy)],
  ["MM-35 validation_pack", x => present(x.validation_pack)],
  ["MM-36 shadow_plan", x => present(x.shadow_plan)],
  ["MM-37 dual_run", x => present(x.dual_run)],
  ["MM-38 discrepancy_taxonomy", x => present(x.discrepancy_taxonomy)],
  ["MM-39 discrepancy_owner", x => present(x.discrepancy_owner)],
  ["MM-40 comparability_class", x => present(x.comparability_class)],
  ["MM-41 bridge_or_break", x => present(x.bridge_or_break)],
  ["MM-42 baseline_policy", x => present(x.baseline_policy)],
  ["MM-43 target_threshold_policy", x => present(x.target_threshold_policy)],
  ["MM-44 downstream_contracts", x => present(x.downstream_contracts)],
  ["MM-45 dashboard_alerts", x => present(x.dashboard_alerts)],
  ["MM-46 consumer_ack", x => present(x.consumer_ack)],
  ["MM-47 cutover_gate", x => present(x.cutover_gate)],
  ["MM-48 rehearsal", x => present(x.rehearsal)],
  ["MM-49 rollback_plan", x => present(x.rollback_plan)],
  ["MM-50 rollback_triggers", x => present(x.rollback_triggers)],
  ["MM-51 kill_switch", x => present(x.kill_switch)],
  ["MM-52 communication", x => present(x.communication)],
  ["MM-53 training_support", x => present(x.training_support)],
  ["MM-54 stabilization", x => present(x.stabilization)],
  ["MM-55 retirement", x => present(x.retirement)],
  ["MM-56 history_retention", x => present(x.history_retention)],
  ["MM-57 privacy_access", x => present(x.privacy_access)],
  ["MM-58 owners", x => present(x.owners)],
  ["MM-59 guardrails", x => present(x.guardrails)],
  ["MM-60 not_claimed", x => present(x.not_claimed)],
  ["MM-61 correction_policy", x => present(x.correction_policy)],
  ["MM-62 people_scoring_prohibited", x => x.people_scoring !== true]
];

const findings = (x) => rules.filter(([, ok]) => !ok(x)).map(([id]) => id);
console.log("SUPERFICIAL", Object.keys(draft.legacy_dashboard).length, draft.declared_status);
console.log("MIGRATION", findings(draft).length ? "HOLD" : "READY", findings(draft).length);

const corrected = {
  migration_id: "SYN-MM-042", revision: "v1", supersedes: "none:first-revision",
  as_of: "2026-08-13T10:00:00Z", trigger: "fictional workflow change",
  problem: "legacy measures no longer answer bounded decisions", scope: "synthetic checkout evidence flow",
  out_of_scope: ["real organization", "production", "productivity score"],
  current_system_ref: "SYS-SYN-LEGACY-v1", target_model_ref: "MODEL-SYN-FLOW-v1",
  decisions: ["which evidence item needs investigation?"], consumers: ["ROLE-SYN-QA", "ROLE-SYN-DECISION"],
  authority: "ROLE-MIGRATION-AUTHORITY", due: "2026-09-30T10:00:00Z",
  legacy_inventory: "INV-SYN-MM-042-v1", metric_lineage: "LINEAGE-SYN-v1",
  consumer_graph: "GRAPH-SYN-v1", dispositions: ["KEEP", "ADAPT", "REPLACE", "RETIRE", "INVESTIGATE"],
  disposition_evidence: "bounded decision/fitness/cost/harm rationale",
  future_goals: ["timely decision evidence"], future_questions: ["where is evidence waiting?", "is data fit?"],
  future_portfolio: ["outcome", "flow", "guardrail", "data_health"], metric_contracts: "REG-SYN-MM-v1",
  semantic_mappings: "MAP-SYN-MM-v1", entity_identity: "stable fake Work/Evidence/Run/Build IDs",
  workflow_definition: "DOW-SYN-v1", start_finish: "accepted-for-evidence to decision-ready",
  population_windows: "fictional evidence items; UTC weekly snapshot", attempt_policy: "all attempts retained; latest not substituted",
  event_contract: "EVT-SYN-v1 event/ingest/schema/correction", source_mapping: "SOURCE-MAP-SYN-v1",
  transform_versions: ["legacy-v1", "candidate-v1"], data_quality: "freshness/completeness/duplicate/order gates",
  backfill_policy: "PARTIAL labelled; no missing-as-zero", validation_pack: "PACK-SYN-normal-late-duplicate-reopen-v1",
  shadow_plan: "30d; no gate/reward", dual_run: "DUAL-SYN-v1 aligned frozen snapshots",
  discrepancy_taxonomy: ["EXPECTED_SEMANTIC", "DATA_QUALITY", "TRANSFORM_DEFECT", "SCOPE_MISMATCH", "UNKNOWN"],
  discrepancy_owner: "ROLE-DATA-STEWARD", comparability_class: "SERIES_BREAK with bounded overlap",
  bridge_or_break: "visible break; no universal conversion", baseline_policy: "old/new/overlap snapshots separate",
  target_threshold_policy: "disabled until shadow review", downstream_contracts: "CONSUMER-CONTRACT-SYN-v1",
  dashboard_alerts: "new labels/as-of/break/unknown; alerts disabled in shadow", consumer_ack: "ACK-SYN-v1",
  cutover_gate: "GATE-SYN-MM-v1", rehearsal: "REHEARSAL-SYN-v1 restore/read/alert tests",
  rollback_plan: "ROLLBACK-SYN-v1", rollback_triggers: ["data gate fail", "unknown critical consumer", "harm"],
  kill_switch: "disable new producer/view/alerts", communication: "role-specific change and break notice",
  training_support: "scenario walkthrough plus support owner", stabilization: "14d data/consumer/action review",
  retirement: "read-only then sunset with exceptions", history_retention: "preserve versions/claims/decisions per fictional policy",
  privacy_access: "synthetic only; aggregate; least privilege; expiry", owners: ["migration", "metric", "data", "consumer", "decision"],
  guardrails: ["unknown rate", "alert noise", "privacy", "team health"],
  not_claimed: ["Agile maturity", "product quality", "improvement", "productivity", "causality"],
  correction_policy: "supersede and notify affected consumers/claims/decisions; no silent edit",
  people_scoring: false
};

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

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

SUPERFICIAL 3 AGILE_CUTOVER_READY
MIGRATION HOLD 61
CORRECTED READY_FOR_MEASUREMENT_MIGRATION_REVIEW 0

سه عدد قدیمی و سه نام جدید هیچ‌یک Migration را کامل نمی‌کنند. Rule منع People scoring تنها Rule پاس‌شده است. نسخهٔ اصلاح‌شده صفر Finding ساختاری دارد، اما درستی داده، Fitness سنجه‌ها، کفایت Dual-run، اعتبار Bridge، موفقیت Cutover، بهبود Flow/Quality، Agile maturity یا درستی Decision را ثابت نمی‌کند. خروجی Review است، نه Cutover Approved.

آزمایشگاه آفلاین ایرانی برای Metric Migration

یک Checkout کاملاً ساختگی و بدون شبکه بسازید: fake Order، PaymentAttempt، PSP Stub، Callback، Ledger، Reconciliation و Notification. Workflow قدیم `test_started→test_complete` و Candidate جدید `evidence_accepted→decision_ready` است؛ بنابراین Cycle timeها عمداً هم‌معنا نیستند. Eventهای timeout پیش/پس از fake commit، retry، duplicate، late، reordered، reopen و cancel را وارد کنید.

آزمونخرابی Seedشدهانتظار
Identityیک Attempt با Work item ادغام شودHOLD و Scope mismatch
TimezoneTehran display به‌جای UTC در TransformTransform defect
DuplicateCallback دوبار ingest شودData-quality finding
Late eventFinish پس از Snapshot برسدCorrection/Recompute، نه حذف
SemanticFinish قدیم و جدید متفاوت باشدSeries break، نه Query fix
RollbackCandidate view عدد Unknown دهدKill switch و restore آزمایشی

مرزهای داده و بازار ایران در Lab

Tenant/Order/Attempt/Event/Ledger/Work/Evidence/Run/Build/Snapshot/Metric/Migration/Decision شناسه‌های جدا و ساختگی دارند. مبلغ فقط IRR خیالی است و تومان با برچسب «نمایشی» نشان داده می‌شود. ارقام فارسی/عربی/لاتین، ی/ی، ک/ک، ZWNJ، RTL/Bidi، UTC instant، Asia/Tehran view و تاریخ جلالی صرفاً نمایشی آزموده می‌شوند.

Lab هیچ اتصال شبکه، Production، سازمان/تیم/کاربر/سفارش/پرداخت/PSP/بانک واقعی، پول واقعی، دادهٔ HR، PII، نام، موبایل، ایمیل، IP، حساب، PAN، CVV2، OTP، Cookie، Token، Credential، Log یا Screenshot واقعی ندارد و توصیهٔ بانکی، مالی، حقوقی، مالیاتی، امنیتی، منابع انسانی یا حریم خصوصی نیست.

Pilot سی‌روزهٔ مهاجرت سنجه‌ها

  1. روز ۱ تا ۵: Trigger/Scope/Authority و Current inventory/consumer graph را ببندید.
  2. روز ۶ تا ۱۰: Disposition، Goal/Question و Future portfolio را Review کنید.
  3. روز ۱۱ تا ۱۵: Semantic/Data/Event contracts و Frozen validation pack را بسازید.
  4. روز ۱۶ تا ۲۲: Shadow/Dual-run را بدون Gate، Reward یا Target فعال اجرا کنید.
  5. روز ۲۳ تا ۲۶: Deltaها را Triage و Comparable/Bridge/Break/Unknown را تعیین کنید.
  6. روز ۲۷ تا ۲۸: Consumer acknowledgment و Cutover/Rollback rehearsal انجام دهید.
  7. روز ۲۹ تا ۳۰: Authority فقط CUTOVER، HOLD یا STOP را با Evidence ثبت کند.

ضدالگوهای مهاجرت معیارهای تست

  • حذف هر Metric قدیمی فقط چون «Waterfall» است؛
  • کپی‌کردن فهرست Agile KPI از اینترنت؛
  • استفاده از Velocity به‌عنوان بهره‌وری/کیفیت؛
  • مقایسهٔ Velocity تیم‌ها یا افراد؛
  • نامیدن Burndown به‌عنوان Outcome؛
  • Cycle time بدون Start/Finish/Item contract؛
  • Throughput به‌عنوان Value؛
  • Defect escape به‌عنوان اثربخشی قطعی QA؛
  • Defect density بر Story point؛
  • Coverage پایین به‌عنوان Risk قطعی؛
  • Automation ratio به‌عنوان بلوغ؛
  • NPS به‌عنوان معیار نهایی کیفیت؛
  • تغییر Query و حفظ همان Label/Target؛
  • Backfill کردن Missing با صفر یا Created time؛
  • برابرخواستن Old/New با Semantic متفاوت؛
  • تبدیل با ضریب جهانی Story point/Velocity/Flow؛
  • Restate خاموش تاریخچه و Baseline؛
  • Cutover Data بدون View/Alert/API consumer؛
  • حذف Pipeline قدیم پیش از Stabilization؛
  • دو Truth دائمی بدون Authority؛
  • Rollback فقط در حد داشتن Query قدیم؛
  • استفادهٔ تنبیهی یا امتیازدهی افراد؛
  • Join کردن دادهٔ HR/Chat/Git بدون Purpose/Privacy؛
  • اعلام Improvement یا Agile maturity پس از Cutover؛
  • اصلاح خاموش عددها و تصمیم‌های متاثر.

چک‌لیست Owner پیش از Cutover

  • Trigger/Scope/out-of-scope/Authority/موعد روشن است؟
  • Inventory فراتر از Dashboard و شامل Alert/API/Bonus/Gate است؟
  • Consumer/Decision/Action هر Metric ثبت شده است؟
  • Lineage و downstream dependency کامل یا Unknown است؟
  • Keep/Adapt/Replace/Retire/Investigate دلیل و Approver دارد؟
  • Future metrics از Goal/Question مشتق شده‌اند؟
  • Portfolio Outcome/Flow/Quality/Guardrail/Data health متوازن است؟
  • Metric/Workflow/Identity/Event contracts نسخه‌دارند؟
  • Start/Finish/Population/Window/Attempt و Null روشن‌اند؟
  • Backfill محدودیت و برچسب صادقانه دارد؟
  • Frozen validation pack Seedهای دشوار دارد؟
  • Dual-run Snapshot/Window/Acceptance/Stop دارد؟
  • Delta taxonomy و Owner مشخص است؟
  • Comparability/Bridge/Break/Unknown مستند و در View آشکار است؟
  • Baseline/Target/Threshold قدیم خاموش کپی نشده‌اند؟
  • Dashboard/Alert/Export/API و automated decision تست شده‌اند؟
  • Consumer acknowledgment، Training و Support آماده است؟
  • Rehearsal/Rollback/Kill switch و Correction اجرا شده‌اند؟
  • Stabilization/Retirement/History retention تعریف شده است؟
  • `people_scoring=false`، Privacy و Not claimed صریح‌اند؟

پرسش‌های متداول درباره معیارهای تست چابک

بهترین معیارهای تست چابک کدام‌اند؟

فهرست جهانی وجود ندارد. ابتدا Objective، Question، Consumer و Decision را تعریف کنید. سپس Portfolio کوچکی از Outcome، Flow/Predictability، Quality/Risk evidence، Guardrail و Data health بسازید. اگر Kanban را طبق راهنمای آن اجرا می‌کنید، WIP، Throughput، Work Item Age و Cycle Time حداقل Flow metrics هستند؛ این به معنای KPI بودن همهٔ آن‌ها برای QA نیست.

تفاوت معیارهای تست سنتی و چابک چیست؟

تفاوت سالم از Decision و Operating model می‌آید، نه از سن Metric. محیط پروژه‌ای ممکن است Completion/Evidence milestone بخواهد؛ Flow پیوسته ممکن است Age/WIP/feedback را لازم داشته باشد. سنجهٔ قدیمیِ Fit را نگه دارید و سنجهٔ جدیدِ بی‌مصرف را رد کنید. «Traditional» و «Agile» به‌تنهایی قرارداد معنایی نیستند.

آیا Velocity KPI خوبی برای تیم QA است؟

معمولاً نه. Velocity می‌تواند ورودی Forecast داخلی همان تیم باشد، اما Story point بین تیم‌ها هم‌مقیاس نیست و با Split/Estimate/DoD تغییر می‌کند. آن را Target، Ranking، Bonus، Productivity یا Quality score نکنید و برای افراد به‌کار نبرید.

آیا هنگام مهاجرت باید تاریخچهٔ Metric قدیمی را تبدیل کنیم؟

فقط اگر Raw data و Semantic کافی برای Restatement قابل‌دفاع دارید. در غیر این صورت Original series را حفظ و `SERIES_BREAK` بگذارید. Bridge محدود نیازمند دورهٔ هم‌پوشان، Method، Population، uncertainty و Expiry است؛ ضریب تبدیل جهانی نسازید.

Dual-run معیارهای قدیم و جدید چقدر طول بکشد؟

مدت ثابت جهانی ندارد. Window باید variation، Item mix، cadence تصمیم، رخدادهای کم‌فراوان و هزینهٔ اجرا را پوشش دهد و Stop/Extension rule داشته باشد. Dual-run تا توضیح‌پذیری Delta و آمادگی Consumer ادامه دارد، نه تا برابرشدن اجباری دو عدد با Semantic متفاوت.

جمع‌بندی: سیستم سنجش را مهاجرت دهید، نه اسم Metric را

Agile شدن با حذف Test count و نصب Velocity/Cycle time رخ نمی‌دهد. Current system، Consumer، Decision، Semantic، Data و History را Inventory کنید؛ هر Metric را Keep/Adapt/Replace/Retire/Investigate کنید؛ Future state را از سؤال بسازید؛ Identity/Workflow/Event را ببندید و با Frozen pack، Shadow و Dual-run اختلاف‌ها را بفهمید.

اگر Old/New هم‌معنا نیستند، Break را پنهان نکنید. Target، View، Alert و Consumer نیز بخشی از Cutover هستند. Rollback را تمرین، History را حفظ و Legacy را کنترل‌شده Retire کنید. Measurement migration بالغ نه وعدهٔ کیفیت و بهره‌وری می‌دهد و نه افراد را رتبه‌بندی می‌کند؛ فقط تصمیم را بر سنجه‌ای Fit، قابل‌ردیابی، محدود و اصلاح‌پذیر قرار می‌دهد.

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