یک گزارش باگ ممکن است عنوان، Steps، Expected، Actual و Screenshot داشته باشد و باز هم برای نفر بعد قابل اجرا نباشد. مشکل معمولاً کمبود نثر نیست؛ زنجیرهٔ «کدام Build، با چه State و Data، در چه Attempt، با کدام Oracle و Evidence» گم شده است. این راهنما مالک Reproduction Contract و Evidence Packet است: قراردادی که یک مشاهده را بدون افشای دادهٔ حساس، به اجرای شاهد، Replay، Triage و Verification تحویل می‌دهد.

برای قالب عمومی یک تیکت از راهنمای گزارش باگ حرفه‌ای استفاده کنید؛ برای رخداد واقعاً متناوب یا Cannot Reproduce به راهنمای بازتولید باگ متناوب بروید؛ و تصمیم‌های Lifecycle، Disposition و Closure را در چرخه عمر باگ نگه دارید. این مقاله جای آن‌ها را نمی‌گیرد.

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

گزارش قابل بازتولید یک «دستور قطعی برای تولید خطا» نیست. این گزارش یک قرارداد نسخه‌دار است که Observation، Oracle، Build/Config، State/Data، Trigger، Attempt، Outcome، Evidence، Correlation، محدودیت و مالک مرحلهٔ بعد را ثبت می‌کند. گیرنده باید بداند چه چیزی را Replay کند، چه تفاوتی را اندازه بگیرد، چه داده‌ای را نبیند و اگر نتیجه متفاوت بود چگونه پاسخ دهد.

ادعاشاهد لازمادعای ممنوع
Failure مشاهده شدActual + time/build/attemptRoot cause پیدا شد
در شرایط ثبت‌شده تکرار شدReplay outcome + identityهمیشه رخ می‌دهد
Expected نقض شدOracle/source/versionطراحی قطعاً غلط است
Evidence هم‌بسته استrun/request/trace IDsتمام لاگ‌ها متعلق به همان رخدادند

مرز مالکیت: Report، Reproduction Contract و Defect یکی نیستند

Artifactپرسشمالک محتوایی
Bug Reportچه مشکلی گزارش شده؟Intake و قالب تک‌تیکت
Reproduction Contractمشاهده در چه شرایطی قابل Replay/ردیابی است؟این راهنما
Canonical Defectکدام Reportها یک نقص واحدند؟Defect management
Investigationمکانیسم یا Root cause چیست؟Engineering/incident workflow
Verification PackFix در Build هدف و دامنهٔ Regression چگونه سنجیده شد؟Verifier + release evidence

بنابراین «قابل بازتولید» یک Disposition قطعی نیست. ممکن است Report آمادهٔ Handoff باشد ولی هنوز گیرنده Replay نکرده باشد؛ یا Failure تکرار شود اما Expected از Source معتبر پشتیبانی نشود. مدیریت چند منبع، Duplicate، Triage، SLA و Risk acceptance متعلق به سیستم مدیریت نقص نرم‌افزار است.

Observation، Interpretation، Hypothesis و Cause را جدا کنید

نوعنمونهٔ دقیقنحوهٔ ثبت
ObservationAPI در ۲۰:۰۰:14Z status=Pending برگرداندFact + Evidence
Interpretationوضعیت سفارش با انتظار ناسازگار استOracle comparison
HypothesisCallback دوم قبل از commit رسیدهآزمایش‌پذیر، نه Fact
Causeمکانیسم تأییدشده با تغییر کنترل‌شدهInvestigation record
RecommendationIdempotency test افزوده شودOption، نه اثبات Cause

Oracle پیش از Steps می‌آید

Steps فقط مسیر رویداد را می‌گویند. بدون Oracle نمی‌دانیم چه چیزی نقض شده است. Oracle می‌تواند Requirement نسخه‌دار، API contract، invariant دامنه، Design approval، Accessibility requirement یا رفتار مقایسه‌ای معتبر باشد. متن «به نظرم باید…» را Expected قطعی ننامید.

Oracle Contract
oracle_id:
claim:
source + version/hash:
applicable build/config/role/state:
observable surface:
comparison rule/tolerance:
unknown/conflict:
owner for clarification:
captured_at:

عنوان یک Locator است، نه داستان کامل

