Problem
Unbounded loops are easy to describe and hard to trust.
The model can produce text forever. That does not mean the workflow should. I wanted a layer that decides when a task advances, stops, or gets kicked to review.
deterministic-agent-orchestrator turns vague “agent” claims into bounded steps, approval pause, retries, and a dead-letter path. The system is only useful if a human can still inspect the state.
Multi-step AI work gets brittle fast. Small failures compound when there is no contract, no budget, and no visible stop point.
Problem
The model can produce text forever. That does not mean the workflow should. I wanted a layer that decides when a task advances, stops, or gets kicked to review.
System response
Workflow state, approval requirements, retry limits, and blocked responses are first-class parts of the engine, not comments in a README.
The useful shape is bounded workflow in front of the model, not the model in charge of the workflow.
The engine matters because it leaves behind something you can actually reason about.
{
"task_id": "demo-021",
"state": "AWAITING_APPROVAL",
"requires_approval": true,
"attempt": 1,
"worker": "fortress_generate"
}
{
"task_id": "demo-022",
"state": "DEAD_LETTER",
"reason": "Fortress policy block",
"next_action": "operator review"
}
Next surface
Open the demo page if you want the visual lane, example artifacts, and the more tactile side of the execution path.