These issues implement the boost backend in dependency order. Each issue is scoped for a single fullsend /fs-code run. Frontend/UI work is excluded and will be covered in a separate set of issues.
Labels: ready-to-code
Scaffold the boost-common package (backstage.role: common-library) with the shared interfaces and permission definitions, and the boost-node package (backstage.role: node-library) with the service ref and extension point. Following the Backstage convention (e.g. plugin-catalog-common + plugin-catalog-node), createServiceRef must NOT live in a common-library package — it would pull @backstage/backend-plugin-api into browser bundles.
From openspec/changes/pluggable-ai-platform-architecture/tasks.md section 1:
- 1.1 Define
AgenticProvider,ProviderDescriptor,ProviderCapabilitiesinterfaces inboost-common - 1.2 Define
NormalizedStreamEventunion type inboost-common - 1.3 Define
ConversationSummary,ConversationDetails,InputItemconversation types inboost-common - 1.4 Create
boost-nodepackage withboostAiProviderServiceRefviacreateServiceRef— serviceRef lives inboost-node, NOTboost-common - 1.6 Verify no provider-specific types in common package
- 1.7 Verify
boost-commonhas no dependency on@backstage/backend-plugin-api
From openspec/changes/security-safety-governance/tasks.md section 1:
- 1.1 Define 16 permissions in
boost-common/src/permissions.ts - 1.2 Define resource types
boost-agentandboost-tool - 1.3 Define conditional rules:
IS_OWNER,IS_NOT_CREATOR,HAS_LIFECYCLE_STAGE - 1.4 Define 5 functional permissions
openspec/changes/pluggable-ai-platform-architecture/design.md— Decision 1 (serviceRef in boost-node, types in boost-common), Decision 5 (type boundaries)openspec/changes/pluggable-ai-platform-architecture/specs/provider-abstraction/spec.mdopenspec/changes/security-safety-governance/specs/fine-grained-permissions/spec.mdspecifications/boost-context.md— Design Principles (read before implementing)
Labels: ready-to-code
Depends on: Issue 1
Scaffold the boost-backend package with the core plugin registration, ProviderManager, boostProviderExtensionPoint, security mode enforcement, and the authorizeLifecycleAction middleware.
From openspec/changes/pluggable-ai-platform-architecture/tasks.md:
- 1.5 Register default service factory in
boost-backend/plugin.tsresolving toProviderManager.getActiveProvider()
From openspec/changes/security-safety-governance/tasks.md sections 2 and 9:
- 2.1 Create
authorizeLifecycleAction(permission, resourceLoader)middleware - 2.2 Implement fine-grained permission check → DENY → 403 pattern
- 2.3 Create resource loader functions for agents and tools
- 1.5 Register all permissions via
permissionsRegistry.addPermissions() - 9.1 Use
development-only-no-authas the dev security mode name - 9.2 No legacy aliases —
noneis rejected with error - 9.3 Add production environment detection with startup warning
openspec/changes/pluggable-ai-platform-architecture/design.md— Decision 1 (serviceRef in boost-node, factory in boost-backend)openspec/changes/pluggable-ai-platform-architecture/specs/provider-hot-swap/spec.mdopenspec/changes/security-safety-governance/design.md— Decision 1 (middleware), Decision 3 (layered self-approval)openspec/changes/security-safety-governance/specs/access-control/spec.md
Labels: ready-to-code
Depends on: Issue 2
Implement the runtime configuration engine: RuntimeConfigResolver with cacheService, AdminConfigService with DB overrides, and Zod schema-driven validation as single source of truth.
From openspec/changes/platform-operations-deployment/tasks.md sections 1 and 2:
- 1.1 All backend services depend on
coreServices.cache - 1.2
RuntimeConfigResolverwith 30s TTL and immediate invalidation - 1.7 Config resolution: single cache layer
- 2.1 Define Zod schemas for all admin-configurable fields
- 2.2 Generate
config.d.tstypes from Zod schemas - 2.3 Validate all config writes via Zod
.parse() - 2.4 Annotate each field with
configScope - 2.5 Add Zod schemas for new config fields
- 2.7 Implement credential encryption for sensitive DB-stored values
- 2.8 Implement schema version tracking
openspec/changes/platform-operations-deployment/design.md— Decisions 1-3openspec/changes/platform-operations-deployment/specs/runtime-config/spec.mdopenspec/changes/platform-operations-deployment/specs/cache-migration/spec.md— RuntimeConfigResolver scenario
Labels: ready-to-code
Depends on: Issue 2
Implement agent CRUD routes with 4-stage lifecycle (Draft → Pending → Published → Archived) and fine-grained permission integration via authorizeLifecycleAction.
From openspec/changes/security-safety-governance/tasks.md section 3:
- 3.1-3.7 Implement all agent routes with fine-grained permissions
From openspec/changes/agent-creation-discovery/tasks.md section 4:
- 4.1 Implement 4-stage lifecycle as the only model
- 4.2 Document cascading delete behavior
openspec/changes/security-safety-governance/specs/fine-grained-permissions/spec.md— Agent permission scenariosopenspec/changes/agent-creation-discovery/design.md— Decision 5 (lifecycle with ownership)openspec/changes/agent-creation-discovery/specs/agent-creation-paths/spec.md
boost-backend — Kagenti tool lifecycle routes, MCP server registration, and infrastructure admin (issue 5 of 15)
Labels: ready-to-code
Depends on: Issue 2
Implement Kagenti tool lifecycle routes (boost.tool.* permissions), MCP server registration routes, and Kagenti infrastructure admin routes (boost.kagenti.admin).
Note: The boost-tool resource type and lifecycle permissions apply to Kagenti tools (K8s workloads) only. MCP servers are registered endpoints without lifecycle governance. MCP tools are runtime-discovered children of MCP servers — they are not independently managed.
From openspec/changes/security-safety-governance/tasks.md sections 4 and 5:
- 4.1-4.4 Implement Kagenti tool lifecycle routes with
boost.tool.*permissions - 5.1 Implement Kagenti admin routes with
boost.kagenti.admin
MCP server registration (admin panel CRUD, connection test, auth chain config) — see spec below
openspec/changes/security-safety-governance/specs/fine-grained-permissions/spec.md— Kagenti tool permission scenarios, infrastructure permissionsopenspec/changes/agent-creation-discovery/specs/mcp-tools/spec.md— MCP server registration and auth chain (separate from Kagenti tool lifecycle)
Labels: ready-to-code
Depends on: Issue 2
Implement the SSE streaming endpoint, normalized stream event processing, and the chat route that connects providers to the frontend via NormalizedStreamEvent.
From openspec/changes/platform-operations-deployment/tasks.md:
- 1.8 Conversation-agent maps: session-scoped cacheService
- 1.9 Rate limiter state: per-window cacheService
openspec/changes/pluggable-ai-platform-architecture/specs/normalized-streaming/spec.mdopenspec/changes/ai-chat-interaction-experience/specs/streaming-chat/spec.mdopenspec/changes/pluggable-ai-platform-architecture/design.md— Decision 3 (cacheService for all caches)
Labels: ready-to-code
Depends on: Issue 6
Implement conversation persistence (DB tables boost_sessions, boost_messages, boost_feedback), search, resume, feedback, and export endpoints.
From openspec/changes/platform-operations-deployment/tasks.md:
- 1.3
ConversationRegistry: 24h TTL via cacheService
openspec/changes/ai-chat-interaction-experience/specs/conversation-history/spec.mdopenspec/changes/platform-operations-deployment/specs/cache-migration/spec.md— ConversationRegistry scenario
Labels: ready-to-code
Depends on: Issue 6
Implement the human-in-the-loop approval service for tool calls, including built-in approval and SonataFlow-managed external workflow with X-Boost-Workflow-Callback header.
From openspec/changes/platform-operations-deployment/tasks.md:
- 1.10 HITL approval state: request-scoped cacheService
openspec/changes/ai-chat-interaction-experience/specs/hitl-approval/spec.mdopenspec/changes/security-safety-governance/specs/access-control/spec.md— SonataFlow trust boundary scenarios
Labels: ready-to-code
Depends on: Issue 3
Implement the RAG knowledge pipeline backend: document ingestion, vector store integration, content hash tracking, and RAG query endpoints.
From openspec/changes/platform-operations-deployment/tasks.md:
- 1.4
DocumentSyncServicecontent hashes: cacheService with long TTL
openspec/changes/ai-chat-interaction-experience/specs/rag-knowledge/spec.mdopenspec/changes/platform-operations-deployment/specs/rag-pipelines/spec.mdopenspec/changes/platform-operations-deployment/specs/cache-migration/spec.md— DocumentSyncService scenario
Labels: ready-to-code
Depends on: Issue 2
Create the Llama Stack provider module as an independent createBackendModule with ResponsesApiProvider, OpenAI Agent SDK orchestration, and all provider caches using cacheService.
From openspec/changes/pluggable-ai-platform-architecture/tasks.md sections 2 and 3:
- 2.1 Create
boost-backend-module-llamastackpackage - 2.2 Implement
ResponsesApiProviderandResponsesApiProviderFactory - 3.2 Implement model list cache via
cache.withOptions({ defaultTtl: '60s' }) - 3.5 Implement MCP auth token cache via cacheService
- 3.8 Implement client manager cache as identity-keyed cacheService
- 3b.2 Define Llama Stack-specific types in module only
From openspec/changes/platform-operations-deployment/tasks.md:
- 1.5 Provider session maps: cacheService with session-appropriate TTL
- 1.6
ClientManager: identity-keyed cacheService
openspec/changes/pluggable-ai-platform-architecture/specs/provider-packaging/spec.md— Llama Stack module scenariosopenspec/changes/pluggable-ai-platform-architecture/specs/multi-agent-orchestration/spec.mdopenspec/changes/pluggable-ai-platform-architecture/design.md— Decision 2 (modules not plugins), Decision 3 (cacheService)
Labels: ready-to-code
Depends on: Issue 2
Create the Kagenti provider module as an independent createBackendModule with KagentiProvider, A2A protocol integration, and all provider caches using cacheService.
From openspec/changes/pluggable-ai-platform-architecture/tasks.md sections 2 and 3:
- 2.3 Create
boost-backend-module-kagentipackage - 2.4 Implement
KagentiProviderandKagentiProviderFactory - 2.5 Ensure no cross-provider imports
- 3.3 Implement agent card cache via
cache.withOptions({ defaultTtl: '5m' }) - 3.4 Implement Keycloak token cache
- 3.7 Implement session maps via cacheService
- 3b.1 Define Kagenti-specific types in module only
openspec/changes/pluggable-ai-platform-architecture/specs/provider-packaging/spec.md— Kagenti module scenariosopenspec/changes/pluggable-ai-platform-architecture/design.md— Decision 2 (modules not plugins), Decision 3 (cacheService)
Labels: ready-to-code
Depends on: Issues 10, 11
Create independently deployable entity provider packages (kagenti-entity-provider, llamastack-entity-provider) and core plugin entity providers (McpEntityProvider, VectorStoreEntityProvider) that emit AI domain objects as Backstage catalog entities.
Important: Two-layer polling model. Backstage's catalog infrastructure polls entity providers on its own schedule. Independently, each entity provider manages its own upstream refresh interval — how often it fetches from the external API (Kagenti, Llama Stack). When Backstage polls, the provider returns cached upstream data. The upstream refresh interval must be configurable via app-config.yaml, not hardcoded.
From openspec/changes/agent-creation-discovery/tasks.md sections 1 and 2:
- 1a.1-1a.6 kagenti-entity-provider package
- 1b.1-1b.6 llamastack-entity-provider package
- 1c.1-1c.3 Composition into provider modules
- 1d.1-1d.3 Core plugin entity providers (MCP servers using upstream
kind: API, spec.type: mcp-serverfrom@backstage/plugin-catalog-backend-module-ai-modelwithResourcefallback; vector stores) - 1e.1-1e.4 Shared entity concerns (ownership mapping, lifecycle mapping, validators, configurable upstream refresh intervals)
- 2.1-2.4 Catalog integration (backend endpoints reading from catalog)
openspec/changes/agent-creation-discovery/specs/catalog-entities/spec.mdopenspec/changes/agent-creation-discovery/design.md— Decisions 1-3 (kinds, deployment modes, catalog as source of truth)
Labels: ready-to-code
Depends on: Issue 11
Implement TokenExchangeManager for per-user Kagenti identity delegation via RFC 8693 OAuth2 Token Exchange, with graceful fallback to service-account token on all failures.
From openspec/changes/security-safety-governance/tasks.md section 7:
- 7.1 Create
TokenExchangeManagerimplementing RFC 8693 - 7.2 Add per-user token caching with TTL from token expiry
- 7.3 Add concurrent exchange deduplication
- 7.4 Add graceful fallback to service-account token
- 7.5 Add config schema:
boost.kagenti.auth.tokenExchange.* - 7.6 Integrate into
KagentiApiClient.requestCore() - 7.7 Extract user OIDC token from configurable request header
openspec/changes/security-safety-governance/specs/access-control/spec.md— Token exchange scenariosopenspec/changes/security-safety-governance/design.md— Decision 4 (backend-only with graceful fallback)
Labels: ready-to-code
Depends on: Issue 10
Extract toolscope as @boost/toolscope (zero Backstage dependencies, injectable CacheAdapter) and create @boost/responses-api-toolkit for shared Responses API utilities.
From openspec/changes/agent-creation-discovery/tasks.md section 3:
- 3.1 Create
@boost/toolscopepackage (29 files) - 3.2 Define
CacheAdapterinterface - 3.3 Create default in-memory
CacheAdapter - 3.4 Create Backstage
CacheAdapterwrappingcoreServices.cache - 3.5 Import
@boost/toolscopefromboost-backend
From openspec/changes/pluggable-ai-platform-architecture/tasks.md section 5:
- 5.1 Create
@boost/toolscopewith injectable cache interface - 5.2 Create
@boost/responses-api-toolkit
openspec/changes/pluggable-ai-platform-architecture/specs/provider-packaging/spec.md— Toolscope extraction scenarioopenspec/changes/agent-creation-discovery/design.md— Decision 4 (standalone npm package)
Labels: ready-to-code
Depends on: Issues 10, 11, 12
Configure all boost packages for RHDH dynamic plugin export (OCI), create deployment examples, implement security hardening (CSRF, credential encryption), and add skills marketplace proxy routes.
From openspec/changes/pluggable-ai-platform-architecture/tasks.md section 6:
- 6.1 Configure
boost-backend-module-llamastackfor RHDH dynamic plugin export (OCI) - 6.2 Configure
boost-backend-module-kagentifor RHDH dynamic plugin export (OCI) - 6.3 Create
dynamic-plugins.yamlexamples for modular deployment
From openspec/changes/security-safety-governance/tasks.md section 8:
- 8.2 Encrypt sensitive values in admin config DB
From openspec/changes/agent-creation-discovery/tasks.md section 5:
- 5.1 Implement proxy routes to external skills catalog backend
- 5.3 Implement K8s manifest generation with OCI init containers
- 5.4 Add deployment progress polling
- 5.6 Route chat to skill agents via
chatEndpointfield
From openspec/changes/platform-operations-deployment/tasks.md section 3:
- 3.1 Document all 25+ configurable keys with scope
- 3.2 Add schema documentation to Zod definitions
openspec/changes/platform-operations-deployment/specs/deployment/spec.mdopenspec/changes/platform-operations-deployment/specs/white-label/spec.mdopenspec/changes/agent-creation-discovery/design.md— Decision 6 (skills marketplace consumer)
Labels: ready-to-code
Depends on: Issue 15 (#3311)
Refactor the skills marketplace routes introduced in issue 15 to read runtimes from local app-config, resolve runtimeId server-side in the deploy endpoint, extract manifest generation into a testable module, and add comprehensive proxy and unit test coverage.
From openspec/changes/pluggable-ai-platform-architecture/tasks.md section 8:
- 8a.3 Add proxy tests for
GET /skillsandGET /skills/domains(mock fetch, verify URL construction, query param forwarding, feature gate, permission checks, non-JSON handling) - 8b.1 Add
boost.skillsMarketplace.runtimes[]Zod schema toschemas.ts(yaml-onlyscope) with fields:id,name,description,image,language,footprint,features[],status - 8b.2 Refactor
GET /skills/runtimesto read from local app-config instead of proxying to external catalog - 8b.3 Add tests for
GET /skills/runtimes(reads config, returns runtime list, feature gate) - 8c.1 Change
POST /skills/deployrequest body to acceptruntimeIdinstead ofociImage; resolve container image fromboost.skillsMarketplace.runtimes[]config - 8c.2 Extract manifest generation into
src/skills/manifestBuilder.ts - 8c.3 Update deploy tests for
runtimeIdresolution andmanifestBuilderunit tests
openspec/changes/pluggable-ai-platform-architecture/tasks.md— Section 8 (Skills Marketplace Integration)openspec/changes/agent-creation-discovery/design.md— Decision 6 (skills marketplace consumer)