Juan Antonio Breña Moral
Leandro Loureiro
|
Juan Antonio Breña Moral Engineering @ IG Group, EU Division
Twitter | GitHub | LinkedIn |
|
|
"Make it work, make it right, make it fast." - Kent Beck "Lead me, follow me, or get out of my way.", "Pressure makes diamonds." - George S. Patton Jr. |
|
|
Leandro Loureiro Engineering Manager @ ING
GitHub | LinkedIn |
|
|
I'm from Portugal, living in Amsterdam Spent most of my career as a Software Engineer in Financial Services Engineering Manager for the last 4 years Passionate about travel and DIY electronics |
|
Source: Leavitt's Alignment Model (1965) >> People, Process and Technology Framework
Train Specialized LLMs
Fine-tuning, LoRA/QLoRA, Distillation, ...
Automate stable processes using AI Agents
Spring AI, LangChain4j, Embabel, ...
Software Engineering enhanced with AI
SDD, Java Skills, MCP-Servers, Knowledge bases, ...
The usage of AI in software engineering is changing the way we work, but that change brings new challenges to address.
Design the context
Define boundaries
contracts
and owners
Discover and connect context
Trace dependencies
document decisions
and close gaps
Recover and validate context
Read behavior
data and incidents
then test assumptions
Plinth is an AI-native engineering toolkit for modern Java enterprise SDLC.
It started as Cursor rules for Java and evolved into reusable agent skills, agents and commands that guide AI assistants through the whole SDLC.
2 years of work and iteration, and its skills are popular on Skills.sh.
This workshop succeeds if, by the end, you understand the concepts behind implementing features with harness engineering.
Whether or not you use Plinth later, you leave with a solid starting point.
Project scope:
/onboarding/update-issue → /explore-problem →
/create-acceptance-criteria/create-spec → /explore-design/implement-spec → /close-spec141-java-refactoring-with-modern-features142-java-functional-programming143-java-functional-exception-handling121-java-object-oriented-design122-java-type-design123-java-design-patterns
126-java-exception-handling128-java-generics124-java-secure-coding
Read the following articles about Plinth benchmarks:
In this exercise, you will learn how to use the Plinth framework to develop AI-native Java applications.
Install every skill for your preferred agent. Execute the command in a terminal:
npx skills add jabrena/plinth --skill '*' --agent cursor -y
npx skills add jabrena/plinth --skill '*' --agent claude-code -y
npx skills add jabrena/plinth --skill '*' --agent codex -y
Install every command for your prefered agent. Execute the command in your prefered agent:
install @004-commands-installation cursor
install @004-commands-installation claude-code
install @004-commands-installation codex
Install every agent for your prefered agent. Execute the command in your prefered agent:
install @005-agents-installation cursor
install @005-agents-installation claude-code
install @005-agents-installation codex
Demo: Install Plinth in your repository
Once the installation finishes, your repository is ready to run the AI-native workflow and deliver any feature of a Java Enterprise project.
/onboarding/update-issue → /explore-problem →
/create-acceptance-criteria/create-spec → /explore-design/implement-spec → /close-spec/onboarding
Makes the repository ready to work with Plinth AI native workflow
by securing two prerequisites:
AGENTS.md
* Only needs to be done once per repository / project.
Demo: Prepare your repository for use AGENTS.md & OpenSpec
Source: https://learn.microsoft.com/en-us/azure/devops/boards/backlogs/define-features-epics?view=azure-devops&tabs=agile-process
Two artifacts, two questions, two audiences
/update-issue
/explore-problem
/create-acceptance-criteria
AI makes implementation 10× faster.
Understanding intent, constraints, and consequences still runs at 1×.

