Persist trader V4 P0 decision trace

This commit is contained in:
Codex
2026-06-26 22:01:25 +08:00
parent 5d210053d0
commit 6bbedda97d
17 changed files with 437 additions and 96 deletions
@@ -7,8 +7,9 @@ import com.quantai.trader.domain.*;
import com.quantai.trader.enums.PositionSide;
import com.quantai.trader.evidence.EvidenceAppender;
import com.quantai.trader.model.TraderModelService;
import com.quantai.trader.outbox.InMemoryOutboxRepository;
import com.quantai.trader.outbox.TraderOutboxRepository;
import com.quantai.trader.outbox.TraderOutboxEvent;
import com.quantai.trader.persistence.TraderDecisionTraceWriter;
import com.quantai.trader.position.TraderPositionManager;
import com.quantai.trader.risk.RiskGateInput;
import com.quantai.trader.risk.RiskLimits;
@@ -32,7 +33,8 @@ public class TraderP0CycleRunner {
private final TraderRiskGate riskGate;
private final TraderActionFactory actionFactory;
private final EvidenceAppender evidenceAppender;
private final InMemoryOutboxRepository outboxRepository;
private final TraderDecisionTraceWriter traceWriter;
private final TraderOutboxRepository outboxRepository;
public TraderP0CycleRunner(TraderProperties properties,
TraderArtifactLoader artifactLoader,
@@ -41,7 +43,8 @@ public class TraderP0CycleRunner {
TraderRiskGate riskGate,
TraderActionFactory actionFactory,
EvidenceAppender evidenceAppender,
InMemoryOutboxRepository outboxRepository) {
TraderDecisionTraceWriter traceWriter,
TraderOutboxRepository outboxRepository) {
this.properties = properties;
this.artifactLoader = artifactLoader;
this.modelService = modelService;
@@ -49,6 +52,7 @@ public class TraderP0CycleRunner {
this.riskGate = riskGate;
this.actionFactory = actionFactory;
this.evidenceAppender = evidenceAppender;
this.traceWriter = traceWriter;
this.outboxRepository = outboxRepository;
}
@@ -69,6 +73,7 @@ public class TraderP0CycleRunner {
pmInput.executionState(), snapshot, riskLimits()));
evidenceAppender.append(cycle.runId(), cycle.cycleId(), "RISK_DECISION", riskDecision.allowAction(), riskDecision.allowAction() ? "RISK_PASS" : riskDecision.blocker(), riskDecision.blocker(), Map.of());
TraderAction action = actionFactory.create(pmDecision, riskDecision, event.symbol());
traceWriter.persistCycleTrace(cycle, snapshot, modelOutput, pmInput.positionState(), pmDecision, riskDecision, action);
outboxRepository.insert(new TraderOutboxEvent("outbox_" + action.actionId(), action.runId(), action.cycleId(),
"TRADER_ACTION", action.actionId(), "ACTION_CREATED", properties.runMode().name() + "_RECORDER",
Map.of("actionType", action.actionType().name()), action.idempotencyKey(), "PENDING", Instant.now()));