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— endpointPOST /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.ktiservices/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 sChatbotService. - 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)" (MC #106050 A1 + #106051 A2) — nova
support_agentrola, RBAC permisije, RLS cross-org SELECT/UPDATE izuzetak nasupport_ticketspreko noveapp.is_support_agentGUC. - Faza B — "Bilko — Support ticket reply + GUC aktivacija (Faza B)" (MC #106054–#106057) —
support_ticket_messagesthread tabela + RLS (B1), POST reply endpoint koji PRVI PUT u kodu stvarno postavljaSET 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" (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 brzo.
6. Linkovi
- Linkovano iz
DEPLOY-MAP.mdiBUILD-BLUEPRINT.mdu 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).