گردش کار نقص، تصویر چند ستون در ابزار نیست؛ یک قرارداد State machine برای تصمیم و تحویل مسئولیت است. اگر «Fixed» هم Status باشد هم ادعای فنی، اگر «Rejected» دلیل نداشته باشد، اگر هرکس بتواند Severity را عوض کند یا اگر بستن تیکت تاریخچه را پاک کند، Board مرتب هم شواهد قابل‌اعتماد تولید نمی‌کند. از طرف دیگر، افزودن ده‌ها وضعیت برای نمایش هر فعالیت، صف و گزارش را پیچیده می‌کند.

این راهنما یک Defect Workflow State Machine قابل‌ممیزی می‌سازد: Object و Scope را هویت می‌دهد؛ State را از Resolution، Field، Label و Queue جدا می‌کند؛ Transition، Guard، Actor و Authority را تعریف می‌کند؛ Evidence و Clockها را حفظ می‌کند؛ Duplicate/Not-a-defect/Deferred/Accepted-risk/Reopen را بدون تحریف تاریخ پوشش می‌دهد؛ و پیش از مهاجرت ابزار، Conformance test اجرا می‌کند. هدف «بهترین Workflow» یا تضمین کیفیت نیست؛ هدف جلوگیری از State ناممکن و تصمیم بی‌ردپا است.

پاسخ کوتاه: بهترین گردش کار ردیابی نقص چیست؟

یک نسخهٔ جهانی وجود ندارد. Workflow خوب کمترین Stateهایی را دارد که تفاوت معنی‌دار در مالکیت، کار مجاز، Evidence لازم، Clock یا تصمیم ایجاد می‌کنند. هر Transition مبدأ/مقصد، Trigger، Guard، Actor، Authority، Side effect و audit event دارد. Outcomeهایی مانند Duplicate، Not-a-defect، Won’t-do یا Fixed در Resolution/Reason نگهداری می‌شوند، نه اینکه بی‌قاعده با State مخلوط شوند.

چیزی که می‌خواهیم بدانیممدل مناسبنمونه
الان در چرخه کجاست؟StateTRIAGED، IN_PROGRESS، READY_FOR_VERIFICATION
چرا کار پایان یافت؟Resolution + reasonFIXED، DUPLICATE، NOT_A_DEFECT
چقدر مهم/فوری است؟Severity/Priority fieldS2 / P1 با rubric
کدام دامنه است؟Type/component/labelAPI، accessibility، payment
چه کسی کار می‌کند؟Owner/assignee/teamTeam Checkout
منتظر چیست؟Blocker/dependency relationBuild B17، Vendor case V4

مرز این مقاله با مدیریت نقص

راهنمای مدیریت نقص از Triage تا SLA و یادگیری مالک Intake، Severity/Priority، جلسهٔ Triage، SLA، aging، escape و بهبود کل فرایند است. این صفحه به لایهٔ پایین‌تر می‌پردازد: چگونه همان سیاست‌ها را به State/Transition/Guard قابل‌اجرا و قابل‌تست تبدیل کنیم، چگونه نسخه را عوض کنیم و از دادهٔ Workflow نتیجهٔ غلط نسازیم.

اول Object را تعریف کنید؛ هر مشاهده Defect نیست

Anomaly مشاهده‌ای است که نیاز به بررسی دارد. Failure رخدادی مشاهده‌شده است؛ Defect یک نقص در Work product می‌تواند باشد؛ Defect report رکورد ارتباطی دربارهٔ آن است. Incident، support request، change، debt، testware issue و security vulnerability ممکن است Workflow و محرمانگی متفاوت بخواهند. واژه‌ها را در Glossary محلی تعریف کنید و ادعای «Error علت انسانی و Defect معلول» را به قانون جهانی تبدیل نکنید.

Object typeTriggerمسیرنباید خودکار فرض شود
Product defect reportرفتار/Work product مشکوکDefect workflowعلت یا fix معلوم است
Testware issueOracle/data/script/config مشکل داردمالک Test assetProduct defect است
Production incidentاختلال فعالIncident response + linksمنتظر Triage عادی می‌ماند
Security vulnerabilityضعف قابل‌سوءاستفاده/گزارش بیرونیrestricted coordinationBoard عمومی امن است
Change/enhancementرفتار مطابق Basis ولی نیاز نامناسبProduct/change backlogگزارش نامعتبر است
Support questionنیاز راهنما/بررسیSupport workflowDefect حتماً وجود دارد

Workflow Contract را نسخه‌دار کنید

DefectWorkflowContract
WorkflowID / version / effective-from / owner / approver
Object types and Product/Service scope
Entry channels and normalization rules
States: purpose / entry / allowed work / exit / clock policy
Transitions: source / target / trigger / guard / actor / authority
Required fields and evidence by transition
Resolution and reason-code dictionaries
Severity/priority/risk vocabularies and owners
Duplicate/block/dependency/link semantics
SLA/OLA clocks, calendars, pause/resume rules
Notifications/integrations/automation identities
Terminal/reopen/archive/correction rules
Migration mapping / conformance suite / review / retirement

WorkflowID باید داخل هر audit event یا در reference قابل‌دسترسی باشد. وقتی Definition تغییر می‌کند، گزارش‌های قبل و بعد را بدون mapping و effective date مقایسه نکنید.

State را با Activity یا Role یکی نگیرید

