# 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:**

1. **Corporate simplicity:** One entity for all ALAI Serbian operations
2. **Cost efficiency:** One incorporation, one tax filing, one audit (vs 3x overhead)
3. **Capital pooling:** EUR 125,000 NBS PI license capital serves all products
4. **Regulatory efficiency:** Single NBS/Poverenik/APML relationship
5. **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:**

1. **ALAI standard:** All products must use Kotlin/Ktor (consistency, shared knowledge)
2. **Type safety:** Kotlin compiler catches errors at compile-time (vs runtime in TypeScript)
3. **Performance:** Ktor netty transport faster than Node.js event loop
4. **Ecosystem:** Better PostgreSQL support (Exposed ORM vs Prisma/Drizzle)
5. **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:

1. **Redesign from scratch** (new UX, new components)
2. **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:**

1. **Proven UX:** Drop Norway tested with real users (positive feedback)
2. **Faster time-to-market:** No need to reinvent UI patterns
3. **Focus on localization:** Effort on Serbian language/culture, not design
4. **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:**

1. **Unblock CI:** Cannot merge PRs if coverage gate fails due to infra issue
2. **Realistic gate:** 52% unit coverage still enforces quality (better than 0%)
3. **Pending fix:** docker-java PR expected Q3 2026
4. **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:**

1. **Latin** (latinica): Standard in tech, banking, official documents
2. **Cyrillic** (ćirilica): Traditional, used in media, education

**Decision:**

Drop Srbija MVP uses **Latin script only**. Cyrillic support added in Phase 2 (post-MVP).

**Rationale:**

1. **Banking standard:** All Serbian banks use Latin for digital interfaces
2. **NBS IPS:** NBS IPS API uses Latin (IBAN, PIB, names)
3. **Tech ecosystem:** Serbian tech products default to Latin (Viber, TikTok, Instagram)
4. **Faster MVP:** No need for script toggle, translation duplication
5. **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:**

1. **Market share:** Android 78% in Serbia (Samsung dominant brand)
2. **Price point:** Galaxy A54 (RSD 40,000 / ~$370) matches middle-class budget
3. **Screen size:** 6.4" (Serbian users prefer larger screens)
4. **Banking apps:** All Serbian banks optimize for Samsung (not iPhone)
5. **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