---
name: bootui-java-development
description: Use when implementing, debugging, refactoring, or testing existing BootUI Java code, including framework-neutral engine logic, Spring MVC and WebFlux adapters, Quarkus runtime and deployment integration, optional dependencies, DTO contracts, and Maven build failures. Not for frontend-only work, creating unrelated applications, or release operations.
metadata:
  internal: true
---

# BootUI Java development

Use this skill for substantive Java maintenance in this repository. It provides an investigation and implementation
workflow, not a replacement for repository instructions or a requirement to delegate work.

Follow [repository instructions](../../../AGENTS.md) and the relevant
[path-scoped instructions](../../instructions/). Consult [the module map](../../../docs/REPOSITORY.md) when locating
ownership. Build and delivery requirements remain authoritative in [CONTRIBUTING.md](../../../CONTRIBUTING.md) and,
when selected, the [vertical-PR agent](../../agents/bootui-vertical-pr.agent.md).

This skill develops BootUI itself. The separate [consumer skill](../../../skills/bootui/SKILL.md) teaches agents to
install and use BootUI in another application. Dr JSkill's application-creation workflow is not required here.

## 1. Establish the change boundary

Read the request, working-tree changes, relevant implementation, and nearby tests before editing. Identify:

- The behavior to preserve or change and a concrete regression or acceptance case.
- The owning layer: core DTO/helper, engine policy/service, adapter observation/wiring, or public transport.
- The affected stacks and consumers, including MCP/CLI where applicable. Read the support and specification documents
  required by repository instructions before changing behavior; do not infer parity from a similarly named class.
- The smallest validation that could disprove the proposed fix.

For a simple lookup or local edit, use direct tools. For a larger task, delegate only independent scopes with explicit
file ownership and acceptance boundaries. Tell Java subagents to load this skill; avoid concurrent Maven builds in
the same worktree. Loading it does not authorize committing, publishing, or spawning additional sessions.

## 2. Investigate with evidence

Find the file using a known path or a narrow glob. Read the implementation and its tests together, then trace the
relevant call chain. Search for an existing helper or SPI before adding one.

Use Java LSP when it answers a semantic question:

| Question | Operation |
| --- | --- |
| What type or overload is this? | `hover`, `goToDefinition` |
| Which code consumes this symbol? | `findReferences`, `incomingCalls` |
| Which classes implement this port? | `goToImplementation` |
| What is the structure of this large file? | `documentSymbol` |
| Where is a named symbol? | `workspaceSymbol` |
| Which usages must change with this name? | `rename`, followed by diff review |

Use the actual symbol position in the current file, not a guessed or pre-edit line number. Before relying on
cross-module results, compare them with one known declaration or caller. An empty workspace search or references
limited to the declaration's file do not establish absence. If results are suspect, use a narrow glob/text search
across the expected modules and inspect the matching code. Do not repeatedly retry the same query or install a new
language server as part of an unrelated fix.

LSP is an aid, not a gate: continue with targeted searches when it is unavailable. A successful tool call or symbol
outline proves neither complete indexing nor compilation. Semantic renames also require checking string-based
registrations, resources, configuration keys, and public contracts that LSP cannot safely rename.

## 3. Implement the smallest complete change

Load only the relevant section of [change recipes](references/change-recipes.md):

- Extract shared behavior or add an SPI.
- Change a DTO or a public response.
- Fix an advisor's false positive or missing evidence.
- Integrate an optional framework capability.

Keep the regression case close to the behavior's owner. Prefer deterministic fixtures, fake providers, and controlled
clocks to real network calls, host-dependent observations, sleeps, or an entire application context for pure logic.
Exercise the failure and absence paths as well as the positive case. Wire every affected adapter; do not compensate
for a missing binding with a silent fallback.

## 4. Validate and debug deliberately

Load [validation and debugging](references/validation.md) before choosing Maven commands. Start with the smallest
relevant selection, then satisfy the required integration and delivery gates. Inspect reports to confirm that the
intended tests and framework augmentation actually ran.

When a run fails, classify the first actionable failure before editing: dependency resolution, compilation,
framework bootstrap, assertion failure, or environment limitation. Preserve its diagnostic and reproduce it at the
smallest useful scope. Do not respond to each failure with another full build or unrelated source changes.

Review the final diff against the acceptance boundary and report any remaining blocker honestly. Do not claim
compilation, cross-stack compatibility, or absence safety from an LSP response or a skipped test run.
