ASP.NET Core project structure — minimal APIs vs controllers, layer
95
93%
Does it follow best practices?
Impact
100%
2.50xAverage score across 5 eval scenarios
Passed
No known issues
{
"context": "Tests whether the agent uses the minimal API pattern (Endpoints/ not Controllers/) for a small-scoped internal service. The task describes a 'lean' internal microservice with only 2 entities, which the skill teaches should use minimal APIs. The task does NOT mention minimal APIs, Endpoints folders, MapGet/MapPost, or records. The agent should choose the minimal API layout proactively based on the service's scope.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Endpoints folder used",
"description": "An Endpoints/ directory exists inside InventoryService/ containing endpoint registration files (NOT a Controllers/ directory). The task describes a 'lean internal service' which signals minimal API pattern, but does not name it.",
"max_score": 14
},
{
"name": "No Controllers folder",
"description": "There is NO Controllers/ directory in the project. The minimal API pattern uses Endpoints/ instead.",
"max_score": 10
},
{
"name": "MapGet/MapPost calls present",
"description": "At least one endpoint file contains MapGet, MapPost, MapPut, or MapDelete calls (not [HttpGet]/[HttpPost] controller attributes).",
"max_score": 12
},
{
"name": "DTOs as records",
"description": "Any DTO or response types are declared using C# 'record' keyword rather than 'class'. The agent was NOT asked to use records.",
"max_score": 10
},
{
"name": "DTO From() factory method",
"description": "At least one response DTO record defines a static From() factory method mapping from the entity type. The agent was NOT asked for factory methods.",
"max_score": 10
},
{
"name": "Services layer exists",
"description": "A Services/ directory (or at least one service class) exists, and endpoint handlers delegate to a service rather than containing inline business logic.",
"max_score": 10
},
{
"name": "IOptions for low-stock threshold",
"description": "The configurable low-stock threshold uses the IOptions<T> pattern with a typed settings class, rather than reading directly from IConfiguration in service code. The agent was NOT asked about IOptions.",
"max_score": 10
},
{
"name": "appsettings.json with config",
"description": "An appsettings.json exists with a ConnectionStrings section and the low-stock threshold setting. The connection string is read from configuration, not hardcoded.",
"max_score": 8
},
{
"name": "Health checks registered",
"description": "The application registers health checks and maps a /health endpoint. The agent was NOT asked about health checks.",
"max_score": 8
},
{
"name": "Data folder with DbContext",
"description": "A Data/ directory exists containing the DbContext class, not placed in the project root or alongside endpoints.",
"max_score": 8
}
]
}evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
skills
aspnet-project-structure
verifiers