Source: https://www.imdb.com/es-es/title/tt0092086/
The Three Amigos is an Agile practice where three perspectives review an increment of work before, during, and after development: Business, Development & Testing.
/update-issue
Rewrites an existing issue description as structured,
evidence-backed content
/explore-problem
Evaluates the issue through five lenses and produces a Functional Specification
/create-acceptance-criteria
Turns the Functional Specification into observable Gherkin scenarios
/explore-problem
turns what and why into something checkable and easier to review
Demo: Define functional specifications
HITL: Verify functional specification before moving to technical specification
/create-spec
/explore-design
A lightweight and configurable framework for creating and managing software specifications.
Build the right thing, and build it right
Capture what you want to build in a spec, and keep your team and your coding agents aligned as the work evolves.
/create-spec
Turns approved material into a validated OpenSpec change
/explore-design
Refine the technical design of an issue or OpenSpec change before implementation.
Demo: Define functional specifications
HITL: Verify technical specification before moving to implementation
/implement-spec
/close-spec
/implement-spec
Delivers an approved task list through framework-aware delegation
/implement-specThe tech lead agent runs the process, but it never writes code itself
/implement-specThe tech lead delegates the work to specialized coding agents
/close-spec
Archives a delivered OpenSpec change and folds it into the specs
Demo: Define functional specifications
HITL: Verify that implementation has any gap or something missing before commiting
Implement and improve Java applications with guidance on:
125 Skills
141-java-refactoring-with-modern-features |
Add Modern Java Features |
Lambdas & method references · Stream API · Optional · java.time · var · List.of() · text blocks · Java 25 features |
|
142-java-functional-programming |
Add Functional Programming style |
| Records & immutability · pure functions · function composition · pattern matching · sealed types · Stream Gatherers | |
143-java-functional-exception-handling |
Apply functional programming approaches for error handling |
Optional & VAVR Either over exceptions · sealed error hierarchies · map/flatMap error pipelines |
|
| Separate data from behavior with records · immutable data & pure transformations · flat data with ID references · pure validation | |
121-java-object-oriented-design |
Apply Object Oriented Design principles |
| SOLID · DRY · YAGNI · composition over inheritance · encapsulation · code smells: God Class, Feature Envy, Data Clumps | |
122-java-type-design |
Review Type Design in development |
Value objects over primitive obsession · type-safe wrappers · generics · fluent interfaces · BigDecimal for money |
|
123-java-design-patterns |
Select and apply Java, REST, event-driven, persistence, and integration patterns |
| Creational, structural & behavioral patterns · REST contracts · Kafka outbox & sagas · repositories & transactions · anti-corruption layers | |
126-java-exception-handling |
Add Exception handling |
| Specific exception types · try-with-resources · exception chaining · fail-fast validation · translation at API boundaries · retries & timeouts | |
128-java-generics |
Apply generics in a class |
No raw types · PECS wildcards · bounded type parameters · generic methods · type erasure · @SafeVarargs · generics with records & sealed types |
|
124-java-secure-coding |
Review my code for Secure Java Coding rules |
| Input validation · parameterized queries · least privilege · strong cryptography · secrets management · safe deserialization · output encoding | |
033-architecture-diagrams |
Generate UML, C4, ER and bounded-context diagrams |
| UML sequence, class, state-machine & deployment diagrams · C4 model · ER diagrams · bounded contexts · modular step-based process | |
030-architecture-adr-general |
Generate Architecture Decision Records (ADRs) |
| Interactive, one question at a time · context, stakeholders, options & outcomes · auto-numbered ADR files | |
110-java-maven-best-practices |
Analyze your pom.xml and apply Maven best practices |
| Dependency management with BOMs · version centralization · plugin configuration · multi-module structure · build profiles | |
111-java-maven-dependencies |
Add Maven dependencies for improved code quality |
| JSpecify nullness · Error Prone + NullAway · VAVR · ArchUnit · JavaMoney · only what you actually need | |
112-java-maven-plugins |
Update your pom.xml with Maven Plugins |
| Enforcer · Surefire & Failsafe · JaCoCo · PIT · SpotBugs & PMD · OWASP · Spotless · Versions · Jib · JMH | |
130-java-testing-strategies |
Apply testing strategies |
| RIGHT-BICEP to guide test creation · A-TRIP for test quality · CORRECT for boundary conditions | |
131-java-testing-unit-testing |
Apply Unit Testing best practices |
| JUnit 5 · AssertJ · Mockito · Given-When-Then · parameterized tests · test independence · no reflection or shared mutable state | |
132-java-testing-integration-testing |
Set up integration test infrastructure with WireMock |
BaseIntegrationTest · WireMock JSON mappings · stubs isolated per test · verified HTTP interactions · no mocked HTTP clients |
|
133-java-testing-acceptance-tests |
Implement acceptance tests from Gherkin scenarios |
@acceptance scenarios · RestAssured · DB/Kafka fixtures · WireMock for external REST · *AT classes run by Failsafe |
|
151-java-performance-jmeter |
Run a performance test with JMeter |
run-jmeter.sh script · load tests with loops, threads & ramp-up · test plans generated from your REST endpoints |
|
152-java-performance-gatling |
Set up Gatling performance testing |
Gatling dependencies & Maven plugin · Java simulations · gatling:test · assertions & feeders · report review |
|
161-java-profiling-detect |
Profile your application at runtime and collect evidence |
| async-profiler · CPU, memory, threading, GC & I/O · JFR recordings · flamegraphs · interactive profiling scripts | |
162-java-profiling-analyze |
Analyze the evidence and generate reports |
| Flamegraphs · CPU hotspots · allocation patterns · threading issues · problem categorization · Impact/Effort prioritization | |
163-java-profiling-refactor |
Refactor code to fix the bottlenecks found |
Targeted changes for CPU, memory & threading issues from the analysis reports · verified with ./mvnw clean verify |
|
164-java-profiling-verify |
Compare results before and after the changes |
| Baseline validation · before/after metrics · side-by-side flamegraphs · regression detection · final results report | |
181-java-observability-logging |
Apply logging guidelines |
| SLF4J with Logback/Log4j2 · proper log levels · parameterized logging · correlation context · no sensitive data in logs | |
182-java-observability-metrics-micrometer |
Apply Micrometer metrics best practices |
| Timers, counters, gauges & distribution summaries · naming & tag conventions · cardinality control · Actuator/Prometheus | |
183-java-observability-tracing-opentelemetry |
Apply OpenTelemetry distributed tracing |
| Span modeling · context propagation · semantic conventions · sampling strategy · privacy-safe attributes · OTLP collectors | |
Demo: Refactor the solution using a specific Skill
HITL: Verify that implementation has any gap or something missing before commiting
In this exercise, you will learn how to use the Plinth framework to develop AI-native Java applications.
AI speeds up delivery;
specs, verification and human checkpoints keep it on track
Thanks