«در دست توسعه‌دهنده»، «QA Testing»، «Waiting for PO» یا «Dev Done» نقش/فعالیت/انتظار را در نام State می‌دوزد و با تغییر تیم می‌شکند. State باید تفاوت عملیاتی پایدار بسازد. Owner، current activity، blocker و queue را Field یا Relation نگه دارید مگر واقعاً Guard/Clock/Decision متفاوتی ایجاد کنند.

  • هر State یک تعریف Entry/Exit و کار مجاز دارد؛
  • دو State با Guard و تصمیم یکسان ادغام می‌شوند؛
  • هر State دست‌کم یک مسیر خروج معتبر دارد؛
  • Terminal state کار باز یا Clock فعال ندارد؛
  • State نامشخصی مانند Done بدون Resolution ممنوع است؛
  • Blocked یک Relation/flag با علت و owner است، نه قبرستان؛
  • Waiting باید منتظر چه کسی/چه artifact/تا چه زمان را ثبت کند؛
  • UI column می‌تواند چند State را نمایش دهد؛ Board مدل دامنه نیست.

State machine مرجع کوچک

StateمعناGuard ورودخروج‌های اصلی
SUBMITTEDرکورد دریافت و هویت داده شدهحداقل ورودی/Reporter/زمانNEEDS_INFO، TRIAGED
NEEDS_INFOتصمیم Triage با Evidence فعلی ممکن نیستسؤال/مالک/موعدSUBMITTED، terminal resolution
TRIAGEDنوع/ریسک/مالک/Disposition تعیین شدهTriage recordPLANNED، DEFERRED، CLOSED
PLANNEDدر Queue تعهدشده با مقصد/مالکpriority/target rationaleIN_PROGRESS، DEFERRED
IN_PROGRESSAnalysis/change/mitigation فعال استowner + work referenceREADY_FOR_VERIFICATION، TRIAGED
READY_FOR_VERIFICATIONResolution candidate و Build/Evidence آمادهresolution/build/change evidenceVERIFIED، REOPENED، NEEDS_INFO
VERIFIEDVerification محدود پاس شدهoracle/result/evidenceCLOSED، REOPENED
REOPENEDResolution قبلی در Scope مقرر نپذیرفته شدattempt/reason/new evidenceTRIAGED، IN_PROGRESS
DEFERREDتصمیم فعال برای بعد، نه پایانauthority/reason/review/expiryTRIAGED، PLANNED، CLOSED
CLOSEDچرخه با Resolution ثبت‌شده پایان یافتهresolution/authority/evidence/linksREOPENED یا successor طبق policy

این مدل Template است، نه استاندارد. تیم کوچک می‌تواند TRIAGED و PLANNED را ادغام کند؛ محیط پرریسک ممکن است APPROVED_FOR_FIX، MITIGATED یا RELEASED را اضافه کند. معیار افزودن State، تصمیم/Guard/Clock واقعی است.

Transition Contract؛ پیکان هم داده می‌خواهد

DefectTransition
TransitionID / workflow version
FromState → ToState
Trigger and business meaning
Actor roles allowed to request
Authority required to approve
Guards and mandatory fields
Evidence references and freshness
Resolution/reason effects
Owner/assignee/queue effects
Clock start/pause/resume/stop
Notification/integration/idempotency effects
Audit event: who/when/from/to/why/changed fields
Failure behavior / override / exception expiry

Actor و Authority یکی نیستند: تستر می‌تواند درخواست Reopen کند، ولی تغییر Scope یا پذیرش ریسک ممکن است صاحب اختیار دیگری بخواهد. Automation هم Actor مستقل با service identity است؛ «System» یا Admin ناشناس audit را بی‌ارزش می‌کند.

Guard؛ وضعیت فقط با متن دکمه عوض نمی‌شود

  • SUBMITTED→TRIAGED: Object type، Scope، Observation و owner معلوم؛
  • TRIAGED→PLANNED: Priority/target/rationale و capacity authority؛
  • IN_PROGRESS→READY_FOR_VERIFICATION: Build/change/mitigation reference و Resolution candidate؛
  • READY_FOR_VERIFICATION→VERIFIED: Confirmation attempt، Oracle، result و Evidence؛
  • VERIFIED→CLOSED: Resolution نهایی، linked decision و open dependency check؛
  • هر→DEFERRED: reason، Risk owner، review date، expiry و trigger؛
  • هر→CLOSED با DUPLICATE: canonical record و رابطهٔ duplicate؛
  • هر→CLOSED با ACCEPTED_RISK: decision authority، scope، condition و expiry؛
  • CLOSED→REOPENED: policy، reason، Evidence و link به Build/incident تازه؛
  • Override: justification، approver، expiry و review؛ نه bypass بی‌ردپا.

Resolution نتیجهٔ چرخه است، نه تضمین حقیقت

ResolutionمعناEvidence/authorityنباید ادعا کند
FIXEDتغییر/mitigation در Subject مشخص verify شدهchange/build + verificationهیچ regression یا defect دیگری نیست
DUPLICATEهمان concern در رکورد canonical اداره می‌شودcanonical link + equivalence rationaleگزارش بی‌ارزش بود
NOT_A_DEFECTرفتار در Scope با Basis معتبر سازگار استbasis/version + reviewerنیاز کاربر مناسب است
NOT_REPRODUCEDدر تلاش‌های ثبت‌شده مشاهده نشدattempt/environment/data/limitsرخ نداده یا Reporter اشتباه کرده
WONT_DOتغییر انتخاب نشدهoption/risk/cost authorityRisk صفر یا Finding نامعتبر است
ACCEPTED_RISKRisk محدود پذیرفته شدهrisk owner/scope/condition/expiryامن یا compliant است
OBSOLETESubject دیگر در دامنه نیستremoval/version evidenceتاریخچه پاک می‌شود
CANNOT_FIXدر قید فعلی تغییر ممکن نیستconstraint/options/reviewبرای همیشه غیرممکن است

