AI Unified Process plugin for the Vaadin/jOOQ stack
86
91%
Does it follow best practices?
Impact
86%
1.10xAverage score across 13 eval scenarios
Low
Low-risk findings worth noting
Implement the use case $ARGUMENTS using Vaadin for the UI layer and jOOQ for data access.
Don't create tests – there are the karibu-test and playwright-test skills for that.
If the Vaadin and jOOQ MCP servers are configured, check them for guidance; otherwise rely on your own knowledge and the documentation links below.
A diff of the specification change may follow the file path in the arguments. When it is there, it is the definitive list of what changed — work through it change by change. A removed line is an instruction to delete the behaviour it described: the remaining specification is already satisfied by the existing code, so a removal is invisible unless you compare code to spec in both directions.
Before writing any code, check whether this use case is already implemented — search for the view,
repository, and DTO names the spec implies, and for existing UC-XXX references. If an
implementation exists, reconcile it with the specification instead of building a parallel one:
fetchInto(SomeDto.class) for projected queries — use Records.mapping(SomeDto::new) insteaddocs/use_cases/docs/entity_model.mdWhen a query projects columns into a DTO, Java record, or any immutable class,
map the result with org.jooq.Records.mapping(...) and a constructor reference.
Do not use fetchInto(Dto.class) — it uses reflection and is not checked
against the projection at compile time.
import org.jooq.Records;
// List
List<PersonDto> persons = ctx
.select(PERSON.ID, PERSON.FIRST_NAME, PERSON.LAST_NAME, PERSON.EMAIL)
.from(PERSON)
.fetch(Records.mapping(PersonDto::new));
// Single (optional) row
Optional<PersonDto> person = ctx
.select(PERSON.ID, PERSON.FIRST_NAME, PERSON.LAST_NAME, PERSON.EMAIL)
.from(PERSON)
.where(PERSON.ID.eq(id))
.fetchOptional(Records.mapping(PersonDto::new));
// Stream
try (Stream<PersonDto> stream = ctx
.select(PERSON.ID, PERSON.FIRST_NAME, PERSON.LAST_NAME, PERSON.EMAIL)
.from(PERSON)
.fetchStream()
.map(Records.mapping(PersonDto::new))) {
...
}The order of the projected columns must match the constructor parameter order of the target type — the compiler will enforce this.
Exception: when fetching a generated table record without projection
(ctx.selectFrom(PERSON).fetchInto(Person.class) using the generator-produced
POJO), the generated into mapper is fine.
https://mcp.vaadin.com/docs)https://jooq-mcp.martinelli.ch/mcp)https://www.javadocs.dev/mcp)