11230 yozuv
  • 💬

    team-lead-pm EP-13 izoh qoldirdi

    PR'lar ochildi (2026-09-13): backend #15 https://github.com/AbdullayevDilshodbek/erpbom-backend/pull/15 · web #14 https://github.com/AbdullayevDilshodbek/erpbom-web/pull/14 · mobil #12 https://github.com/AbdullayevDilshodbek/erpbom-mobile/pull/12. Merge — foydalanuvchi qarori.

  • ✎

    unknown-agent EP-13 yangiladi

    Yangilandi: pr_url

  • 💬

    team-lead-pm EP-13 izoh qoldirdi

    EP-13 YOPILDI (30/30) — yakunlash tekshiruvi natijasi va IKKI QARZ (push oldidan emas, keyingi epicda hal qilinsin): (1) NotificationOutboxMonitorScriptSmokeTest.java:84 da yangi Assumptions.assumeTrue(isPsqlAvailable()) — psql bolmagan muhitda (CI) test JIMGINA skip boladi, yashil korinadi lekin yurmaydi; muhit qorovuli fail-loud qilinsin yoki psql CI obraziga qoshilsin. (2) EP-13-T07-S03 (erpbom-mobile) branch/sha siz turibdi; mobil va web branchlari (feat/EP-13-erpbom-mobile 5 commit, feat/EP-13-erpbom-web 4 commit) bu yurishda umuman tekshirilmadi va origin da mavjud emas. Drift gate natijasi: TOZA (exit 0, baseline, ikki tomonlama operatsiya darajasida 11<->11, head_commit=de83361, jar HEAD dan qayta qurilgan — ishlab turgan obraz 2026-08-22 dan eski edi va yolgon-yashil berardi).

  • ✎

    finalize-ep-13 EP-13-T00 yangiladi

    Yangilandi: branch, commit_sha

  • ✎

    finalize-ep-13 EP-13 yangiladi

    Yangilandi: branch, commit_sha

  • ⇄

    system EP-13 statusni o'zgartirdi Ishlanyapti → Bajarildi

    Bolalardan avtomatik hisoblandi

  • ⇄

    system EP-13-T08 statusni o'zgartirdi Ishlanyapti → Bajarildi

    Bolalardan avtomatik hisoblandi

  • ⇄

    qa-ep-13-t08-s03 EP-13-T08-S03 statusni o'zgartirdi Review → Bajarildi

  • 💬

    qa-ep-13-t08-s03 EP-13-T08-S03 izoh qoldirdi

    QA 2-ko'rik (mutatsiya bilan), commit de83361 — mezon 5653 QABUL QILINDI. O'lchov izolyatsiyalangan `git worktree` (/tmp/qa2-EP-13-T08-S03, HEAD=de83361) da, asosiy daraxtga yozilmadi. Baza: Tests run: 10, Failures: 0, Skipped: 0 (psql 16.15 bor — hech narsa SKIP bo'lmadi). 1-ko'rikda TIRIK qolgan ikkala mutant endi O'LDI: * `percentile_cont(0.95)` -> `(0.50)` — 5 test yiqildi (p95WithinSla..., p95BreachingSla..., p95IgnoresRowsWithNonSent..., p95IsUnaffectedBy...NullSentAt, p95WindowExcludes...). Skript chiqishi mutant ta'sir qilganini tasdiqladi: `p95: 1.000 s` (kutilgan 1.500 s), ya'ni test worktree'dagi NUSXANI o'qiydi. * `WHERE status = 'sent'` -> `WHERE true` — p95IgnoresRowsWithNonSentStatusEvenWhenSentAtIsPopulated yiqildi (`Namuna hajmi: 25`, kutilgan 20). QA ning qo'shimcha mutantlari: * (b) oyna filtri (`created_at >= now() - ...`) olib tashlandi -> O'LDI (p95WindowExcludesSentRowsOutsideP95WindowHours). * `awk ... v < 3` -> `v <= 3` -> O'LDI (p95ExactlyAtThresholdIsReportedAsViolated) — yangi chegara testi qat'iy "<" ni haqiqatan qo'riqlaydi. * (a) oyna filtri olib tashlandi -> O'LDI (countsFailedAndDeadByLastErrorCodeWithinWindowOnly). * `COALESCE(last_error_code, '(last_error_code NULL)')` olib tashlandi -> O'LDI (NULL kesimi qoplangan). * TIRIK (informatsion, 5653 doirasidan TASHQARIDA): `percentile_cont(0.99)` -> `(0.95)` — p99 ustuni hech bir assert bilan qoplanmagan. Skriptning o'zi p99 ni "faqat ma'lumot uchun — rasmiy chegara yo'q" deb belgilaydi, mezon 5653 esa faqat p95 va qoida 38 chegarasini talab qiladi, shu sabab bu bargni bloklamaydi. Kelajakda p99 chegarasi kiritilsa, test ham kerak bo'ladi. Metodologiya eslatmasi: birinchi urinishda `<=` mutantini `/*MUTANT4*/` izohi bilan kiritgan edim — awk `/*...*/` ni tushunmaydi, awk sintaktik xato berib BARCHA verdikt "BUZILGAN" bo'lib qoldi va 5 test yiqildi (yolg'on xulosa). Mutant izohsiz qayta o'tkazildi; sof natija yuqorida. Assert'lar: tautologik EMAS — kutilgan qiymatlar testda QAT'IY yozilgan (`1.500 s`, `4.000 s`, `3.000 s`, `2.999 s`, `Namuna hajmi (status='sent'): 20`), skript chiqishi qayta hisoblanib o'zi bilan solishtirilmaydi. OK yo'nalishdagi testlarda `doesNotContain("BUZILGAN")` ham bor. Fixture xilma-xilligi: haqiqiy skript chiqishi p50=1.000 / p95=1.500 / p99=9.100 — uchala qiymat FARQLI (19x1 s + 1x11 s). Chegara testlari (20x3.000 s va 20x2.999 s) ataylab bir xil taqsimotli, bu o'rinli — ular qat'iy "<" ni o'lchaydi va `<=` mutantini o'ldirdi. Regressiya: `git diff 719be85..de83361 -- scripts/` BO'SH (skript o'zgarmagan). Test diff'ida faqat eski bir xil fixture va `1.000 s`/`5.000 s` assert'lari olib tashlangan; bitta ham test klassi/metodi o'chirilmagan (10 -> 10+5 emas, 5 -> 10 ta test). 1-ko'rikdagi qamrov saqlangan: bo'sh jadval (`Jami: 0` + `ma'lumot yo'q`), `last_error_code` kesimi + oyna filtri, turib qolgan qatorlar (`Soni: 3`) — hammasi hali ham yashil va yuqoridagi mutantlar bilan qoplangani tasdiqlandi. `.github/workflows/ci.yml` o'zgarmagan. Gigiyena: `git show --stat de83361` faqat NotificationOutboxMonitorScriptSmokeTest.java; commit xabarida AI atributi YO'Q; `git grep MUTANT HEAD` va `grep -rn MUTANT src/ scripts/` bo'sh; worktree `git worktree remove` bilan tozalandi; asosiy daraxt `git status` toza. Yakuniy o'lchov (asosiy daraxt, qulf ostida): Tests run: 10, Failures: 0, Errors: 0, Skipped: 0.

  • ✓

    qa-ep-13-t08-s03 EP-13-T08-S03 qabul mezonini belgiladi

    ✓ Skript (b) `created_at`->`sent_at` kechikishining p95 ini chiqaradi va qoida 38 chegarasi (p95 < 3 s) bilan solishtiradi

  • ⇄

    qa-ep-13-t08-s02 EP-13-T08-S02 statusni o'zgartirdi Review → Bajarildi

  • ✓

    qa-ep-13-t08-s02 EP-13-T08-S02 qabul mezonini belgiladi

    ✓ Ro'yxatda 14 ta qo'lda AC ning har biri uchun aniq qadamlar va kutilgan natija yozilgan

  • 💬

    qa-ep-13-t08-s02 EP-13-T08-S02 izoh qoldirdi

    QA 2-ko'rik (109f1d3) — 5629 O'TDI. D1 (worker yoqish yo'li) EMPIRIK tasdiqlandi — izolyatsiyalangan git worktree, HAQIQIY OS env o'zgaruvchisi + ConfigDataApplicationContextInitializer (real application*.yml): dev+env=true -> app.notifications.worker.enabled=false (defekt haqiqiy); prod env'siz -> true; prod+env=true -> true; prod+env=false -> false. Hujjatdagi uchala joy (0.1-band 1/2, AC13 2-qadam, AC14 1-qadam) prod ga o'tgan; butun faylda qolgan `-Dspring-boot.run.profiles=dev` yo'q. To'liqlik: prod qo'shimcha majburiy env talab qilmaydi (RequiredEnvironmentProperties = DB_URL/DB_USER/DB_PASSWORD/JWT_SECRET, profil-neytral; @Profile bean yo'q; MinIO ixtiyoriy - Optional<FileUploadService>), FCM fail-fast tartibi hujjatda ogohlantirilgan, prod logging INFO da AC10 kutadigan NotificationRetentionJob yozuvi ko'rinadi (log.info). D2 mustaqil tasdiqlandi: SECURITY_EVENT_NOT_CONFIGURABLE — NotificationPreferenceService.java:47 + muzlatilgan openapi/v1/notifications.yaml (716-qator misolida); BusinessConflictException -> 409 (GlobalExceptionHandler.java:98); auth.token_reuse_detected_admin = SECURITY (NotificationEventCatalog.java:244) -> canDisable()=false; Admin-1 da user_session.revoke bor, demak requireVisibleToUser 404 bermaydi, 409 keladi; PUT tanasi (push_enabled+inapp_enabled) ikkala maydoni @NotNull — kontrakt bilan mos. Yangi AC14 stsenariysi spec §12 AC14 matniga mos: claimBatch SQL sharti `status='sending' AND next_attempt_at <= now()` (NotificationOutboxRepository.java:135) va LEASE_DURATION = Duration.ofMinutes(5) (NotificationOutboxWorker.java:152) — DB simulyatsiyasi to'g'ri. Regressiya yo'q: 14 AC bo'limi va 14 ta "AC:" yakuni, AC15 (a)-(d), §3.1-§3.4 saqlangan; 19 o'chirilgan qator — faqat almashtirilganlari. Yangi havolalar toza: application-dev.yml:88-90, application.yml:287, application-prod.yml:69, application-dev.yml:2-3, deploy/docker-compose.yml SPRING_PROFILES_ACTIVE=prod, README "Lokal ishga tushirish (dev)", NotificationWorkerProdProfileTest ikkala metodi. Gigiyena: commit faqat docs/10_notifications_qolda_qabul.md, AI atributi yo'q, git grep MUTANT HEAD bo'sh, erp/docs/modules/10_notifications.md §12 (1379-1499) tegilmagan (hunklar 466/900/1560).

  • ⇄

    coder-ep-13-t08-s03 EP-13-T08-S03 statusni o'zgartirdi Ishlanyapti → Review

  • ✎

    coder-ep-13-t08-s03 EP-13-T08-S03 yangiladi

    Yangilandi: commit_sha

  • ✓

    coder-ep-13-t08-s03 EP-13-T08-S03 qabul mezonini belgiladi

    ✓ Skript (b) `created_at`->`sent_at` kechikishining p95 ini chiqaradi va qoida 38 chegarasi (p95 < 3 s) bilan solishtiradi

  • ✎

    coder-ep-13-t08-s02 EP-13-T08-S02 yangiladi

    Yangilandi: commit_sha

  • ⇄

    coder-ep-13-t08-s02 EP-13-T08-S02 statusni o'zgartirdi Ishlanyapti → Review

  • ✓

    coder-ep-13-t08-s02 EP-13-T08-S02 qabul mezonini belgiladi

    ✓ Ro'yxatda 14 ta qo'lda AC ning har biri uchun aniq qadamlar va kutilgan natija yozilgan

  • ⚑

    coder-ep-13-t08-s02 EP-13-T08-S02 ishga oldi

  • ⚑

    coder-ep-13-t08-s03 EP-13-T08-S03 ishga oldi

  • ⇄

    qa-ep-13-t08-s02 EP-13-T08-S02 statusni o'zgartirdi Review → Ishlanyapti

  • 💬

    qa-ep-13-t08-s02 EP-13-T08-S02 izoh qoldirdi

    QA (qa-EP-13-T08-S02): QAYTARILDI. 5630 ✓, 5631 ✓, 5629 ✗ (2 defekt). === D1 (bloklovchi, 5629) — §0.1 2-band: worker yoqish ko'rsatmasi ISHLAMAYDI === Hujjat: §0.1 1-band `mvn spring-boot:run -Dspring-boot.run.profiles=dev` + 2-band "NOTIFICATION_OUTBOX_WORKER_ENABLED=true env bilan ustidan yoz". Haqiqat: application-dev.yml:68/88-90 da `app.notifications.worker.enabled: false` LITERAL (placeholder EMAS). Profil-xos fayl application.yml:287 dagi `${NOTIFICATION_OUTBOX_WORKER_ENABLED:false}` placeholder'ini bosib ketadi, ya'ni dev profilda bu env UMUMAN o'qilmaydi. EMPIRIK ISBOT (izolyatsiyalangan `git worktree`, ApplicationContextRunner, keyin o'chirildi): dev + ENV=true -> app.notifications.worker.enabled = false <-- hujjat va'dasi BUZILGAN prod + ENV=false -> app.notifications.worker.enabled = false <-- nazorat: env nomi to'g'ri, prod'da ishlaydi (o'lchov asbobi sog'lom) OQIBATI: ko'rsatma bo'yicha yurgizilsa worker ishlamaydi -> AC1/AC3/AC5/AC7/AC13/AC14/AC15 va AC16 o'lchovi jimgina "push kelmadi / qatorlar pending" beradi; sinovchi buni mahsulot nuqsoni deb hisoblaydi. Xuddi shu noto'g'ri ko'rsatma AC13 2-qadamda (=true bilan qayta ko'tarish) va AC14 1-qadamda (ikki instans =true) TAKRORLANADI. Repo bu tuzoqni allaqachon hujjatlagan: application-prod.yml:46-49 izohi va NotificationWorkerProdProfileTest javadoc'i (aynan shu sinf, oldingi QA topilmasi). Yo'l (tanlash coder'da): (a) buyruq qatori argumenti `-Dspring-boot.run.arguments=--app.notifications.worker.enabled=true` (eng yuqori ustunlik, profildan qat'i nazar), (b) prod profil + FCM env, yoki (c) application-dev.yml ga placeholder qo'yish — bu ALOHIDA backend ishi, hujjat bargida qilinmasin. === D2 (5629) — AC12 spec bandini to'liq qamramagan === Hujjat 266-299 qatorlar (AC12): spec §12 AC12 ning 5 ta kutilgan natijasidan 4 tasi bor (Aziz account_locked ✓, qulflangan ekranda "Aziz" yo'q ✓, Admin-1 oladi / Admin-2 olmaydi ✓, Aziz'ga admin nusxasi kelmaydi (E17) SQL bilan ✓, deep_link sessiyalar ekrani ✓, (d) account_locked_admin o'chirilishi ✓). YETISHMAYDI: `auth.token_reuse_detected_admin` ni O'CHIRIB BO'LMASLIGI (tugma yo'q) — spec §12 AC12 oxirgi bandi va qoida 37 jadvali (severity=security, "O'chirsa bo'ladimi: ⛔ yo'q"). Hujjatda bu kod FAQAT 136-qatorda, AC6 ning "6 ta security kodidan biri" IXTIYORIY ro'yxatida uchraydi — sinovchi `auth.password_changed` ni tanlasa bu xossa hech qachon tekshirilmaydi. Kerak: AC12 (d) ga ikkinchi qadam — `GET /api/v1/notification-events` javobida `auth.token_reuse_detected_admin` uchun `can_disable = false` va UI'da o'chirish tugmasi yo'qligi. === O'TGAN JOYLAR (qayta o'lchandi, coder so'ziga ishonilmadi) === • Struktura: 14 ta AC (AC1-AC3, AC5-AC15) bo'limi bor, har birida 4 qism (boshlang'ich holat / amal / kutilgan natija / AC) to'liq. Bo'sh "tekshirildi" checklist EMAS — qadamlar bajariladigan (aniq SQL, endpoint, env). • Mazmun solishtiruvi spec §12 bilan: AC3 salbiy tekshiruv (summa 12 400 000 / kontragent nomi / hujjat raqami push'da YO'Q) ✓; AC5 (account_blocked KELADI + ish xabari dead/recipient_ineligible) ✓; AC6 (security sozlamadan qat'i nazar + can_disable=false) ✓; AC15 to'rttala bandi (a) polling to'xtaydi (b) attempt_count oshmaydi (c) pending turadi, dead bo'lmaydi (d) tiklangach yetadi — ✓. • YOLG'ON HAVOLA TOPILMADI (hammasi tekshirildi, namuna emas): 13 hodisa kodi -> hammasi NotificationEventCatalog.java da; 10 endpoint -> 7 tasi muzlatilgan kontrakt openapi/v1/notifications.yaml da metod+yo'l bilan aynan mos, 3 tasi AuthController(@PostMapping /login)/UserController.java:83(@PatchMapping /{id}/status)/SessionController.java:34 da; fayl:qator havolalari ANIQ — FcmConfig.java:61 (FCM_BASE_URL), :99-118 (fcmWorkerConfigurationGuardRunner), NotificationEnqueueService.java:168-172 (existsRecentDedupe), NotificationOutboxWorker.java:165-166 (SYSTEMIC_ERROR_CODES, network_error HAQIQATAN ichida), notification-outbox-monitor.sh:209-217 (p95 VERDICT matnlari so'zma-so'z mos); sozlama sukutlari mos (breaker 20 / 60s, fixedDelay 1000ms, retention cron `0 30 3 * * *` / retention-months 3); V52 push_tokens audience CHECK ✓; §3.3 INSERT V51 CHECK'lariga haqiqatan mos (notification_id+notification_created_at juftligi NULL, severity 'info' va status 'pending' ruxsat ro'yxatida) — ya'ni qadam amalda yuradi. === 5630 (men o'lchadim — coder o'lchamagan edi) = ✓ === Skript repo'da va bajariladigan: scripts/notification-outbox-monitor.sh. Hujjat unga MAVJUD bayroq/env bilan havola qiladi (--p95-window-hours bor, sukut 24; DB_URL/DB_USER/DB_PASSWORD -> PGHOST/PGDATABASE/PGUSER/PGPASSWORD o'girish naqshi skriptda haqiqatan bor). Bir kunlik oyna ma'lumotida ishlashi S03 ning Testcontainers smoke testi bilan o'lchandi (to'liq Flyway, haqiqiy notification_outbox; shared dev DB'ga HECH NARSA yozilmadi): mvn -Dtest=NotificationOutboxMonitorScriptSmokeTest test -> Tests run: 5, Failures: 0, Errors: 0 (BUILD SUCCESS, 46 s) Qamrov: bo'sh jadval ("ma'lumot yo'q", crash emas), oyna bo'yicha failed/dead sanog'i, p95 < 3 s -> "OK (qoida 38...)", p95 5 s -> "BUZILGAN (...)" — IKKALA shoxobcha, turib qolgan qatorlar. Chegara (p95 < 3 s) va p95 ni beradigan chiqish qatori hujjatda aynan nusxalab bajariladigan darajada aniq. === 5631 = ✓ (hujjat mezoni, jonli o'lchov talab qilinmaydi) === §3.3: 200 ta payroll.accrued qanday tug'diriladi (SQL), zudlik bilan 1 ta task.available, o'lchov so'rovi sent_at-created_at (qoida 38 bilan so'zma-so'z bir xil), 3 sekund chegarasi, tozalash qadami — bor va mazmunli. §3.4: natija jurnali jadvali (Sana · O'lchagan · p95 · p99 · Namuna hajmi · Ommaviy sinov · Xulosa) — bor. === Coder ⚠️ larining baholashi (3 ta) — hech biri BIZNES bo'shlig'i emas, blocked kerak emas === 1) AC15 FCM URL qattiq yozilgani (FcmConfig.java:61) — TEXNIK bo'shliq (config-seam yo'q), spec bo'shlig'i emas. Muqobil ASOSLI: network_error haqiqatan SYSTEMIC_ERROR_CODES da (:165-166), ya'ni breaker (qoida 36) uchun literal http_5xx bilan ekvivalent yo'lni ishga tushiradi. Alohida backend ishi sifatida ochilsin (FCM base-URL override property). 2) AC13 millisekund poygasi — ASOSLI CHEKLOV. Deterministik muqobil (worker'ni oldindan o'chirish) bir xil kuzatiladigan natijani beradi (qator pending saqlanadi, qayta ko'tarilgach yetadi, E19 buzilmaydi). Spec bo'shlig'i emas. 3) AC16 ommaviy sinovda DB insert — ASOSLI CHEKLOV va ochiq aytilgan. Spec ham, task technical_notes ham "navbatga qo'yilgan zahoti" deydi, mexanizmni belgilamaydi; worker faqat qatordan o'qiydi (qoida 33). INSERT V51 CHECK'lariga mos ekani tasdiqlandi. === Gigiyena === • git show --stat f82d4bc: FAQAT docs/10_notifications_qolda_qabul.md (556 qo'shildi), begona fayl yo'q. ✓ • Commit xabarida AI atributi YO'Q (Co-Authored-By / Generated with / Claude-Session topilmadi). ✓ • `git grep MUTANT HEAD` bo'sh. ✓ Asosiy ish daraxtiga yozilmadi (git status toza), worktree o'chirildi, probe fayli qoldirilmadi. ✓ • erp/docs: S02 TEGMAGAN — 10_notifications.md §12 HEAD bilan bayt-aynan (diff bo'sh), demak solishtiruv bazasi ishonchli. ⚠️ OGOHLANTIRISH (S02 aybi EMAS, lead uchun): /var/www/erp ish daraxtida BOSHQA barglardan 5 ta COMMIT QILINMAGAN spec o'zgarishi turibdi — 01_suppliers, 03_warehouse, 06_orders, 08_finance (+1 qatordan) va 10_notifications.md (+49: qoida 6 doirasi "EP-13-T03-S05 topilmasi" + yangi qoida 40). Fayl vaqti 08:29, S02 claim'idan (10:09) OLDIN. Yo'qolib ketmasligi uchun commit qilinishi kerak.

  • ✓

    qa-ep-13-t08-s02 EP-13-T08-S02 qabul mezonini belgiladi

    ✓ Ommaviy hodisa sinovi qadamlari yozilgan va o'lchov natijasi qayd etiladigan joy bor

  • ✓

    qa-ep-13-t08-s02 EP-13-T08-S02 qabul mezonini belgiladi

    ✓ SLA/kuzatuv so'rovlari skript sifatida repo'da va bir kunlik ma'lumotda ishlaydi

  • ✓

    qa-ep-13-t08-s02 EP-13-T08-S02 qabul mezonini belgiladi

    ✗ Ro'yxatda 14 ta qo'lda AC ning har biri uchun aniq qadamlar va kutilgan natija yozilgan

  • ⇄

    qa-ep-13-t08-s03 EP-13-T08-S03 statusni o'zgartirdi Review → Ishlanyapti

  • 💬

    qa-ep-13-t08-s03 EP-13-T08-S03 izoh qoldirdi

    QA (qa-EP-13-T08-S03), commit 719be85 — QAYTARILDI: 5653 qoplanmagan (mezon 5652/5654/5655 ✅). 🔴 DEFEKT — fixture bir xilligi: p95 ni HECH NARSA qo'riqlamaydi. src/test/java/uz/erpbom/notifications/NotificationOutboxMonitorScriptSmokeTest.java:153-155 va :170-172 — ikkala p95 testi ham 20 tadan AYNAN BIR XIL kechikish qo'yadi (20×1 s va 20×5 s). Barcha qiymat teng bo'lganda p50 == p95 == p99, shuning uchun testlar percentile darajasini umuman tekshirmaydi. MUTATSIYA (izolyatsiyalangan `git worktree`, HEAD=719be85, har biri alohida to'liq yurgizildi): 1) scripts/notification-outbox-monitor.sh:196 `percentile_cont(0.95)` -> `(0.50)` => Tests run: 5, Failures: 0 — 🔴 TIRIK QOLDI (skript p95 o'rniga MEDIANA chiqarsa ham to'plam yashil). 2) scripts/notification-outbox-monitor.sh:200 `WHERE status = 'sent'` -> `WHERE true` => Tests run: 5, Failures: 0 — 🔴 TIRIK QOLDI (qoida 38 so'rovining status filtri qo'riqlanmagan). 3) nazorat: :165/:176 `status IN ('failed','dead')` -> `('failed')` => yiqildi ("Jami: 3" vs kutilgan "Jami: 4") — o'lchov asbobi ishlayotganini isbotlaydi. 4) nazorat: :211 `v < 3` -> `v < 300` => p95BreachingSlaThresholdIsReportedAsViolated:179 yiqildi. ⚠️ MUHIM: SKRIPTNING O'ZI TO'G'RI — bu kod nuqsoni EMAS, test qamrovi nuqsoni. Alohida scratch DB da o'zim o'lchadim: 95×1 s + 5×20 s => skript p95=1.950 s, bu DB ning o'z percentile_cont(0.95)=1.950 bilan bir xil (p50=1.000 — ya'ni haqiqiy p95 hisoblanadi). Chegara aynan 3.000 s => "BUZILGAN" (spec `p95 < 3 s` qat'iy — to'g'ri). SQL qoida 38 bilan so'zma-so'z mos (percentile_cont(0.95) WITHIN GROUP (ORDER BY sent_at - created_at), status='sent', oyna). Kerak (5653 ni yopish uchun) — NotificationOutboxMonitorScriptSmokeTest da: (a) p95 testida QIYA taqsimot ishlat, p50 != p95 bo'lsin (mas. 95 ta 1 s + 5 ta 20 s => p95 = 1.950 s, p50 = 1.000 s) va ANIQ "1.950 s" ni assert qil => 0.95->0.50 mutanti o'ladi. (b) O'SHA p95 stsenariysiga kamida bitta `status='pending'` (sent_at NULL) va bitta oynadan TASHQARIDAGI 'sent' qator qo'sh, keyin "Namuna hajmi (status='sent'): N" ular hisobga OLINMAGANINI assert qil => status filtri / oyna mutanti o'ladi. (c) Chegara holati: p95 AYNAN 3.000 s => "BUZILGAN" deb chiqishi (qat'iy `<`) — hozir umuman testlanmagan. O'lchangan dalillar (boshqa mezonlar): * 5652 ✅ — skriptni O'ZIM yurgizdim: bo'sh jadval => EXIT 0, "Jami: 0", "p95: ma'lumot yo'q", "Soni: 0", xato yo'q. last_error_code kesimi ishlaydi (UNREGISTERED 2 / UNAVAILABLE 1 / "(last_error_code NULL)" 1). Mutant 3 bu mezonni qo'riqlayotganini tasdiqladi. * 5654 ✅ — `git diff 2d7579f..719be85 --stat -- src/main openapi src/main/resources/db/migration` = BO'SH (yangi endpoint/jadval/migratsiya yo'q). `.github/workflows/ci.yml` o'zgarmagan. M14 = B rioya qilingan. * 5655 ✅ — README.md dagi buyruqni aynan nusxalab yurgizdim: DB_URL=jdbc:postgresql://localhost:5432/... + DB_USER/DB_PASSWORD => ulandi (erpbom@localhost:5432), jdbc->libpq o'girish README:63-68 va skript:50-65 da ANIQ hujjatlashtirilgan (psql JDBC URL ni tushunmasligi alohida ogohlantirilgan). env'siz ishga tushirish aniq xato + exit 2; --help exit 0. Eslatma (nuqson EMAS): `erpbom-dev-postgres` migratsiya 44 da, `notification_outbox` V51 da keladi — shu sabab dev DB da skript "relation does not exist" bilan exit 3 beradi. Bu muhit eskirgani, skript nuqsoni emas (skript hujjatlanganidek DB xatosida nolga teng bo'lmagan kod qaytaradi). Baza to'plami: `mvn -Dtest=NotificationOutboxMonitorScriptSmokeTest test` => Tests run: 5, Failures: 0, Errors: 0, Skipped: 0. (psql /usr/bin/psql 16.15 mavjud — Assumptions SKIP ishlamadi, testlar haqiqatan yurdi.) Tozalik: mutatsiya faqat /tmp/qa-EP-13-T08-S03 worktree'da, worktree o'chirildi; scratch DB qa_ep13_t08_s03 DROP qilindi; asosiy daraxt `git status --porcelain` BO'SH, `git grep MUTANT HEAD` bo'sh.

  • ✓

    qa-ep-13-t08-s03 EP-13-T08-S03 qabul mezonini belgiladi

    ✗ Skript (b) `created_at`->`sent_at` kechikishining p95 ini chiqaradi va qoida 38 chegarasi (p95 < 3 s) bilan solishtiradi

  • ✓

    qa-ep-13-t08-s03 EP-13-T08-S03 qabul mezonini belgiladi

    ✓ Ishga tushirish yo'li hujjatlashtirilgan (README yoki skript izohi)

  • ✓

    qa-ep-13-t08-s03 EP-13-T08-S03 qabul mezonini belgiladi

    ✓ Yangi REST endpoint, yangi jadval va yangi rule YARATILMAGAN (M14 = B rioya qilingan)

  • ✓

    qa-ep-13-t08-s03 EP-13-T08-S03 qabul mezonini belgiladi

    ✓ Skript (a) failed/dead sanog'ini `last_error_code` kesimida chiqaradi va bo'sh jadvalda ham xato bermaydi

  • ⇄

    qa-ep-13-t08-s01 EP-13-T08-S01 statusni o'zgartirdi Review → Bajarildi

  • 💬

    qa-ep-13-t08-s01 EP-13-T08-S01 izoh qoldirdi

    QA mustaqil tekshiruv (qa-EP-13-T08-S01) — QABUL QILINDI. Bazaviy yurish (flock ostida, main tree): PushTokenCleanupAc4IntegrationTest 3/3 + WorkReviewIntegrationTest 13/13 = Tests run: 16, Failures: 0, Errors: 0. Regressiya (uz.erpbom.notifications.**): Tests run: 215, Failures: 0, Errors: 0 — BUILD SUCCESS. 5626 — ikkala yo appRequestDelete... (qoida 22a, DELETE /push-tokens/{device_id}) va serverGuarantee... (qoida 22b+23, SessionRevocationService, HTTP DELETE yo) ALOHIDA test metodlarida. Assert FCM darajasida: RecordingPushSenderPort.requests() isEmpty (159-172 va 206-210 qatorlar) + outbox dead/no_token — ya worker haqiqatan yurgani isbotlanadi, faqat DB qatori emas. 5627 — MUTATSIYA QA tomonidan QAYTA otkazildi, izolyatsiyalangan worktree (/tmp/qa-EP-13-T08-S01-verify), har mutant javap bilan bytecode darajasida tasdiqlandi: M1 PushTokenService.delete tanasi boshatildi (javap: `0: return`) -> YIQILDI faqat (a) testi (PushTokenCleanupAc4IntegrationTest.java:161) + eski PushTokensControllerIntegrationTest#deleteRemovesRowImmediatelyAndIsIdempotent. Qolgan 225 test yashil. M2 scheduleDeferredCleanupForUser JPQL neytrallandi -> YIQILDI faqat (b) testi (:191) + SessionRevocationServiceIntegrationTest. Qolgan 224 yashil. M3 deleteByTokenAndUserIdNot JPQL neytrallandi -> YIQILDI faqat (c) testi + PushTokensControllerIntegrationTest#sameTokenOnSameDeviceMovesToNewUserAndOldRowIsGone. Qolgan 225 yashil. M4 (QA qoshimchasi, tavtologiya tekshiruvi) findEligibleForSend dagi delete_after qorigi neytrallandi -> (b) testi aynan FCM assertida yiqildi (:208, Expecting empty but was: [PushSendRequest[eventCode=auth.account_blocked, tokens=[fcm_ac4_server_guarantee_...]]]). Demak FCM-darajali assert tavtologiya emas, yolgonni ushlaydi. Fixture xilma-xilligi: uch testda user/device_id/token qiymatlari har xil (UUID suffiks), (c) da audience ham employee->driver farq qiladi; qotib qolgan qiymat yoq. 5628 — (c) testi: A registratsiya -> B ayni device_id + ayni token bilan registratsiya -> countPushTokensForUser(A)=0, A ning outbox qatori dead/no_token, FCM ga BITTA sorov (B uchun) va u aynan sharedToken bilan. AC11/UC4 3-qadam qoplangan. Flaki test (lead topshirigi): git diff f10a647^ f10a647 -- WorkReviewIntegrationTest.java faqat `erpbom.outbox.production.fixed-delay=3600000` property (+ izoh) qoshgan; @Disabled/@Ignore/assumeTrue YOQ, assert yumshatilmagan (pendingOutboxRow tekshiruvi 299/333 qatorlarda ozgarishsiz). Klass 3 marta ketma-ket yurgizildi: 13/13, 13/13, 13/13 — yashil. Tozalik: `grep -rn MUTANT src/` bosh, `git grep MUTANT HEAD` bosh, worktree ochirildi, asosiy ish daraxti toza (hech narsa yozilmadi/commit qilinmadi).

  • ✓

    qa-ep-13-t08-s01 EP-13-T08-S01 qabul mezonini belgiladi

    ✓ B user kirgach ayni token faqat B qatorida bo'ladi (AC11)

  • ✓

    qa-ep-13-t08-s01 EP-13-T08-S01 qabul mezonini belgiladi

    ✓ Token tozalash kodi olib tashlanganda aynan bu testlar yiqiladi, qolgan to'plam yashil qoladi

  • ✓

    qa-ep-13-t08-s01 EP-13-T08-S01 qabul mezonini belgiladi

    ✓ Ikkala yo'l (ilova so'rovi va server kafolati) alohida testda qoplangan

  • ⇄

    coder-ep-13-t08-s02 EP-13-T08-S02 statusni o'zgartirdi Ishlanyapti → Review

  • 💬

    coder-ep-13-t08-s02 EP-13-T08-S02 izoh qoldirdi

    5629=true (14 ta AC — AC1,2,3,5-15 — har biri 4 qismli: boshlangich holat/amal/kutilgan natija/AC; hammasi grep bilan tasdiqlangan: 13 ta hodisa kodi NotificationEventCatalog.java da, 6 ta endpoint controllerlarda, jadval/ustun nomlari V50-V53 migratsiyalarda). 5630/5631 ONGLI ravishda ochiq qoldirildi (yolgon true qilinmadi): scripts/notification-outbox-monitor.sh mavjud va togri chaqirilgan (buyruq/bayroqlar hujjatda tekshirilgan), lekin uni haqiqiy bir kunlik malumot + 200ta ommaviy hodisa bilan jonli yurgizib bolmadi: shared erpbom-dev-postgres konteynerida notification_outbox jadvali yoq edi (Flyway migratsiya bu DBda ishlamagan yoki boshqa holatda), migratsiya/sinov malumotini shu umumiy DBga yozish parallel agentlar ishiga xalaqit berishi mumkin edi, shuning uchun bajarilmadi. Hujjat 3.2/3.3 bolimlarida usul aniq korsatilgan — QA mustaqil izolyatsiyalangan muhitda olchab 5630/5631ni yopishi kerak.

  • ✓

    coder-ep-13-t08-s02 EP-13-T08-S02 qabul mezonini belgiladi

    ✓ Ro'yxatda 14 ta qo'lda AC ning har biri uchun aniq qadamlar va kutilgan natija yozilgan

  • ✎

    coder-ep-13-t08-s02 EP-13-T08-S02 yangiladi

    Yangilandi: branch, commit_sha

  • 📄

    coder-ep-13-t08-s02 EP-13-T08-S02 fayllarni qayd etdi

    1 ta fayl qayd etildi

  • ⇄

    coder-ep-13-t08-s02 EP-13-T08-S02 statusni o'zgartirdi Backlog → Ishlanyapti

    Agent ishni boshladi

  • ⚑

    coder-ep-13-t08-s02 EP-13-T08-S02 ishga oldi

  • ⇄

    coder-ep-13-t08-s03 EP-13-T08-S03 statusni o'zgartirdi Ishlanyapti → Review

  • ✎

    coder-ep-13-t08-s03 EP-13-T08-S03 yangiladi

    Yangilandi: branch, commit_sha

  • 💬

    coder-ep-13-t08-s03 EP-13-T08-S03 izoh qoldirdi

    scripts/notification-outbox-monitor.sh — 3 signal: (a) failed/dead last_error_code kesimida, oyna bilan chegaralangan (partition pruning); (b) p95/p99 (qoida 38 so'rovi), p95<3s bilan solishtirib OK/BUZILGAN, bo'sh natijada NULL -> "ma'lumot yo'q" (xato bermaydi); (c) countStuckRows SQL shartining aynan nusxasi. Yangi endpoint/jadval/rule YO'Q (git diff src/main bo'sh). Tasdiqlash: Testcontainers smoke test (NotificationOutboxMonitorScriptSmokeTest, 5 ta test, real PG16 ustida skriptni subprocess sifatida ishga tushiradi) — bo'sh jadval, (a) oyna filtri (30 soat oldingi hisobga olinmaydi), (b) p95 OK va BUZILGAN ikkala yo'nalish (20x1s -> 1.000s OK; 20x5s -> 5.000s BUZILGAN), (c) 3 ta stuck stsenariy (NotificationSweepJobTest bilan bir xil). mvn -Dtest=NotificationOutboxMonitorScriptSmokeTest test -> 5/5 yashil. Dev DB (erpbom-dev-postgres) V37 da qolgan (V51 yo'q) shu sabab u yerda emas, Testcontainers'da (to'liq Flyway V1..V57) sinaldi.

  • ✓

    coder-ep-13-t08-s03 EP-13-T08-S03 qabul mezonini belgiladi

    ✓ Ishga tushirish yo'li hujjatlashtirilgan (README yoki skript izohi)

  • ✓

    coder-ep-13-t08-s03 EP-13-T08-S03 qabul mezonini belgiladi

    ✓ Yangi REST endpoint, yangi jadval va yangi rule YARATILMAGAN (M14 = B rioya qilingan)

  • ✓

    coder-ep-13-t08-s03 EP-13-T08-S03 qabul mezonini belgiladi

    ✓ Skript (b) `created_at`->`sent_at` kechikishining p95 ini chiqaradi va qoida 38 chegarasi (p95 < 3 s) bilan solishtiradi

  • ✓

    coder-ep-13-t08-s03 EP-13-T08-S03 qabul mezonini belgiladi

    ✓ Skript (a) failed/dead sanog'ini `last_error_code` kesimida chiqaradi va bo'sh jadvalda ham xato bermaydi

  • 📄

    coder-ep-13-t08-s03 EP-13-T08-S03 fayllarni qayd etdi

    3 ta fayl qayd etildi

  • ⇄

    coder-ep-13-t08-s03 EP-13-T08-S03 statusni o'zgartirdi Backlog → Ishlanyapti

    Agent ishni boshladi

  • ⚑

    coder-ep-13-t08-s03 EP-13-T08-S03 ishga oldi

  • ⇄

    coder-ep-13-t08-s01 EP-13-T08-S01 statusni o'zgartirdi Ishlanyapti → Review

  • ✎

    coder-ep-13-t08-s01 EP-13-T08-S01 yangiladi

    Yangilandi: branch, commit_sha

  • 💬

    coder-ep-13-t08-s01 EP-13-T08-S01 izoh qoldirdi

    AC4 avtomatik integratsiya testi yozildi: PushTokenCleanupAc4IntegrationTest (3 ta @Test - (a) DELETE /push-tokens/{device_id}, (b) SessionRevocationService server kafolati (qoida 22b/23, oyna yopilgach security xabar ham FCM stubga yetmaydi), (c) AC11/UC4 3-qadam qurilma qayta biriktirilishi). Har uch yolda RecordingPushSenderPort orqali FCM darajasida tekshirildi - mavjud testlar faqat DB qator darajasini tekshirardi, shu yetishmayotgan bogin yopildi. Mutatsiya (izolyatsiyalangan worktree, /tmp/qa-EP-13-T08-S01): 3 ta alohida mutatsiya (PushTokenService.delete boshatildi; PushTokenRepository.scheduleDeferredCleanupForUser va deleteByTokenAndUserIdNot AND 1=0 bilan no-op qilindi) - har birida FAQAT mos test qizil, qolgan 2/3 yashil qoldi. Diqqat: birinchi urinishda PushTokenCleanupAdapter.deletePushToken ni buzganda test ozgarmadi - chunki bu klass faqat auth.LogoutService orqali chaqiriladi, HTTP DELETE endpoint esa togridan-togri PushTokenService.delete ni chaqiradi; haqiqiy chaqiruv zanjirini tekshirib togri mutatsiya nuqtasiga otdim. Shu jarayonda testda @BeforeEach tozalov yoqligi (cross-test ifloslanish, worker butun jadvalni claim qilgani sababli) ham topildi va tuzatildi (alohida commit). LEAD topshirigi: WorkReviewIntegrationTest#terminalBrakRejectReleasesQtyClaimedForReclaim dagi ProductionOutboxWorker (fixedDelay 2s) poygasi erpbom.outbox.production.fixed-delay=3600000 bilan tuzatildi, 3 marta ketma-ket yashil tasdiqlandi (@Disabled ishlatilmadi, assert yumshatilmadi).

  • ✓

    coder-ep-13-t08-s01 EP-13-T08-S01 qabul mezonini belgiladi

    ✓ B user kirgach ayni token faqat B qatorida bo'ladi (AC11)

  • ✓

    coder-ep-13-t08-s01 EP-13-T08-S01 qabul mezonini belgiladi

    ✓ Token tozalash kodi olib tashlanganda aynan bu testlar yiqiladi, qolgan to'plam yashil qoladi

  • ✓

    coder-ep-13-t08-s01 EP-13-T08-S01 qabul mezonini belgiladi

    ✓ Ikkala yo'l (ilova so'rovi va server kafolati) alohida testda qoplangan