AI Unified Process for the Vaadin/jOOQ stack - migrations, implementation, tests
87
92%
Does it follow best practices?
Impact
87%
1.17xAverage score across 15 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 browserless-test (recommended), 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.mduc-coverage sub-agent and close every gap it reports — see
Coverage Check belowWhen 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)Before you report the use case as implemented, hand it to the read-only uc-coverage sub-agent
of this plugin (it may appear as aiup-vaadin-jooq:uc-coverage). It re-reads the specification and
reports which main success scenario steps, alternative flows, business rules, preconditions, and
postconditions have no code behind them — and which code has no specification behind it.
UC-001 implementation. Add "work
in progress" to check a large use case mid-way — after the data access layer, before the UI — so
it reports remaining work instead of defects.**Status:** value. Pass that suggestion on to the
user; leave the document itself alone.agents/uc-coverage.md) yourself.