عنوان باید Entity/Surface، Trigger یا Condition و Observable Failure را قابل جست‌وجو کند. Severity، علت حدسی، نام مقصر و عبارت‌های «فوری/افتضاح» را داخل عنوان نگذارید. مثال: «[Checkout/API] پس از callback تکراری، Order در Pending می‌ماند» از «پرداخت خراب است» قابل عمل‌تر است؛ اما جزئیات Build و Data همچنان در Contract می‌آیند.

[Surface/Entity] + [Trigger/Condition] → [Observed outcome]
[پنل سفارش] با callback تکراری → وضعیت Pending باقی می‌ماند

Report Identity و تاریخچهٔ Correction را ثبت کنید

فیلدکارکرد
report_id/versionارجاع بدون ابهام
created_by/observed_atمنشأ و Cutoff
statusDraft/Ready/Needs-info/Superseded
supersedes/correctsحفظ تاریخچه
access/classificationکنترل مشاهدهٔ Evidence
next owner/dueHandoff قابل پیگیری

Build Identity فقط «نسخه ۲» نیست

نسخهٔ بازاری ممکن است چند Artifact متفاوت داشته باشد. Commit/tag، package یا image digest، schema/migration، feature flags، dependency versions، config hash و deployment/branch را تا حد لازم ثبت کنید. هدف بازسازی هویت است، نه کپی‌کردن تمام Inventory.

Build Identity
release_label: SYN-2.4
commit: 7f3-demo
artifact_digest: sha256:demo88
schema: v3
config_hash: sha256:cfg-demo-21
flags: callback_v2=on
dependencies: fake-psp=v4; fake-ledger=v2

Environment را به تفاوت‌های مؤثر محدود کنید

«Chrome/Windows» برای باگ Backend کافی نیست و Dump کامل سیستم برای یک غلط متن لازم نیست. OS/browser/device/runtime/network/locale/timezone/cache/storage/topology/permissions را فقط وقتی ثبت کنید که به Claim یا فرضیه مرتبط‌اند. برای محیط قابل ساخت و عیب‌یابی، لَب Docker Compose تسترها مرجع جداگانه است.

State یک Snapshot است، نه جملهٔ «وارد حساب شدم»

State dimensionنمونه
Actor/rolesynthetic buyer / role-customer
Entity stateOrder=Created، Attempt=Started
Session/authfresh session، scope محدود
Cache/storagecold cache، empty local storage
Queue/eventoutbox pending=0
ClockUTC instant + Asia/Tehran display
Feature/configcallback_v2=on

Test Data باید Seed، Schema و Lineage داشته باشد

نام کاربری واقعی یا رکورد Production «دادهٔ بازتولید» نیست. Dataset مصنوعی/ماسک‌شده، seed، generator version، schema، reset rule، referential invariants و شناسه‌های خیالی را ثبت کنید. سیاست عمیق‌تر داده، حریم و Subsetting در راهنمای مدیریت داده تست آمده است.

Data Identity
dataset: SYN-CHECKOUT-42
schema: v3
seed: 42
generator: checkout-fixture@1.2
reset: transaction rollback + queue purge
entities: SYN-ORDER-42, SYN-ATTEMPT-42
real_person/payment/credential_data: none

Precondition، Trigger و Procedure را جدا کنید

بخشپرسش
Preconditionپیش از اجرا چه State/Data لازم است؟
Setupچگونه آن وضعیت ساخته/تأیید می‌شود؟
Triggerکدام Event پنجرهٔ مشاهده را آغاز می‌کند؟
Procedureچه Actionهایی با چه Input و ترتیب؟
Observation pointکجا/چه زمانی Evidence گرفته می‌شود؟
Cleanupچه چیزی Reset یا حفظ می‌شود؟

Steps باید اتمیک، پارامتری و قابل مشاهده باشند

هر Step بهتر است Actor، Action/Input، Target و Observation اختیاری داشته باشد. «پرداخت کنید» چندین تصمیم و Event را پنهان می‌کند. در عین حال، ریزکردن هر کلیک بی‌اثر Noise می‌سازد. حداقل‌سازی یعنی حذف گام با آزمایش، نه حذف تصادفی جزئیات.

Step 3
actor: synthetic fake-PSP
action: POST callback fixture CB-42 twice
target: /sandbox/callback
interval: 25 ms (fictional)
expected acknowledgement: HTTP 200 for each request
capture: request IDs + trace ID + Order/Ledger states

