DEV Community

Anu Alleshwaram
Anu Alleshwaram

Posted on

Why I Trusted Hindsight and Cascadeflow for Incident Context

The hardest part of building an operations platform was never rendering dashboards. It was making incident information flow through the system without turning into disconnected state. I ended up treating workflow orchestration as a first-class engineering problem, and that decision shaped almost every part of the codebase.
What the system does
SentinelAI is an operations workspace that combines incident management, AI-assisted investigation, knowledge search, document management, analytics, notifications, connectors, and organization management behind a single React frontend and FastAPI backend.
The frontend keeps each capability behind its own route:

<Route path="dashboard" element={<Dashboard />} />
<Route path="copilot" element={<Copilot />} />
<Route path="incidents" element={<Incidents />} />
<Route path="knowledge" element={<Knowledge />} />
<Route path="analytics" element={<Analytics />} />
Enter fullscreen mode Exit fullscreen mode

The backend exposes matching APIs while handling authentication, persistence, and real-time communication through FastAPI.
Rather than thinking about these as isolated features, I treated them as stages in the same operational workflow. That is where Cascadeflow became useful. Instead of wiring every screen together manually, I modeled the system as information moving between predictable stages.
Useful references:
Cascadeflow GitHub
Cascadeflow documentation
The technical story
One design decision paid off repeatedly: separating operational state from workflow execution.
Authentication, persistence, connector management, document indexing, and incident history all evolve independently. The backend starts with explicit configuration instead of hidden globals:

MONGO\_URL = os.environ.get("MONGO\_URL", "mongodb://127.0.0.1:27017")
DB\_NAME = os.environ.get("DB\_NAME", "sentinelai")
JWT\_SECRET = os.environ.get("JWT\_SECRET", "local-dev-secret")
Enter fullscreen mode Exit fullscreen mode

That made every workflow deterministic because configuration stayed outside the execution path.
I also leaned on WebSockets for live operational updates instead of forcing clients to poll continuously. Operations software feels noticeably different when incident timelines update immediately.
Another lesson was that memory matters just as much as workflow. Long-running investigations span multiple documents, conversations, and incidents. I found the ideas behind Hindsight especially useful for structuring persistent context instead of repeatedly rebuilding prompts.
References:
Hindsight GitHub
Hindsight documentation
Vectorize agent memory
Code-backed decisions
The frontend intentionally separates major capabilities into independent pages instead of one large dashboard.

<Route path="connectors" element={<Connectors />} />
<Route path="notifications" element={<Notifications />} />
<Route path="settings" element={<Settings />} />
Enter fullscreen mode Exit fullscreen mode

On the backend, FastAPI gives each concern its own endpoint while sharing authentication and persistence.

app = FastAPI()

app.add\_middleware(
    CORSMiddleware,
    allow\_origins=\["\*"],
)
Enter fullscreen mode Exit fullscreen mode

That separation made it easier to evolve individual workflows without introducing tight coupling.
Example workflow
A typical interaction looks like this:
A connector reports an operational incident.
The incident appears in the dashboard.
The copilot retrieves related documentation.
Historical operational context is loaded through persistent memory.
The operator receives structured recommendations instead of isolated alerts.
Analytics reflects the updated operational state.
Nothing here depends on one giant controller. Each stage contributes one responsibility before handing work to the next.
Lessons learned
Workflow boundaries matter more than UI boundaries.
Persistent memory reduces duplicated reasoning.
Real-time updates simplify operator experience.
Configuration should stay outside workflow execution.
Independent modules make operational software easier to evolve.
Cascadeflow helped me think about execution as a pipeline instead of scattered callbacks. Hindsight influenced how I treated operational memory as infrastructure rather than prompt engineering. Those two ideas ended up affecting the architecture more than any individual framework choice.

Top comments (0)