نام‌ها را محلی انتخاب کنید، ولی Reason dictionary را versioned و بدون Free-text-only نگه دارید. توضیح آزاد مکمل Reason code است. تغییر Resolution باید audit و در گزارش correction دیده شود.

CLOSED مساوی FIXED نیست

CLOSED State پایانی Workflow است؛ FIXED یکی از Resolutionهاست. اگر همهٔ بسته‌شده‌ها را «رفع‌شده» گزارش کنید، Duplicate، Not-reproduced، Accepted-risk و Obsolete را تحریف می‌کنید. داشبورد باید State و Resolution را جدا جمع کند و denominator را اعلام کند.

Severity، Priority و Risk را از State بیرون نگه دارید

Severity اثر مشاهده‌شده در Scope است؛ Priority ترتیب تصمیم/کار در Context؛ Risk احتمال/پیامد آینده با عدم‌قطعیت. یک نقص Severity بالا ممکن است با workaround و exposure پایین Priority متفاوت بگیرد؛ Priority می‌تواند با Release تغییر کند. State «Critical bug» یا «Low priority» تاریخچهٔ تصمیم و حرکت را مخلوط می‌کند.

DefectDecisionFields
Severity: rubric + affected population/data/operation + evidence
Priority: decision horizon + target + dependencies + authority
Risk: condition/event/impact + likelihood/uncertainty + owner
Customer/contract urgency: source + due + applicability
Change history: old/new/value/actor/reason/time
Overrides: approver + expiry + review

جزئیات Triage و Risk در راهنمای تست مبتنی بر ریسک تکمیل می‌شود. Workflow نباید با Matrix عددی ساختگی تصمیم را خودکار کند.

Intake؛ گزارش را بدون تخریب صدای Reporter نرمال کنید

گزارش می‌تواند از تست، Production، Support، Monitoring، Security researcher یا کاربر برسد. متن اصلی، زمان و Channel را immutable نگه دارید؛ نسخهٔ نرمال‌شده را جدا بسازید. Reporter نباید برای نداشتن اصطلاح فنی یا reproduction قطعی سرزنش شود.

DefectReport
ReportID / source / reporter or protected identity / received-at
Product/service/artifact/build/commit/config
Environment/device/browser/region/locale/timezone
Observed behavior + expected basis/version + difference
Preconditions/state/data class (minimized)
Steps or event sequence + frequency/attempts
Impact/population/workaround/safety signal
Logs/screenshots/traces with digest/redaction/retention
Related test/run/incident/change/support/security records
Reproduction status: NOT_TRIED | REPRODUCED | INTERMITTENT | NOT_OBSERVED
Unknowns / access sensitivity / disclosure restrictions
Normalizer / changed fields / original preserved

«Expected» باید به Requirement، rule، design decision، standard یا authorized Product interpretation وصل شود. نبود Basis می‌تواند Question/Change باشد؛ به‌خودی‌خود گزارش را Invalid نمی‌کند.

Duplicate؛ شباهت عنوان کافی نیست

دو گزارش با Symptom مشابه ممکن است Cause یا affected version متفاوت داشته باشند؛ دو Symptom متفاوت ممکن است یک Constraint مشترک داشته باشند. Deduplication باید canonical record، equivalence scope، affected builds/populations، Evidence و link دوطرفه داشته باشد. Reporter و Watcherهای رکورد فرعی باید Update مهم را دریافت کنند.

  • جست‌وجوی candidate با text/component/signature فقط پیشنهاد است؛
  • Human review یا rule معتبر equivalence را تعیین می‌کند؛
  • Duplicate reason بدون canonical ID ممنوع؛
  • Evidence منحصربه‌فرد به canonical منتقل/لینک می‌شود؛
  • Scope mismatch رکورد را merge نمی‌کند؛
  • بازشدن canonical اثر رکوردهای مرتبط را اعلام می‌کند؛
  • اشتباه dedupe قابل‌Undo و audit است؛
  • Duplicate rate برای تنبیه Reporter KPI نیست.

Needs Info و Not Reproduced قبرستان نیستند

NEEDS_INFO یک State فعال با سؤال دقیق، owner، کانال امن، due date و fallback است. NOT_REPRODUCED یک Resolution محدود به Attemptها و محیط‌های ثبت‌شده است. Timeout خودکار می‌تواند بسته‌شدن اداری بسازد، اما نباید «مشکل وجود ندارد» گزارش شود؛ پیامد بالا ممکن است Exploration، telemetry یا monitoring بخواهد.

Deferred و Accepted Risk را جدا نگه دارید

مفهومState/Resolutionنیازبازشدن
DeferredState غیرپایانی یا disposition زمان‌دارreason/target/review/ownerdate، dependency، risk change
BacklogQueue/commitment policypriority/target/capacityplanning/replenishment
Wont-doResolution پایانی تصمیم تغییر ندادنoptions/rationale/authoritycondition/new evidence
Accepted riskResolution/linked risk decisionscope/condition/expiry/ownerexpiry/exposure/incident
ObsoleteResolution پایانیsubject removal evidencefeature restored/reintroduced

