~/dev/devtalks-2026 · java -jar turning-java-ai-ready.jar title · 01
OpenJDK Runtime Environment Temurin-25+36 (build 25+36-LTS)
OpenJDK 64-Bit Server VM (mixed mode, sharing)
2026-06-03 14:35:00.001 INFO c.m.devtalks.Talk Starting Talk using Java 25 on stage:java
2026-06-03 14:35:00.018 INFO c.m.d.boot.ReactorLoader Discovered 7 acts on classpath
2026-06-03 14:35:00.042 INFO c.m.devtalks.Talk No active profile set, falling back to default: "live"
DevTalks Java Stage 03 June 2026 · 14:35 — 15:20 · Bucharest

Turning Your Java Project Into an AI-Ready Codebase.

2026-06-03 14:35:00.118 INFO c.m.devtalks.Talk speaker Marc Nuri @ Red Hat — Sr. Principal SWE · Developer Tools
2026-06-03 14:35:00.119 INFO c.m.devtalks.Talk event DevTalks Romania 2026 · Java Stage
2026-06-03 14:35:00.122 INFO c.m.devtalks.Talk Started Talk in 0.122 seconds · ready in PT45M
$
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · devtalks-act-01-context/pom.xml act 01 / 07
$ mvn -pl :devtalks-act-01-context -am verify
[INFO]Scanning for projects...
[INFO]────────< com.marcnuri.devtalks:devtalks-act-01-context >────────
[INFO] Building devtalks-act-01-context 1.0.0-SNAPSHOT [1/7]
Act I · @Act(1) · public class Context

Context — why I care about this.

[INFO]Reactor Build Order:
[INFO] 
[INFO] devtalks-act-01-context ....... BUILDING ...
[INFO] · devtalks-act-02-unit-of-productivity .... PENDING
[INFO] · devtalks-act-03-the-catch ..... PENDING
[INFO] · devtalks-act-04-teach-agents .... PENDING
[INFO] · devtalks-act-05-codebase-feedback .... PENDING
[INFO] · devtalks-act-06-role-shift .... PENDING
[INFO] · devtalks-act-07-close ......... PENDING
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · about/DayJob.java act 01 · about/day_job · 02
// portrait_01 calm
// whoami · day_job

Marc Nuri

senior_principal_software_engineer @ red_hat  ·  developer_tools
// open-source I maintain @ work
kubernetes-mcp-server
github.com/containers/kubernetes-mcp-server
Go ____
fabric8 kubernetes-client
github.com/fabric8io/kubernetes-client
Java ____
Eclipse JKube
github.com/eclipse-jkube/jkube
Java ____
@manusa
@marcnuri.com
@MarcNuri
/in/marcnuri
marc nuri | red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · about/AfterHours.java act 01 · about/after_hours · 02
// portrait_02 …and a bit unhinged.
// whoami · after_hours

…and on the side.

probably-unhealthy_obsession_with_software  ·  weekends & evenings
// side quests · open-source on my own time
helm-java
manusa/helm-java
Java ___
actions-setup-minikube
manusa/actions-setup-minikube
JavaScript ___
ai-beacon
manusa/ai-beacon
Go JS
electronim
manusa/electronim
JavaScript ___
YAKD
manusa/yakd
Java ___
podman-mcp-server
manusa/podman-mcp-server
Go ___
Full Stack Quarkus and React
Packt · 2022
blog.marcnuri.com // posts on Java, Kubernetes & dev tools
marc nuri | red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · FieldNotes.java act 01 · field-notes · 03
// whoami · field_notes

Field notes,
not doctrine.

These patterns come from maintaining several Java and open source projects with AI-assisted workflows.

They worked in my context. Your codebase, team, and constraints may differ.

Real projects Specific context Adapt, don’t copy
marc nuri | red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · devtalks-act-02-unit-of-productivity/pom.xml act 02 / 07
$ mvn -pl :devtalks-act-02-unit-of-productivity -am verify
[INFO]Scanning for projects...
[INFO]──< com.marcnuri.devtalks:devtalks-act-02-unit-of-productivity >──
[INFO] Building devtalks-act-02-unit-of-productivity 1.0.0-SNAPSHOT [2/7]
Act II · @Act(2) · public class UnitOfProductivity

