AI Unified Process - stack-agnostic core methodology (requirements, entity model, use cases)
92
95%
Does it follow best practices?
Impact
92%
1.29xAverage score across 12 eval scenarios
Low
Low-risk findings worth noting
This is a lookup, not a script. Use it after you've identified the project's stack from build files. Sections are independent — read only the ones that match the project in front of you.
pom.xml, build.gradle(.kts). Look for spring-boot-starter-*
dependencies to confirm modules in use (-web, -security, -data-jpa,
-jooq, -thymeleaf, etc.).@RestController, @Controller classes.@Route(...) or extending Component /
VerticalLayout and reachable from a router layout.@Scheduled.@KafkaListener, @RabbitListener, @JmsListener,
@EventListener.SecurityFilterChain configuration — requestMatchers(...).hasRole("X"),
.authenticated(), .permitAll().@RolesAllowed, @PreAuthorize, @Secured.UserDetailsService and any role/authority enum.@Entity classes (relationships from @OneToMany, @ManyToOne,
@OneToOne, @ManyToMany).src/main/resources/db/migration/V*.sql)
rather than annotated classes; the generated classes mirror the DDL.@NotNull, @Size, @Email,
@Min, @Max, @Pattern).@SpringBootTest, @WebMvcTest, Vaadin Browserless / Karibu view tests, Playwright tests under
src/test/. Tests named after a use case (e.g. UC001NameOfUcTest) are gold — they encode the success scenario and
alternative flows already.requirements.txt, pyproject.toml, manage.py.urls.py (URL conf), view functions and class-based views (View, ListView, CreateView, etc.),
DRF ViewSets and
APIViews, Celery tasks (@shared_task).auth app's groups and permissions (Group, Permission).LoginRequiredMixin, PermissionRequiredMixin, @login_required,
@permission_required.IsAuthenticated, custom BasePermission
subclasses).models.py files. Relationships from ForeignKey,
OneToOneField, ManyToManyField. Validation from validators=[...],
null=, blank=, unique=, choices=. Migrations under
<app>/migrations/.tests.py or tests/ directory; TestCase subclasses.@app.route(...) (Flask), @app.get/post/...
(FastAPI), Blueprint registrations, APIRouter includes.@login_required, FastAPI dependencies that resolve a user (Depends(get_current_user)),
custom decorators.Base subclasses, Pydantic models if used as the persistence layer. Migrations in Alembic
(migrations/versions/).Build files: package.json. Look for express, koa, fastify,
nestjs, next.
Entry points:
app.get/post/..., router.use(...).@Controller(...), @Get, @Post, etc.; @MessagePattern
for microservices.pages/api/* (pages router), app/**/route.ts (app router), server actions in app/**/page.tsx.Actors: middleware that sets req.user, NestJS @UseGuards(...)
with RolesGuard, NextAuth session callbacks, custom JWT middleware.
Entities:
schema.prisma is the source of truth for entities and relationships.@Entity classes with @Column, @OneToMany, etc.Model.init({...}) calls.pgTable(...) calls in schema.ts.Prisma → AI Unified Process type mapping (never copy Prisma/SQL types into the entity model — translate every column):
| Prisma type | AI Unified Process Data Type | Length/Precision | Validation Rules |
|-----------------------------------|----------------|------------------|-----------------------------------|
| Int @id @default(autoincrement()) | Long | 19 | Primary Key, Sequence |
| Int | Integer | 10 | Not Null |
| String | String | 255 (or actual) | Not Null |
| String @unique | String | 255 | Not Null, Unique |
| String? (optional) | String | 255 | Optional |
| Decimal @db.Decimal(10, 2) | Decimal | 10,2 | Not Null, Min: 0 |
| Boolean | Boolean | — | Not Null |
| DateTime @default(now()) | DateTime | — | Not Null |
| relation field userId Int | Long | 19 | Not Null, Foreign Key (USER.id) |
@db.Decimal, Decimal(10,2), Int, String?, bigint, VARCHAR and TEXT
must not appear anywhere in entity_model.md — they are implementation details, not the AI Unified Process
vocabulary. A
// "customer" or "admin" comment on a
String column maps to Not Null, Values: customer, admin.
Validation: class-validator decorators, Zod schemas, Joi schemas, Yup schemas — these are the richest source of business rules in the Node ecosystem.
An Angular SPA's "entry points" are its own routes, not just the backend API it calls. When a project pairs an Angular
frontend with a separate backend (e.g. aiup-angular-jpa's Spring Boot API), read both sides: recover actors and use
cases from the frontend routes, and confirm entities against the backend's domain/DTO shape.
angular.json, package.json (look for @angular/core,
@angular/router).app.routes.ts (a flat Routes array), or lazy-loaded route configs
(loadComponent/loadChildren) in larger apps. Each top-level route usually corresponds to one use case; a route
with nested forms/dialogs for create/edit/delete may still be one use case ("Manage X") rather than three.canActivate, canActivateChild, functional guard functions), an auth service/interceptor
if present. Standalone-components-era Angular apps often have none of these yet — don't invent actors the code doesn't
distinguish.*.model.ts files, typically colocated with the service that fetches them
(e.g. services/<entity>.ts + services/<entity>.model.ts)
rather than a separate models//dto/ folder. These mirror the backend's domain/DTO shape — prefer the backend's
entity model when both are present; the frontend types are a fallback when only the frontend is available.src/**/*.spec.ts (Angular's newer
@angular/build:unit-test builder, not the classic Jasmine/Karma default — check
angular.json's test architect target to confirm which one a given project uses), Playwright specs under
tests/e2e/ or e2e/. Tests named after a use case (e.g. UC-010-browse-product-catalog.spec.ts) or tagged
@UC-XXX are gold — they encode the success scenario and alternative flows already.config/routes.rb, controllers under
app/controllers/, ActionMailer mailers, ActiveJob jobs.before_action :authenticate_user! (Devise), Pundit policies, CanCanCan abilities, custom role columns on
users.app/models/*.rb. Relationships from has_many,
belongs_to, has_one, has_and_belongs_to_many. Validation from
validates :field, .... Schema in db/schema.rb (canonical) and
db/migrate/.http.HandleFunc, router libraries (chi, gin, echo, fiber). gRPC
services implementing generated interfaces.sqlc-generated structs (schema in query.sql /
schema.sql), GORM structs with tags, Ent schemas under
ent/schema/.Build files: *.csproj, *.sln, Program.cs. Look for package references to confirm components in use
(Microsoft.EntityFrameworkCore.*, Microsoft.AspNetCore.Components.Web, bunit, Microsoft.Playwright.Xunit,
etc.).
Entry points:
.razor files with @page "/..." directive (and optional @rendermode).app.MapGet(...), app.MapPost(...), [ApiController] classes.IHostedService or BackgroundService implementations.Actors:
[Authorize(Roles = "...")] attributes on controllers or Razor pages.<AuthorizeView Roles="..."> or <AuthorizeView Policy="..."> components in Blazor templates.AuthorizationHandler<T>, and policy registrations in Program.cs.Entities:
DbContext classes with DbSet<T> properties.[Key], [Required], [ForeignKey], [MaxLength], or configured via Fluent API
(IEntityTypeConfiguration<T> implementations or OnModelCreating).Migrations/ directory.C# → AI Unified Process type mapping:
| C# / .NET type | AI Unified Process Data Type | Length/Precision | Validation Rules |
|--------------------------------------|----------------|------------------|-----------------------------------|
| long / long? | Long | 19 | Primary Key (if ID) / Not Null|
| int / int? | Integer | 10 | Not Null |
| string | String | 255 (or actual) | Not Null |
| decimal | Decimal | 10,2 | Not Null, Min: 0 |
| bool | Boolean | — | Not Null |
| DateTime / DateTimeOffset | DateTime | — | Not Null |
| DateOnly | Date | — | Not Null |
| Foreign Key long CustomerId | Long | 19 | Not Null, Foreign Key (CUSTOMER.id) |
Tests: bUnit tests (TestContext, RenderComponent<T>), xUnit / NUnit specs, and Playwright tests
(PageTest subclasses) under *.Tests/ or *.Tests.E2E/.
When the ORM doesn't capture everything, fall back to the schema:
REFERENCES clauses give cardinality.
ON DELETE CASCADE often signals composition (the child can't exist without the parent — typically ||--o{);
ON DELETE SET NULL signals a weaker association.(id, code, label) shape often represent enumerated values; in the entity model
these can become a
Values: A, B, C validation on the parent rather than their own entity, unless they have lifecycle of their own.Don't multiply actors past what the code actually distinguishes:
hasRole(...), you have multiple actors. Name them after the role..tessl-plugin
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
skills