Deferred بدون review date فقط پنهان‌کردن Queue است. Accepted risk را تستر یا Developer به‌طور پیش‌فرض تصویب نمی‌کند؛ صاحب اختیار باید در مدل مسئولیت و تصمیم نام‌گذاری شود.

Verification؛ تغییر کد با حل Concern یکی نیست

DefectVerification
VerificationID / defect / resolution candidate
Subject build/commit/config/environment
Change/mitigation and claimed scope
Test basis/oracle/version/tolerance/window
Precondition/state/data/cleanup
Confirmation attempts and actual result
Focused regression scope + exclusion rationale
Evidence artifacts/digests/redaction
PASS | FAIL | ERROR | BLOCKED | INCONCLUSIVE
Limitations/unknowns/expiry
Verifier / independence need / reviewed-at
Transition recommendation, not automatic release approval

PASS در Confirmation فقط Claim محدود را پشتیبانی می‌کند. Regression کامل، نبود defect، امنیت، کیفیت یا Release readiness را ثابت نمی‌کند. چرخهٔ Run/Attempt/Outcome در راهنمای مدیریت اجرای تست جزئی‌تر شده است.

Reopen؛ تاریخ را بازنویسی نکنید

Reopen باید نشان دهد Resolution قبلی در کدام Build/Scope پذیرفته نشد یا Evidence تازه چه چیزی را تغییر داد. Attempt قبلی پاک نمی‌شود. اگر Concern تازه فقط مشابه است یا نسخه/سبب متفاوت دارد، رکورد جدید با رابطهٔ regression/related-to بهتر از Reopen بی‌پایان است.

وضعیتReopen همان رکوردرکورد تازه
Confirmation در همان fix fail شدبلهمعمولاً خیر
همان Concern در Build بعد بازگشتطبق policy؛ regression linkبرای cycle/metrics جدا مفید
Symptom مشابه، cause/Scope متفاوتخیربله با related link
Accepted-risk منقضی شدبله یا successor طبق policyاگر context کاملاً تازه است
Reporter Evidence تازه داداگر همان Claimاگر Claim تازه

Clock و SLA؛ Calendar و Pause باید قابل‌بازتولید باشند

Aging بر پایهٔ Created تا Closed اغلب Queue، کار، انتظار Reporter، deploy و verification را مخلوط می‌کند. Clockها را رویدادمحور و جدا کنید: time-to-acknowledge، time-to-triage، queue-to-start، active resolution، wait-for-build، wait-for-verification، decision age و total elapsed.

DefectClockPolicy
ClockID / purpose / population
Start event / stop event
Pause states/reasons and who may pause
Calendar/timezone/working-hours/holidays
Severity/priority/service class mapping
Target vs hard deadline
Missing/out-of-order event behavior
Reopen reset/continue/new-clock policy
Exception/override/expiry
Source query/version and correction rule

Pause در NEEDS_INFO می‌تواند رفتار بد بسازد اگر سؤال مبهم باشد یا تیم داخلی تأخیر را به Reporter منتقل کند. SLA سبز لزوماً Outcome خوب نیست؛ backlog age، reopen، resolution mix و harm را کنار آن ببینید.

Scrum Workflow و Kanban Workflow نام‌گذاری گمراه‌کننده‌اند

راهنمای رسمی Scrum Guide 2020 Defect status یا Bug workflow تجویز نمی‌کند؛ تاکتیک‌های Context-sensitive را بیرون تعریف Scrum می‌گذارد. Scrum می‌تواند Fix را در Product Backlog یا Sprint work اداره کند، اما State machine شما باید همچنان Evidence، authority و terminal semantics داشته باشد. Kanban visualization/WIP نیز ستون‌های Board را به Lifecycle حقیقت تبدیل نمی‌کند.

Context profileتنظیم Workflowثابت‌های لازم
تیم کوچک/کم‌ریسکState کمتر، Triage asyncreason/evidence/audit
محصول چندتیمیrouting/ownership/dependency قویcanonical ID/system of record
Release زمان‌بندی‌شدهtarget build/fix version/deploy verifyBuild identity/decision authority
Continuous deliveryshort queues/automation/rollout linksattempt/rollback/production evidence
Safety/regulatoryapproval/independence/retention بیشترtraceability/no bypass
Open source/externalpublic intake/privacy/moderationreporter protection/communication
Securityrestricted states/disclosure coordinationauthorization/confidentiality/mitigation

منبع ISTQB چه می‌گوید و چه نمی‌گوید؟

ISTQB CTAL Test Management v3.0 یک نمونهٔ سادهٔ OPEN→IN PROGRESS→RESOLVED→CLOSED همراه REJECTED نشان می‌دهد و تصریح می‌کند Stateها، Transition rules و Roleها با سازمان فرق می‌کنند و Workflow باید با Context سازگار شود؛ Duplicate و false positive نیز باید قابل‌تحلیل بمانند. این منبع Vocabulary آموزشی است، نه الزام Certification، ابزار، نام State یا معماری همین مقاله.

Tool primitive را با Policy اشتباه نگیرید

