Merge pull request 'fix: restore clock and validation contracts' (#5) from agent/restore-clock-contract-build into main
ci / static (push) Has been cancelled
ci / backend (push) Has been cancelled
ci / frontend (push) Has been cancelled
ci / publish (push) Has been cancelled
Build & Test with Secrets / frontend (push) Has been cancelled
Build & Test with Secrets / security-scan (push) Has been cancelled
Build & Test with Secrets / notification (push) Has been cancelled
deploy / notify (push) Successful in 1s
Build & Test with Secrets / build (push) Has been cancelled
deploy / deploy (push) Successful in 1m1s
ci / static (push) Has been cancelled
ci / backend (push) Has been cancelled
ci / frontend (push) Has been cancelled
ci / publish (push) Has been cancelled
Build & Test with Secrets / frontend (push) Has been cancelled
Build & Test with Secrets / security-scan (push) Has been cancelled
Build & Test with Secrets / notification (push) Has been cancelled
deploy / notify (push) Successful in 1s
Build & Test with Secrets / build (push) Has been cancelled
deploy / deploy (push) Successful in 1m1s
This commit was merged in pull request #5.
This commit is contained in:
@@ -208,11 +208,11 @@ public class DashboardService : IDashboardService
|
|||||||
a.Message)).ToList(),
|
a.Message)).ToList(),
|
||||||
HealthScore = healthScore,
|
HealthScore = healthScore,
|
||||||
RiskInsights = riskInsights,
|
RiskInsights = riskInsights,
|
||||||
LastUpdate = _clock.UtcNow.DateTime,
|
LastUpdate = _clock.UtcNow.UtcDateTime,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Cache result
|
// Cache result
|
||||||
_cache[portfolioId] = (_clock.UtcNow, response);
|
_cache[portfolioId] = (_clock.UtcNow.UtcDateTime, response);
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,11 +143,13 @@ builder.Services.AddScoped<KArtSell.Host.Features.MarketData.IMarketDataIngestio
|
|||||||
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IPortfolioRebalanceService>(sp =>
|
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IPortfolioRebalanceService>(sp =>
|
||||||
new KArtSell.Host.Features.Portfolio.PortfolioRebalanceService(
|
new KArtSell.Host.Features.Portfolio.PortfolioRebalanceService(
|
||||||
sp.GetRequiredService<NpgsqlDataSource>(),
|
sp.GetRequiredService<NpgsqlDataSource>(),
|
||||||
sp.GetRequiredService<IBackgroundJobClient>()));
|
sp.GetRequiredService<IBackgroundJobClient>(),
|
||||||
|
sp.GetRequiredService<IClock>()));
|
||||||
|
|
||||||
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IRiskMetricsService>(sp =>
|
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IRiskMetricsService>(sp =>
|
||||||
new KArtSell.Host.Features.Portfolio.RiskMetricsService(
|
new KArtSell.Host.Features.Portfolio.RiskMetricsService(
|
||||||
sp.GetRequiredService<NpgsqlDataSource>()));
|
sp.GetRequiredService<NpgsqlDataSource>(),
|
||||||
|
sp.GetRequiredService<IClock>()));
|
||||||
|
|
||||||
// Risk & Stress (VS-06~07)
|
// Risk & Stress (VS-06~07)
|
||||||
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IStressTestService>(sp =>
|
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IStressTestService>(sp =>
|
||||||
@@ -162,7 +164,8 @@ builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IAlertService>(sp =>
|
|||||||
// Dashboard (VS-08)
|
// Dashboard (VS-08)
|
||||||
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IDashboardService>(sp =>
|
builder.Services.AddScoped<KArtSell.Host.Features.Portfolio.IDashboardService>(sp =>
|
||||||
new KArtSell.Host.Features.Portfolio.DashboardService(
|
new KArtSell.Host.Features.Portfolio.DashboardService(
|
||||||
sp.GetRequiredService<NpgsqlDataSource>()));
|
sp.GetRequiredService<NpgsqlDataSource>(),
|
||||||
|
sp.GetRequiredService<IClock>()));
|
||||||
|
|
||||||
// Security Master (VS-02) - Temporarily disabled: ISecurityMasterRulesStore implementation pending
|
// Security Master (VS-02) - Temporarily disabled: ISecurityMasterRulesStore implementation pending
|
||||||
// builder.Services.AddScoped<KArtSell.Host.Features.SecurityMaster.ISecurityMasterSyncHandler>(sp =>
|
// builder.Services.AddScoped<KArtSell.Host.Features.SecurityMaster.ISecurityMasterSyncHandler>(sp =>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ namespace KArtSell.Modules.ModelOperations.Domain;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// VS-08 DOMAIN: Dashboard aggregation policy
|
/// VS-08 DOMAIN: Dashboard aggregation policy
|
||||||
/// Pure business logic for combining portfolio, risk metrics, stress, alerts into unified snapshot
|
/// Pure business logic for combining portfolio, risk metrics, stress, alerts into unified snapshot
|
||||||
/// No I/O, no DateTime.Now (all times injected)
|
/// No I/O; time-dependent values are supplied by callers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
||||||
// Note: This policy combines results from VS-04~07 components
|
// Note: This policy combines results from VS-04~07 components
|
||||||
|
|||||||
+2
-2
@@ -25,7 +25,7 @@ public sealed class MarketDataIngestionUnitTests
|
|||||||
Guid.NewGuid(), "AAPL", DateOnly.FromDateTime(DateTime.UtcNow),
|
Guid.NewGuid(), "AAPL", DateOnly.FromDateTime(DateTime.UtcNow),
|
||||||
100m, 102m, 99m, 101m, 1_000_000, DateTime.UtcNow, 1, "KRX", Guid.NewGuid().ToString());
|
100m, 102m, 99m, 101m, 1_000_000, DateTime.UtcNow, 1, "KRX", Guid.NewGuid().ToString());
|
||||||
|
|
||||||
var result = MarketDataPolicy.ValidatePrice(price);
|
var result = MarketDataPolicy.ValidatePrice(price, DateOnly.FromDateTime(DateTime.UtcNow));
|
||||||
|
|
||||||
Assert.True(result.IsValid);
|
Assert.True(result.IsValid);
|
||||||
Assert.Empty(result.Errors);
|
Assert.Empty(result.Errors);
|
||||||
@@ -38,7 +38,7 @@ public sealed class MarketDataIngestionUnitTests
|
|||||||
Guid.NewGuid(), "AAPL", DateOnly.FromDateTime(DateTime.UtcNow),
|
Guid.NewGuid(), "AAPL", DateOnly.FromDateTime(DateTime.UtcNow),
|
||||||
-100m, 110m, 90m, 105m, 1_000_000, DateTime.UtcNow, 1, "KRX", Guid.NewGuid().ToString());
|
-100m, 110m, 90m, 105m, 1_000_000, DateTime.UtcNow, 1, "KRX", Guid.NewGuid().ToString());
|
||||||
|
|
||||||
var result = MarketDataPolicy.ValidatePrice(price);
|
var result = MarketDataPolicy.ValidatePrice(price, DateOnly.FromDateTime(DateTime.UtcNow));
|
||||||
|
|
||||||
Assert.False(result.IsValid);
|
Assert.False(result.IsValid);
|
||||||
Assert.NotEmpty(result.Errors);
|
Assert.NotEmpty(result.Errors);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public class VS03_MarketDataPolicyTests
|
|||||||
DataSource: "KRX",
|
DataSource: "KRX",
|
||||||
CorrelationId: "test-123");
|
CorrelationId: "test-123");
|
||||||
|
|
||||||
var result = MarketDataPolicy.ValidatePrice(price);
|
var result = MarketDataPolicy.ValidatePrice(price, DateOnly.FromDateTime(DateTime.UtcNow));
|
||||||
|
|
||||||
Assert.True(result.IsValid);
|
Assert.True(result.IsValid);
|
||||||
Assert.Empty(result.Errors);
|
Assert.Empty(result.Errors);
|
||||||
@@ -46,7 +46,7 @@ public class VS03_MarketDataPolicyTests
|
|||||||
DataSource: "KRX",
|
DataSource: "KRX",
|
||||||
CorrelationId: "test-123");
|
CorrelationId: "test-123");
|
||||||
|
|
||||||
var result = MarketDataPolicy.ValidatePrice(price);
|
var result = MarketDataPolicy.ValidatePrice(price, DateOnly.FromDateTime(DateTime.UtcNow));
|
||||||
|
|
||||||
Assert.False(result.IsValid);
|
Assert.False(result.IsValid);
|
||||||
Assert.Contains("Open price must be > 0", result.Errors);
|
Assert.Contains("Open price must be > 0", result.Errors);
|
||||||
@@ -69,7 +69,7 @@ public class VS03_MarketDataPolicyTests
|
|||||||
DataSource: "KRX",
|
DataSource: "KRX",
|
||||||
CorrelationId: "test-123");
|
CorrelationId: "test-123");
|
||||||
|
|
||||||
var result = MarketDataPolicy.ValidatePrice(price);
|
var result = MarketDataPolicy.ValidatePrice(price, DateOnly.FromDateTime(DateTime.UtcNow));
|
||||||
|
|
||||||
Assert.False(result.IsValid);
|
Assert.False(result.IsValid);
|
||||||
Assert.Contains("High must be >= Low", result.Errors);
|
Assert.Contains("High must be >= Low", result.Errors);
|
||||||
@@ -92,7 +92,7 @@ public class VS03_MarketDataPolicyTests
|
|||||||
DataSource: "KRX",
|
DataSource: "KRX",
|
||||||
CorrelationId: "test-123");
|
CorrelationId: "test-123");
|
||||||
|
|
||||||
var result = MarketDataPolicy.ValidatePrice(price);
|
var result = MarketDataPolicy.ValidatePrice(price, DateOnly.FromDateTime(DateTime.UtcNow));
|
||||||
|
|
||||||
Assert.False(result.IsValid);
|
Assert.False(result.IsValid);
|
||||||
Assert.Contains("cannot be in the future", result.Errors[0]);
|
Assert.Contains("cannot be in the future", result.Errors[0]);
|
||||||
@@ -115,7 +115,7 @@ public class VS03_MarketDataPolicyTests
|
|||||||
DataSource: "KRX",
|
DataSource: "KRX",
|
||||||
CorrelationId: "test-123");
|
CorrelationId: "test-123");
|
||||||
|
|
||||||
var result = MarketDataPolicy.ValidatePrice(price);
|
var result = MarketDataPolicy.ValidatePrice(price, DateOnly.FromDateTime(DateTime.UtcNow));
|
||||||
|
|
||||||
Assert.True(result.IsValid);
|
Assert.True(result.IsValid);
|
||||||
Assert.True(result.QualityScore < 80); // Quality degraded but still valid
|
Assert.True(result.QualityScore < 80); // Quality degraded but still valid
|
||||||
|
|||||||
Reference in New Issue
Block a user