Minimal Reproduction را با Delta بسازید

ابتدا یک Witness run کامل را حفظ کنید؛ سپس یک متغیر را تغییر دهید: callback count، interval، flag، cache یا dataset. هر حذف/تغییر باید Outcome را ثبت کند. اگر با حذف Step هنوز Failure هست، آن Step برای Trigger لازم نیست؛ ممکن است برای State یا Evidence لازم باشد.

RunDeltaOutcomeاستنباط محدود
W1دو callback/25msObservedWitness
C1یک callbackNot observedتعداد ممکن است مرتبط باشد
D1دو callback/500msNot observedTiming ممکن است مرتبط باشد
D2flag offNot observedFlag association؛ نه Cause

Witness Run و Control Run مکمل‌اند

Witness همان Failure را با هویت کامل ثبت می‌کند. Control تا جای ممکن همان Build/Config/Data را دارد و فقط متغیر تعریف‌شده را عوض می‌کند. نتیجهٔ متفاوت قدرت فرضیه را بیشتر می‌کند، اما Cause را خودکار اثبات نمی‌کند؛ تفاوت‌های پنهان و تصادف هنوز ممکن‌اند.

Run Record
run_id:
contract_version:
executor + timestamp:
build/config/data/state identities:
changed variable:
attempt_id:
actual observations:
oracle comparison:
artifact manifest:
outcome: OBSERVED | NOT_OBSERVED | INCONCLUSIVE | INVALID
limitations:

Attempt Identity از نرخ بازتولید مهم‌تر شروع می‌شود

«۳ بار از ۵ بار» بدون تعریف Attempt، reset، cutoff و Conditions مبهم است. Attempt ID، start/end، reset result، input/seed، outcome و invalid reason را ثبت کنید. Invalid را نه Success بشمارید نه Failure. نرخ کوچک و محلی احتمال Production یا شیوع کاربران را تخمین نمی‌زند.

Outcomeمعنا
ObservedOracle violation در Conditions هدف دیده شد
Not observedRun معتبر بود، نقض دیده نشد
InconclusiveEvidence/Oracle برای حکم کافی نیست
InvalidSetup/reset/build/run خراب بود
Abortedبه علت ایمنی/زمان/منبع متوقف شد

Actual Result باید Observation قابل زمان‌بندی باشد

«کار نکرد» را به Surface، value، timestamp، duration، error/signature و state transition تبدیل کنید. UI screenshot فقط نمای Presentation است؛ برای ادعای Backend از API، database invariant، event/ledger یا log هم‌بسته استفاده کنید. دسترسی مستقیم Production تنها با مجوز، حداقل‌سازی و مسیر ایمن.

Expected Result باید Source و Scope داشته باشد

Expected ممکن است برای Role، locale، flag یا state دیگری درست باشد. Source/version و شرط کاربرد را بنویسید. اگر Requirement متناقض است، Report را به «نیازمند تعیین Expected/Disposition» ببرید؛ اختلاف را با شدت‌دادن متن حل نکنید.

Evidence Packet یک Manifest دارد، نه انبوه Attachment

Artifactحداقل Metadataخطر
Screenshot/videorun/time/surface/hashPII/notification/background
HAR/requestfilter/time/request ID/redactionCookie/Auth/body/query
Logservice/build/timezone/filtersecret/PII/tenant crossover
Tracetrace/span/sample/statuscorrelation/privacy
DB/query resultquery version/snapshot/rows/hashbulk data/change risk
Crash dumpbuild/device/symbols/timememory/user data
Artifact Manifest Item
artifact_id/name/type:
run_id + captured_at:
source/tool/version/filter:
content_hash:
claim_supported:
redaction_profile + review_status:
access/retention/delete_at:
known omissions:
supersedes:

Screenshot شاهد است، ولی Steps یا Oracle نیست

تصویر می‌تواند State قابل مشاهده را ثبت کند، نه مسیر رسیدن، request order، دادهٔ پنهان یا Expected. Crop بیش از حد زمینه را حذف می‌کند؛ تصویر کامل نیز ممکن است نام، پیام، شماره یا Token نشان دهد. Annotation باید کپی اصلی را تخریب نکند و نسخهٔ Redacted از Original کنترل‌شده جدا باشد.

ویدئو Timeline را نشان می‌دهد، نه علت را

