معماری چندکسبوکاری، تجاری و تجارت الکترونیک · فصل ۸ — PWA و Native App Decision · 278
Native App Decision Gate
workflow تجاری را به UI یا integration منفرد تقلیل میدهد و state، rights، approval و measurement را یکپارچه نمیکند. موضوع جاری: «Native App Decision Gate». میتواند «Native App Decision Gate» را برای یک workflow محدود با state/contract/approval و verification مناسب طراحی کند.
خلاصهٔ درس
workflow تجاری را به UI یا integration منفرد تقلیل میدهد و state، rights، approval و measurement را یکپارچه نمیکند. موضوع جاری: «Native App Decision Gate».
میتواند «Native App Decision Gate» را برای یک workflow محدود با state/contract/approval و verification مناسب طراحی کند.
خروجی این درس
میتواند «Native App Decision Gate» را برای یک workflow محدود با state/contract/approval و verification مناسب طراحی کند.
پیشنیازها
اولین سؤال: دقیقاً کدام journey با PWA حل نمیشود؟
تیم محصول میگوید: «دیگر وقتش رسیده اپ native داشته باشیم.» تیم فنی جواب میدهد: «PWA ارزانتر است، پس native لازم نیست.» هر دو جمله میتوانند اشتباه باشند، چون از راهحل شروع میکنند نه از نیاز اثباتشده.
در این درس تصمیم را برعکس میسازیم. ابتدا یک required_journey مشخص میکنیم؛ سپس evidence فعلی COM-036 را برای install/offline/push/camera و هر capability مرتبط میآوریم؛ بعد residual gap، کیفیت fallback، native capability delta و هزینهی lifecycle را جداگانه ثبت میکنیم. خروجی نه «طرفداری از native» است نه «طرفداری از web»؛ خروجی یک PWA-vs-Native Decision Gate & Evidence Record v1 است که باید توسط انسان قابل بازتولید باشد.
مرز این درس
COM-037 مالک تصمیم آیا، چرا و با چه محدودهای native/hybrid لازم است است. این درس مالک پیادهسازی Service Worker، Push، Camera یا installability نیست؛ آن evidence از COM-036 میآید. همچنین exception مدیریتی را طراحی نمیکند؛ آن متعلق به AGN-001 است.
سه قاعدهی مرزی:
- وجود API یا manifest مساوی capability parity نیست.
- وجود App Store مساوی نیاز محصول به native نیست.
- تصمیم قبلی authority دائمی نیست؛ با تغییر browser/OS، هزینه یا journey باید Gate دوباره اجرا شود.
مدل ذهنی: Requirement → Evidence → Gap → Option → Burden → Decision
| decision_id | required_journey | capability_requirement | pwa_evidence_ref | web_support_state | fallback_quality | native_capability_delta | background_requirement | hardware_integration_requirement | distribution_channel | store_policy_dependency | privacy_permission_surface | build_cost_class | ongoing_maintenance_class | support_burden | decision_state | review_trigger | evidence_ref |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| D-BASE-HYB | warehouse scan under intermittent connectivity | background scan + device integration | PWA-E-17 | PARTIAL | UNACCEPTABLE | NARROW_CLOSES_GAP | REQUIRED | REQUIRED | WEB_PLUS_MANAGED_MOBILE | LOW | BOUNDED | MEDIUM | MEDIUM | MEDIUM | HYBRID_APPROVED | browser/device integration materially improves | E-BASE-01 |
| D-NOGAP | same warehouse scan after browser release | background scan + device integration | PWA-E-24 | SUPPORTED | ACCEPTABLE | NONE_MATERIAL | SATISFIED_WEB | SATISFIED_WEB | WEB | NONE | CURRENT_WEB_ONLY | HIGH_AVOIDABLE | HIGH_AVOIDABLE | HIGH_AVOIDABLE | REJECT | re-open only on new required journey | E-TRANSFER-02 |
| D-HOLD | time-sensitive customer alert | reliable target push | PWA-E-MISSING | UNKNOWN | UNKNOWN | UNPROVEN | UNKNOWN | N/A | UNKNOWN | UNKNOWN | UNKNOWN | UNKNOWN | UNKNOWN | UNKNOWN | HOLD | collect target OS/permission evidence | E-HOLD-03 |
| D-NATIVE | field-worker capture + sync + low latency + device accessory | multiple persistent OS/device requirements | PWA-E-31 | UNSUPPORTED | UNACCEPTABLE | FULL_CLOSES_MULTIPLE_GAPS | REQUIRED | REQUIRED | APP_STORE_AND_MANAGED | MATERIAL_REVIEWED | REVIEWED_BOUNDED | HIGH | MEDIUM | MEDIUM | NATIVE_APPROVED | quarterly capability/cost review or support burden HIGH | E-NATIVE-04 |
فلو اصلی:
required journeys → current PWA evidence → residual gap/fallback → compare PWA repair | narrow hybrid | full native → distribution/privacy/security/lifecycle gate → REJECT | HOLD | HYBRID_APPROVED | NATIVE_APPROVED → review/retirement trigger
اگر evidence تعیینکننده UNKNOWN، DISPUTED یا STALE باشد، تصمیم باید در HOLD بماند. NATIVE_APPROVED یک احساس یا preference نیست؛ یک state با پیششرطهای قابل ممیزی است.
چهار نوع ادعا را قاطی نکن
FACT — Web platform. Web App Manifest، Service Workers، Push API و Media Capture مکانیزمهای جدا هستند و lifecycle/permission/implementation constraintهای متفاوت دارند. بنابراین «PWA داریم» یک evidence کافی برای همهی journeyها نیست.
FACT — Distribution. Guideline 4.2 اپل برای App Store حداقل functionality و utility میخواهد و صرفاً repackaged website را کافی نمیداند. این constraint کانال توزیع است، نه حکم اینکه «پس native بساز».
INFERENCE. اگر یک requirement مهم با web/PWA و fallback قابلقبول حل نمیشود و یک native delta مشخص آن را میبندد، native/hybrid قابل دفاعتر میشود. اگر gap باقی نمانده، codebase و release/support lifecycle اضافه ممکن است فقط هزینه باشد.
DESIGN — MAKNOW. stateها، fieldها، thresholdهای local و review triggerهای این درس طراحی MAKNOW هستند؛ از W3C یا Apple استخراج نشدهاند.
قرارداد ۲۶بعدی Decision Gate
رکورد کاری ۲۶ field دارد:
decision_id, required_journey, capability_requirement, pwa_evidence_ref, web_support_state, fallback_quality, native_capability_delta, background_requirement, offline_requirement, hardware_integration_requirement, performance_target, distribution_channel, store_policy_dependency, release_review_dependency, privacy_permission_surface, security_boundary, team_skill_constraint, build_cost_class, ongoing_maintenance_class, release_cadence, observability_requirement, support_burden, decision_state, exception_authority, review_trigger, evidence_ref.
Gate 1 — Required journey را قبل از platform بنویس
مثلاً «کاربر انباردار باید در محیط با اتصال ناپایدار، اسکن سختافزاری را ادامه دهد و پس از reconnect sync قابل ردیابی داشته باشد.» این بسیار دقیقتر از «اپ موبایل میخواهیم» است.
Gate 2 — PWA evidence را capability-by-capability ثبت کن
pwa_evidence_ref باید بگوید روی target browser/OS چه چیزی واقعاً آزمایش/اثبات شده است. API presence، browser marketing page یا تجربهی desktop بهتنهایی evidence کافی برای target mobile mix نیست.
Gate 3 — Support state و fallback را جدا نگه دار
web_support_state میتواند SUPPORTED, PARTIAL, UNSUPPORTED, UNKNOWN, DISPUTED, STALE باشد. حتی اگر state PARTIAL است، fallback_quality ممکن است ACCEPTABLE باشد و native را غیرضروری کند؛ یا UNACCEPTABLE باشد و gap را material کند.
Gate 4 — Native capability delta را دقیق بنویس
بگو native دقیقاً چه چیز اضافه میکند: persistent background execution؟ hardware integration؟ latency budget؟ deeper OS integration؟ اگر delta مبهم است، approval مبهم است.
Gate 5 — Background/offline/hardware/performance را جدا کن
این چهار نیاز را در یک «mobile capability» ادغام نکن. ممکن است offline با PWA خوب باشد اما یک hardware path مشکل داشته باشد. آنوقت hybrid محدود شاید از full native بهتر باشد.
Gate 6 — Distribution و review dependency مستقلاند
اگر مسیر توزیع App Store است، store policy و release review یک dependency هستند. اگر enterprise/direct distribution است، constraint متفاوت است. هیچکدام بهتنهایی product fit را اثبات نمیکنند.
Gate 7 — Privacy و security surface را مقایسه کن
Permission surface، local storage/secrets، device identifiers، deep links، background services و attack surface را برای گزینهی جدید ثبت کن. capability بیشتر معمولاً surface بیشتری هم میآورد.
Gate 8 — Build cost را از recurring burden جدا کن
یک بار ساختن native تنها هزینه نیست. ongoing_maintenance_class, release_cadence, observability_requirement, support_burden باید دیده شوند. هزینهی دو codebase، store releases و device/OS matrix میتواند تصمیم را عوض کند.
Gate 9 — کوچکترین option که gap را میبندد انتخاب کن
سه گزینهی baseline: PWA repair/fallback improvement، narrow hybrid/native companion، full native. اگر companion محدود یک hardware/background gap را میبندد، full native برای همهی journeyها نیاز به دلیل اضافه دارد.
Gate 10 — review trigger و retirement path
هر approval باید trigger بازبینی داشته باشد: browser support change، OS policy change، support burden threshold، usage below target، permission failure rate، store-policy change یا native delta دیگر material نباشد.
مثالهای حلشده
1. Gap محدود → HYBRID_APPROVED
Checkout، catalog و account management در PWA خوب کار میکنند. یک journey انبار نیاز به background scan + hardware integration دارد و fallback دستی باعث خطای عملیاتی میشود. native companion فقط همان journey را میبندد؛ build/maintenance متوسط و success metric روشن است. نتیجه: HYBRID_APPROVED، نه full native.
2. Gap حذف شده → REJECT
نسخهی جدید target browser محدودیت قبلی را رفع میکند و fallback نیز acceptable شده است. اگر فقط به approval قبلی نگاه کنیم native ادامه پیدا میکند؛ اما Gate جدید باید residual gap را صفر ببیند و REJECT/retire path را بررسی کند.
3. Evidence ناقص → HOLD
تیم میگوید «push روی دستگاههای مشتری کار نمیکند»، ولی target OS mix و permission state evidence ندارد. تصمیم صحیح HOLD است، نه حدس NATIVE_APPROVED.
4. Full native فقط با gapهای متعدد و پایدار
چند journey حیاتی به background execution، tight latency و hardware integration نیاز دارند؛ fallbackها unacceptable هستند، native delta مستند است، privacy/security review انجام شده و maintenance/support در tolerance است. NATIVE_APPROVED قابل دفاع است—تا زمانی که review trigger نقض نشود.
Failure modeهای متداول
- Preference-first: «من native را دوست دارم» یا «web همیشه بهتر است» قبل از evidence.
- API-presence parity: وجود یک API بهعنوان proof کامل target support.
- Single-gap overreach: یک gap محدود باعث full native شدن کل محصول میشود.
- Store mystique: حضور در App Store بهعنوان justification خودکار.
- Fallback blindness: PARTIAL support بدون سنجش اینکه fallback واقعاً قابل قبول است یا نه.
- One-time cost bias: فقط build cost دیده میشود و release/support/observability فراموش میشود.
- Privacy/security omission: capability اضافه میشود ولی permission/security surface ثبت نمیشود.
- Weighted-score theater: چند عدد arbitrary جمع میشوند و hard constraint پنهان میشود.
- Permanent approval: تصمیم سال قبل بدون revalidation ادامه مییابد.
- Forced success: evidence ناقص به decision مثبت تبدیل میشود.
Alternatives و trade-offها
PWA repair کمترین fragmentation را دارد و deployment سریع است، اما اگر target OS/browser یک gap بنیادی داشته باشد ممکن است requirement را نبندد.
Narrow hybrid/native companion برای یک capability محدود میتواند بهترین نسبت outcome به burden باشد. در عوض integration boundary، handoff بین web/native و support complexity اضافه میشود.
Full native کنترل بیشتری روی OS/device integration میدهد اما codebase، release process، store review، testing matrix و support burden را بزرگ میکند. این گزینه وقتی قوی است که gapهای متعدد و پایدار به آن نیاز داشته باشند—not because “serious apps are native”.
نکتهی مهم: trade-offها را به یک score مبهم تبدیل نکن. بعضی evidenceها blocking هستند، بعضی decisive و بعضی فقط advisory.
Experienced bridge: در review چه میپرسی؟
- کدام required journey الان fail/degrade میشود؟
- evidence دقیق target browser/OS چیست؟
- آیا fallback acceptable است؟ با چه metric؟
- native دقیقاً چه delta قابلاندازهگیری میدهد؟
- آیا یک companion محدود کافی است؟
- distribution/review dependency چیست؟
- privacy/security surface چه تغییری میکند؟
- build، maintenance، release و support burden چیست؟
- success metric چیست؟
- چه triggerی باعث narrow/retire/review میشود؟
اگر سؤال 1 یا 4 جواب مشخص ندارد، تیم هنوز architecture decision ندارد؛ فقط preference دارد.
تمرین هدایتشده و مستقل
Lab آفلاین را اجرا کن:
python -B lab/COM-037-LAB1/learner/run_checks.py
ابتدا baseline را بررسی کن. سپس mutationها را اجرا کن: gap اصلی را حذف کن؛ maintenance/support burden را دو برابر کن؛ یک OS-level requirement اضافه کن؛ store review dependency را material کن؛ و evidence تعیینکننده را UNKNOWN کن.
در مرحلهی transfer، فرض کن browser release جدید gap قبلی را بسته ولی native client گرانتر شده است. decision قبلی را کپی نکن؛ از required_journey و evidence فعلی دوباره شروع کن.
Verification evidence
قبولی نیاز دارد که evaluator حداقل این خطاها را بگیرد:
NATIVE_APPROVEDیاHYBRID_APPROVEDبدون residual gap واقعی؛- approval وقتی decisive evidence
UNKNOWN/DISPUTED/STALEاست؛ - approval بدون native capability delta روشن؛
- full native وقتی narrow companion gap را با burden کمتر میبندد؛
- App Store label بهعنوان justification بدون utility/distribution evidence؛
- maintenance/support burden جهش کرده ولی decision recompute نشده؛
- transfer که approval قبلی را oracle فرض میکند.
Oracle فقط fixture و ruleهای visible است؛ hidden AI reasoning، live store یا production telemetry لازم نیست.
Assessment و transfer
برای summative باید چهار کار انجام شود: مرز COM-037 را توضیح بده؛ artifact baseline را کامل کن؛ mutation حذف capability gap را diagnose کن؛ و در scenario انتقالی تصمیم را از evidence جدید بازسازی کن.
پاسخ قوی صرفاً state نهایی را نمیگوید. نشان میدهد کدام field تصمیم را تعیین کرد، چه evidenceی blocking بود، چه چیزی advisory بود، و review trigger بعدی چیست.
منابع و تازگی
W3C-APPMANIFEST— Web Application Manifest؛ rechecked 2026-09-14.W3C-SERVICE-WORKERS— Service Workers؛ rechecked 2026-09-14.W3C-PUSH— Push API؛ rechecked 2026-09-14.W3C-MEDIA-CAPTURE— Media Capture and Streams؛ rechecked 2026-09-14.APPLE-APP-REVIEW— App Review Guidelines، خصوصاً 4.2؛ rechecked 2026-09-14.LOCAL_DESIGN_AUTHORITY— Frozen COM-037 Bible برای fieldها و stateها.
Apple policy باید حداکثر تا 2026-11-02 و W3C/platform assumptions تا 2026-12-31 دوباره بررسی شوند یا زودتر اگر semantics materially تغییر کرد. این lesson هیچ vendor documentی را به MAKNOW decision authority تبدیل نمیکند.
ارزیابی
پاسخنامهی این درس در بستهی آموزش وجود ندارد؛ خودت جواب بده و صادقانه علامت بزن. «نیاز به مرور» درس را به صف تکرار میفرستد.
COM-037-S1 retrieval
Explain the COM-037 boundary and name one adjacent non-goal.
COM-037-S2 application
Build the complete decision record for the baseline fixture.
COM-037-S3 diagnosis
Remove the only capability gap that justified native and recompute.
COM-037-S4 transfer
A browser release closes the old gap while native support burden rises. Rebuild the decision.
ملاکهای ارزیابی (rubric)
A sufficient submission must satisfy all critical dimensions: boundary correctness; exact evidence binding; explicit negative evidence/non-success states; bounded decision no stronger than evidence; lifecycle/distribution/privacy-security trade-off visibility; and changed-context transfer rebuilt from current evidence.
منابع و تازگی
مطالعهٔ موارد (case studies)
فایلهای آزمایشگاه
تمام fixtureها مصنوعی و آفلاین هستند. در این پوشه python -B run_checks.py را اجرا کنید. evaluator تصمیم را فقط از fieldهای visible بازسازی میکند و هیچ شبکه، credential، store زنده، telemetry تولید یا answer key مخفی ندارد.