Issue tracker ممکن است Status، label، assignee، project field، milestone، automation و permission بدهد. مستندات GitHub Projects نیز Viewهای table/board/roadmap و Fieldهای سفارشی را ابزار انعطاف‌پذیر معرفی می‌کند، نه یک Methodology اجباری. Jira، GitHub، GitLab، Azure DevOps، Redmine یا ابزار دیگر را پس از Contract و PoC انتخاب کنید؛ برند، State semantics را طراحی نمی‌کند.

  • آیا Guard واقعاً enforce می‌شود یا فقط متن راهنماست؟
  • Permission به Actor/Authority mapping می‌خورد؟
  • History شامل from/to/actor/time/reason/field diff است؟
  • API/Webhook eventها idempotent، versioned و قابل-reconcile هستند؟
  • Reason code و canonical duplicate link اجباری است؟
  • Clock calendar/pause/reopen قابل‌پیاده‌سازی است؟
  • Restricted security item و field-level access ممکن است؟
  • Export شامل history/attachment/link/schema است؟
  • Automation نمی‌تواند Guard را bypass کند؟
  • دسترسی/Region/پرداخت/Export از ایران آزمایش شده؟

امنیت؛ Vulnerability را در Board عمومی نریزید

جزئیات ضعف امنیتی، exploit، affected asset و Reporter identity ممکن است سوءاستفاده یا آسیب ایجاد کند. CERT/CC توضیح می‌دهد Vulnerability coordination میان چند ذی‌نفع برای تحلیل، remediation و disclosure انجام می‌شود. این راهنما جای Policy حقوقی/امنیتی یا هماهنگ‌کنندهٔ ذی‌صلاح نیست.

  • کانال intake و دامنهٔ تست مجاز؛
  • تأیید دریافت و ارتباط امن با Reporter؛
  • least disclosure و role/field-level access؛
  • Evidence encryption/redaction/retention؛
  • asset/affected version/exploitability/risk؛
  • vendor/subprocessor/dependency coordination؛
  • mitigation، fix، backport و affected-user path؛
  • disclosure decision، timeline و authority؛
  • CVE/identifier در صورت کاربرد، نه به‌عنوان Severity؛
  • incident escalation اگر exploitation فعال است؛
  • audit بدون افشای عمومی؛
  • post-disclosure correction.

روابط بین رکوردها را نوع‌دار کنید

RelationمعناInvariant
DUPLICATESConcern در canonical اداره می‌شودیک canonical فعال و بدون cycle
BLOCKS / BLOCKED_BYپیشرفت وابسته استجهت/owner/condition
CAUSED_BYCause با Evidence حمایت شدهفرضیه را Fact ننامد
REGRESSION_OFرفتار قبلی بازگشتهversion/fix lineage
FOUND_BYTest/run/monitor/incident sourcesource immutable
FIXED_BYChange candidatemerge به معنی verify نیست
VERIFIED_BYAttempt/Evidencesubject/build/oracle
AFFECTS / SUPERSEDESنسخه/رکورد اثرپذیر یا جایگزینscope/effective time

Free-text «مرتبط با #۱۲» برای Query و Integrity کافی نیست. Relationهای معکوس را atomic یا reconciliation‌پذیر نگه دارید.

Audit Event؛ تاریخچه برای پاسخ‌گویی، نه نظارت فردی

DefectWorkflowEvent
EventID / defectID / workflowVersion
EventType / occurred-at UTC / recorded-at UTC
Actor identity/type / delegated authority
FromState / ToState
Changed fields: old/new with sensitive-field policy
Reason code / rationale / evidence references
Source UI/API/import/automation + request/correlation ID
Idempotency key / sequence scope
Override/exception reference
Digest/retention/redaction/correction link

Event log نباید برای رتبه‌بندی سرعت افراد، میزان «بستن باگ» یا ساعات کار استفاده شود. هدف بازسازی تصمیم، کشف Drift و اصلاح داده است. دادهٔ حساس Reporter یا Security نباید در Export عمومی بیاید.

Automation و Integration؛ Effect-once طراحی کنید

CI می‌تواند defect candidate بسازد، PR می‌تواند change link کند و Deploy می‌تواند Verification را قابل‌اجرا کند؛ هیچ‌کدام نباید Closure را صرفاً از روی سبزی Pipeline انجام دهد. Webhook ممکن است تکراری، دیر یا خارج از ترتیب برسد. از event ID، idempotency، sequence scope، retry/backoff، DLQ و reconciliation استفاده کنید.

Automationعمل مجازGuard انسانی/سیستمی
Failed checkcandidate/update evidencededupe + expected-failure policy
PR mergedchange candidate linkedtarget build هنوز لازم
Build deployedREADY_FOR_VERIFICATION candidateartifact/config mapping
Confirmation passedverification evidenceoracle/attempt/scope/authority
Timeoutalert/escalateنه auto-close/accepted risk
Duplicate webhookno-op with auditidempotency key
Reconciliationrepair driftdry-run/approval/correction

اگر Issue tracker با Test management/CI/Chat یکپارچه می‌شود، راهنمای Data Contract، Retry و Trace semantics تحویل و reconciliation را تکمیل می‌کند.

Invariantهای Workflow را قابل‌اجرا کنید

  • State و Resolution از dictionary همان version هستند؛
  • Transition در Contract مجاز است؛
  • Guardهای مقصد کامل‌اند؛
  • Actor مجاز و Authority معتبر است؛
  • terminal بدون Resolution وجود ندارد؛
  • non-terminal Resolution نهایی ندارد؛
  • DUPLICATE canonical معتبر و non-cyclic دارد؛
  • DEFERRED owner/review/expiry دارد؛
  • ACCEPTED_RISK scope/authority/expiry دارد؛
  • READY_FOR_VERIFICATION build/change candidate دارد؛
  • VERIFIED attempt و Evidence معتبر دارد؛
  • REOPENED به resolution/attempt قبلی اشاره می‌کند؛
  • Clock eventها ordered یا explicitly corrected هستند؛
  • هر mutation audit event دارد؛
  • automation identity و idempotency key معلوم است؛
  • restricted item در notification/export نشت نمی‌کند.