ویدئو برای gesture، focus، animation و sequence مفید است، اما Build، input دقیق و Backend state را تضمین نمی‌کند. زمان‌های کلیدی را Bookmark کنید، متن Steps را نگه دارید، صوت/اعلان/حساب‌های دیگر را حذف کنید و نرخ پخش/برش را ثبت کنید.

HAR را حتی پس از Sanitization بازبینی کنید

مستند رسمی Chrome DevTools Network میان HAR sanitized و HAR دارای دادهٔ حساس فرق می‌گذارد و می‌گوید حالت sanitized به‌طور پیش‌فرض Cookie، Set-Cookie و Authorization را حذف می‌کند. این حذف به معنی «کاملاً امن» نیست؛ URL، query، body، response و شناسه‌های دامنه ممکن است حساس بمانند. Redaction profile و بازبینی محتوا لازم است.

Log و Trace را با Correlation متصل کنید

W3C Trace Context قالب HTTP برای انتشار Context و هم‌بستگی درخواست‌ها را تعریف می‌کند؛ traceparent و tracestate جایگزین Run/Order/Attempt identity یا تضمین ثبت Trace نیستند. W3C همچنین قرار دادن PII یا دادهٔ حساس در این فیلدها را منع می‌کند. در Report، trace ID را با time window، service و sampling status همراه کنید.

Evidence از موبایل باید Device و Build را حفظ کند

مستند رسمی Android bug report توضیح می‌دهد که گزارش دستگاه می‌تواند log، stack trace، screenshot و اطلاعات پیکربندی/Build داشته باشد. چنین Bundleهایی ممکن است بسیار گسترده باشند؛ Collection مجاز، انتخاب Device درست، Redaction، دسترسی و Retention را پیش از Attach تعیین کنید. Emulator evidence معادل همهٔ دستگاه‌های واقعی نیست.

Hash یکپارچگی Artifact را می‌سنجد، نه حقیقت آن را

Digest کمک می‌کند بفهمیم فایل پس از Capture تغییر کرده یا خیر. Hash ثابت نمی‌کند Capture از Build درست، ساعت درست، Scope درست یا منبع معتبر بوده است. Algorithm، مقدار، فایل و زمان را ثبت کنید؛ نسخهٔ Redacted طبیعتاً Hash دیگری دارد.

Redaction باید قابل آزمون و قابل رد باشد

کلاسکنترلآزمون منفی
Credential/Tokenحذف header/body/cookiepattern + manual review
PIIsynthetic/mask/minimizesearch name/mobile/email
Financialfake IDs/amounts/accountno PAN/CVV2/OTP/real transaction
Tenantscope filterno cross-tenant record
Internal secretvault reference، نه valuesecret scanner
MetadataEXIF/path/filename cleanupmetadata inspection

Evidence Access و Retention جزو Contract است

لینک منقضی، فایل بدون مجوز و Attachment عمومی، Handoff را می‌شکند. Classification، audience، least privilege، owner، retention/delete date، legal/security hold و route درخواست دسترسی را ثبت کنید. هیچ گزارش باگی مجوز دورزدن کنترل‌های سازمانی نیست.

فرم ساخت‌یافته Completeness را تقویت می‌کند، نه کفایت را

مستند رسمی GitHub Issue Forms ورودی‌های مختلف، Validation، label و assignee پیش‌فرض را پشتیبانی می‌کند و نمونهٔ Bug form آن Current/Expected/Steps/Environment دارد. Required بودن یک Textarea ثابت نمی‌کند مقدار آن دقیق، امن یا قابل Replay است. Validation معنایی و Review همچنان لازم‌اند.

Reproduction Readiness را با Gate قراردادی بسنجید

GateReady وقتی…در غیر این صورت
ClaimObservation و Oracle جدا هستندNeeds clarification
IdentityBuild/Config/Data/State کافی استNeeds identity
RunAttempt/Trigger/Outcome ثبت استNeeds witness
EvidenceManifest/correlation/hash وجود داردNeeds evidence
SafetyRedaction/access/retention بازبینی شدهQuarantine
Handoffowner/action/due/response contract روشن استUnrouted

Ready for Handoff با Reproduced فرق دارد