AI changes the unit of dev productivity.

[INFO]Reactor Build Order:
[INFO] 
[INFO] devtalks-act-01-context ....... SUCCESS [04:12]
[INFO] devtalks-act-02-unit-of-productivity .... BUILDING ...
[INFO] · devtalks-act-03-the-catch ..... PENDING
[INFO] · devtalks-act-04-teach-agents .... PENDING
[INFO] · devtalks-act-05-codebase-feedback .... PENDING
[INFO] · devtalks-act-06-role-shift .... PENDING
[INFO] · devtalks-act-07-close ......... PENDING
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · OldWorld.java act 02 · sequential · 04
The Old World · 10 months ago

One developer, one task at a time.

Synchronous · sequential · always on the implementation path
·
08:00
09:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
Yousolo dev
Email
Standup
Implement feature #42
Review PRs
Expenses & chores
Fix bug #18 + tests
1-1
Implement #42 (cont.)
Agent 1
Agent 2
Agent 3
Agent 4
Agent 5
Agent 6
»One task at a time. You're always on the implementation path.
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · NewWorld.java act 02 · parallel · 05
The New World · today

You orchestrate. Agents execute.

Concurrent · many tasks in flight · the bottleneck moves from compute → to you
·
08:00
09:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
Youorchestrator
↑ A1 A2 A3
↑ A4
↑ A5
↑ A6
↑ research · overnight
Spawn
Email
Standup
Review A1
Iter A1 + merge
Spawn A4
Rev A2
Spawn A5
Iter A2 + merge
1-1
Rev A3 + merge
Spawn A6
Rev A4
Rev A5
Rev A6
Spawn research
Agent 1parallel session
Implement #42
Feedback v1
Round 2
Agent 2parallel session
Tests PR #37
Helper utils
PR feedback
Agent 3parallel session
Investigate & fix #18
Regression + cleanup
Agent 4parallel session
Triage + labels
Quick win #51
Agent 5parallel session
Draft API docs
Changelog
Agent 6parallel session
Refactor parser internals
Research
»Agents are fast. They finish and wait — for you to review, unblock, merge, spawn the next one.
»The key shift: implementation work can run in parallel.
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · devtalks-act-03-the-catch/pom.xml act 03 / 07
$ mvn -pl :devtalks-act-03-the-catch -am verify
[INFO]Scanning for projects...
[INFO]────────< com.marcnuri.devtalks:devtalks-act-03-the-catch >────────
[INFO] Building devtalks-act-03-the-catch 1.0.0-SNAPSHOT [3/7]
Act III · @Act(3) · public class TheCatch

The catch: AI amplifies your project.

[INFO]Reactor Build Order:
[INFO] 
[INFO] devtalks-act-01-context ....... SUCCESS [04:12]
[INFO] devtalks-act-02-unit-of-productivity .... SUCCESS [05:48]
[INFO] devtalks-act-03-the-catch ..... BUILDING ...
[INFO] · devtalks-act-04-teach-agents .... PENDING
[INFO] · devtalks-act-05-codebase-feedback .... PENDING
[INFO] · devtalks-act-06-role-shift .... PENDING
[INFO] · devtalks-act-07-close ......... PENDING
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · interlude/AudienceCheck.java act 03 · raiseHand() · 06
# a quick show of hands · be honest

Who tried AI on a real Java project
and got slop?

> Raise your hand if any of this feels familiar.
invented API brittle mocks huge diff CI red after 28m broke compatibility
agent.log — ci · pull-request #4271 FAILED
$ agent implement ISSUE-1337 --project legacy-java-service
opened a 42-file PR
wrote a confident explanation
invented an API that does not exist
mocked the bug away
broke public behavior
mvn verify failed after 28 minutes
BUILD FAILURE · exit 1 $
marc nuri|red hat
devtalks.ro · 2026
[ scene · chaotic ops room · sludge ]
~/dev/devtalks-2026 · PoorlyArchitectedProject.java act 03 · bad-amplifier · 07
Huge PRs, no baby steps
No tests, behavioral / black-box
No spec docs — nobody knows what it does
Vague, unrefined issues & tickets
No user / customer / PM feedback loop
Problems hidden for months… exposed in hours
// the takeaway
Poor project hygiene becomes worse when AI speeds everything up.
marc nuri|red hat
devtalks.ro · 2026
[ scene · clean ops room · sail catches the tailwind ]
~/dev/devtalks-2026 · AgentReadyProject.java act 03 · good-amplifier · 08
Small, atomic PRs
Strong test coverage
Clear specs
Well-defined, broken-down issues
Short feedback loop
Fast CI/CD pipeline
// the takeaway
AI doesn't replace engineering discipline — it amplifies it.
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · framing/Legacy.java act 03 · legacy-is-unsafe-change · 09
// reframing