Conformance Scenarioهای ضروری

Scenarioانتظار
Happy fix pathSubmitted→Triaged→In progress→Ready→Verified→Closed/Fixed
Verification failAttempt حفظ و Reopened؛ بدون پاک‌کردن Fixed candidate
Duplicatecanonical اجباری، relation بدون cycle، subscriber transfer
Not reproducedattempt/environment/limits اجباری
Deferred expiryبازگشت به triage یا escalation، نه ماندن خاموش
Accepted riskauthority/scope/condition/expiry و reopen trigger
Unauthorized transitionرد بدون mutation، audit security event
Missing guardرد با field errors قابل‌فهم
Duplicate webhookیک effect و چند delivery record
Out-of-order deployنسخهٔ کهنه State را عقب نبرد
Import legacymapping/confidence/quarantine برای ambiguous
Security exportrestricted fields/attachments حذف یا مجازسازی شوند

آزمایش مستقل: پنج Status در برابر ۵۲۸ کنترل

برای جلوگیری از اینکه مقاله فقط نمودار پیشنهادی باشد، یک Validator قطعی و بدون وابستگی روی Node.js ۲۴.۱۸.۰ اجرا شد. Fixture کاملاً ساختگی SYN-DEFECT-WORKFLOW-STATE-01 فقط پنج Status آشنا داشت: New، Assigned، Fixed، Retested و Closed. بررسی سطحی وجود آنها را کافی دانست و خروجی گمراه‌کننده داد:

STANDARD_DEFECT_LIFECYCLE_HIGH_QUALITY_READY

ممیزی مستقل دقیقاً ۵۲۸ کنترل یکتای group-qualified را در ۲۹ گروه identity، scope، terminology، intake، report، state، transition، guard، actor، authority، resolution، reason، duplicate، severity، priority، evidence، verification، reopen، defer، clock، queue، security، automation، migration، conformance، metric، governance، correction و limits مطالبه کرد. Fixture شعاری هیچ‌کدام را نداشت:

HOLD-528
NO_REAL_TARGET_PASS

قانون مستقل دوم تأیید کرد هیچ Product، Organization، Reporter، System، Vulnerability، Payment یا Outcome واقعی در آزمایش نیست. پس از درج همهٔ کنترل‌های ساختگی با کلید یکتا و assertion تعداد/uniqueness، نتیجهٔ ساختاری اصلاح شد:

READY_FOR_DEFECT_WORKFLOW_STATE_MACHINE_REVIEW-0

این نتیجه فقط کامل‌بودن ساختار Fixture را نشان می‌دهد؛ نه اینکه Observation واقعاً Defect است، Severity/Priority درست‌اند، Resolution/Verification معتبر است، Workflow برای Context کافی است، Security/Compliance برقرار است، defectها رفع شده‌اند، کیفیت محصول بهتر شده یا Release آماده است.

آزمایشگاه آفلاین فارسی؛ Callback ساختگی

آزمایشگاه هیچ شبکه، Product، سازمان، Reporter، بانک، PSP، پرداخت یا پول واقعی ندارد. چهار Defect report ساختگی دربارهٔ Order، PaymentAttempt، PSP Stub، Callback، Ledger و Reconciliation ساخته می‌شوند؛ یک Duplicate، یک timeout-after-fake-commit، یک verification failure و یک Accepted-risk منقضی‌شونده دارند.

SYN-DEFECT-CALLBACK-LAB-01
Workflow: DWF-7 / fixture-only
Builds: WEB-R12 / API-B44 / STUB-P3
Faults: timeout-before/after-fake-commit; duplicate/late/reordered
Data: fictional Order/Attempt/Callback/Ledger/Reconciliation
Money: fictional IRR; labelled display-only toman
Locale: fa-IR/RTL; Persian/Arabic/Latin digits; ی/ي; ک/ك; ZWNJ
Time: UTC events; Asia/Tehran views; Jalali presentation-only
No network/Production/real person/org/system/vulnerability/payment/outcome

Runner transitionهای مجاز/غیرمجاز، Guard، canonical duplicate، audit event، idempotent webhook، out-of-order deploy، reopen و expiry را روی Eventهای ساختگی امتحان می‌کند. PASS این آزمایش فقط State machine fixture را می‌سنجد و Benchmark ابزار یا فرایند واقعی نیست.

مهاجرت Workflow؛ Board را یک‌شبه عوض نکنید

  1. Inventory State/Resolution/Field/Automation/Query/Dashboard/API؛
  2. مشاهدهٔ استفادهٔ واقعی و Stateهای مرده/ambiguous؛
  3. Contract و dictionary جدید با Decision owner؛
  4. Old→New mapping یک‌به‌یک/چندبه‌یک/ambiguous؛
  5. Legacy snapshot، digest و recoverable backup؛
  6. Dry-run روی کپی کمینه و redacted؛
  7. Conformance suite و report reconciliation؛
  8. Shadow read/report پیش از write cutover؛
  9. Freeze window و idempotent migration؛
  10. Quarantine رکورد ambiguous، نه حدس؛
  11. Update integration/template/dashboard/training؛
  12. Canary team، rollback criteria و support؛
  13. Post-cutover count/link/history/clock checks؛
  14. Old workflow read-only retention و retirement date.