Stateتعریف
Draftقرارداد در حال تکمیل
Ready for handoffکنترل ساختاری/ایمنی عبور کرده، Replay نشده
Reproducedگیرنده در Conditions ثبت‌شده Failure را دیده
Not reproducedRun معتبر بود ولی Failure دیده نشد
InconclusiveOracle/Evidence/Run حکم نمی‌دهد
Needs informationشکاف مشخص و درخواست‌شده
QuarantinedEvidence مشکوک به دادهٔ حساس
Supersededنسخهٔ جدید با تاریخچه جایگزین شده

قرارداد پاسخ گیرنده، رفت‌وبرگشت مبهم را حذف می‌کند

Handoff Response
receiver + received_at:
contract/artifact versions accessed:
replay run_id:
same/different identities:
outcome:
new evidence:
questions as exact missing fields:
disposition authority needed:
next action/owner/due:
correction requested:

Severity، Priority و Reproducibility سه محور متفاوت‌اند

Failure شدید می‌تواند یک‌بار مشاهده شده باشد؛ Failure کم‌اثر ممکن است صددرصد تکرار شود. Reproducibility دربارهٔ شرایط مشاهده و Replay است، Severity دربارهٔ Impact، و Priority/Class of Service دربارهٔ ترتیب اقدام. تصمیم آن‌ها را به Authority Map تیم بسپارید، نه به Reporter تنها. اختلاف نقش و تصمیم را با پروتکل تعارض QA و Dev حل کنید.

یک باگ، یک Report قانون مطلق نیست

چند Failure ممکن است یک Cause/Defect مشترک یا برعکس یک Symptom مشترک با Causeهای متفاوت داشته باشند. Reporter باید Observationها و Attemptها را تفکیک کند؛ Canonicalization و Duplicate decision در Triage انجام می‌شود. شکستن کورکورانه یا ادغام زودهنگام، هر دو Traceability را آسیب می‌زنند.

پیش از ثبت، «دو یا سه بار» قانون عمومی نیست

تکرار می‌تواند State را نابود، تراکنش را دوبرابر، داده را افشا یا Incident را تشدید کند. برای Crash محلی کم‌خطر شاید Replay فوری مناسب باشد؛ برای Production، مالی، امنیتی یا Destructive ابتدا Evidence و Containment. بودجهٔ Attempt باید از Risk، هزینه، تغییرپذیری و ارزش اطلاعات بیاید، نه عدد ثابت.

Production و Security مسیرهای استثنا دارند

شرطاقدام مقدم
آسیب فعال کاربر/داده/مالیIncident/containment
احتمال VulnerabilityPrivate security channel
دادهٔ واقعی در ArtifactQuarantine، نه upload عمومی
عملیات برگشت‌ناپذیرعدم Replay بدون مجوز/کنترل
Evidence قانونی/حسابرسیChain/retention policy
شخص ثالثContract/vendor escalation با حداقل داده

قالب کامل Reproduction Contract

REPRODUCTION CONTRACT
Identity: report_id/version/status/created/observed/supersedes
Claim: observation + impact boundary
Oracle: expected/source/version/scope/conflict
Target: release/build/artifact/schema/config/flags/dependencies
Context: environment/device/network/locale/timezone
State: actor/entity/session/cache/queue/clock
Data: dataset/schema/seed/generator/reset/invariants
Run: witness/control/attempt/trigger/steps/observation window/outcome
Evidence: manifest/correlation/hash/redaction/access/retention
Limits: unknowns/omissions/nonrepresentative conditions
Safety: production/security/privacy/destructive constraints
Handoff: receiver/action/due/response states/correction path

مثال مصنوعی: callback تکراری در Checkout خیالی

سناریوی SYN-CHECKOUT-42 کاملاً ساختگی و محلی است. Fake PSP دو callback خیالی را با فاصلهٔ ۲۵ میلی‌ثانیه می‌فرستد. UI وضعیت Pending نشان می‌دهد، API Order نیز Pending است، اما Ledger مصنوعی یک credit دارد. Oracle قرارداد می‌گوید پس از callback معتبر باید Order=Paid و دقیقاً یک credit وجود داشته باشد؛ UI به‌تنهایی Oracle نیست.

فیلدمقدار مصنوعی
Buildcommit.7f3 + image digest demo88
Config/Datacfg-demo-21 / schema-v3 / seed42
Actor/EntitySYN-BUYER-42 / SYN-ORDER-42
Tracesyn-trace-0000000000000042
Witnessduplicate callback → Pending
Controlsingle callback → Paid
Evidencesynthetic HAR/log/API/Ledger/screenshot
DecisionReady for handoff؛ نه Root cause

