문서 고도화 다음 단계를 반영해 XLSX·HTML·PPT 품질 게이트를 강화했습니다
핵심 수정사항: - ExcelSkill summary_sheet에 trend_series를 추가해 Trend Dashboard 블록을 렌더링하고, workbook quality review가 dashboard형 summary 구성을 더 정확히 평가하도록 확장했습니다. - HtmlSkill은 print=true인데 print_header/print_footer가 없는 경우 기본 print frame을 자동 생성하도록 보강했고, ArtifactQualityReviewService는 print-ready 문서의 frame/decision/evidence/cover 부족을 추가 경고로 반환합니다. - DeckPlanningService는 comparison, roadmap, executive_summary, kpi_dashboard 슬라이드의 최소 구조를 자동 보정하고, DeckQualityReviewService는 slide-level quality gate를 추가해 긴 headline, 과밀 슬라이드, 옵션 부족, 표/차트 데이터 누락을 Slide N 경고로 요약합니다. - DeckQualityReviewServiceTests, ExcelSkillDashboardSummaryTests, HtmlSkillPrintFrameTests를 확장해 회귀 검증을 강화했습니다. 검증 결과: - dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify_doc_next3\\ -p:IntermediateOutputPath=obj\\verify_doc_next3\\ : 경고 0 / 오류 0 - dotnet test src/AxCopilot.Tests/AxCopilot.Tests.csproj -c Release -v minimal --filter "DeckQualityReviewServiceTests|PptxSkillAutoRepairTests|PptxSkillConsultingDeckTests|ExcelSkillDashboardSummaryTests|ExcelSkillSummarySheetTests|HtmlSkillPrintFrameTests|HtmlSkillConsultingSectionsTests|ArtifactQualityReviewServiceTests" -p:OutputPath=bin\\verify_doc_next3_tests\\ -p:IntermediateOutputPath=obj\\verify_doc_next3_tests\\ : 통과 13
This commit is contained in:
@@ -54,4 +54,33 @@ public class DeckQualityReviewServiceTests
|
||||
review.Strengths.Should().Contain(strength => strength.Contains("Executive Summary"));
|
||||
review.Issues.Should().NotContain(issue => issue.Severity == DeckReviewSeverity.Critical);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReviewDeck_ShouldSurfaceSlideLevelQualityAlerts()
|
||||
{
|
||||
using var slides = JsonDocument.Parse(
|
||||
"""
|
||||
[
|
||||
{ "layout": "title", "title": "Growth Strategy" },
|
||||
{
|
||||
"layout": "executive_summary",
|
||||
"title": "Executive Summary",
|
||||
"headline": "This headline is intentionally very long so that it exceeds the preferred consulting slide headline length and triggers the slide quality gate.",
|
||||
"summary_points": ["Only one point"]
|
||||
},
|
||||
{
|
||||
"layout": "comparison",
|
||||
"title": "Options",
|
||||
"headline": "Compare options",
|
||||
"options": [{ "name": "A", "pros": "Fast", "cons": "Shallow", "verdict": "Only option" }]
|
||||
}
|
||||
]
|
||||
""");
|
||||
|
||||
var review = DeckQualityReviewService.ReviewDeck("Alert Deck", slides.RootElement, hasTemplate: false, autoRepairCount: 0);
|
||||
|
||||
review.Issues.Should().Contain(issue => issue.Message.Contains("Slide 2"));
|
||||
review.Issues.Should().Contain(issue => issue.Message.Contains("headline is too long"));
|
||||
review.Issues.Should().Contain(issue => issue.Message.Contains("comparison slide needs at least two options"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,9 @@ public class ExcelSkillDashboardSummaryTests
|
||||
"scorecards": [
|
||||
{ "label": "Run-rate", "value": "96%", "status": "On Track", "note": "Ahead of plan" }
|
||||
],
|
||||
"trend_series": [
|
||||
{ "label": "Revenue", "current": "120", "target": "130", "delta": "-10", "status": "Watch" }
|
||||
],
|
||||
"sheet_summaries": [
|
||||
{ "sheet": "Revenue", "status": "Watch", "summary": "SMB margin pressure", "owner": "Sales Ops" }
|
||||
],
|
||||
@@ -73,6 +76,8 @@ public class ExcelSkillDashboardSummaryTests
|
||||
texts.Should().Contain("Approve regional rollout");
|
||||
texts.Should().Contain("Scorecards");
|
||||
texts.Should().Contain("Run-rate");
|
||||
texts.Should().Contain("Trend Dashboard");
|
||||
texts.Should().Contain("-10");
|
||||
texts.Should().Contain("Revenue");
|
||||
texts.Should().Contain("SMB margin pressure");
|
||||
}
|
||||
|
||||
@@ -59,4 +59,52 @@ public class HtmlSkillPrintFrameTests
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ExecuteAsync_WithPrintEnabled_ShouldGenerateDefaultPrintFrame()
|
||||
{
|
||||
var workDir = Path.Combine(Path.GetTempPath(), "ax-html-printframe-auto-" + Guid.NewGuid().ToString("N"));
|
||||
Directory.CreateDirectory(workDir);
|
||||
|
||||
try
|
||||
{
|
||||
var tool = new HtmlSkill();
|
||||
var context = new AgentContext
|
||||
{
|
||||
WorkFolder = workDir,
|
||||
Permission = "Auto",
|
||||
OperationMode = "external",
|
||||
};
|
||||
|
||||
var args = JsonDocument.Parse(
|
||||
"""
|
||||
{
|
||||
"path": "auto-print-frame.html",
|
||||
"title": "Strategy Review",
|
||||
"print": true,
|
||||
"body": "<h2>Executive Summary</h2><p>Summary text with enough detail to qualify as a printable executive report.</p><h2>Decision</h2><p>Approve the phase-1 roadmap.</p><h2>Evidence</h2><p>Supporting evidence.</p><h2>Appendix</h2><p>Reference detail.</p>"
|
||||
}
|
||||
""").RootElement;
|
||||
|
||||
var result = await tool.ExecuteAsync(args, context, CancellationToken.None);
|
||||
|
||||
result.Success.Should().BeTrue();
|
||||
var html = File.ReadAllText(Path.Combine(workDir, "auto-print-frame.html"));
|
||||
html.Should().Contain("print-header");
|
||||
html.Should().Contain("print-footer");
|
||||
html.Should().Contain("Strategy Review");
|
||||
html.Should().Contain("AX Copilot");
|
||||
}
|
||||
finally
|
||||
{
|
||||
try
|
||||
{
|
||||
if (Directory.Exists(workDir))
|
||||
Directory.Delete(workDir, true);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user