WorkflowMigrationRecord
MigrationID / oldVersion → newVersion
Scope/query/snapshot/digest/counts
State-resolution-field mapping version
Ambiguous records and quarantine owner
History/link/attachment/comment preservation
Automation/integration/dashboard consumers
Dry-run/conformance/reconciliation evidence
Cutover actor/time/idempotency
Rollback checkpoint/criteria/result
Post-check/correction/notification
Legacy retention and deletion authority

Metricهای Workflow با denominator و Countermetric

MeasureتصمیمCountermetric/limit
Time in state/queueکجا انتظار است؟work class/blocked reason
Transition rejectionGuard/UX مبهم است؟unsafe bypass/override
Resolution mixچرا چرخه‌ها پایان می‌یابند؟severity/source mix
Reopen by reasonverification/fix/Scope مشکل دارد؟new-versus-same concern
Deferred overdueتصمیم‌های زمان‌دار رها شده‌اند؟risk/owner/expiry
Needs-info ageارتباط کجا می‌ماند؟question quality/reporter burden
Audit completenessتصمیم قابل‌بازسازی است؟capture/privacy cost
Migration mismatchداده سالم منتقل شد؟quarantine/false correction

Defect count، closure rate، developer fix speed یا tester reopen rate نباید KPI فردی یا کیفیت Product باشد. Trend ممکن است از Release mix، Detection، policy یا migration تغییر کند. گزارش Evidence تا تصمیم محدودیت Claim را برای ذی‌نفعان حفظ می‌کند.

Governance و تغییر Workflow

WorkflowChangeProposal
ProposalID / problem / evidence / affected decisions
Current behavior and failure mode
Proposed state/transition/guard/dictionary change
Alternatives including no change
Impact: roles, queues, clocks, integrations, reports, security
Backward compatibility and migration need
Conformance scenarios / Pilot / countermetrics
Owner / approver / dissent / effective date
Rollback / documentation / training / review / correction

تعداد Statusها را در Retrospective بر اساس سلیقه کم‌وزیاد نکنید. Change باید مشکل، Evidence و مصرف‌کنندگان داده را نشان دهد. Admin ابزار به‌طور خودکار صاحب اختیار Process نیست.

Correction؛ وقتی State یا Resolution اشتباه ثبت شد

DefectWorkflowCorrection
CorrectionID / affected record/events/report
Original value/transition/claim retained
Error discovered-at / source / impact scope
Corrected value or compensating event
Authority / rationale / evidence
Clock/metric/dashboard/release-decision effects
Related records and stakeholder notification
Reconciliation/revalidation result
No silent edit / no invented historical timestamp

اگر State به‌اشتباه Closed یا Severity تغییر کرده، timestamp تاریخی جعل نکنید. Event اصلاحی امروز را با effective meaning ثبت و گزارش‌های متاثر را reissue کنید.

ضدالگوهای Workflow نقص

  • یک «چرخه عمر استاندارد» برای همهٔ Contextها؛
  • نام‌گذاری Simple/Standard/Scrum/Kanban به‌عنوان چهار مدل کامل؛
  • Board column مساوی State domain؛
  • State برای Severity/Priority/Role/Component؛
  • Done/Closed بدون Resolution؛
  • Closed مساوی Fixed؛
  • Resolved بدون Build/change candidate؛
  • Fixed توسط merge شدن PR؛
  • Verified بدون Oracle/Attempt/Evidence؛
  • Rejected بدون Reason؛
  • Duplicate بدون canonical link؛
  • Not reproduced مساوی وجود ندارد؛
  • Needs info بدون سؤال/owner/deadline؛
  • Deferred بدون review/expiry؛
  • Accepted risk توسط Assignee؛
  • Blocked به‌عنوان قبرستان State؛
  • Reopen با پاک‌کردن تاریخ Fixed؛
  • هر regression در رکورد قدیمی بی‌انتها؛
  • Admin ابزار صاحب Process/authority؛
  • Automation ناشناس با bypass Guard؛
  • Auto-close از روی CI green یا inactivity؛
  • Webhook at-most-once فرض‌شده؛
  • Security vulnerability در Board عمومی؛
  • گزارش ناقص به معنی Reporter بد؛
  • بستن زیاد به‌عنوان Productivity؛
  • SLA pause برای سبزکردن Dashboard؛
  • مهاجرت با mapping حدسی و حذف history؛
  • ویرایش خاموش State/Resolution/Metric.