برای طراحی Sandbox و حالت‌های پرداخت به راهنمای تست درگاه پرداخت مراجعه کنید. مثال حاضر هیچ بانک، PSP، فروشگاه، کاربر، تراکنش، پول یا ادعای بازار ایران را نمایندگی نمی‌کند.

آزمایش بازتولیدپذیر: Template PASS در برابر Contract HOLD

Fixture مستقل SYN-REPRO-CONTRACT-01 یک Report ساختگی با Title، Description، Steps، Expected، Actual، Environment، Screenshot و Severity می‌سازد. کنترل سادهٔ required-field آن را PASS می‌کند. Validator دوم روی هویت و Evidence همان Record کار می‌کند.

$ node .post-1829-experiment.js
runtime: Node.js v26.7.0
fixture: SYN-REPRO-CONTRACT-01

naiveTemplate.requiredFields = 8
naiveTemplate.missing = []
naiveTemplate.decision = PASS

draftContract findings:
- missing-build-identity
- missing-config-hash
- missing-data-seed
- presentation-only-oracle
- missing-correlation-id
- missing-comparable-control-run
- missing-artifact-hash (2)
- unverified-redaction (2)
draftContract.decision = HOLD

correctedContract.findings = []
correctedContract.decision = READY_FOR_HANDOFF

نتیجه فقط می‌گوید Required fields با Handoff readiness یکی نیست. نسخهٔ اصلاح‌شده از قواعد ساختاری ازپیش‌نوشته‌شده عبور می‌کند؛ اسکریپت هیچ برنامه، شبکه، PSP، API، Ledger، Screenshot یا HAR واقعی را اجرا/بازبینی/Replay نکرده و وجود Defect، Cause یا Fix را ثابت نمی‌کند.

حدود اعتبار آزمایش مصنوعی

  • تمام Report، Build، State، Data، Trace، Artifact، Hash، Rule و Decision ساختگی‌اند.
  • تعداد هشت فیلد، هشت Check و ده Finding Benchmark یا استاندارد نیست.
  • Validator فقط Presence و چند رشتهٔ قراردادی را بررسی می‌کند، نه صحت معنایی یا امنیت واقعی.
  • READY_FOR_HANDOFF معادل Reproduced، Valid defect، Root cause، Severity یا Release decision نیست.
  • هیچ نرخ بهره‌وری، زمان رفع، کیفیت، هزینه یا احتمال Production اندازه‌گیری نشده است.
  • مقادیر ۲۵ms، seed42 و شناسه‌ها صرفاً Fixture هستند.

آزمایشگاه فارسی کاملاً جدا و بدون شبکه

یک سرویس محلی Fake Checkout با API و Ledger درون‌حافظه‌ای بسازید. Seed ثابت، clock مصنوعی، callback تکراری، callback دیررس، ارقام فارسی/عربی/لاتین، Unicode normalization، نمایش ریال و تومان با واحد صریح و UTC/Asia-Tehran را Fault کنید. تمام endpointها fake و شبکه خاموش باشد.

FaultContract fieldEvidence
Build اشتباهartifact digestidentity mismatch
Seed فراموش‌شدهdata identityfixture manifest
Callback duplicateattempt/triggerrequest IDs
UI-only claimoracleAPI/Ledger comparison
Trace قطعcorrelationservice gap
HAR دارای token fakeredactionnegative scan
Artifact تغییرکردهhashdigest mismatch
Contract اصلاح‌شدهsupersedesimmutable history

نام، موبایل، ایمیل، IP، حساب، Order، PAN، CVV2، OTP، Cookie، Token، Secret، فایل، Screenshot، تراکنش یا پول واقعی وارد نکنید. این Lab توصیهٔ بانکی، مالی، حقوقی، امنیتی یا حریم خصوصی برای ایران نیست.

Verification بعد از Fix قرارداد تازه می‌خواهد

اجرای قبل از Fix را بازنویسی نکنید. Fix commit، Build جدید، همان یا نسخهٔ تازهٔ Contract، witness replay، control، mechanism-led regression، before/after evidence و Limit را ثبت کنید. Not observed در یک Run مساوی «برای همیشه رفع شد» نیست.

Verification Addendum
defect/report links:
fix commit + target build:
contract version replayed:
before evidence:
after run/outcome/evidence:
regression scope/rationale:
environment/data differences:
limitations/residual risk:
verifier + verified_at:
closure authority:

