Decision Workflow¶
Aletheia includes Euboulia — a deliberative planning agent that turns a natural language decision problem into a solved LP/MIP optimization. You describe the problem in plain language through the Analyst Workbench chat; Euboulia extracts the mathematical structure, writes executable solver code, and runs it.
How It Works¶
Euboulia processes a decision through seven stages:
| Stage | Status | What happens |
|---|---|---|
| Analyze | analyzing | Parses the free-text description, identifies the decision type and objective |
| Extract | extracting | Pulls out parameters, decision variables, constraints, and assumptions |
| Formulate | formulating | Expresses each constraint and objective in LaTeX notation |
| Code | coding | Translates formulations into CVXPY Python code |
| Assemble | ready | Combines code into a complete, runnable solver program |
| Data | ready | Injects concrete values into the assembled program |
| Execute | solved | Runs the solver and captures the result |
The pipeline is driven by an LLM at each stage and validated structurally before proceeding. Errors trigger an automatic debug loop that patches and retries.
Starting a Decision¶
Open the Analyst Workbench chat and describe your problem as you would to a colleague:
"I need to allocate a $500K budget across five projects to maximize expected ROI. Each project requires a minimum spend of $20K and I can't exceed 40% on any single project."
Euboulia creates a Decision Brief and works through the pipeline autonomously. You can watch progress in the Decisions panel on the right side of the workbench.
Trigger phrase
The chat agent routes to Euboulia when it detects decision intent. Phrases like "allocate", "schedule", "assign", "optimize", or "maximize/minimize" reliably trigger it. You can also say "create a decision plan for…" explicitly.
Reviewing the Brief¶
Once the extracting stage completes, the Decision Brief shows:
- Parameters — named constants drawn from your description (e.g.,
budget,min_spend) - Variables — what the solver will decide (e.g.,
allocation[i]for each project) - Constraints — hard limits, soft limits, and regulatory constraints with their sources
- Objective — the function to maximize or minimize, with its formulation
- Assumptions — anything Euboulia inferred that wasn't explicit in your description
Review the assumptions carefully. Each assumption shows an impact statement explaining how it affects the solution. If an assumption is wrong, correct it in chat:
"The 40% cap applies only to external vendors, not internal teams."
Euboulia updates the brief and re-formulates.
Providing Data¶
After the ready state, Euboulia may ask for concrete values. Provide them in chat:
"The expected ROI for each project is: Alpha 18%, Beta 12%, Gamma 25%, Delta 9%, Epsilon 15%."
If you are connected to a knowledge graph, Euboulia will attempt to pull parameter values from graph entities automatically (see KG-Enhanced Mode below).
Running the Solver¶
Once all data is available, Euboulia executes the solver automatically. You can also trigger execution explicitly:
"Run the solver."
The solver uses CVXPY with the CLARABEL backend for continuous problems and GLPK_MI for integer/binary programs.
Interpreting Results¶
Results appear in the Decision Brief panel under Result:
| Status | Meaning |
|---|---|
optimal | The solver found the globally optimal solution |
feasible | A valid solution was found, but optimality is not guaranteed (MIP solvers) |
infeasible | No solution satisfies all constraints simultaneously |
unbounded | The objective can improve without limit — a constraint is likely missing |
timeout | Solver exceeded the time limit; partial results may be available |
error | Code execution failed — the debug loop will attempt a fix |
Optimal and feasible results show the objective value and the value of each decision variable.
For infeasible results, check whether your constraints contradict each other. Ask Euboulia:
"Why is this infeasible?"
It will identify the conflicting constraints and suggest relaxations.
For unbounded results, a constraint is missing or a variable has no upper bound. Review the variables and constraints in the brief.
KG-Enhanced Mode¶
When the Workbench is connected to one or more knowledge graphs through MCP connectors, Euboulia can enrich the decision with graph data:
- Parameter values are retrieved from entities matching the parameter definitions
- Constraints derived from graph relationships (capacity, regulation, dependency) are added automatically with source
graph - The KG Context section of the brief shows which connectors were queried and how many entities contributed
KG enhancement runs during the extracting stage. The analyst can override any graph-derived value by providing it explicitly in chat.
Debug Loop¶
If the generated solver code raises an exception at runtime, Euboulia enters an automatic debug loop:
- Captures the error message and stack trace
- Sends them back to the LLM with the faulty code
- Receives a patched version and re-executes
The loop retries up to three times. If all retries fail, the brief enters error status and the last error message is shown. You can ask Euboulia to retry after providing clarification:
"The variable 'allocation' should be non-negative."
Decision History¶
Every decision session is persisted in SQLite and in its own FalkorDB graph (decision_<id>). From the workbench:
- The Decisions panel lists all past decisions with their status and objective value
- Clicking a past decision restores the full brief, including parameters, constraints, and result
- The FalkorDB graph stores a PROV-O audit trail of each execution activity
Learn More¶
- Web UI — Analyst Workbench features and keyboard shortcuts
- Running Investigations — How Phronesis and Euboulia share the workbench
- MCP Connectors — Connecting knowledge graphs for KG-enhanced mode