CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl-labs/aspnet-project-structure

ASP.NET Core project structure — minimal APIs vs controllers, layer

95

2.50x
Quality

93%

Does it follow best practices?

Impact

100%

2.50x

Average score across 5 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-3/

{
  "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

tile.json