ResolveAI.
AI-Assisted Helpdesk & Incident Triage Platform
A helpdesk backend where the model produces triage signals and deterministic policy turns them into priority and routing. The AI suggests; the system decides — so every decision stays explainable and testable. In active development; nothing here is presented as deployed.
- —Ticket state machine with an append-only audit trail
- —Deterministic policy on top of LLM signals
- —Hybrid retrieval — pgvector + full-text, fused with RRF
01
Problem & goal
Support teams triage tickets by hand: priority depends on who reads it first, SLAs get tracked inconsistently, and dozens of tickets from the same incident get handled one by one. ResolveAI turns unstructured tickets into structured work — without handing the decisions to a model.
02
How it works
- —A ticket enters through the REST API and commits alongside its outbox event in one transaction — creation never waits on an LLM call.
- —A worker claims events with SKIP LOCKED, strips PII, and asks the model for structured triage signals.
- —Deterministic policy converts those signals into priority and routing, writing every transition into the state machine's audit trail.
- —Related tickets are correlated into incident proposals, confirmed by a human, then updated once and fanned out.
Architecture
- POST /tickets
- Outbox
- Worker
- PII Redaction
- LLM
- Policy
Deterministic rules compute priority and routing.
VISUALS
Project screens
Ticket workflow
Project screenshot pending
03
Security model
- —JWT access + refresh tokens with four roles — CUSTOMER, AGENT, TEAM_LEAD, ADMIN.
- —Tenant isolation enforced across the backend, not just filtered in the UI.
- —PII is redacted before any model call; every generated claim must carry a citation.
04
Built with
Live progress
Updated as work lands
Built so far
- ✓Modular monolith core: IAM, Ticketing, SLA and Platform modules
- ✓Ticket state machine with an append-only audit trail
- ✓JWT auth with refresh tokens, four roles, tenant isolation
- ✓PostgreSQL schema with versioned migrations
- ✓Outbox worker claiming events with SKIP LOCKED
- ✓PII redaction pipeline before any model call
Next up
- →Hybrid retrieval: pgvector + full-text, merged with Reciprocal Rank Fusion
- →Citation-enforced draft generation and its evaluation harness
- →Incident correlation and the human-confirmed proposal gate
- →Prometheus + Grafana observability dashboards
05
Challenges & tradeoffs
AI in the request path
An LLM call inside ticket creation would make it slow and unpredictable — so signals are produced asynchronously behind an outbox worker, and the request path stays deterministic.
Trustworthy drafts
Generated text can invent facts. Every draft claim must be backed by a citation, and drafts with low citation coverage are suppressed rather than sent.
Restart safety
Workers crash mid-job. SKIP LOCKED plus the outbox means an event is processed exactly once, and nothing is lost on restart.
06
Decisions
PostgreSQL for SKIP LOCKED, partial unique indexes, JSONB, full-text search and pgvector in one engine.
PostgreSQL for SKIP LOCKED, partial unique indexes, JSONB, full-text search and pgvector in one engine.
An outbox so ticket persistence and event creation are atomic
An outbox so ticket persistence and event creation are atomic — even if the worker dies mid-flight.
Deterministic policy after the model keeps business decisions explainable, testable and reviewable.
Deterministic policy after the model keeps business decisions explainable, testable and reviewable.
Links
Next