Files
yidaima/RuoYi-Vue/docs/superpowers/plans/2026-07-11-plugin-executor-routing-approval.md

6.0 KiB

Plugin Executor Routing And Approval Implementation Plan

For agentic workers: Implement task-by-task with tests first. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Freeze a validated Executor route per contribution step and persist environment-bound approval evidence for real execution attempts.

Architecture: A routing policy resolves configured overrides or the explicit default before enqueue, validates adapter support, fingerprints the route configuration, and stores the selected code on each receipt. Execution APIs bind non-dry-run attempts to exact Transition/routing/environment identities and persist approval evidence.

Tech Stack: Java 8, Spring Boot 2.5 configuration binding, MyBatis, MySQL 5.7-compatible SQL, JUnit 4, Mockito, Vue 2.

Global Constraints

  • Default behavior remains dry-run:v1 with no required request body.
  • Runtime Executor failures must never fall back to another adapter.
  • Every receipt must execute with its persisted Executor code.
  • Real attempts require exact environment, Transition, routing fingerprint, operator, and reason by default.
  • Routing/approval APIs must not expose target credentials.

Task 1: Routing Configuration And Snapshot

Files:

  • Modify: ruoyi-generator/src/main/java/com/ruoyi/generator/config/PluginExecutionProperties.java

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/PluginExecutionRoutingSnapshot.java

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/PluginExecutionRoutingPolicy.java

  • Modify: ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/execution/PluginContributionExecutorRegistry.java

  • Test: ruoyi-generator/src/test/java/com/ruoyi/generator/factory/plugin/execution/PluginExecutionRoutingPolicyTest.java

  • Test: ruoyi-generator/src/test/java/com/ruoyi/generator/factory/plugin/execution/PluginContributionExecutorRegistryTest.java

  • Write failing tests for normalized route keys, default inheritance, mixed snapshots, stable fingerprints, and invalid adapter rejection.

  • Add environment, approval policy, and route-map configuration.

  • Add explicit Executor Registry validation/dispatch without runtime fallback.

  • Run routing and Registry tests and confirm they pass.

Task 2: Freeze Routes During Enqueue And Delivery

Files:

  • Modify: ruoyi-generator/src/main/java/com/ruoyi/generator/service/PluginTransitionExecutionService.java

  • Modify: ruoyi-generator/src/main/java/com/ruoyi/generator/service/PluginTransitionOutboxWorker.java

  • Test: ruoyi-generator/src/test/java/com/ruoyi/generator/service/PluginTransitionExecutionServiceTest.java

  • Test: ruoyi-generator/src/test/java/com/ruoyi/generator/service/PluginTransitionOutboxWorkerTest.java

  • Write failing tests for mixed per-step receipt codes and receipt-directed Worker dispatch.

  • Resolve/validate all routes before inserting an execution batch.

  • Freeze summary/environment/fingerprint on the batch and code on each receipt.

  • Dispatch with receipt.executorCode and confirm no current configuration lookup occurs.

Task 3: Approval Evidence And Persistence

Files:

  • Create: ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/model/PluginTransitionExecutionRequest.java

  • Modify: ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/model/PluginTransitionExecution.java

  • Modify: ruoyi-generator/src/main/resources/mapper/factory/PluginTransitionExecutionMapper.xml

  • Modify: sql/factory_plugin_registry.sql

  • Modify: sql/front_workbench.sql

  • Modify: sql/db.sql

  • Test: ruoyi-generator/src/test/java/com/ruoyi/generator/factory/plugin/execution/PluginExecutionRoutingPolicyTest.java

  • Test: ruoyi-generator/src/test/java/com/ruoyi/generator/factory/plugin/PluginRegistrySchemaScriptTest.java

  • Write failing approval tests for dry-run compatibility, missing evidence, stale identities, invalid reason, and accepted evidence.

  • Persist environment, route fingerprint, approval-required, operator/time/reason fields.

  • Add conditional MySQL 5.7 upgrade columns and full-schema columns.

  • Run policy, Mapper, and schema tests.

Task 4: API And Registry Status

Files:

  • Modify: ruoyi-generator/src/main/java/com/ruoyi/generator/factory/plugin/model/PluginRegistryStatus.java

  • Modify: ruoyi-generator/src/main/java/com/ruoyi/generator/controller/FeaturePluginController.java

  • Modify: ruoyi-generator/src/test/java/com/ruoyi/generator/controller/FeaturePluginControllerTest.java

  • Modify: ruoyi-admin/src/main/resources/application.yml

  • Write failing contracts for routing status and optional execution approval bodies.

  • Expose only non-secret environment/routing policy fields.

  • Pass approval requests to execute/retry/compensate services.

  • Add environment and known route override variables to application configuration.

Task 5: Admin Approval And Audit UI

Files:

  • Modify: ruoyi-ui/src/api/generator/plugin.js

  • Modify: ruoyi-ui/src/views/generator/plugin/index.vue

  • Modify: ruoyi-ui/test/pluginRegistryView.test.mjs

  • Write a failing static contract for approval payloads, environment/routing identity, per-step Executor, and evidence history.

  • Prompt for approval reason when real routes require evidence.

  • Send exact Transition/routing/environment identities for every action.

  • Show environment, routing fingerprint, approval evidence, and receipt Executor.

  • Run static tests and production build.

Task 6: Documentation And Regression

Files:

  • Modify: docs/superpowers/specs/2026-07-10-ai-software-factory-roadmap.md

  • Modify: docs/superpowers/plans/2026-07-11-plugin-executor-routing-approval.md

  • Document D8e2d configuration, persistence, compatibility, and remaining adapter boundary.

  • Run focused Plugin/routing/Outbox/approval tests.

  • Run generator full regression against the 18 known baseline failures.

  • Run admin critical tests, frontend static tests, and production build.

  • Confirm EasyCode and RuoYi UI endpoints return HTTP 200.