Request Lifecycle (IDE Debug Mode)
This page is the runtime control-flow view for one turn. Think of it as stepping through breakpoints from API entry to final persistence.
Canonical step inventory (latest)
1LoadOrCreateConversationStep
2ResetConversationStep
3PersistConversationBootstrapStep
4AuditUserInputStep
5PolicyEnforcementStep
6IntentResolutionStep
7ResetResolvedIntentStep
8FallbackIntentStateStep
9AddContainerDataStep
10McpToolStep
11SchemaExtractionStep
12AutoAdvanceStep
13RulesStep
14ResponseResolutionStep
15PersistConversationStep
16PipelineEndGuardStep
Graph below is the common path
The visual flow highlights the common deterministic runtime path. Conditional/system steps from the list above still execute when their prerequisites are met.
Request Turn Execution Graph
Click any node in tree or graph to inspect method-level detail, session snapshots, and table touch points.
- Controller -> Engine
- DAG + Step Wrapper
- Step Hook Interception
ConversationController.message
package: com.github.salilvnair.convengine.api.controllerfile: src/main/java/com/github/salilvnair/convengine/api/controller/ConversationController.java
JAVA
EngineContext engineContext = EngineContext.builder()
.conversationId(conversationId.toString())
.userText(request.getMessage())
.inputParams(inputParams)
.build();
EngineResult result = engine.process(engineContext);
DefaultConversationalEngine.process
package: com.github.salilvnair.convengine.engine.providerfile: src/main/java/com/github/salilvnair/convengine/engine/provider/DefaultConversationalEngine.java
JAVA
EngineSession session = sessionFactory.open(engineContext);
session.setConversationHistory(historyProvider.lastTurns(session.getConversationId(), 10));
EnginePipeline pipeline = pipelineFactory.create();
return pipeline.execute(session);
EnginePipelineFactory.orderByDag + wrapWithTiming
package: com.github.salilvnair.convengine.engine.factoryfile: src/main/java/com/github/salilvnair/convengine/engine/factory/EnginePipelineFactory.java
JAVA
@PostConstruct
public void init() {
List<EngineStep> ordered = orderByDag(discoveredSteps);
this.pipeline = new EnginePipeline(wrapWithTiming(ordered));
}
// orderByDag uses @MustRunAfter, @MustRunBefore, @RequiresConversationPersisted
// wrapWithTiming adds STEP_ENTER / STEP_EXIT / STEP_ERROR audits + hook callbacks
EnginePipeline.execute
package: com.github.salilvnair.convengine.engine.pipelinefile: src/main/java/com/github/salilvnair/convengine/engine/pipeline/EnginePipeline.java
JAVA
for (EngineStep step : steps) {
StepResult r = step.execute(session);
if (r instanceof StepResult.Stop(EngineResult result)) {
return result;
}
}
return session.getFinalResult();
EngineStepHook typed step matching
package: com.github.salilvnair.convengine.engine.hookfile: src/main/java/com/github/salilvnair/convengine/engine/hook/EngineStepHook.java
JAVA
public interface EngineStepHook {
default boolean supports(EngineStep.Name stepName, EngineSession session) { return true; }
default void beforeStep(EngineStep.Name stepName, EngineSession session) {}
default void afterStep(EngineStep.Name stepName, EngineSession session, StepResult result) {}
default void onStepError(EngineStep.Name stepName, EngineSession session, Throwable error) {}
}
Consumer hook example
package: com.zapper.convengine.hooks
JAVA
@Component
public class MyHook implements EngineStepHook {
@Override
public boolean supports(EngineStep.Name stepName, EngineSession session) {
return EngineStep.Name.SchemaExtractionStep == stepName;
}
@Override
public void beforeStep(EngineStep.Name stepName, EngineSession session) {
session.putInputParam("consumer_hint", "compact");
}
}
Table Touch Matrix
Per-turn table access
| Table | Read Path | Write Path |
|---|---|---|
| ce_conversation | LoadOrCreateConversationStep | PersistConversationStep / reset steps |
| ce_intent | IntentResolutionStep | - |
| ce_intent_classifier | IntentResolutionStep | - |
| ce_output_schema | SchemaExtractionStep | - |
| ce_prompt_template | SchemaExtractionStep / ResponseResolutionStep | - |
| ce_rule | RulesStep | - |
| ce_response | ResponseResolutionStep | - |
| ce_config | intent/reset/mcp/sql-agent config lookup | - |
| ce_audit | - | all stage audits via DbAuditService |
How to read this page
Start at IntentResolutionStep, then click SchemaExtractionStep and RulesStep in the tree. That path explains most multi-turn behavior differences.