Correction بهتر از ویرایش بی‌ردپا است

اگر Build، Expected، Artifact یا Redaction اشتباه بود، نسخهٔ جدید با reason و supersedes بسازید؛ Artifact ناامن را Quarantine/replace کنید و ارجاع‌های تصمیم را به نسخهٔ درست ببرید. ویرایش خاموش Evidence audit را می‌شکند و ممکن است نتیجهٔ قبلی را نامعتبر کند.

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

کنترلماشینیانسانی
Required/format/enumقویTailoring
Build/config existenceقابل بررسیrelevance
Artifact hash/link/accessقویclaim fit
Secret/PII patternsکمکیcontext/privacy review
Oracle versiondrift checkmeaning/authority
Reproduction/Causerunner evidenceinterpretation

AI می‌تواند خلاصه کند، اما شاهد نسازد

AI ممکن است Title پیشنهاد دهد، Field مفقود را Flag کند، Timeline استخراج کند یا مشابهت Reportها را رتبه‌بندی کند. نباید Step، Build، Log، Expected، Severity، Redaction یا Cause را حدس بزند. Source links، confidence، human confirmation، audit و ممنوعیت ارسال Evidence حساس به Provider کنترل‌نشده لازم‌اند.

معیارهای فرایند را بدون بازی‌سازی تعریف کنید

پرسشMeasureCountermetric
Handoff روشن است؟درصد Ready با Population تعریف‌شدهزمان Reporter
رفت‌وبرگشت کم شد؟clarification cycles by classsilent wrong assumptions
Evidence قابل دسترسی است؟link/access failureover-broad access
حریم رعایت شد؟quarantine/redaction escapesmissing useful evidence
Replay ممکن است؟first valid replay outcomeseverity/risk mix
Correction سالم است؟superseded references repairedhistory loss

زمان رفع باگ را مستقیماً به کیفیت Reporter نسبت ندهید؛ پیچیدگی، Queue، مالکیت، Environment و Priority دخیل‌اند. «درصد Reproduced» نیز هدف خام خوبی نیست، چون تیم ممکن است Reportهای دشوار یا تک‌وقوع را رد کند.

برنامهٔ ۳۰روزهٔ استقرار

روزکارخروجی
۱–۵نمونه‌گیری امن از Reportها و رفت‌وبرگشت‌هاtaxonomy شکاف
۶–۱۰تعریف Identity/Oracle/Run/Evidence/SafetyContract v0.1
۱۱–۱۵ساخت Fixture/Lab و Redaction testssynthetic pack
۱۶–۲۰Pilot روی یک تیم/سطح Riskresponse evidence
۲۱–۲۵تنظیم فرم، Gate، exception و Accessv0.2
۲۶–۳۰Review metric/countermetric و تصمیمAdopt/Adapt/Stop

نقش‌ها و حقوق تصمیم

نقشمسئولیتتصمیم مستقل نیست
ReporterObservation/Contract/Evidence provenanceRoot cause/priority/release
Domain/ProductOracle/impact clarificationtechnical cause
Engineer/InvestigatorReplay/hypothesis/cause evidencerisk acceptance
QA/Verifierbefore/after/regression evidenceall business priority
Security/Privacychannel/redaction/access/retentionproduct expected behavior
Triage/Defect ownercanonical/disposition/routinginventing evidence
Release/Risk owneraccept/hold/conditional decisionrewriting facts

۳۰ ضدالگوی گزارش قابل بازتولید

  1. عنوان «کار نمی‌کند»
  2. علت حدسی در Actual
  3. Expected بدون Source
  4. Version بازاری بدون Artifact
  5. Environment «test»
  6. حساب واقعی در Steps
  7. Seed/Reset نامشخص
  8. State ضمنی
  9. چند Action در یک Step
  10. حذف Witness اولیه
  11. نرخ بدون Attempt definition
  12. Invalid به‌عنوان Not observed
  13. Screenshot به‌جای Oracle
  14. ویدئو به‌جای Steps
  15. انبوه Log بدون time/filter
  16. HAR sanitized به‌عنوان کاملاً امن
  17. Trace ID بدون sampling/time
  18. Artifact بدون hash/provenance
  19. لینک Evidence بدون Access test
  20. Retention نامحدود
  21. PII در trace context
  22. Replay مخرب در Production
  23. Severity=Reproducibility
  24. Priority توسط Template
  25. هر Symptom یک Defect قطعی
  26. Required field=quality
  27. AI-generated fact
  28. Ready=Reproduced
  29. Not observed=Fixed
  30. ویرایش بی‌ردپای Evidence