Legacy is not age.
Legacy is unsafe change.

[ stable ]

Long-lived
Java codebase

Fabric8 Kubernetes Client Java 11
Helm Java Java 8
  • Stable contracts
  • Behavioral tests
  • Known boundaries
  • Fast feedback
AI can accelerate it.
[ risky ]

AI-assisted codebase
without guardrails

  • Rapid throughput
  • Weak tests
  • Unclear contracts
  • Hidden coupling
  • Review debt
Slop becomes legacy fast.

Age is not the problem. Unsafe change is.

// AI makes unsafe change compound sooner.
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · readiness/Flywheel.java act 03 · flywheel · 10
Compounding
AI leverage
1
Bounded readiness work
tests · docs · cleanup · CI
2
Project gets clearer
knowledge · boundaries · specs
3
Agents become safer
better PRs · fewer wrong turns
4
Developer gains capacity
review · scope · architecture
// bridge to act IV

AI-readiness
is a flywheel.

“Start with bounded readiness work that makes the repository easier to change.”

// takeaway
Every improvement lowers the cost of the next change.
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · devtalks-act-04-teach-agents/pom.xml act 04 / 07
$ mvn -pl :devtalks-act-04-teach-agents -am verify
[INFO]Scanning for projects...
[INFO]──────< com.marcnuri.devtalks:devtalks-act-04-teach-agents >──────
[INFO] Building devtalks-act-04-teach-agents 1.0.0-SNAPSHOT [4/7]
Act IV · @Act(4) · public class TeachAgents

Teach agents what the project means.

[INFO]Reactor Build Order:
[INFO] 
[INFO] devtalks-act-01-context ....... SUCCESS [04:12]
[INFO] devtalks-act-02-unit-of-productivity .... SUCCESS [05:48]
[INFO] devtalks-act-03-the-catch ..... SUCCESS [06:21]
[INFO] devtalks-act-04-teach-agents .... BUILDING ...
[INFO] · devtalks-act-05-codebase-feedback .... PENDING
[INFO] · devtalks-act-06-role-shift .... PENDING
[INFO] · devtalks-act-07-close ......... PENDING
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · devtalks-act-04-teach-agents/AGENTS.md act 04 · agent map · 11
// act 04 · agent map

Encode project-specific knowledge.

README.md tells a person how to use it.
AGENTS.md tells an agent how to change it.

AGENTS.md · fabric8 / kubernetes-client
# Build & validation
Prefer `make` targets over raw Maven commands.
`make generate-model` is the singular model regen path.
# Mock-mode tests
Default to plain HTTP for new mock-mode tests.
The first HTTPS call in each surefire fork pays
a ~7-8s TLS / Vert.x cold-start cost.
# CI reproduction
Reproduce 2-core CI locally:
  docker run --cpus=2 --memory=4g …
  1. [ 01 ] canonical command one path. not a 12-line Maven invocation to guess at.
  2. [ 02 ] operational gotcha the kind of thing an old hand on the project would tell you on day one.
  3. [ 03 ] CI reproduction the agent can rerun your CI on its own laptop — before opening a PR.
Makefile fabric8 today
# fast validation — used by AGENTS.md, used by the agent
quick-build:
	mvn -T 1C -DskipTests \
	  -pl '!doc-projects/...' \
	  install
build.gradle.kts if you'd rather
// same intent, different dialect
tasks.register("quickBuild") {
  group = "verification"
  dependsOn(":kubernetes-client:install")
  // parallel build, skip tests
}
$ claude "run a fast build" agent finds quick-build. just runs it.
// takeaway
Not generic. Project-specific. Project-specific. And executable.
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · .claude/skills/regen-java-models-from-upstream/SKILL.md act 04 · skill · 14
// act 04 · skill

