Skip to content

⚠️ Rewrite harness as thin single-stage runner with SkillCard-based skills#53

Open
savitharaghunathan wants to merge 8 commits into
konveyor:mainfrom
savitharaghunathan:harness_update
Open

⚠️ Rewrite harness as thin single-stage runner with SkillCard-based skills#53
savitharaghunathan wants to merge 8 commits into
konveyor:mainfrom
savitharaghunathan:harness_update

Conversation

@savitharaghunathan

@savitharaghunathan savitharaghunathan commented Jul 21, 2026

Copy link
Copy Markdown
Member

Replace multi-step CLI harness with thin ACP wrapper that runs a single migration stage (plan/execute/verify) per pod invocation, managed by the AgentPlaybookRun reconciler. Add per-stage skill OCI images, full javaee-to-quarkus skill from migration-skills repo, handoff.md generation with agent summaries and plan steps, filesystem watcher for incremental commits, and e2e test scripts with timestamped branch names.

Assisted-By: Claude Code noreply@anthropic.com

Summary by CodeRabbit

  • New Features

    • Introduced a streamlined, stage-based migration runner (planning, execution, verification) powered by SkillCards.
    • Added Java migration skills for javax→jakarta EE and Java EE→Quarkus, including guides and references.
    • Added new agent image variants (Java, Go, C#, Node.js) and image build/push support.
  • Enhancements

    • Added automatic file monitoring to commit and push incremental progress during runs.
    • Added configurable limits for automated turn handling and verification fix iterations.
  • Documentation

    • Documented the new harness architecture, stage runner approach, and agent image setup.

Replace multi-step CLI harness with thin ACP wrapper that runs a single
migration stage (plan/execute/verify) per pod invocation, managed by the
AgentPlaybookRun reconciler. Add per-stage skill OCI images, full
javaee-to-quarkus skill from migration-skills repo (SKILL.md + 6 modules
+ 6 references), handoff.md generation with agent summaries and plan
steps, filesystem watcher for incremental commits, and e2e test scripts
with timestamped branch names.

Assisted-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
@savitharaghunathan
savitharaghunathan marked this pull request as draft July 21, 2026 22:02
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ac37776b-9fa9-4b85-a769-029fb15384f0

📥 Commits

Reviewing files that changed from the base of the PR and between d5ef522 and 0aaeefe.

📒 Files selected for processing (5)
  • hack/harness-test/setup.sh
  • harness/cmd/migration-harness/main.go
  • harness/internal/git/git.go
  • harness/internal/hub/client.go
  • harness/internal/watcher/patterns.go
🚧 Files skipped from review as they are similar to previous changes (5)
  • harness/internal/watcher/patterns.go
  • harness/internal/hub/client.go
  • hack/harness-test/setup.sh
  • harness/internal/git/git.go
  • harness/cmd/migration-harness/main.go

📝 Walkthrough

Walkthrough

The harness is replaced with a single-stage, SkillCard-driven runner. It adds Hub credential and analysis integration, incremental filesystem commits, language-specific agent images, Java migration skills, and AgentPlaybook integration resources.

Changes

Thin runner architecture

Layer / File(s) Summary
Runtime contracts and integrations
harness/internal/config/*, harness/internal/hub/*, harness/internal/acp/*, harness/internal/git/*, harness/internal/goose/lifecycle.go, harness/go.mod
Configuration, Hub access, ACP turn limits, git behavior, credential handling, and ACP secret requirements are updated for stage execution.
Single-stage orchestration and progress persistence
harness/cmd/migration-harness/main.go
The CLI exposes run, discovers mounted skills, builds one prompt, runs one ACP stage, writes analysis and handoff artifacts, and synchronizes repository changes.
Incremental staging and commit watcher
harness/internal/watcher/*
A debounced filesystem watcher filters repository changes, stages permitted files, and invokes commit/push callbacks with tests for relevant and excluded changes.
Stage and migration SkillCards
skills/plan/*, skills/execute/*, skills/verify/*, skills/javaee-to-quarkus/*
New plan, execute, verify, and Java EE-to-Quarkus skills define stage workflows, migration references, build gates, and SkillCard manifests.
Agent image build matrix
.github/workflows/images.yml, Makefile, images/*
Image automation builds and pushes a shared base image plus Java, Go, C#, and Node.js variants.
Playbook test wiring
hack/harness-test/*, config/samples/*
Integration resources define stage agents, SkillCards, an ordered AgentPlaybook, timestamped runs, Kind setup, and updated sample skill collections.
Architecture and release records
docs/adr/0006-harness-thin-runner-and-skillcard-skills.md, changes/unreleased/53-harness-thin-runner.yaml
Architecture and unreleased-change records describe the thin runner, SkillCard packaging, watcher lifecycle, and per-stage images.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant AgentPlaybookRun
  participant migrationHarness
  participant Hub
  participant GitRepository
  participant gooseServe
  participant ACP
  participant Watcher

  AgentPlaybookRun->>migrationHarness: Start stage with environment
  migrationHarness->>Hub: Resolve application and git credentials
  migrationHarness->>GitRepository: Clone and checkout target branch
  migrationHarness->>Hub: Fetch analysis insights
  migrationHarness->>gooseServe: Start ACP service
  migrationHarness->>ACP: Discover skills and send stage prompt
  ACP-->>Watcher: Produce repository changes
  Watcher->>GitRepository: Stage and commit changes after quiet period
  ACP-->>migrationHarness: Return stage completion status
  migrationHarness->>GitRepository: Write handoff and push final commit
Loading

Possibly related issues

Possibly related PRs

Suggested reviewers: djzager, ibolton336

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 27.78% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise, specific, and accurately describes the main change: rewriting the harness as a thin SkillCard-based runner.
Description check ✅ Passed The description clearly summarizes the rewrite, stage model, skill images, handoff generation, watcher, and test scripts, with no required template sections missing.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.12.2)

Error: build linters: plugin(logcheck): plugin "logcheck" not found
The command is terminated due to an error: build linters: plugin(logcheck): plugin "logcheck" not found


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@savitharaghunathan

Copy link
Copy Markdown
Member Author

fixes #38, #41

Assisted-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
The old agent-java-goose-build target was replaced by agent-images-build
which builds all three stage images (plan, execute, verify).

Assisted-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
Assisted-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
Assisted-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
Assisted-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
@savitharaghunathan savitharaghunathan linked an issue Jul 23, 2026 that may be closed by this pull request
7 tasks
Replace per-stage images (plan, execute, verify) with per-language
images (java, go, csharp, nodejs). Skills come via SkillCards at
runtime. Closes konveyor#40.

Assisted-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
@savitharaghunathan
savitharaghunathan marked this pull request as ready for review July 23, 2026 16:06

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

🟠 Major comments (27)
hack/harness-test/setup.sh-82-92 (1)

82-92: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Load skill images when CONTAINER_TOOL=docker.

docker image exists is not a Docker CLI subcommand, and the conditional redirects stderr, so Docker users always skip skill-image loading. Use image inspect, which both Docker and Podman support for local-image checks.

Proposed fix
-    if $CONTAINER_TOOL image exists "${SKILL_IMAGE}:${SKILL}" 2>/dev/null; then
+    if $CONTAINER_TOOL image inspect "${SKILL_IMAGE}:${SKILL}" >/dev/null 2>&1; then
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@hack/harness-test/setup.sh` around lines 82 - 92, Update the image-existence
check in the SKILL loop to use the shared `image inspect` command instead of
`image exists`, preserving the existing container-tool-specific image loading
behavior and output.
harness/internal/git/git.go-129-136 (1)

129-136: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Treat fully filtered changes as a no-op.

When all status entries are excluded untracked files, no paths are staged before wt.Commit; go-git returns ErrEmptyCommit for a clean index and the watcher treats this as a failed commit+push. Track whether any wt.Add(path) succeeds and return plumbing.ZeroHash, nil when nothing was staged.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@harness/internal/git/git.go` around lines 129 - 136, Update the
status-processing loop around wt.Add in the git commit flow to track whether at
least one path is staged. When every entry is an excluded untracked file and no
wt.Add succeeds, return plumbing.ZeroHash, nil before attempting wt.Commit;
preserve existing add-error propagation and normal commit behavior when files
are staged.
harness/internal/git/git.go-20-24 (1)

20-24: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Prevent bypassing the destructive-delete boundary.

/workspace/../etc and /workspace-other pass the prefix check, so this can recursively remove an unintended existing directory. Normalize the path and use filepath.Rel to require a proper child of an allowed root; also return os.RemoveAll failures.

Proposed fix
+	"path/filepath"
+
 func Clone(ctx context.Context, cred *Credentials, destDir string) (*gogit.Repository, error) {
+	var err error
+	destDir, err = filepath.Abs(destDir)
+	if err != nil {
+		return nil, fmt.Errorf("resolve destination: %w", err)
+	}
+
 	if _, err := os.Stat(destDir); err == nil {
-		if !strings.HasPrefix(destDir, "/workspace") && !strings.HasPrefix(destDir, os.TempDir()) {
+		if !isChildOf(destDir, "/workspace") && !isChildOf(destDir, os.TempDir()) {
 			return nil, fmt.Errorf("refusing to remove %s: not under /workspace or temp", destDir)
 		}
-		os.RemoveAll(destDir)
+		if err := os.RemoveAll(destDir); err != nil {
+			return nil, fmt.Errorf("remove %s: %w", destDir, err)
+		}
 	}
 }
+
+func isChildOf(path, root string) bool {
+	rel, err := filepath.Rel(root, path)
+	return err == nil && rel != "." && rel != ".." &&
+		!strings.HasPrefix(rel, ".."+string(filepath.Separator))
+}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@harness/internal/git/git.go` around lines 20 - 24, Update the
destructive-delete guard around os.Stat and os.RemoveAll to cleanly normalize
destDir and use filepath.Rel against /workspace and os.TempDir(), allowing only
paths that are proper descendants of either root, not the roots themselves or
similarly prefixed paths. Return any error from os.RemoveAll instead of ignoring
it, while preserving the existing refusal error for paths outside the allowed
roots.
skills/javaee-to-quarkus/modules/cleanup.md-48-54 (1)

48-54: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Make dev-mode verification bounded in every module. A foreground mvn quarkus:dev command can block the stage indefinitely.

  • skills/javaee-to-quarkus/modules/cleanup.md#L48-L54: use a timeout/readiness probe and explicitly stop the process.
  • skills/javaee-to-quarkus/modules/app-config.md#L61-L68: apply the same bounded startup check instead of relying on “briefly.”
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/modules/cleanup.md` around lines 48 - 54, Make
dev-mode verification bounded in both
skills/javaee-to-quarkus/modules/cleanup.md (lines 48-54) and
skills/javaee-to-quarkus/modules/app-config.md (lines 61-68): replace the
unbounded or “briefly” run of mvn quarkus:dev with a timeout/readiness probe,
and explicitly stop the launched process after verification.
skills/javaee-to-quarkus/modules/cleanup.md-9-12 (1)

9-12: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Do not recursively delete every directory named weblogic.

This can remove unrelated application packages or vendor content. Enumerate exact tracked stub paths first, then delete only those paths with git rm or a narrowly scoped command.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/modules/cleanup.md` around lines 9 - 12, Update the
cleanup instructions to enumerate the exact tracked WebLogic stub directory
paths before removal, then delete only those approved paths using git rm or an
equivalently narrow command; remove the broad find-based recursive deletion.
skills/plan/references/migration-phases.md-125-130 (1)

125-130: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Do not replace createCipher as a one-token migration to createCipheriv.

createCipheriv requires an explicit cipher, key, and IV, so this replacement is cryptographic redesign. Add a separate crypto migration task covering algorithm, key management, IV handling, and whether authenticated encryption is required.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/plan/references/migration-phases.md` around lines 125 - 130, Update
the “Key Changes” migration guidance to remove the direct
require('crypto').createCipher → createCipheriv replacement. Add a separate
crypto migration task that explicitly covers cipher algorithm selection, key
management, IV generation/handling, and whether authenticated encryption is
required; retain the unrelated Buffer, URL, and fs migration entries.
skills/plan/SKILL.md-54-62 (1)

54-62: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Generate graph.json into an ignored graph directory.
PLAN.md is the only expected plan-stage output, and the repo-level graph.json remains staged by the harness unless the generated graph is written to an internal path such as graphify-out/, detect/, or .konveyor/.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/plan/SKILL.md` around lines 54 - 62, Update the “Phase 1 — Generate
Code Graph” instructions so the graphify update command writes graph.json under
an ignored internal directory such as graphify-out/, detect/, or .konveyor/,
rather than the repository root. Preserve PLAN.md as the only expected
plan-stage output and ensure the documented command and output location are
consistent.
skills/javaee-to-quarkus/references/dependency-map.md-16-17 (1)

16-17: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Make JMS/MDB connector selection broker-specific across all messaging guidance. The current JMS examples all default SmallRye Reactive Messaging to AMQP, but Java EE queue/topic mappings can also target JMS or Kafka brokers with different ack/fail/transaction semantics. Keep AMQP as one option and require explicit connector/mapping for JMS and Kafka destinations, including channel names, acknowledgement mode, and transaction handling where applicable.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/dependency-map.md` around lines 16 - 17,
Make JMS/MDB connector guidance broker-specific across all affected sites:
skills/javaee-to-quarkus/references/dependency-map.md lines 16-17,
skills/plan/references/migration-phases.md lines 60-63, and
skills/javaee-to-quarkus/modules/app-config.md lines 46-59. Keep AMQP as an
explicit option, and add distinct JMS and Kafka mappings with broker-appropriate
channel names, acknowledgement/failure behavior, and transaction handling where
applicable.
skills/javaee-to-quarkus/modules/build-config.md-20-30 (1)

20-30: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Remove Java EE umbrella APIs and legacy build plugins consistently.

references/dependency-map.md calls out removal of javax:javaee-api, javax:javaee-web-api, maven-war-plugin, and maven-ejb-plugin, but only javaee-api and maven-war-plugin are listed here. Ensure the build Config step documents removal of the full incompatible set so legacy Java EE WAR/EJB artifacts don’t remain in the Quarkus build.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/modules/build-config.md` around lines 20 - 30,
Update the build Config step to document removal of all incompatible legacy
artifacts: javax:javaee-api, javax:javaee-web-api, maven-war-plugin, and
maven-ejb-plugin. Preserve the existing removal guidance while adding the
missing dependency and plugin entries so the full set matches
references/dependency-map.md.
skills/javaee-to-quarkus/modules/app-config.md-18-27 (1)

18-27: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Do not hardcode datasource values into migrated applications.

These values lock every migration to PostgreSQL/localhost and allow fallback credentials (${DB_USER:myuser}/${DB_PASS:mypass}) when secrets are absent. Use project-specific placeholder syntax here, make production credentials fail closed when missing, and add Flyway settings only when the project actually performs migrations.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/modules/app-config.md` around lines 18 - 27, Replace
the hardcoded datasource and fallback credential values in the
application.properties example with the project-specific placeholder syntax,
ensuring required production credentials fail when absent. Remove
PostgreSQL-specific and Flyway settings unless the migrated project actually
uses PostgreSQL and performs Flyway migrations; otherwise generate only the
applicable configuration.
skills/javaee-to-quarkus/references/dependency-map.md-35-36 (1)

35-36: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Do not map JAAS directly to quarkus-oidc.

JAAS is a Java Authentication/Authorization Service mechanism, while quarkus-oidc is only for OIDC/OAuth2 providers. This mapping can send JAAS-based auth to an OIDC provider and silently change or remove the original authentication behavior; make it mechanism-specific and require security review.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/dependency-map.md` around lines 35 - 36,
Update the JAAS / Security entry in the dependency map to avoid directly mapping
JAAS to quarkus-oidc. Make the recommendation mechanism-specific, distinguish
OIDC/OAuth2 use from other JAAS-based authentication, and require security
review before selecting an alternative dependency; leave the separate Servlet
Filter mapping unchanged.
skills/plan/references/migration-phases.md-78-83 (1)

78-83: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Keep the byte-vs-text distinction in the Python mappings.

unicode(x) → str(x) and basestring → str only preserve semantics when x/basestring are guaranteed to be text. For byte values, replace with explicit conversion with an encoding policy, e.g. bytes.decode() or str.encode(), instead of blindly mapping to str.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/plan/references/migration-phases.md` around lines 78 - 83, Update the
Python 2-to-3 mappings in the migration reference to preserve byte-versus-text
semantics: do not present unicode(x) → str(x) or basestring → str as universal
replacements. Specify explicit encoding or decoding using bytes.decode() or
str.encode() when values may be bytes, while retaining direct str mappings only
for guaranteed text values.
skills/javaee-to-quarkus/references/pattern-map.md-153-167 (1)

153-167: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Do not use ContainerRequestFilter as a blanket replacement for @WebFilter("/*").

A servlet /* filter intercepts all HTTP requests routed through the servlet layer, including non-JAX-RS servlet endpoints and static resources. A JAX-RS @Provider ContainerRequestFilter only runs for JAX-RS requests, so authentication, header injection, or request/servlet-state transformations can be skipped on those paths. Preserve equivalent HTTP-layer coverage, for example with Quarkus HTTP/Vert.x filters, or explicitly migrate the security policy to apply to non-REST traffic.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/pattern-map.md` around lines 153 - 167,
Update the “Servlet Filter → JAX-RS Filter” mapping so it does not present
ContainerRequestFilter as a blanket replacement for `@WebFilter`("/*"). Document
that ContainerRequestFilter covers only JAX-RS requests, and direct migrations
requiring all HTTP, servlet, or static-resource coverage toward Quarkus
HTTP/Vert.x filters or an explicitly expanded security policy.
skills/javaee-to-quarkus/references/config-map.md-9-12 (1)

9-12: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Use secret references instead of literal credentials.

The mapping instructs the agent to write username=user and password=pass into configuration. Use environment/secret references such as ${DB_USERNAME} and ${DB_PASSWORD}, and explicitly prohibit committing resolved credentials.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/config-map.md` around lines 9 - 12,
Update the datasource credential mappings in config-map.md to use
secret/environment references such as ${DB_USERNAME} and ${DB_PASSWORD} instead
of literal username and password values, and explicitly instruct that resolved
credentials must never be committed.
skills/verify/SKILL.md-44-49 (1)

44-49: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Allow minimal fixes in related build/configuration files.

A compiler error can require updating pom.xml, generated configuration, or another directly related file. Restricting changes to only the reported source file can make the verification stage fail on otherwise fixable dependency/configuration errors.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/verify/SKILL.md` around lines 44 - 49, Update the “Fix Rules” section
in SKILL.md to permit minimal changes to directly related build or configuration
files, such as pom.xml or generated configuration, when required to resolve a
compiler error. Retain the existing constraints to fix only compiler errors,
avoid refactoring, and limit changes to files necessary for the reported error.
skills/javaee-to-quarkus/references/config-map.md-7-18 (1)

7-18: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Do not infer the database vendor from the JNDI name.

A <jta-data-source> identifies a datasource, not whether it is PostgreSQL. Hardcoding db-kind=postgresql can select the wrong driver, URL, dialect, and transaction configuration. Require inspection of the actual JDBC URL/driver and preserve named/XA datasource semantics.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/config-map.md` around lines 7 - 18, The
datasource mapping table must not infer PostgreSQL from the JNDI name in
<jta-data-source>. Update the entries around quarkus.datasource.db-kind and JDBC
settings to require determining the vendor from the actual JDBC URL or driver,
while preserving named and XA datasource semantics instead of presenting generic
values as universal mappings.
skills/javaee-to-quarkus/modules/lifecycle.md-48-55 (1)

48-55: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Do not delete custom migration bootstrap unconditionally.

quarkus.flyway.migrate-at-start=true runs configured Flyway migrations only when the Flyway extension, driver, and migration resources are present; it does not reproduce custom tenant selection, pre/post hooks, locking, or conditional logic. Preserve or explicitly migrate that behavior before deleting the startup class.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/modules/lifecycle.md` around lines 48 - 55, Revise
the Flyway/DB startup guidance to avoid unconditionally deleting custom
migration bootstrap classes. State that removal is safe only after verifying
Quarkus has the required Flyway extension, driver, migration resources, and
equivalent tenant selection, hooks, locking, and conditional behavior; otherwise
preserve or explicitly migrate that custom logic before relying on
quarkus.flyway.migrate-at-start.

Source: MCP tools

skills/javaee-to-quarkus/references/annotation-map.md-19-20 (1)

19-20: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Preserve EJB timer semantics in the scheduler migration

Mapping @Schedule to @Scheduled without carrying over schedule expression, persistence, overlap/concurrency, timezone, and transaction behavior can change timer lifetimes or execution behavior; the same applies to @Timeout lifecycle handling. Document/configure the exact Quarkus Scheduler settings needed instead of a bare annotation rename.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/annotation-map.md` around lines 19 - 20,
Expand the `@Schedule` and `@Timeout` mappings in annotation-map.md to document how
schedule expressions, persistence, overlap/concurrency, timezone, transactions,
and `@Timeout` lifecycle behavior must be preserved with Quarkus Scheduler.
Specify the required `@Scheduled` attributes and related configuration or code
changes instead of presenting a bare annotation rename or removal.

Source: MCP tools

skills/javaee-to-quarkus/modules/messaging.md-72-76 (1)

72-76: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Handle the emitter completion result.

Emitter.send(payload) returns a CompletionStage completed only after downstream acknowledgement and exceptionally on nack. Ignoring it makes send() report success before delivery succeeds and hides broker/processing failures; return, await, or handle the completion result.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/modules/messaging.md` around lines 72 - 76, Update
the send method to handle the CompletionStage returned by emitter.send(payload)
instead of discarding it. Propagate, await, or explicitly handle completion and
exceptional nack outcomes so callers do not observe success before downstream
acknowledgement and failures are not hidden.

Source: MCP tools

skills/javaee-to-quarkus/modules/ejb-to-cdi.md-64-66 (1)

64-66: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Preserve remote contracts before deleting interfaces.

@Remote interfaces define EJB remote calls that may be consumed outside the migrating project. In this deletion step, either verify no external consumers exist or replace the remote contract with a versioned REST, messaging, or client API before removing the interface file.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/modules/ejb-to-cdi.md` around lines 64 - 66, Before
applying “Remove Remote interfaces,” verify that each `@Remote` contract has no
external consumers; where consumers exist, replace it with a versioned REST,
messaging, or client API and migrate callers before deleting the interface and
removing its implementations’ implements clauses.
skills/javaee-to-quarkus/modules/ejb-to-cdi.md-16-18 (1)

16-18: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Preserve @Stateful conversational scope instead of mapping it to @ApplicationScoped.

@ApplicationScoped beans are application-wide, so replacing @Stateful this way moves client-specific conversational state to a shared instance and can cause cross-client data leakage/thread-safety issues. Update both this migration step and the annotation reference table with a scope-preserving migration rule based on the actual client state ownership (for example, externalizing state or choosing the narrowest CDI scope that matches the bean’s lifetime).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/modules/ejb-to-cdi.md` around lines 16 - 18, Replace
the direct `@Stateful-to-`@ApplicationScoped mapping with guidance to preserve
conversational state based on client ownership, such as externalizing state or
selecting the narrowest matching CDI scope. Apply this migration rule in the
EJB-to-CDI migration step and update the `@Stateful` entry in
skills/javaee-to-quarkus/references/annotation-map.md (lines 9-12); leave the
`@Stateless` and `@Singleton` mappings unchanged.

Source: MCP tools

skills/javaee-to-quarkus/modules/messaging.md-27-43 (1)

27-43: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Confirm the messaging contract before converting to String payloads.

onMessage(Message) can preserve TextMessage, but narrowing it to @Incoming("orders") String body discards non-text payloads, headers/properties, transaction behavior, and JMS/Lifecycle delivery results. Use the reactive Message payload when metadata or acknowledgement/failure handling matters, and handle failures explicitly.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/modules/messaging.md` around lines 27 - 43, Update
the OrderServiceMDB.onMessage reactive messaging contract to use
org.eclipse.microprofile.reactive.messaging.Message when metadata,
acknowledgement, failure handling, or non-text payloads must be preserved;
otherwise explicitly validate and handle the TextMessage-to-String conversion.
Preserve required headers/properties and delivery semantics, and add explicit
acknowledgement or failure handling where applicable.

Source: MCP tools

skills/javaee-to-quarkus/references/config-map.md-52-58 (1)

52-58: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Do not use durable=true as the queue/topic discriminator.

Durability controls AMQP subscription persistence; it does not preserve JMS queue-versus-topic topology. The migration needs broker topology details such as address, container, fully-qualified queue names, link names, or multicast routing rather than this one-line mapping.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/config-map.md` around lines 52 - 58, The
Messaging config mapping should not present durable=true as the Queue vs Topic
discriminator. Update the relevant table row to state that topology must be
derived from broker-specific details such as address, container, fully-qualified
queue names, link names, or multicast routing, while retaining durable as an
AMQP subscription-persistence setting.

Source: MCP tools

skills/javaee-to-quarkus/SKILL.md-27-32 (1)

27-32: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Migrate web.xml contents before removing the descriptor.

web.xml is listed for removal in skills/javaee-to-quarkus/SKILL.md:28, modules/app-config.md:44, and modules/cleanup.md:18, but skills/javaee-to-quarkus/references/config-map.md defines migrations for context-param, <welcome-file-list>, <error-page>, <servlet-mapping>, <filter-mapping>, and <security-constraint>. Element-by-element migration is required before deleting the file to avoid dropping application behavior.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/SKILL.md` around lines 27 - 32, Update the migration
workflow in the relevant app-config and cleanup guidance to require reviewing
and migrating every web.xml element before deletion, using the mappings in
references/config-map.md for context-param, welcome-file-list, error-page,
servlet-mapping, filter-mapping, and security-constraint. Make web.xml removal
conditional on completing those migrations rather than presenting it as an
immediate step.
skills/javaee-to-quarkus/references/annotation-map.md-23-24 (1)

23-24: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Map datasource resources to Quarkus datasource beans, not @ConfigProperty.

Quarkus datasources are injected via CDI, e.g. @Inject DataSource for the default datasource or @Inject AgroalDataSource with @DataSource("name") for named datasources. @ConfigProperty is for application configuration values, not the datasource bean itself, so this mapping is misleading for migration output.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/annotation-map.md` around lines 23 - 24,
Update the `@Resource` (DataSource) entry in annotation-map.md to map datasource
resources to CDI-injected DataSource or named AgroalDataSource beans using the
appropriate `@DataSource` qualifier, rather than `@ConfigProperty`; leave the
separate `@Resource` (JMS) mapping unchanged.

Source: MCP tools

skills/javaee-to-quarkus/references/config-map.md-23-29 (1)

23-29: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Preserve session timeout and security behavior during migration.

The app-config/cleanup flow removes WEB-INF/web.xml unconditionally, but <session-config><session-timeout> and <security-constraint> are application behaviors that must not be discarded as “not applicable.” Confirm whether the target Quarkus app should remain stateless, then migrate session timeout to an equivalent (for example quarkus.http.auth.form.timeout/cookie expiry) and ensure existing security constraints are covered by the new HTTP auth policies or annotations.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/config-map.md` around lines 23 - 29,
Update the app-config/cleanup flow that removes WEB-INF/web.xml to preserve
behaviors from session-config and security-constraint before deletion: confirm
the target Quarkus application’s intended statefulness, configure an equivalent
session timeout when sessions are required, and migrate every security
constraint to matching HTTP auth policies or authorization annotations such as
`@RolesAllowed`. Do not treat these web.xml entries as unconditionally “not
applicable.”
skills/javaee-to-quarkus/modules/ejb-to-cdi.md-68-82 (1)

68-82: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Do not replace arbitrary JNDI lookups with CDI injection.

ejb:/... lookups bind to a WildFly/JBoss-style EJB view that may be remote or outside the target Quarkus module. CDI injection only resolves beans managed in the Quarkus application; keep a remote-client adapter or migrate the caller to an explicit REST/messaging client for external/deployed-away EJBs.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/modules/ejb-to-cdi.md` around lines 68 - 82, Revise
the “Replace JNDI lookups with injection” guidance to avoid blanket replacement
of arbitrary JNDI lookups. For ejb:/ lookups targeting remote or external EJB
views, retain a remote-client adapter or direct callers to an explicit REST or
messaging client; recommend `@Inject` FooService only when the service is a
CDI-managed bean within the same Quarkus application.
🟡 Minor comments (9)
docs/adr/0006-harness-thin-runner-and-skillcard-skills.md-20-24 (1)

20-24: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Align the thin-runner scope statement with the responsibilities listed below.

Saying the harness handles “only git plumbing and goose lifecycle” omits Hub resolution, analysis persistence, skill discovery, filesystem watching, and final push behavior. Replace that wording with the actual boundary.

Proposed wording
-The harness needed to become a thin, uniform wrapper — identical in
-every stage image — that handles only git plumbing and goose lifecycle.
+The harness needed to become a thin, uniform wrapper — identical in
+every stage image — that handles git/Hub integration, skill discovery,
+incremental persistence, and goose lifecycle, while leaving migration
+intelligence to mounted skills.

Also applies to: 30-54

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/adr/0006-harness-thin-runner-and-skillcard-skills.md` around lines 20 -
24, Update the thin-runner scope statement in the ADR to match the
responsibilities described in the subsequent sections: include Hub resolution,
analysis persistence, skill discovery, filesystem watching, and final push
behavior alongside git plumbing and Goose lifecycle handling. Apply the same
boundary wording consistently to the related statement covering the additional
referenced section.
docs/adr/0006-harness-thin-runner-and-skillcard-skills.md-117-123 (1)

117-123: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add a language to the fenced diagram.

Use text (or another appropriate language) after the opening fence to satisfy MD040.

Proposed fix
-```
+```text
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/adr/0006-harness-thin-runner-and-skillcard-skills.md` around lines 117 -
123, Specify the fenced diagram’s language by changing its opening fence to use
the text language, while leaving the diagram content and closing fence
unchanged.

Source: Linters/SAST tools

docs/adr/0006-harness-thin-runner-and-skillcard-skills.md-114-129 (1)

114-129: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Document the shipped image matrix, not the Java-only hierarchy.

This ADR says there are five images and treats Go as future, while this PR adds language-specific variants for Java, Go, C#, and Node.js. Update the diagram, image count, and consequences so the architecture record matches the released build matrix.

Also applies to: 304-307

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/adr/0006-harness-thin-runner-and-skillcard-skills.md` around lines 114 -
129, Update the image hierarchy and image count in this ADR to document the
shipped matrix: shared agent-base and agent-plan images plus language-specific
base, execute, and verify images for Java, Go, C#, and Node.js. Revise the
surrounding consequences text to describe all four supported languages and
remove the statement that Go is future or requires adding new images.
hack/harness-test/setup.sh-73-75 (1)

73-75: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Use unique temporary archive paths. Predictable /tmp filenames permit symlink/TOCTOU interference by another local user.

  • hack/harness-test/setup.sh#L73-L75: create the agent archive with mktemp before saving and loading it.
  • hack/harness-test/setup.sh#L85-L87: create the skill archive with mktemp before saving and loading it.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@hack/harness-test/setup.sh` around lines 73 - 75, Create unique temporary
archive paths with mktemp before each save/load sequence, and use the resulting
path for both the $CONTAINER_TOOL save and kind load commands. Apply this to
both the agent archive sequence at hack/harness-test/setup.sh lines 73-75 and
the skill archive sequence at lines 85-87, preserving cleanup of the generated
temporary files.

Source: Linters/SAST tools

harness/internal/watcher/patterns.go-8-12 (1)

8-12: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Allow Kotlin DSL Gradle files.

New build.gradle.kts and settings.gradle.kts files resolve to .kts, which is not allowlisted and therefore will never be committed.

Proposed fix
-	".gradle": true, ".kt": true, ".groovy": true,
+	".gradle": true, ".kts": true, ".kt": true, ".groovy": true,
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@harness/internal/watcher/patterns.go` around lines 8 - 12, Update the
sourceExts allowlist in patterns.go to include the .kts extension, so Kotlin DSL
Gradle files such as build.gradle.kts and settings.gradle.kts are recognized and
committed.
harness/internal/hub/client.go-49-56 (1)

49-56: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Return the real ListInsights() failure in FetchAnalysis.

FetchAnalysis returns nil, nil for every error, so transport/auth/read failures become “no analysis” and the non-fatal caller warning becomes dead. Return nil, err unless the API has a documented not-found/empty-success contract.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@harness/internal/hub/client.go` around lines 49 - 56, Update
Client.FetchAnalysis so failures from selected.Analysis.ListInsights() return
nil together with the original err instead of nil, nil; preserve the existing
successful insights return path.
skills/javaee-to-quarkus/references/dependency-map.md-29-30 (1)

29-30: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Separate MicroProfile Config from YAML support.

quarkus-config-yaml only adds YAML config support; MicroProfile Config is built into Quarkus. Mark Config support as built-in and add the YAML extension only when the application uses YAML.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/dependency-map.md` around lines 29 - 30,
Update the MicroProfile Config entry in the dependency map to identify Config as
built into Quarkus rather than mapping it to quarkus-config-yaml, and add a
separate YAML configuration entry that lists quarkus-config-yaml as conditional
on the application using YAML.
skills/javaee-to-quarkus/references/verify-errors.md-9-9 (1)

9-9: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Don’t add quarkus-arc as a compiler workaround for missing EJB types.

quarkus-arc supplies CDI, not javax.ejb; the compiler error is expected until EJB code is refactored to CDI/Jakarta types in the EJB-to-CDI phase.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/references/verify-errors.md` at line 9, Update the
`package javax.ejb does not exist` verification guidance to remove the
suggestion to add `quarkus-arc` temporarily; state that the error is expected
until the EJB-to-CDI migration replaces EJB types with CDI/Jakarta equivalents.
skills/plan/references/migration-plan-skill.md-53-58 (1)

53-58: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make reference discovery safe when no files match.

The unexpanded glob causes ls to fail when no reference files exist, so the agent may stop before reaching the generic-planning fallback.

- ls /opt/skills/*/references/*.md
+ find /opt/skills -type f -path '*/references/*.md' -print
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/plan/references/migration-plan-skill.md` around lines 53 - 58, Update
the reference discovery command in the loaded migration skills check so an
unmatched glob does not cause the command to fail or halt execution. Preserve
discovery of matching reference files and ensure the flow continues to the
generic planning fallback using migration-phases.md when none are found.
🧹 Nitpick comments (3)
.github/workflows/images.yml (1)

67-80: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Build the image matrix only once on publishing jobs.

agent-images-push already depends on agent-images-build, so non-PR jobs build all images at Line 68 and again at Line 80. Limit the standalone build step to PRs; the push target can build once before publishing.

Proposed fix
       - name: Build images
+        if: github.event_name == 'pull_request'
         run: make agent-images-build
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/images.yml around lines 67 - 80, Update the “Build images”
step in the workflow to run only for pull-request events, while leaving the
“Push images” step and its existing condition unchanged. Since agent-images-push
already depends on agent-images-build, publishing jobs must rely on that
dependency and build the image matrix only once.
harness/cmd/migration-harness/main.go (1)

187-193: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

os.Exit(1) on the failure path skips all deferred cleanup.

defer cancel(), defer srv.Stop(), defer wsClient.Close(), and defer w.Stop() do not run when os.Exit is called, so on stage failure goose serve and the websocket are not gracefully torn down (the success path at Line 193 runs them). Prefer surfacing the exit code from main() instead of exiting mid-function.

Sketch
-	// 13. Exit
-	if stageFailed {
-		logging.Err("stage failed")
-		os.Exit(1)
-	}
-	logging.Ok("stage succeeded")
-	return nil
+	// 13. Exit
+	if stageFailed {
+		logging.Err("stage failed")
+		return errStageFailed // deferred cleanup runs; main() maps this to exit code 1
+	}
+	logging.Ok("stage succeeded")
+	return nil
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@harness/cmd/migration-harness/main.go` around lines 187 - 193, Update the
stage-failure handling in main so it returns an error or otherwise propagates a
nonzero exit status to the top-level process instead of calling os.Exit(1)
mid-function. Preserve the existing success and failure logging while ensuring
deferred cleanup from cancel, srv.Stop, wsClient.Close, and w.Stop executes
before main exits.
skills/javaee-to-quarkus/SKILL.md (1)

40-44: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Clarify the Maven-only build contract.

The skill advertises Java EE migration generally but hardcodes mvn compile. Either explicitly scope this SkillCard to Maven projects or add Gradle detection and build commands.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/javaee-to-quarkus/SKILL.md` around lines 40 - 44, The build
instructions after each phase must support the advertised project scope: either
explicitly restrict the SkillCard to Maven projects and retain the pom.xml/mvn
compile flow, or add Gradle project detection with its appropriate compile
command alongside Maven detection. Ensure the selected build tool is used
consistently before proceeding or stopping on failure.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 80d6f163-f427-4ad4-842a-f9961220414b

📥 Commits

Reviewing files that changed from the base of the PR and between fff23af and d5ef522.

⛔ Files ignored due to path filters (1)
  • harness/go.sum is excluded by !**/*.sum
📒 Files selected for processing (98)
  • .github/workflows/images.yml
  • Makefile
  • changes/unreleased/53-harness-thin-runner.yaml
  • config/samples/kustomization.yaml
  • config/samples/skillcard_javaee_to_quarkus.yaml
  • config/samples/skillcard_javax_to_jakarta_ee.yaml
  • config/samples/skillcollection_java_migration.yaml
  • docs/adr/0006-harness-thin-runner-and-skillcard-skills.md
  • hack/harness-test/playbook-resources.yaml
  • hack/harness-test/resources.yaml
  • hack/harness-test/setup.sh
  • harness/cmd/migration-harness/main.go
  • harness/go.mod
  • harness/internal/acp/session.go
  • harness/internal/config/config.go
  • harness/internal/config/config_test.go
  • harness/internal/detect/detect.go
  • harness/internal/detect/detect_test.go
  • harness/internal/execute/execute.go
  • harness/internal/execute/execute_test.go
  • harness/internal/fixloop/fixloop.go
  • harness/internal/fixloop/fixloop_test.go
  • harness/internal/git/credentials.go
  • harness/internal/git/git.go
  • harness/internal/git/git_test.go
  • harness/internal/goose/acp_runner.go
  • harness/internal/goose/acp_runner_test.go
  • harness/internal/goose/goose.go
  • harness/internal/goose/lifecycle.go
  • harness/internal/goose/recipe.go
  • harness/internal/goose/recipe_test.go
  • harness/internal/handoff/handoff.go
  • harness/internal/handoff/handoff_test.go
  • harness/internal/hub/client.go
  • harness/internal/metrics/metrics.go
  • harness/internal/metrics/metrics_test.go
  • harness/internal/plan/approval.go
  • harness/internal/plan/context.go
  • harness/internal/plan/context_test.go
  • harness/internal/plan/hints.go
  • harness/internal/plan/hints_test.go
  • harness/internal/plan/parser.go
  • harness/internal/plan/parser_test.go
  • harness/internal/plan/plan.go
  • harness/internal/plan/recipe.go
  • harness/internal/plan/turns.go
  • harness/internal/plan/turns_test.go
  • harness/internal/plan/types.go
  • harness/internal/rundir/rundir.go
  • harness/internal/rundir/rundir_test.go
  • harness/internal/verify/verify.go
  • harness/internal/verify/verify_test.go
  • harness/internal/watcher/patterns.go
  • harness/internal/watcher/patterns_test.go
  • harness/internal/watcher/watcher.go
  • harness/internal/watcher/watcher_test.go
  • harness/recipes/execute.yaml
  • harness/recipes/fix.yaml
  • harness/recipes/verify.yaml
  • harness/skill-bundle/goose-migration/SKILL.md
  • harness/skill-bundle/goose-migration/references/README.md
  • harness/skill-bundle/goose-migration/references/REFERENCES_SUMMARY.md
  • harness/skill-bundle/goose-migration/references/dotnet-framework-to-core.md
  • harness/skill-bundle/goose-migration/references/javaee-quarkus.md
  • harness/skill-bundle/goose-migration/references/python2-to-python3.md
  • harness/skill-bundle/goose-migration/references/springboot-2-to-3.md
  • harness/skill-bundle/goose-migration/skills/javaee-quarkus/SKILL.md
  • harness/skill-bundle/goose-migration/skills/migration-plan/MIGRATION_PLAN_SKILL_UPDATES.md
  • harness/skill-bundle/goose-migration/skills/python2-to-python3/SKILL.md
  • images/README.md
  • images/agent-base-goose/Containerfile
  • images/agent-base/Containerfile
  • images/agent-csharp/Containerfile
  • images/agent-go/Containerfile
  • images/agent-java-goose/Containerfile
  • images/agent-java/Containerfile
  • images/agent-nodejs/Containerfile
  • skills/execute/SKILL.md
  • skills/execute/skill.yaml
  • skills/javaee-to-quarkus/SKILL.md
  • skills/javaee-to-quarkus/modules/app-config.md
  • skills/javaee-to-quarkus/modules/build-config.md
  • skills/javaee-to-quarkus/modules/cleanup.md
  • skills/javaee-to-quarkus/modules/ejb-to-cdi.md
  • skills/javaee-to-quarkus/modules/lifecycle.md
  • skills/javaee-to-quarkus/modules/messaging.md
  • skills/javaee-to-quarkus/references/annotation-map.md
  • skills/javaee-to-quarkus/references/config-map.md
  • skills/javaee-to-quarkus/references/dependency-map.md
  • skills/javaee-to-quarkus/references/pattern-map.md
  • skills/javaee-to-quarkus/references/sources.md
  • skills/javaee-to-quarkus/references/verify-errors.md
  • skills/plan/SKILL.md
  • skills/plan/references/migration-phases.md
  • skills/plan/references/migration-plan-skill.md
  • skills/plan/skill.yaml
  • skills/verify/SKILL.md
  • skills/verify/skill.yaml
💤 Files with no reviewable changes (47)
  • harness/skill-bundle/goose-migration/SKILL.md
  • images/agent-base-goose/Containerfile
  • harness/internal/rundir/rundir.go
  • harness/internal/plan/types.go
  • harness/internal/plan/hints_test.go
  • harness/recipes/fix.yaml
  • harness/skill-bundle/goose-migration/references/javaee-quarkus.md
  • harness/skill-bundle/goose-migration/references/README.md
  • harness/skill-bundle/goose-migration/references/dotnet-framework-to-core.md
  • harness/internal/plan/turns.go
  • harness/internal/goose/goose.go
  • harness/skill-bundle/goose-migration/references/REFERENCES_SUMMARY.md
  • harness/skill-bundle/goose-migration/skills/javaee-quarkus/SKILL.md
  • harness/internal/rundir/rundir_test.go
  • harness/internal/goose/recipe_test.go
  • harness/internal/plan/parser.go
  • harness/internal/plan/recipe.go
  • harness/skill-bundle/goose-migration/references/springboot-2-to-3.md
  • harness/internal/plan/approval.go
  • harness/internal/verify/verify.go
  • harness/internal/verify/verify_test.go
  • harness/internal/plan/parser_test.go
  • images/agent-java-goose/Containerfile
  • harness/internal/fixloop/fixloop_test.go
  • harness/recipes/execute.yaml
  • harness/internal/plan/hints.go
  • harness/internal/execute/execute.go
  • harness/internal/handoff/handoff.go
  • harness/internal/detect/detect_test.go
  • harness/internal/handoff/handoff_test.go
  • harness/internal/metrics/metrics.go
  • harness/skill-bundle/goose-migration/skills/migration-plan/MIGRATION_PLAN_SKILL_UPDATES.md
  • harness/internal/plan/plan.go
  • harness/internal/goose/acp_runner_test.go
  • harness/internal/metrics/metrics_test.go
  • harness/skill-bundle/goose-migration/skills/python2-to-python3/SKILL.md
  • harness/internal/detect/detect.go
  • harness/internal/goose/acp_runner.go
  • harness/internal/execute/execute_test.go
  • harness/internal/plan/context.go
  • harness/recipes/verify.yaml
  • harness/internal/fixloop/fixloop.go
  • harness/internal/goose/recipe.go
  • harness/internal/plan/turns_test.go
  • harness/internal/git/credentials.go
  • harness/skill-bundle/goose-migration/references/python2-to-python3.md
  • harness/internal/plan/context_test.go

@savitharaghunathan savitharaghunathan left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@coderabbitai
Re: the skill content findings (migration guidance for Java EE → Quarkus, messaging semantics, security mappings, etc.) — these are valid improvements but will be addressed separately in a follow-up PR. The current skill content is a baseline to get the pipeline working end-to-end; refinements to migration accuracy and edge-case handling come next.

- Path traversal in Clone guard: use filepath.Abs + filepath.Rel
  instead of strings.HasPrefix; check os.RemoveAll error
- docker image exists is not a Docker CLI command: use image inspect
- Empty staging commit: track whether anything was staged, return
  early if not
- Missing .kts in watcher allowlist: Kotlin DSL Gradle files ignored
- FetchAnalysis swallows errors: return nil, err instead of nil, nil
- os.Exit(1) skips deferred cleanup: return error so defers run

Assisted-By: Claude Code <noreply@anthropic.com>
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>

@ibolton336 ibolton336 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants