# Bilko — Support sistem — arhitektura (MC #106061)

**Parent:** MC #106049 (Support MVP) · **Ovaj task:** MC #106061 (D1) · **Agent:** Skillforge · **Datum:** 2026-07-20

Ova stranica postoji da se izbjegne zabuna od 2026-07-13 ("dva backena") — Bilko ima **tri odvojena support mehanizma** plus jedan odgođen. Nijedan se ne preklapa niti dijeli kod s drugim. Ako trebate promijeniti support ponašanje, prvo utvrdite u KOJI od ova tri/četiri komada spada promjena.

## 1. Mapa sistema

```mermaid
flowchart TB
    subgraph customer["Customer-facing"]
        CW["ChatWidget.tsx<br/>apps/web/components/chatbot/"]
        CBS["ChatbotService.kt<br/>/chatbot/message endpoint<br/>KANONSKI AI customer backend"]
        CC["ComplianceClassifier.kt<br/>floor/compliance guard (#105476)<br/>fail-closed na compliance pitanja"]
        CW -->|"POST /chatbot/message"| CBS
        CBS --> CC
    end

    subgraph staff["Staff-only (interno)"]
        BSA["bilko-support-answer.js<br/>ZASEBAN staff-copilot daemon<br/>NIJE customer-facing, NE dijeli kod s ChatbotService"]
    end

    subgraph human["Human support (OVAJ MVP, MC #106049)"]
        SA["support_agent rola<br/>RBAC: support_ticket:read / support_ticket:reply"]
        RLS["RLS cross-org izuzetak<br/>app.is_support_agent GUC<br/>SAMO support_tickets + support_ticket_messages"]
        REPLY["Async ticket reply<br/>NotificationService polling<br/>support_ticket_messages thread"]
        SA --> RLS
        RLS --> REPLY
    end

    subgraph future["Faza 3 (ODGOĐENO)"]
        RT["Real-time live chat<br/>AI->čovjek handoff<br/>build in-house (Ktor WS+Redis) vs Chatwoot/Crisp<br/>trigger: realan volumen support zahtjeva"]
    end

    CC -.->|"nikad ne dijeli backend"| SA
    BSA -.->|"nikad ne dijeli backend"| SA
    REPLY -.->|"kad dođe red"| RT

```

## 2. AI chat — customer widget (KANONSKI, ne dira ovaj MVP)

- **Backend:** `ChatbotService` — endpoint `POST /chatbot/message`. Ovo je JEDINI kanonski AI customer-facing backend u Bilku.
- **Frontend:** `ChatWidget.tsx` (`apps/web/components/chatbot/ChatWidget.tsx`).
- **Compliance guard:** `ComplianceClassifier.kt` — floor/compliance guard iz MC #105476, live u produkciji, PASS. Fail-closed dizajn: na pitanjima koja spadaju u compliance-klasu bez pouzdanog KB hita, sistem odbija davati odgovor (ne pretpostavlja).
- **Verifikovano iz koda:** `apps/api/src/main/kotlin/no/alai/bilko/services/ChatbotService.kt` i `services/chatbot/ComplianceClassifier.kt` — komentari na linijama 160–265 potvrđuju fail-closed granu za compliance-klasu pitanja.

## 3. AI staff triage — zaseban daemon

- **`bilko-support-answer.js`** — ZASEBAN staff-copilot daemon. Pomaže ALAI/Bilko support osoblju da brže odgovori na tikete (draft odgovora, KB pretraga za internu upotrebu).
- **NIJE customer-facing.** Ne prima poziv od `ChatWidget.tsx`, ne dijeli kod ni endpoint s `ChatbotService`.
- Postoji nezavisno od RBAC/RLS promjena u ovom MVP-u (Faza A/B) — support\_agent rola ne mijenja kako ovaj daemon radi.

## 4. Human support — NOVO u ovom MVP-u (MC #106049)

Ovo je jedini dio arhitekture koji je STVARNO nov u ovom talasu. Detalji u:

- **Faza A** — "[Bilko — Support agent rola + RLS temelj (Faza A)](https://docs.alai.no/books/backend/page/bilko-support-agent-rola-rls-temelj-faza-a-mc-106050106051)" (MC #106050 A1 + #106051 A2) — nova `support_agent` rola, RBAC permisije, RLS cross-org SELECT/UPDATE izuzetak na `support_tickets` preko nove `app.is_support_agent` GUC.
- **Faza B** — "[Bilko — Support ticket reply + GUC aktivacija (Faza B)](https://docs.alai.no/books/backend/page/bilko-support-ticket-reply-guc-aktivacija-faza-b-mc-106054-106057)" (MC #106054–#106057) — `support_ticket_messages` thread tabela + RLS (B1), POST reply endpoint koji PRVI PUT u kodu stvarno postavlja `SET LOCAL app.is_support_agent = 'true'` (B2), GET customer strana poruka (B3), lista tiketa scoped za support\_agent uz regresiju platform\_admin (B4).
- Puna RBAC/RLS referenca i runbook — vidi ["Bilko — Kako support agent radi"](https://docs.alai.no/books/backend/page/bilko-kako-support-agent-radi-runbook-mc-106063) (E2, runbook).

## 5. Faza 3 (odgođeno) — Real-time live chat + AI→čovjek handoff

- **Status:** ODGOĐENO. Nije dio ovog MVP-a (MC #106049 pokriva samo async ticket reply).
- **Otvorena odluka kad dođe red:** build in-house (Ktor WebSocket + Redis/ACA sticky sessions) vs gotov servis (Chatwoot/Crisp — napomena: GDPR data-processor ugovor za PII bio bi potreban ako se ide ovim putem).
- **Trigger za pokretanje:** realan volumen support zahtjeva koji async ticket-reply model više ne pokriva dovoljno br‌zo.

## 6. Linkovi

- Linkovano iz `DEPLOY-MAP.md` i `BUILD-BLUEPRINT.md` u repou (`~/business/ALAI-Holding-AS/products/Bilko/`).
- Plan: `~/.claude/plans/bilko-support-mvp-2026-07-20.md`
- Evidence: `~/system/evidence/106050/` (A1, ako postoji), `~/system/evidence/106051/` (A2), `~/system/evidence/106053/` (A3/A4), `~/system/evidence/106054/` (B1), `~/system/evidence/106055/` (B2/B3/B4).