Encode project-specific tasks.

AGENTS.md was the map.
SKILL.md is the ritual.

fabric8io / kubernetes-client · #7528 Open

chore(deps): bump cluster-api-provider-metal3 from 1.9.3 to 1.12.2

dependabot[bot] opened 5 days ago
generate-model — cluster-api/v1beta1 not found
check-no-schema-file-modified
build · 47 compile errors
0 reviews · 0 comments · 0 humans assigned · last activity: dependabot · 4h ago
— No conversation yet. —
stale · 5 days upstream reorganized its API. someone has to read Go.
.claude/skills/regen-java-models-from-upstream/SKILL.md SKILL
---
name: regen-java-models-from-upstream
description: bump Go dep · regen Java models · fix · open closing PR
---
# Steps
1. Pick up the failing Dependabot PR.
2. Decode upstream Go API changes← read Go to ship Java
3. Run make generate-model← canonical command (~15 min)
4. Fix Java compile · refToJavaTypeMappings in pom.xml
5. Update CHANGELOG · alphabetical← avoids merge conflicts
6. Commit · push · open the PR that Closes Dependabot.
fabric8io / kubernetes-client · #7544 Merged

chore(deps): bump cluster-api-provider-metal3 from 1.9.3 to 1.12.2

Claude Code opened & merged by manusa · just now
+cmd/reflection.go· Go import path → api/core/v1beta1
+openshift-misc/pom.xml· refToJavaTypeMappings
+Java models moved· clusterapi.v1beta1clusterapi.core.v1beta1
Closes #7528 32 files · 3 cascade bumps · was open 5 days // ran while I slept.
// takeaway
5 days. No humans. Still red. // upstream Go reorg · nobody wants to read it. A maintainer's ritual, written down. Once. // ~10 lines of frontmatter · ~300 lines of markdown · executable. Who wants to read Go to ship a Java release? The agent does. // hours of Go reading · slow model-regen cycles · diff-check by hand    unattended.
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · devtalks-act-05-codebase-feedback/pom.xml act 05 / 07
$ mvn -pl :devtalks-act-05-codebase-feedback -am verify
[INFO]Scanning for projects...
[INFO]───< com.marcnuri.devtalks:devtalks-act-05-codebase-feedback >───
[INFO] Building devtalks-act-05-codebase-feedback 1.0.0-SNAPSHOT [5/7]
Act V · @Act(5) · public class CodebaseFeedback

A good codebase tells the agent when it is wrong.

[INFO]Reactor Build Order:
[INFO] 
[INFO] devtalks-act-01-context ....... SUCCESS [04:12]
[INFO] devtalks-act-02-unit-of-productivity .... SUCCESS [05:48]
[INFO] devtalks-act-03-the-catch ..... SUCCESS [06:21]
[INFO] devtalks-act-04-teach-agents .... SUCCESS [07:02]
[INFO] devtalks-act-05-codebase-feedback .... BUILDING ...
[INFO] · devtalks-act-06-role-shift .... PENDING
[INFO] · devtalks-act-07-close ......... PENDING
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · devtalks-act-05-codebase-feedback/SpecsVsTests.java act 05 · pushback · 17
// act 05 · the codebase pushes back

Specs explain intent. Tests enforce it.

But text doesn't push back.

docs/specs/config.md // advisory
# Default namespace
When no namespace is configured,
fall back to kubernetes.default.svc.
// an agent may read this.
// or skip it.
// or break it. and not notice.
ConfigTest.java // enforced
@Test
@DisplayName("falls back to kubernetes.default.svc")
void fallsBackToDefaultNamespace() {
assertThat(new ConfigBuilder().build())
.hasFieldOrPropertyWithValue(
"masterUrl", "https://kubernetes.default.svc/");
}
BUILD FAILED — ConfigTest › falls back to kubernetes.default.svc
expected: "https://kubernetes.default.svc/"
actual: "https://my-cluster.example.com/"
// what the agent sees when it gets it wrong.
// takeaway
In Java, the best spec is the one that compiles. // text waits to be read. tests run on every commit.
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · devtalks-act-05-codebase-feedback/BlackBoxTests.java act 05 · unit of behavior · 19
// act 05 · the unit shifts

Black-box tests: the unit is behavior.

// why my tests survived the AI era

PodServiceTest.java ✓ passing △ AGENT-EDITED
// white-box · couples to internals
@Mock Client client;
@Mock PodOps pods;
@Mock NamedOp named;
@Mock Registry registry;
@Mock EventEmitter emitter;
@InjectMocks PodService service;
 
@Test
void deletesPod() {
service.delete("foo");
 
verify(client).pods();
verify(pods).withName("foo");
verify(named).delete();
verify(registry).unregister("foo");
verify(emitter).emit(any());
}
@Mock Client client;
@Mock PodOps pods;
@Mock NamedOp named;
@Mock Registry registry;
@Mock EventEmitter emitter;
@InjectMocks PodService service;
 
 @Test
-void deletesPod() {
+void removesPod() {
- service.delete("foo");
+ service.removePod(PodRef.of("foo"));
 
  verify(client).pods();
  verify(pods).withName("foo");
  verify(named).delete();
- verify(registry).unregister("foo");
- verify(emitter).emit(any());
+ verify(podLifecycle).unregisterAndEmit(any());
 }
asserts who called what agent rewrote 4 lines. nothing pinned the contract.
PodService.java // stable △ refactor applied
// system under test · production code
void delete(String name) {
client.pods()
.withName(name)
.delete();
registry.unregister(name);
emitter.emit(new DeleteEvent(name));
}
-void delete(String name) {
+void removePod(PodRef ref) {
  client.pods()
- .withName(name)
+ .withName(ref.name())
  .delete();
- registry.unregister(name);
- emitter.emit(new DeleteEvent(name));
+ podLifecycle.unregisterAndEmit(ref);
 }
internals an agent might refactor rename · extract helper · same behavior
PodBehaviorIT.java ✓ passing ✓ UNTOUCHED
// black-box · asserts observable behavior
@EnableKubeAPIServer
KubernetesClient kubernetes;
 
@Test
@DisplayName("removes the pod from the cluster")
void removesPodFromCluster() {
kubernetes.pods().resource(pod).create();
 
given().when()
.delete("/api/v1/pods/foo")
.then().statusCode(204);
 
assertThat(kubernetes.pods().withName("foo").get())
.isNull();
}
asserts the pod is gone zero test edits. contract held.
A method is not always a useful unit. A unit of behavior often is.
// survived agent refactors with Fabric8 kube-api-test QuarkusTest Testcontainers YAKD · Selenium
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · devtalks-act-06-role-shift/pom.xml act 06 / 07
$ mvn -pl :devtalks-act-06-role-shift -am verify
[INFO]Scanning for projects...
[INFO]───────< com.marcnuri.devtalks:devtalks-act-06-role-shift >───────
[INFO] Building devtalks-act-06-role-shift 1.0.0-SNAPSHOT [6/7]
Act VI · @Act(6) · public class RoleShift

What changes for the developer.

[INFO]Reactor Build Order:
[INFO] 
[INFO] devtalks-act-01-context ....... SUCCESS [04:12]
[INFO] devtalks-act-02-unit-of-productivity .... SUCCESS [05:48]
[INFO] devtalks-act-03-the-catch ..... SUCCESS [06:21]
[INFO] devtalks-act-04-teach-agents .... SUCCESS [07:02]
[INFO] devtalks-act-05-codebase-feedback .... SUCCESS [05:18]
[INFO] devtalks-act-06-role-shift .... BUILDING ...
[INFO] · devtalks-act-07-close ......... PENDING
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · devtalks-act-07-close/pom.xml act 07 / 07
$ mvn -pl :devtalks-act-07-close -am verify
[INFO]Scanning for projects...
[INFO]─────────< com.marcnuri.devtalks:devtalks-act-07-close >─────────
[INFO] Building devtalks-act-07-close 1.0.0-SNAPSHOT [7/7]
Act VII · @Act(7) · public class Close

Close.

[INFO]Reactor Build Order:
[INFO] 
[INFO] devtalks-act-01-context ....... SUCCESS [04:12]
[INFO] devtalks-act-02-unit-of-productivity .... SUCCESS [05:48]
[INFO] devtalks-act-03-the-catch ..... SUCCESS [06:21]
[INFO] devtalks-act-04-teach-agents .... SUCCESS [07:02]
[INFO] devtalks-act-05-codebase-feedback .... SUCCESS [05:18]
[INFO] devtalks-act-06-role-shift .... SUCCESS [04:36]
[INFO] devtalks-act-07-close ......... BUILDING ...
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · close/Questions.java act 07 · q-and-a · 10
$ ./questions.sh —interactive

Thank you.
Questions?

// keep in touch
@manusa
@marcnuri.com
@MarcNuri
/in/marcnuri
blog.marcnuri.com
/MarcNuri
marcnuri.com
→ slides & links · blog.marcnuri.com
marc nuri|red hat · senior principal software engineer
DevTalks java stage · 03 june 2026
~/dev/devtalks-2026 · 02-spec-and-test-driven 05 / 12
// principle

Coding agents don't fix
bad engineering practices.

They amplify them. The shape of your project is the contract the agent reads from — and writes back into.

[ 01 ] Well-structured Java projects evolve faster and safer with AI in the loop.
[ 02 ] Poorly tested ones break spectacularly — and often silently.
[ 03 ] The fix is rarely a better model. It's better boundaries, tests, and feedback loops.
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · 02-spec-and-test-driven/compare 06 / 12
// before / after

What changes when the agent enters the room.

[ before ] — agent-unaware
Implicit contracts, white-box tests, tribal knowledge.
  • Refactors stall on hidden coupling
  • "Looks fine" PRs slip past CI
  • Framework upgrades take weeks
  • Onboarding humans = onboarding agents
[ after ] — agent-ready
Explicit specs, black-box suites, tight loops.
  • Agent reads tests as the spec
  • Failures localise to a module
  • Upgrades become incremental PRs
  • Same harness works for humans & LLMs
marc nuri|red hat
devtalks.ro · 2026
// quote 07 / 12
"
AI is only as good as the structure, clarity, and test harness of the project it works within.
working principle, throughout this talk
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · 04-lessons-from-the-field 08 / 12

87%

[ illustrative figure — replace with real data ]
// the payoff

of the agent's PR diff was reviewed in < 10 minutes.

When the black-box suite carries the spec, code review collapses to intent + edge cases. The mechanical part — does it still work? — is already answered before a human opens the diff.

source: internal · fabric8 kubernetes client · q1 2026
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · 03-black-box-suites 09 / 12
// demo

Hand the agent the test, not the diff.

~/workspace/fabric8-kubernetes-client — zsh — 132×32
1$ claude "make the watcher reconnect after server restart"
2▸ analysing module · client-impl/src/main/java/io/fabric8/.../WatchHTTPManager.java
3▸ locating black-box suite · src/test/java/.../WatcherReconnectTest.java
4 step 1 · writing failing test
5 step 2 · implementing reconnect backoff
6 step 3 · running mvn verify [ 14 tests ]
7▸ diff +112 −18 across 3 files · no public api change
8$ git diff --stat
marc nuri|red hat
devtalks.ro · 2026
~/dev/devtalks-2026 · 02-spec-and-test-driven/feedback-loop 10 / 12
// architecture

The feedback loop that makes agents reliable.

diagram placeholder
spec → failing test → impl → mvn verify → review
marc nuri|red hat
devtalks.ro · 2026
[ full-bleed image · replace ]
// case study

A four-week framework upgrade, shipped in three afternoons.

Fabric8 Kubernetes Client · JDK 17 → 21 migration, driven entirely by the existing black-box suite as the spec.

marc nuri|red hat
devtalks.ro · 2026
DevTalks Java Stage 03–04 june · bucharest · 2026 ~/talks/turning-java-ai-ready

Turning Your Java
Project Into an
AI-Ready Codebase

Spec- and test-driven workflows for letting coding agents safely refactor, upgrade, and ship features in real Java projects.

Marc Nuri Senior Principal Software Engineer @ Red Hat
DevTalks Romania 2026
03 June · Java Stage · 14:35 — 15:20