Skip to main content

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

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:

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).