CEO Decision Log CEO Decision Log (D9-D14) CEO Decision Log (D9-D14) Context: Major architectural and strategic decisions made during Drop Srbija v2 rebuild. All decisions D1-D8 documented in existing docs/05-decision-log.md . This chapter covers v2-specific decisions D9-D14. D9: Legal Entity — ALAI Tech d.o.o. Date: 2026-04-16 Decision ID: D9 Status: Active (Incorporation Pending) Context: Early Drop Srbija documentation referenced "Drop Srbija d.o.o." as the intended legal entity for Serbian operations. This implied separate incorporation per product line (Drop, Bilko, Tok). Decision: Drop Srbija operates as a product line under ALAI Tech d.o.o. (single Serbian subsidiary of ALAI Holding AS). No separate "Drop Srbija d.o.o." will be incorporated. Rationale: Corporate simplicity: One entity for all ALAI Serbian operations Cost efficiency: One incorporation, one tax filing, one audit (vs 3x overhead) Capital pooling: EUR 125,000 NBS PI license capital serves all products Regulatory efficiency: Single NBS/Poverenik/APML relationship Brand architecture: Legal entity = ALAI Tech, product brands = Drop/Bilko/Tok Consequences: ✅ Reduced costs, simplified structure, easier capital management ❌ All products share liability under one entity ⚠️ Must maintain strong compliance (one NBS audit covers all) Related Documents: Legal entity structure: docs/bookstack/01-legal-entity.md Full decision context: docs/05-decision-log.md#d9 D10: Backend — Kotlin/Ktor (ALAI Standard) Date: 2026-04-17 Decision ID: D10 Status: Active Context: Drop Srbija v1 prototype used Hono (TypeScript) backend. ALAI standard mandates Kotlin/Ktor for all products (CEO decision 2026-02-25). Decision: Drop Srbija v2 backend uses Kotlin 2.1.0 + Ktor 3.1.2 , replacing Hono/TypeScript. Rationale: ALAI standard: All products must use Kotlin/Ktor (consistency, shared knowledge) Type safety: Kotlin compiler catches errors at compile-time (vs runtime in TypeScript) Performance: Ktor netty transport faster than Node.js event loop Ecosystem: Better PostgreSQL support (Exposed ORM vs Prisma/Drizzle) Team expertise: Petter Graff (CodeCraft lead) Kotlin expert Alternatives Rejected: Keep Hono/TypeScript: Violates ALAI standard, divergent tech stack Node.js Express: Slower than Ktor, callback hell Go: No ALAI expertise, steeper learning curve Consequences: ✅ ALAI standard compliance, better performance, type safety ❌ Full backend rewrite (20 modules, 22 migrations) ⚠️ Learning curve for team members without Kotlin experience Evidence: Backend directory: backend/ (Kotlin/Ktor, not TypeScript/Hono) 617 tests passing (79 Kotest files) D11: Frontend — Drop Norway 1:1 Copy Date: 2026-04-17 Decision ID: D11 Status: Active Context: Two frontend strategies considered: Redesign from scratch (new UX, new components) 1:1 copy from Drop Norway (proven UX, localize for Serbia) Decision: Drop Srbija v2 frontend is a 1:1 copy of Drop Norway with minimal changes (NOK→RSD, BankID→OTP, Vipps→NBS IPS, nb-NO→sr-RS). Rationale: Proven UX: Drop Norway tested with real users (positive feedback) Faster time-to-market: No need to reinvent UI patterns Focus on localization: Effort on Serbian language/culture, not design Lower risk: Known UX, fewer unknowns Changes: Currency: NOK → RSD Auth: BankID → Phone OTP Payment: Vipps → NBS IPS Language: Norwegian (nb-NO) → Serbian (sr-RS) National ID: Personnummer → JMBG (13 digits) Consequences: ✅ Faster MVP, proven UX, lower risk ❌ Less differentiation from Drop Norway ⚠️ Serbian users may expect different UX patterns (future feedback) Evidence: 30 pages adapted (1:1 copy with changes) 6 new Serbian components (JMBG, PhoneSR, IBANSR, PIB, NBSIPS, OTP) 145 i18n keys (sr-RS) D12: JaCoCo Gate — 52% Unit-Only (Temporary) Date: 2026-04-17 Decision ID: D12 Status: Active (Pending docker-java Fix) Context: ALAI standard: 60% test coverage gate. Drop Srbija v2 backend achieves 60% with unit + integration tests (Testcontainers). However, docker-java issue on M-series Macs causes Testcontainers to hang in CI (GitHub Actions). Decision: Temporarily lower coverage gate to 52% unit-only until docker-java issue fixed. Integration tests run locally but disabled in CI. Rationale: Unblock CI: Cannot merge PRs if coverage gate fails due to infra issue Realistic gate: 52% unit coverage still enforces quality (better than 0%) Pending fix: docker-java PR expected Q3 2026 Future restoration: Will restore 60% gate (unit + integration) once fixed Target Timeline: Now (2026-04-17): 52% unit-only gate Q3 2026: docker-java fixed → re-enable integration tests → 60% gate Consequences: ✅ CI unblocked, PRs can merge ❌ Lower coverage than ALAI standard (temporary) ⚠️ Must manually run integration tests locally before merge Evidence: JaCoCo report: 52.1% (unit-only) backend/build.gradle.kts : Coverage rule set to 52% Comment in CI: "Integration tests disabled due to docker-java M-series Mac issue" D13: Script — Latin MVP, Cyrillic Phase 2 Date: 2026-04-17 Decision ID: D13 Status: Active Context: Serbian language uses two scripts: Latin (latinica): Standard in tech, banking, official documents Cyrillic (ćirilica): Traditional, used in media, education Decision: Drop Srbija MVP uses Latin script only . Cyrillic support added in Phase 2 (post-MVP). Rationale: Banking standard: All Serbian banks use Latin for digital interfaces NBS IPS: NBS IPS API uses Latin (IBAN, PIB, names) Tech ecosystem: Serbian tech products default to Latin (Viber, TikTok, Instagram) Faster MVP: No need for script toggle, translation duplication User preference: Research shows 80%+ young Serbians prefer Latin for digital Phase 2 Plan: Add script toggle (settings) Duplicate i18n keys: sr-Latn.json + sr-Cyrl.json Auto-detect user preference (browser locale or IP) Consequences: ✅ Faster MVP, aligns with banking UX ❌ Cyrillic users may feel excluded (mitigated: majority prefer Latin) ⚠️ Phase 2 effort: 145 keys × 2 scripts = 290 translation keys Evidence: Frontend i18n: sr.json (Latin only) No Cyrillic translation files D14: Mobile Target — Samsung Galaxy A54 (Not iPhone) Date: 2026-04-17 Decision ID: D14 Status: Active Context: Drop Srbija is mobile-first (phone-based auth, QR payments). Primary test device must represent majority of Serbian users. Decision: Primary mobile test device: Samsung Galaxy A54 (Android), not iPhone. Rationale: Market share: Android 78% in Serbia (Samsung dominant brand) Price point: Galaxy A54 (RSD 40,000 / ~$370) matches middle-class budget Screen size: 6.4" (Serbian users prefer larger screens) Banking apps: All Serbian banks optimize for Samsung (not iPhone) NFC support: Galaxy A54 has NFC (needed for future card payments) iPhone Support: Still tested (Playwright cross-browser) Not primary optimization target iOS < 20% market share in Serbia Consequences: ✅ Aligns with Serbian market, realistic testing ❌ iPhone users may experience suboptimal UX (acceptable trade-off) ⚠️ Must still ensure iOS compatibility (no P0 bugs) Evidence: Playwright config: defaultBrowserType: 'chromium' (Android Chrome) Lighthouse tests: Mobile profile (Galaxy A54 viewport) No iPhone-specific optimizations (e.g., haptic feedback) Summary Table Decision Date Status Impact D9: ALAI Tech d.o.o. 2026-04-16 Active Legal entity consolidation D10: Kotlin/Ktor 2026-04-17 Active Backend tech stack D11: Drop Norway 1:1 2026-04-17 Active Frontend strategy D12: 52% Coverage Gate 2026-04-17 Temporary CI unblocking D13: Latin Script MVP 2026-04-17 Active Localization scope D14: Samsung Galaxy A54 2026-04-17 Active Mobile test target Full Decision Log: docs/05-decision-log.md (D1-D14) Next Review: After Phase 5 (NBS IPS integration) or major architectural change