Skip to content

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:

  1. Captures the error message and stack trace
  2. Sends them back to the LLM with the faulty code
  3. 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