refactor(dotnet): normalize history ingestion payloads
Validators (Pushes and Pull Requests) / validate-ui-and-storage (push) Successful in 17s
Validators (Pushes and Pull Requests) / validate-core (push) Has been cancelled

This commit is contained in:
2026-07-13 01:22:45 +09:00
parent 5b9f870ad6
commit a2db0bae00
2 changed files with 86 additions and 10 deletions
@@ -34,25 +34,32 @@ namespace QuantEngine.Application.Services
string? sourceVersion = null,
string? gate = null)
{
ArgumentNullException.ThrowIfNull(decision);
var normalizedInstrumentId = NormalizeOptional(instrumentId);
var normalizedSourceVersion = NormalizeOptional(sourceVersion) ?? RequireValue(decision.DecisionSource, nameof(decision.DecisionSource));
var normalizedGate = NormalizeOptional(gate) ?? (string.IsNullOrWhiteSpace(sellDecision?.Validation) ? "PASS" : sellDecision.Validation!.Trim());
var normalizedAction = RequireValue(decision.FinalAction, nameof(decision.FinalAction));
var payload = new Dictionary<string, object?>
{
["decision_id"] = Guid.NewGuid().ToString("N"),
["decided_at"] = DateTimeOffset.UtcNow,
["instrument_id"] = instrumentId ?? string.Empty,
["action"] = decision.FinalAction,
["gate"] = gate ?? (string.IsNullOrWhiteSpace(sellDecision?.Validation) ? "PASS" : sellDecision.Validation),
["instrument_id"] = normalizedInstrumentId ?? string.Empty,
["action"] = normalizedAction,
["gate"] = normalizedGate,
["score"] = decision.PriorityScore,
["source_version"] = sourceVersion ?? decision.DecisionSource,
["source_version"] = normalizedSourceVersion,
["provenance"] = new Dictionary<string, object?>
{
["final_action"] = decision.FinalAction,
["final_action"] = normalizedAction,
["action_priority"] = decision.ActionPriority,
["priority_score"] = decision.PriorityScore,
["decision_source"] = decision.DecisionSource,
["sell_action"] = sellDecision?.Action,
["sell_validation"] = sellDecision?.Validation,
["timing_action"] = timingDecision?.Action,
["timing_reason"] = timingDecision?.Reason
["sell_action"] = NormalizeOptional(sellDecision?.Action),
["sell_validation"] = NormalizeOptional(sellDecision?.Validation),
["timing_action"] = NormalizeOptional(timingDecision?.Action),
["timing_reason"] = NormalizeOptional(timingDecision?.Reason)
}
};
@@ -67,6 +74,11 @@ namespace QuantEngine.Application.Services
string? sourceVersion = null,
DateTimeOffset? observedAt = null)
{
factorId = RequireValue(factorId, nameof(factorId));
factorVersion = RequireValue(factorVersion, nameof(factorVersion));
outputGate = RequireValue(outputGate, nameof(outputGate));
sourceVersion = NormalizeOptional(sourceVersion) ?? factorVersion;
var payload = new Dictionary<string, object?>
{
["factor_output_id"] = Guid.NewGuid().ToString("N"),
@@ -75,7 +87,7 @@ namespace QuantEngine.Application.Services
["factor_version"] = factorVersion,
["output_value"] = outputValue,
["output_gate"] = outputGate,
["source_version"] = sourceVersion ?? factorVersion,
["source_version"] = sourceVersion,
["provenance"] = new Dictionary<string, object?>
{
["factor_id"] = factorId,
@@ -88,5 +100,18 @@ namespace QuantEngine.Application.Services
return _store.AppendAsync("factor_output_history", payload);
}
private static string RequireValue(string value, string parameterName)
{
if (string.IsNullOrWhiteSpace(value))
{
throw new ArgumentException("Value is required.", parameterName);
}
return value.Trim();
}
private static string? NormalizeOptional(string? value)
=> string.IsNullOrWhiteSpace(value) ? null : value.Trim();
}
}