RANE — Incident Triage Copilot
RANE is a local incident command center with a FastAPI backend and a responsive, buildless HTML/CSS/JavaScript frontend. It supports historical incident replay, Gemma-backed triage or explicitly labeled deterministic demo guidance, and persistent engineer decisions. It does not autonomously resolve incidents.
Run locally
From the repository root, with Python 3.11+:
python3 -m venv .venv
source .venv/bin/activate
pip install -e './backend[test]'
python run.py
Open http://127.0.0.1:8000; API documentation is at /docs. The backend
loads incident_event_log.csv from the repository root by default. Override
the path with RANE_INCIDENTS_CSV. The SQLite action database defaults to
backend/data/rane_actions.sqlite3 and can be changed with RANE_ACTIONS_DB.
The supplied CSV contains 119,998 event records across 20,769 unique incidents.
Incident_response.txt documents its fields. The loader handles day-first
timestamps, numeric-labeled priority/impact/urgency, and anonymized fields.
Do not interpret category/symptom IDs as readable descriptions.
Demo workflow
- Filter/search the queue for
INC0025693and open its incident detail. - Use the replay timestamp to compare incident state before and after priority escalation. The queue, detail, and analysis use the selected time cutoff.
- Choose Demo Mode for deterministic investigation suggestions, or Live Mode when a model deployment is configured. Demo responses are explicitly labeled and do not represent model inference.
- Review hypotheses, evidence, missing information, and recommended actions. Accept or dismiss actions, record an investigation note, and mark the replay point investigated.
- Review persistent decisions in Activity History. Engineer actions never trigger infrastructure changes.
Model configuration
The default is Demo Mode unless live provider configuration is complete. Copy
.env.example to .env, set server-side values, and restart the application.
run.py loads both the root .env and backend/.env (root values take
precedence).
| Variable | Purpose |
|---|---|
GEMMA_PROVIDER |
google (default locally) or digitalocean |
GEMMA_ENDPOINT |
Complete HTTPS chat-completions URL; DigitalOcean defaults to https://inference.do-ai.run/v1/chat/completions |
GEMMA_API_KEY |
Server-side provider credential |
GEMMA_MODEL |
Model override; Google defaults to gemma-4-31b-it; DigitalOcean defaults to gemma-4-31B-it. |
RANE_INCIDENTS_CSV |
Optional CSV path; defaults to incident_event_log.csv in the repository root |
RANE_ACTIONS_DB |
Optional SQLite database path |
For Google, the backend calls
https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent
with the API key on the server. The key was verified to list Gemma 4 models,
and gemma-4-31b-it completed a JSON-generation check. This is the default
model. Google generation may take up to 120 seconds. DigitalOcean's
inference endpoint documentation
describes its chat endpoint at
https://inference.do-ai.run/v1/chat/completions; DigitalOcean requires its
own model access key and a supported model ID. Its Gemma 4 catalog ID is
gemma-4-31B-it. Do not reuse a Google key for DigitalOcean.
Configuration presence does not prove that inference succeeds; verify the deployment before presenting it as live inference. Live provider failures are explicit and never silently substituted with demo output.
Deploy to DigitalOcean App Platform
The repository includes a Dockerfile and App Platform spec for deploying the
main branch of EthanP-Code/RANE_Incident_Handler. After installing and
authenticating doctl with an account that can create apps and access that
GitHub repository, create the app with:
doctl apps create --spec .do/app.yaml
The app spec selects DigitalOcean Gemma and its documented serverless endpoint,
but intentionally does not contain a credential. Add a newly generated
DigitalOcean model access key as the GEMMA_API_KEY secret in the App
Platform console, then redeploy. The model access key does not grant permission
to create or manage the App Platform app. The key previously pasted into chat
must be revoked and replaced; never place it in source control or the app spec.
The SQLite activity database uses the container filesystem and is not durable across App Platform redeployments or instance replacement. Configure external persistent storage before relying on activity history in production.
Replay and data integrity
- CSV rows are incident events. Queue counts and snapshots aggregate by
incident ID at the selected replay time; equal-timestamp rows use
sys_mod_countordering. - Day-first source timestamps have no timezone and are treated as UTC internally without changing their clock values.
- Only allowlisted metadata is supplied to the model. Resolution/closure timestamps, resolution codes, resolved-by values, SLA outcomes, and later events are excluded—even if outcome columns are already populated in earlier CSV rows.
- The data contains no application logs, metrics, service-name mappings, or runbooks. Causes remain hypotheses; recommended steps are investigations, not remediation instructions.
- Missing datasets produce an actionable empty state. No fabricated incidents are used by the application.
Dataset attribution: Amaral, C., Fantinato, M., and Peres, S., Incident management process enriched event log, UCI Machine Learning Repository, DOI 10.24432/C57S4H, CC BY 4.0.
Verify
python -m pytest backend/tests -q
node --check backend/frontend/app.js
Live model inference has not been verified without deployment credentials. This is a local hackathon MVP; authentication, production telemetry, and automated remediation are outside its scope.
Log in or sign up for Devpost to join the conversation.