چک‌لیست ۴۸نقطه‌ای Handoff

  1. Report ID
  2. نسخه
  3. Status
  4. Observed at
  5. Reporter
  6. Supersedes
  7. Observation
  8. Impact boundary
  9. Interpretation جدا
  10. Hypothesis جدا
  11. Expected
  12. Oracle source
  13. Oracle version
  14. Oracle scope
  15. Release label
  16. Commit
  17. Artifact digest
  18. Schema
  19. Config hash
  20. Flags
  21. Dependencies
  22. Platform/device
  23. Network/locale/time
  24. Actor/role
  25. State before
  26. State after
  27. Dataset
  28. Seed/generator
  29. Reset rule
  30. Trigger
  31. Atomic steps
  32. Input values
  33. Observation window
  34. Attempt IDs
  35. Outcome vocabulary
  36. Witness run
  37. Control/delta
  38. Correlation IDs
  39. Artifact manifest
  40. Hashes
  41. Redaction profile
  42. Redaction review
  43. Access/classification
  44. Retention/delete
  45. Limitations
  46. Safety exception
  47. Receiver/action/due
  48. Response/correction contract

جمع‌بندی: بازتولیدپذیری یک زنجیرهٔ هویت و شاهد است

گزارش خوب فقط کوتاه یا پرجزئیات نیست؛ متناسب با Claim، دقیق و امن است. Observation را از Cause جدا کنید، Oracle را نسخه‌دار کنید، Build/State/Data/Attempt را هویت بدهید، Witness و Control را ثبت کنید، Evidence را با Manifest/Correlation/Hash/Redaction تحویل دهید و Ready، Reproduced و Verified را یکی نگیرید. این Contract اصطکاک اطلاعاتی را قابل مشاهده می‌کند؛ کیفیت محصول یا سرعت Fix را تضمین نمی‌کند.

سؤالات متداول گزارش باگ قابل بازتولید

مهم‌ترین بخش گزارش باگ قابل بازتولید چیست؟

یک فیلد واحد نیست؛ زنجیرهٔ Observation→Oracle→Build/State/Data→Attempt→Evidence اهمیت دارد. Steps بدون Oracle یا Build دقیق می‌تواند اجرا شود ولی ادعای دیگری را بسنجد. Contract باید متناسب با Risk و Surface Tailor شود.

اگر باگ فقط یک‌بار رخ داد، گزارش را ثبت کنیم؟

اگر Observation معتبر یا اثر مهم است، بله؛ آن را One-time observed بنامید و Evidence اولین وقوع، identity، unknownها و خطر Replay را حفظ کنید. یک وقوع را «همیشه» یا Root cause ننامید. مسیر عمیق‌تر باگ متناوب/Cannot Reproduce را جدا دنبال کنید.

آیا Screenshot یا Video برای بازتولید کافی است؟

معمولاً نه. آن‌ها Presentation و Timeline را نشان می‌دهند، اما Build، State، Input، Backend outcome، Oracle و Correlation را لزوماً ثبت نمی‌کنند. آن‌ها را به Run و Claim مشخص متصل و از نظر دادهٔ حساس بازبینی کنید.

چند بار باید باگ را پیش از ثبت تکرار کنیم؟

عدد عمومی وجود ندارد. Risk، تخریب‌پذیری، Production/Security/Financial context، هزینه، State mutation و ارزش اطلاعات تعیین می‌کنند. گاهی یک Witness امن کافی است؛ گاهی ماتریس Attempt لازم است؛ و گاهی Containment بر Replay مقدم است.

آیا فرم اجباری یا AI گزارش را خودکار قابل بازتولید می‌کند؟

فرم می‌تواند Completeness و فرمت را تقویت کند و AI می‌تواند Field مفقود یا Timeline را پیشنهاد دهد؛ هیچ‌کدام صدق Observation، کفایت Oracle، امنیت Evidence، Reproduction یا Cause را تضمین نمی‌کنند. Human review، Replay evidence و تاریخچهٔ Correction لازم می‌مانند.

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