چک‌لیست مالک Defect Workflow

  1. WorkflowID/version/effective date/owner مشخص است؟
  2. Object type و Scope از Incident/Change/Security جداست؟
  3. Glossary محلی Observation/Failure/Defect/Report دارد؟
  4. State از Resolution/Field/Label/Queue جداست؟
  5. هر State purpose/entry/work/exit/clock دارد؟
  6. State مرده یا دو State هم‌معنا حذف شده؟
  7. هر Transition source/target/trigger دارد؟
  8. Actor درخواست‌کننده از Authority جداست؟
  9. Guardها در UI/API/import/automation enforce می‌شوند؟
  10. Override reason/approver/expiry/audit دارد؟
  11. Terminal بدون Resolution ناممکن است؟
  12. Reason dictionary versioned و reportable است؟
  13. Duplicate canonical/equivalence/no-cycle دارد؟
  14. Severity/Priority/Risk rubric و history دارند؟
  15. اصل گزارش و نسخهٔ normalize‌شده حفظ می‌شوند؟
  16. Basis/Build/Environment/Data/Evidence هویت دارند؟
  17. Needs-info سؤال/owner/due/fallback دارد؟
  18. Not-reproduced Attempt و limits دارد؟
  19. Deferred owner/review/expiry/trigger دارد؟
  20. Accepted-risk authority/scope/condition/expiry دارد؟
  21. Verification Oracle/attempt/result/evidence دارد؟
  22. Reopen به Resolution و Evidence قبلی وصل است؟
  23. Clock calendar/timezone/pause/reopen policy دارد؟
  24. Security item access/disclosure/incident branch دارد؟
  25. Relationها typed، directional و queryable هستند؟
  26. هر mutation audit event immutable دارد؟
  27. Automation identity/idempotency/order/reconciliation دارد؟
  28. Conformance happy/edge/negative/security tests اجرا شده؟
  29. Tool انتخابی export/history/guard نیاز را پاس می‌کند؟
  30. Iran access/region/payment/export/fallback آزمایش شده؟
  31. Migration snapshot/mapping/quarantine/rollback دارد؟
  32. Metric denominator/mix/countermetric/claim limit دارد؟
  33. Workflow change Pilot/impact/consumers/rollback دارد؟
  34. Correction بدون silent edit و report reissue تعریف شده؟

Pilot سی‌روزهٔ بدون سیستم واقعی

بازهکارخروجیStop condition
روز ۱ تا ۵Object/glossary/current-state inventoryWorkflow contract v0Security/incident مخلوط شود
روز ۶ تا ۱۰state/resolution/transition/guardmachine + dictionariesauthority یا terminal مبهم
روز ۱۱ تا ۱۵fixture reports/relations/clockssynthetic event setداده/Reporter واقعی لازم شود
روز ۱۶ تا ۲۰automation/conformance negative testspass/fail evidenceguard bypass یا secret leak
روز ۲۱ تا ۲۵migration dry-run/reconciliationmapping/quarantine/rollbackhistory/link loss
روز ۲۶ تا ۳۰metric/governance/correction drillreviewable operating packsilent edit یا people KPI

این Pilot فقط Contract و State machine را با Fixture می‌آزماید. برای استقرار واقعی باید سیاست محصول، حقوق دسترسی، داده، امنیت، قرارداد، ابزار و تصمیم‌گیران واقعی وارد شوند و rollout کوچک قابل‌بازگشت باشد.

جمع‌بندی؛ Workflow زبان تصمیم است

گردش کار مؤثر با تعداد Status یا نام ابزار سنجیده نمی‌شود. باید نشان دهد Record چه Objectی است، اکنون در چه Stateی قرار دارد، چرا و با چه Authority انتقال یافته، چه Evidence/Resolutionی دارد، کدام Clock فعال است و چگونه می‌توان خطا را Reopen یا Correct کرد.

زنجیرهٔ حرفه‌ای این است: Object/Scope → Intake/Report → State → Transition/Guard → Actor/Authority → Evidence → Resolution → Verification/Reopen → Clock/Relation → Audit → Migration/Conformance → Governance/Correction. کمینه‌بودن خوب است، اما فقط وقتی معنای تصمیم و تاریخچه حذف نشود.

سوالات متداول

حداقل Statusهای لازم برای گردش کار باگ چیست؟

عدد جهانی نیست. حداقل باید Intake/Triage، کار فعال، آمادهٔ Verification، پایان و در صورت نیاز Reopen/Deferred را بدون ابهام اداره کند. اگر دو State Guard/Owner/Clock/Decision یکسان دارند، ادغام؛ اگر یک State چند معنای عملیاتی دارد، تفکیک کنید. Resolution را جدا نگه دارید.

تفاوت Resolved، Verified و Closed چیست؟

در یک قرارداد رایج، Resolved/Ready یعنی Change یا Disposition candidate ارائه شده؛ Verified یعنی Oracle محدود روی Build مشخص آن را پشتیبانی کرده؛ Closed یعنی Workflow با Resolution نهایی پایان یافته. نام‌ها می‌توانند عوض شوند، اما Guard و Claim limit باید روشن باشند. Closed الزاماً Fixed نیست.

چه کسی باید باگ را ببندد یا Reopen کند؟

Title جهانی وجود ندارد. Actor می‌تواند Transition را درخواست کند، ولی Authority از Context/Risk می‌آید. معمولاً Producer تغییر نمی‌تواند Evidence خود را به‌تنهایی تأیید کند وقتی استقلال لازم است؛ پذیرش ریسک هم با Assignee یا QA پیش‌فرض نیست. Role/Authority را در Contract ثبت کنید.

آیا در Scrum باگ باید User Story باشد؟

Scrum Guide نوع Issue یا Workflow باگ تجویز نمی‌کند. تیم می‌تواند Fix را در Product/Sprint Backlog اداره کند، اما نوع Work item نباید Evidence، Resolution، Severity/Risk یا تاریخچهٔ Defect را حذف کند. تصمیم برحسب Product، اندازه، Risk، reporting و tool integration است.

بهترین ابزار برای گردش کار ردیابی نقص کدام است؟

پس از تعریف Contract مشخص می‌شود. دو یا سه ابزار را با State/Guard/Permission/audit/API/idempotency/report/security/export/migration و دسترسی ایران روی Fixture آزمایش کنید. ابزار محبوب یا قابل‌سفارشی‌سازی ممکن است Guard را enforce نکند یا Exit پرهزینه داشته باشد؛ نام برند جای PoC را نمی‌گیرد.

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