Auto-generated by
rails system:skills:generate_catalogon 2026-09-30 19:30 UTC. Source:descriptor()class methods onextensions/system/server/app/services/system/ai/skills/*_executor.rb. Do NOT edit by hand — re-run the rake task instead.
67 executors across 8 categories.
For architecture context (agent bindings, plan vs. execute pattern, invocation surfaces), see SKILL_EXECUTORS.md.
acme_certificate_provision— Provision (issue) a new ACME TLS certificate for the platform's public listeners. Creates the certificate record and drives it through issuance via the ACME server (Let's Encrypt by default). Use this skill when the operator asks to obtain a new TLS cert for a hostname — specify the common name, the issuer, and the challenge type (dns-01 needs a DNS provider credential).attach_storage— Provision a cloud volume, attach it to a running NodeInstance, and mount it at the requested path. Composes VolumeManagementService.provision/attach + SshExecutionService for filesystem setup.attribute_failure— Given a failed NodeInstance, rank recent module changes + promotions by likelihood of being the causeboot_image_drift_rollout— Plan a canary-first, halt-on-failure in-place boot-image upgrade across all drifted instances on a node platform, converging the fleet onto the promoted image.capacity_recommend— Recommend instance count or instance-type adjustments for a Template's fleet based on heartbeat health and assignment densityconfigure_sdwan_for_project— Create an SDWAN network for a project, attach the supplied instances as peers, optionally provision a project VIP, and compile the topology preview. Composes Sdwan::Network + Sdwan::PeerEnroller + Sdwan::VirtualIp + Sdwan::TopologyCompiler.deploy_app_code— Deploy a Git repository onto a provisioned NodeInstance via SSH+systemddiscover_packages_by_intent— Intent-based package discovery — describe a capability need ('reverse proxy', 'distributed cache') and get ranked packages from accessible repositories. Use system_search_packages instead when you already know the package name and just want filter/browse.docker_provision— Provision a managed Docker daemon on a NodeInstance — auto-registers as a Devops::DockerHost bound to the SDWAN overlay /128drift_remediate— Compare a NodeInstance's running modules against its assigned modules; returns a planned action set + estimated disruption %. PLANS ONLY — it applies nothing, soresolvedis true only when there was no drift to applyexpose_service_local— Expose a backend service locally at a friendly /svc/ path on the platform's own host(s), authenticated by the reverse proxy (ForwardAuth). Use this when an operator asks to 'publish for our users', 'put behind /svc/ with login', or otherwise make an overlay/internal service reachable to the site's own authenticated users (NOT the public internet — use expose_service_publicly for that). Creates or updates the Sdwan::Service, enables its local-exposure facet, and regenerates the reverse proxy.expose_service_public_tcp— Toggle a backend service's public (Path B) TLS-carrying TCP exposure via Traefik HostSNI routing. Use this when an operator asks to 'publish on the public internet over raw TLS/TCP', 'turn on/off public exposure for ', or otherwise flip Sdwan::Service#public_enabled. EXPOSE (enabled: true, default) validates the service's protocol is tls, that a HostSNI host resolves, and — under edge_mode terminate — that a matching valid ACME certificate exists, before enabling. UNEXPOSE (enabled: false) simply disables it. NOT for HTTP(S) (use expose_service_publicly) or the site-local /svc plane (use expose_service_local).expose_service_publicly— Expose a backend service to the public internet end-to-end — provisions an SDWAN Virtual IP, a hub DNAT port mapping (443 for https / 80 for http), an ACME TLS certificate for the hostname, and regenerates the reverse proxy. Use this when an operator asks to 'make reachable from the internet at ', 'put a public endpoint in front of ', or otherwise publish an internal service with TLS.fulfill_capability_request— On-demand: turn an NL capability request into a running, leased instance. Composes a plan and creates a DURABLE System::FulfillmentRequest (state machine); approval is an out-of-band transition on the persisted, frozen plan.gitops_apply_proposal— Apply one approved GitOps drift proposal to live fleet state (template / module / assignment / pool / platform diffs) and mark it implemented; a stale-conflict or unsupported diff is refused with the reasongitops_register_repository— Register a Git repository as a declarative source of fleet state the GitOps Reconciler syncs every 5 minutes (branch, path prefix, Vault credential path, auto_apply, SSH host key); the first sync runs on the next reconcile tickgitops_sync_repository— Sync one registered GitOps repository now: clone/fast-forward it, diff its desired fleet state against the live fleet and open one Ai::AgentProposal per drifted resource; returns the finalized sync run handle. Applies nothinglist_package_repositories_summary— Summarize the package repositories configured for the operator's account — counts, kinds (apt/rpm/dnf), visibility (shared vs account), sync status. Use for 'how many package repos', 'what package sources', 'list my repositories', or similar inventory queries.module_compose— Compose a Template draft from a workload description — SEMANTICALLY ranks modules (embedding cosine, keyword fallback), runs conflict checks, and surfaces package gaps to materialize when no module covers a capabilitymodule_smoke_verify— Compose a newly-built module onto a pooled instance atop base-os and assert it's healthy (systemd unit active, manifest health endpoint answers, ldd closure complete)package_module_create— Materialize an apt/rpm package + transitive dep closure as NodeModule rows + ModuleDependency edges, then dispatch a CI buildpackage_module_refresh— Re-materialize a NodeModule's source package when upstream drifts (replays persisted recommends_chosen for determinism)package_repository_sync— Enqueue a background sync of upstream apt/rpm metadata for one package repository (account-scoped or shared); returns once queued, the sync runs out-of-processplatform_health_check— COMPOSITE platform health snapshot — the Rails API, worker, Sidekiq, Redis, PostgreSQL, the reverse proxy, the MCP endpoint, fleet tick liveness, provider egress and fleet error/silent counts, delegated whole to System::Platform::CompositeHealthProbe. Every subsystem gets its own entry; a subsystem that could not be observed reports not_measured, never ok. Use this skill when the operator asks whether the platform itself is healthy, degraded or down.platform_maintenance— Routine platform maintenance — certificate renewal, drift checks. Use this skill when the operator asks about (a) which certs are expiring soon, (b) whether they should rotate something, or (c) whether any instances have drifted from the modules their node is assigned. For the composite platform health answer, use platform_health_check instead.platform_resilience— Platform incident response — cordon and stop an instance, scale a deployment up/down (this action and the Scaling panel's PATCH both reconcile the live replica count after writing target_replicas; the GitOps bridge still only records it), or triage peer/instance health. Use this skill when the operator describes a stress event (instance misbehaving, capacity pressure, peer heartbeats stale) or asks 'what should I do about X'.provision_cluster— Provision N instances of a Template in a region — composes create_node + provision_instance for eachprovision_full_stack— Provision a full compute+network+storage stack from a template — composes provision_instance + optional storage volume + optional SDWAN peer enrollmentrelocate_workload— Relocate a project's compute workload from one region to another via blue/green or drain cutover. Composes ProvisionFullStackExecutor (target) + ProvisioningService.terminate_instance (source).restore_volume— Restore a ProviderVolume from one of its completed snapshots. Read restored_in_place in the outputs: true means the volume was rolled back and writes made since the snapshot are DISCARDED; false means the provider copied the snapshot into a new volume (restored_volume_id) and the source volume is unchanged — pass swap_into_place to have the copy swapped onto the source's instance and device (swapped in the outputs). Optionally takes a fresh snapshot first so the pre-restore state stays recoverable. Refuses on providers with no snapshot or no restore primitive rather than reporting a restore that did not happen.reverse_proxy_compose— Regenerate the reverse-proxy (Traefik) dynamic config for a certificate's account. Use this skill when an operator wants a valid certificate's HTTPS routers brought online (or refreshed) in the reverse proxy — it re-emits the account's dynamic YAML from its valid certs; Traefik file-watches and reloads automatically.rolling_module_upgrade— Size a FLEET-ATOMIC module upgrade for a NodeModule across all instances of a Template. The upgrade cannot be staged or batched: the served version resolves from a per-MODULE pointer (NodeModule#current_version_id), so every instance carrying the module converges together. PLAN ONLY — the plan is NOT executed; nothing in the platform moves the pointer from this plan. See the class doc for the manual procedure and for real staging options.scale_project— Adapt a provisioning project's footprint — add replicas in-region, remove the newest replicas, plan a vertical resize, or expand into a new region. Composes ProvisionFullStackExecutor + RollingModuleUpgradeExecutor.sdwan_compose_full_topology— Orchestrate the three SDWAN composition primitives (HostBridge, OVN, IPFIX) in one tool call. Composes SdwanHostBridgeComposeExecutor + SdwanOvnComposeTopologyExecutor + SdwanIpfixCollectorComposeExecutor.sdwan_host_bridge_compose— Allocate per-host SDWAN bridges (Linux for lightweight profile, OVS for heavyweight) for a set of NodeInstances. Composes Sdwan::HostBridgeAllocator. Idempotent.sdwan_ipfix_collector_compose— Register an IPFIX collector for an account so the topology compiler can stamp ipfix exporter config onto every heavyweight (ovs-kind) HostBridge in the per-host payload. Idempotent on (account, name). Composes Sdwan::IpfixCollector.sdwan_ovn_apply_acl— Apply OVN ACLs (firewall rules) to a logical switch — heavyweight-profile only. Composes Sdwan::OvnAcl entries scoped to one switch and re-compiles the deployment plan. Idempotent on (switch, acl_name).sdwan_ovn_compose_topology— Compose an OVN logical-network topology (deployment + logical switches + ports) for a heavyweight-profile account, then compile the ovn-nbctl plan. Composes Sdwan::OvnDeployment + Sdwan::OvnLogicalSwitch + Sdwan::OvnLogicalSwitchPort + Sdwan::OvnCompiler.service_discovery_composer— Make a backend service discoverable across the fleet over the SDWAN overlay end-to-end — provisions a Virtual IP (auto-advertised via iBGP for in-overlay discovery), publishes a VIP-backed federation service-catalog offering for federated peers, regenerates the local Traefik routes, and OPTIONALLY publishes a public DNS record (A/AAAA/CNAME) for internet-facing names. Use this when an operator asks to 'make discoverable', 'publish to the service catalog', or 'advertise to other sites'.suggest_architectures_for_fleet— Suggest which canonical architectures to materialize a package for, based on the current fleet's NodePlatform coverage and the repository's served architectures.
runbook_generate— Generate a markdown operational runbook for a NodeTemplate — boot order, common failure modes, recovery procedures
federation_acceptance— Complete a federation handshake from a single-use acceptance token — runs the full accept chain (accept transition, platform enroll, managed-child operator grant, node_api bootstrap-token issuance, SDWAN overlay attach, and a federation governance health scan). Use when an operator wants to finish peering with a proposed federation peer whose acceptance token they hold.federation_manager— Survey federation peer + grant + cert health for an account and surface findings the operator (or a future autonomy loop) should action.federation_peer_remediate— Remediate a stale or cert-expiring federation peer: re-handshake a stale peer over mTLS (recovering it if reachable), degrade an unreachable active peer, or alert the operator that a federation cert needs an operator-driven rotation. Invoked by the fleet DecisionEngine off the FederationPeerLivenessSensor.multi_tenant_isolation— Provision a fully-isolated SDWAN network slice for a single tenant inside the account: a dedicated overlay network with its own VRF + isolated iBGP RIB (no shared routing table), a non-overlapping /64 (Sdwan::PrefixAllocator), default-deny nftables firewall rules scoped to the tenant CIDR, an OVN logical switch, and tenant-CIDR OVN ACLs. Composes Sdwan::Network + Sdwan::PrefixAllocator + Sdwan::FirewallRule + SdwanOvnComposeTopologyExecutor + SdwanOvnApplyAclExecutor. SDWAN-native — no k8s NetworkPolicy, no VLAN. Use when an operator asks to 'isolate tenant ', 'give its own segregated network', or 'stand up a blast-radius boundary for '.sdwan_federation_compose— Stand up a federation overlay topology (hub-and-spoke OR full-mesh) by composing per-peer Sdwan::PeerEnroller + Sdwan::TopologyCompiler + Sdwan::Bgp::RoutePolicyCompiler. Creates one Sdwan::Network, enrolls each member as a peer (hubs publicly_reachable), and compiles the per-peer WireGuard + FRR route-policy envelope.
architecture_create— Directly create a custom (non-canonical) architecture. Requires system.architectures.manage; surfaces for operator approval via intervention policy.architecture_delete— Delete a non-canonical architecture. Fails if any NodePlatform still references it. Canonical rows are immutable and return an error.architecture_propose— Propose adding a new architecture to the platform-wide catalog (creates an Ai::AgentProposal for human review).architecture_update— Update a non-canonical architecture's fields. Canonical rows are immutable and return an error.disk_image_promote— Promote a published disk-image publication to its NodePlatform's active default — every instance provisioned on the platform afterwards boots from it; the previously active publication is retired in the same transactiondisk_image_retention— Set a NodePlatform's disk-image retention count — how many publications the purge sweep keeps before soft-deleting older artifacts (1..50); reversible GC configurationdisk_image_rollback— Roll a NodePlatform's active disk image back to a prior publication — an explicit one, else the newest retired publication, else the newest published one that is not current; restores a retired artifact and retires the previously active publication in one transactionpromote_replica— Promote a postgres streaming replica to primary after the primary is provider-confirmed down: cut the DB VIP over to the replica's SDWAN peer, fence the old primary, and dispatch the module-declared pg_ctl promote. Refuses a live primary outright and refuses an unknown or over-bound replication lag unless the operator accepts the data loss.reap_instance— Terminate an unrecoverable NodeInstance whose workload has already been moved to a pooled replacement. The destructive half of a DR replace, gated separately from it.reap_orphan_pool_guest— Destroy a provider guest named for an ephemeral instance pool that no platform row knows — a VM left behind when its record went. Re-checked against the provider inventory and name-verified at the terminate; parks in a protected plane.replace_instance— Replace an unrecoverable NodeInstance with a warm pool member: acquire the replacement, reattach its volumes, re-enrol it on every SDWAN network the failed one held (inheriting the failed peer's routing ROLE rather than the schema defaults, with the endpoint re-derived from the replacement's own address so a replacement hub is not left advertising the dead instance's), move its VIPs, and re-home every published Sdwan::Service that dialled the failed instance by address onto the replacement (the dead member is drained, not removed, until the reap). The terminate of the failed instance is a SEPARATE approval, performed by ReapInstanceExecutor.
governance_gap_propose— File (or update) the one reviewable improvement offer for a governance gap the fleet tick detected — a declared category nobody owns, an agent without skills, a lane bound to no skill, an executor without a catalog row, a missing lineage edge or delegation policy — and materialise the runtime-closable ones under the Platform Architect's gates
sdwan_bgp_session_remediate— Triage an unhealthy iBGP session; returns a plan with likely cause + recommended next step. v1 does NOT auto-restart FRR.sdwan_credential_refresh— Re-issue an SDWAN peer's expiring membership credential server-side, without touching the WireGuard keypairsdwan_failover— Plan an SDWAN hub failover for an unreachable network; identifies promotion candidates without auto-flippingsdwan_peer_remediate— Rotate an SDWAN peer's keypair and force the agent to re-establish its tunnel on next reconcilesdwan_vip_failover— Promote the next failover candidate of a silent-holder Sdwan::VirtualIp. Anycast VIPs return informational only.
cve_remediation_orchestration— Orchestrate the full CVE → exposure → rebuild → rolling-upgrade chain for one CVEcve_response— Triage a CVE entry against the fleet — enumerates exposure, scores risk, proposes a remediation plancve_runbook_generate— Generate a markdown remediation runbook for a CVE — exposed modules, recommended steps, verification commands
platform_deploy— Deploy a new Powernode platform. Pass mode='standalone' for a sovereign platform. With no params, returns a wizard payload describing the form the operator should fill in. mode='federated' is NOT available here — it mints a single-use acceptance token that this surface cannot deliver; operators deploy federated platforms over POST /api/v1/system/platform/deployments, which reveals the token once in its HTTP response.
Provision (issue) a new ACME TLS certificate for the platform's public listeners. Creates the certificate record and drives it through issuance via the ACME server (Let's Encrypt by default). Use this skill when the operator asks to obtain a new TLS cert for a hostname — specify the common name, the issuer, and the challenge type (dns-01 needs a DNS provider credential).
- Class:
System::Ai::Skills::AcmeCertificateProvisionExecutor - Source:
extensions/system/server/app/services/system/ai/skills/acme_certificate_provision_executor.rb - Category: devops
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
common_name |
string | Yes | Primary hostname the cert secures (e.g. ops.example.com) |
sans |
array | No | Subject Alternative Names — additional hostnames the cert also secures |
issuer |
string | Yes | ACME issuer; one of: letsencrypt-prod, letsencrypt-staging, internal-ca |
challenge_type |
string | Yes | ACME challenge; one of: dns-01, http-01, tls-alpn-01 |
dns_credential_id |
string | No | System::AcmeDnsCredential id — REQUIRED when challenge_type is dns-01 (publishes the validation record) |
acme_email |
string | No | Operator contact email for ACME registration; falls back to platform/account default if omitted |
Outputs
certificate_id: stringcommon_name: stringissuer: stringchallenge_type: stringstatus: stringissued_at: stringexpires_at: stringvault_paths_present: boolean
Provision a cloud volume, attach it to a running NodeInstance, and mount it at the requested path. Composes VolumeManagementService.provision/attach + SshExecutionService for filesystem setup.
- Class:
System::Ai::Skills::AttachStorageExecutor - Source:
extensions/system/server/app/services/system/ai/skills/attach_storage_executor.rb - Category: devops
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
instance_id |
string | Yes | System::NodeInstance to attach the volume to |
size_gb |
integer | Yes | Volume size in GiB (1-16384) |
volume_type |
string | No | Optional ProviderVolumeType name (e.g. 'gp3'); falls back to provider default when nil |
mount_point |
string | No | Filesystem mount path on the instance |
dry_run |
boolean | No | Plan only — no volume creation, no SSH |
Outputs
dry_run: booleancount: integerplanned_actions: arrayoutputs: {:node_instance_ids=>[:string], :storage_volume_ids=>[:string], :mount=>:object}failures: arraypartial: boolean- Class:
System::Ai::Skills::AttributeFailureExecutor - Source:
extensions/system/server/app/services/system/ai/skills/attribute_failure_executor.rb - Category: devops
candidates: arraytop_candidate: objectconfidence: decimalconfidence_state: stringconfidence_detail: objectreasoning: string- Class:
System::Ai::Skills::BootImageDriftRolloutExecutor - Source:
extensions/system/server/app/services/system/ai/skills/boot_image_drift_rollout_executor.rb - Category: devops
platform_id: stringtarget_git_sha: stringtotal_drifted: integerbatch_size: integerbatch_count: integerhalted: booleanhalt_reason: stringcircuit_breaker: objectbatches: arraydispatched_task_ids: arraydispatch_errors: arrayself_managed_excluded: arrayblast_radius_ceiling: integer- Class:
System::Ai::Skills::CapacityRecommendExecutor - Source:
extensions/system/server/app/services/system/ai/skills/capacity_recommend_executor.rb - Category: devops
template_id: stringtotal_count: integeractive_count: integersilent_count: integererrored_count: integerrecommendation: objectconfidence: string- Class:
System::Ai::Skills::ConfigureSdwanForProjectExecutor - Source:
extensions/system/server/app/services/system/ai/skills/configure_sdwan_for_project_executor.rb - Category: devops
dry_run: booleancount: integertopology: stringplanned_actions: arrayoutputs: {:sdwan_network_id=>:string, :sdwan_peer_ids=>[:string], :virtual_ip_id=>:string, :topology_preview=>[:object]}failures: arraypartial: boolean- Class:
System::Ai::Skills::DeployAppCodeExecutor - Source:
extensions/system/server/app/services/system/ai/skills/deploy_app_code_executor.rb - Category: devops
deployment_id: stringcommit_sha: stringpublic_url: string- Class:
System::Ai::Skills::DiscoverPackagesByIntentExecutor - Source:
extensions/system/server/app/services/system/ai/skills/discover_packages_by_intent_executor.rb - Category: devops
intent: stringresults: arrayseed_count: integerconfidence: string- Class:
System::Ai::Skills::DockerProvisionExecutor - Source:
extensions/system/server/app/services/system/ai/skills/docker_provision_executor.rb - Category: devops
dry_run: booleanhost_id: stringhost_status: stringapi_endpoint: stringalready_provisioned: booleanplan: object- Class:
System::Ai::Skills::DriftRemediateExecutor - Source:
extensions/system/server/app/services/system/ai/skills/drift_remediate_executor.rb - Category: devops
resolved: booleanrequires_approval: booleandisruption_pct: integerplanned_actions: {:attach=>[:string], :detach=>[:string], :update=>[:string]}- Class:
System::Ai::Skills::ExposeServiceLocalExecutor - Source:
extensions/system/server/app/services/system/ai/skills/expose_service_local_executor.rb - Category: devops
service_id: stringslug: stringname: stringlocal_path: stringlocal_url: stringauth_mode: stringhost: stringlocal_services_path: stringroutes_configured: integercreated: boolean- Class:
System::Ai::Skills::ExposeServicePublicTcpExecutor - Source:
extensions/system/server/app/services/system/ai/skills/expose_service_public_tcp_executor.rb - Category: devops
service_id: stringslug: stringpublic_enabled: booleanedge_mode: stringclient_auth: stringhost: stringlocal_services_path: stringroutes_configured: integer- Class:
System::Ai::Skills::ExposeServicePubliclyExecutor - Source:
extensions/system/server/app/services/system/ai/skills/expose_service_publicly_executor.rb - Category: devops
service_hostname: stringvip_id: stringvip_cidr: stringport_mapping_id: stringcertificate_id: stringcertificate_status: stringpublic_endpoints: arraysteps_completed: arraywarnings: array- Class:
System::Ai::Skills::FulfillCapabilityRequestExecutor - Source:
extensions/system/server/app/services/system/ai/skills/fulfill_capability_request_executor.rb - Category: devops
fulfillment_request_id: stringstate: stringplan: objectexecuted: booleanrequires_approval: booleanreused_modules: arraymaterialized_modules: arraybuild_batch_id: stringtemplate_id: stringinstance_id: stringinstance_ids: arraylease: objectleases: arraysmoke: objectparked: arrayunresolved_gaps: arrayapproval_withheld_reason: string- Class:
System::Ai::Skills::GitopsApplyProposalExecutor - Source:
extensions/system/server/app/services/system/ai/skills/gitops_apply_proposal_executor.rb - Category: devops
applied: booleanapplied_action: stringresource_id: stringproposal_id: stringproposal_status: string- Class:
System::Ai::Skills::GitopsRegisterRepositoryExecutor - Source:
extensions/system/server/app/services/system/ai/skills/gitops_register_repository_executor.rb - Category: devops
repository_id: stringname: stringbranch: stringpath_prefix: stringauto_apply: booleanlast_status: stringssh_host_key_fingerprints: arrayssh_host_key_source: string- Class:
System::Ai::Skills::GitopsSyncRepositoryExecutor - Source:
extensions/system/server/app/services/system/ai/skills/gitops_sync_repository_executor.rb - Category: devops
repository_id: stringsync_run_id: stringdiff_count: integerproposal_ids: arraysynced_revision: stringdiff_summary: object- Class:
System::Ai::Skills::ListPackageRepositoriesSummaryExecutor - Source:
extensions/system/server/app/services/system/ai/skills/list_package_repositories_summary_executor.rb - Category: devops
total: integerby_kind: objectby_visibility: objectby_sync_status: objectrepositories: arraysummary: string- Class:
System::Ai::Skills::ModuleComposeExecutor - Source:
extensions/system/server/app/services/system/ai/skills/module_compose_executor.rb - Category: devops
draft_template: objectconflicts: arraygaps: arraycandidate_count: integerranking_mode: stringreasoning: string- Class:
System::Ai::Skills::ModuleSmokeVerifyExecutor - Source:
extensions/system/server/app/services/system/ai/skills/module_smoke_verify_executor.rb - Category: devops
ok: booleanmodule_name: stringbase_os_module_name: stringinstance_id: stringtemplate_id: stringchecks: arrayMaterialize an apt/rpm package + transitive dep closure as NodeModule rows + ModuleDependency edges, then dispatch a CI build
- Class:
System::Ai::Skills::PackageModuleCreateExecutor - Source:
extensions/system/server/app/services/system/ai/skills/package_module_create_executor.rb - Category: devops
Inputs
Field Type Required Description repository_idstring Yes - package_namestring Yes - architecturesarray No Defaults to repository.architectures if omitted recommends_selectedarray No Per-edge recommends opt-in list (defaults to none) category_idstring No - Outputs
top_level_module_id: stringdependency_count: integerrecommends_count: integerbuild_dispatches: arraywarnings: array
Re-materialize a NodeModule's source package when upstream drifts (replays persisted recommends_chosen for determinism)
- Class:
System::Ai::Skills::PackageModuleRefreshExecutor - Source:
extensions/system/server/app/services/system/ai/skills/package_module_refresh_executor.rb - Category: devops
Inputs
Field Type Required Description package_module_link_idstring Yes PackageModuleLink.id of the module to refresh forceboolean No - Outputs
enqueued: booleanpackage_module_link_id: string
Enqueue a background sync of upstream apt/rpm metadata for one package repository (account-scoped or shared); returns once queued, the sync runs out-of-process
- Class:
System::Ai::Skills::PackageRepositorySyncExecutor - Source:
extensions/system/server/app/services/system/ai/skills/package_repository_sync_executor.rb - Category: devops
Inputs
Field Type Required Description repository_idstring Yes PackageRepository.id Outputs
ok: booleanqueued: booleanstatus: stringrepository_id: string
COMPOSITE platform health snapshot — the Rails API, worker, Sidekiq, Redis, PostgreSQL, the reverse proxy, the MCP endpoint, fleet tick liveness, provider egress and fleet error/silent counts, delegated whole to System::Platform::CompositeHealthProbe. Every subsystem gets its own entry; a subsystem that could not be observed reports not_measured, never ok. Use this skill when the operator asks whether the platform itself is healthy, degraded or down.
- Class:
System::Ai::Skills::PlatformHealthCheckExecutor - Source:
extensions/system/server/app/services/system/ai/skills/platform_health_check_executor.rb - Category: devops
Outputs
action: stringdata: objectrecommendations: array
Routine platform maintenance — certificate renewal, drift checks. Use this skill when the operator asks about (a) which certs are expiring soon, (b) whether they should rotate something, or (c) whether any instances have drifted from the modules their node is assigned. For the composite platform health answer, use platform_health_check instead.
- Class:
System::Ai::Skills::PlatformMaintenanceExecutor - Source:
extensions/system/server/app/services/system/ai/skills/platform_maintenance_executor.rb - Category: devops
Inputs
Field Type Required Description actionstring Yes One of: cert_status, cert_rotate, drift_check, health_check certificate_idstring No Cert id (only for cert_rotate of a specific row; omit to rotate all expiring) deployment_idstring No PlatformDeployment id (for drift_check; omit to scan all deployments) renewal_window_daysinteger No How many days ahead to consider a cert 'expiring soon' (cert_status / cert_rotate) Outputs
action: stringdata: objectrecommendations: array
Platform incident response — cordon and stop an instance, scale a deployment up/down (this action and the Scaling panel's PATCH both reconcile the live replica count after writing target_replicas; the GitOps bridge still only records it), or triage peer/instance health. Use this skill when the operator describes a stress event (instance misbehaving, capacity pressure, peer heartbeats stale) or asks 'what should I do about X'.
- Class:
System::Ai::Skills::PlatformResilienceExecutor - Source:
extensions/system/server/app/services/system/ai/skills/platform_resilience_executor.rb - Category: devops
Inputs
Field Type Required Description actionstring Yes One of: drain_instance, scale, failover_check instance_idstring No NodeInstance id (required for drain_instance) deployment_idstring No PlatformDeployment id (required for scale) directionstring No scale direction: set target_replicasinteger No When direction=set, the new target_replicas value Outputs
action: stringdata: objectrecommendations: array
Provision N instances of a Template in a region — composes create_node + provision_instance for each
- Class:
System::Ai::Skills::ProvisionClusterExecutor - Source:
extensions/system/server/app/services/system/ai/skills/provision_cluster_executor.rb - Category: devops
Inputs
Field Type Required Description template_idstring Yes - countinteger Yes Number of nodes/instances to spin up (1-50) provider_region_idstring Yes - provider_instance_type_idstring Yes - name_prefixstring No Prefix for node names (default: "node") dry_runboolean No Plan only — return projected actions without creating resources Outputs
dry_run: booleancount: integercreated_nodes: arrayprovisioned: arrayoutputs: {:node_ids=>[:string], :node_instance_ids=>[:string]}failures: arraypartial: boolean- Class:
System::Ai::Skills::ProvisionFullStackExecutor - Source:
extensions/system/server/app/services/system/ai/skills/provision_full_stack_executor.rb - Category: devops
dry_run: booleancount: integerplanned_actions: arrayoutputs: {:node_ids=>[:string], :node_instance_ids=>[:string], :sdwan_peer_ids=>[:string], :storage_volume_ids=>[:string]}failures: arraypartial: boolean- Class:
System::Ai::Skills::RelocateWorkloadExecutor - Source:
extensions/system/server/app/services/system/ai/skills/relocate_workload_executor.rb - Category: devops
dry_run: booleancount: integercutover_strategy: stringplanned_actions: arrayoutputs: {:node_ids=>[:string], :node_instance_ids=>[:string], :sdwan_peer_ids=>[:string], :storage_volume_ids=>[:string], :terminated_instance_ids=>[:string]}failures: arraypartial: boolean- Class:
System::Ai::Skills::RestoreVolumeExecutor - Source:
extensions/system/server/app/services/system/ai/skills/restore_volume_executor.rb - Category: devops
dry_run: booleancount: integerplanned_actions: arrayoutputs: {:storage_volume_ids=>[:string], :restored_from_snapshot_id=>:string, :pre_restore_snapshot_id=>:string, :restored_in_place=>:boolean, :restored_volume_id=>:string, :swapped=>:boolean}failures: arraypartial: boolean- Class:
System::Ai::Skills::ReverseProxyComposeExecutor - Source:
extensions/system/server/app/services/system/ai/skills/reverse_proxy_compose_executor.rb - Category: devops
certificate_id: stringcommon_name: stringstatus: stringdynamic_config_path: stringrouters_configured: integerlocal_services_path: stringlocal_services_configured: integer- Class:
System::Ai::Skills::RollingModuleUpgradeExecutor - Source:
extensions/system/server/app/services/system/ai/skills/rolling_module_upgrade_executor.rb - Category: devops
total_instances: integeraffected_instance_ids: arrayestimated_total_seconds: integercircuit_breaker: objectby_environment: objectblast_radius_ceiling_exceeded: boolean- Class:
System::Ai::Skills::ScaleProjectExecutor - Source:
extensions/system/server/app/services/system/ai/skills/scale_project_executor.rb - Category: devops
dry_run: booleancount: integerscaling_strategy: stringplanned_actions: arrayoutputs: {:node_ids=>[:string], :node_instance_ids=>[:string], :sdwan_peer_ids=>[:string], :storage_volume_ids=>[:string], :rolling_upgrade_plan=>:object, :sdwan_service_ids=>[:string], :sdwan_service_backend_ids=>[:string], :removed_node_instance_ids=>[:string], :detached_sdwan_peer_ids=>[:string], :deleted_storage_volume_ids=>[:string], :removed_sdwan_service_backend_ids=>[:string], :orphans=>[:object], :floor_reached=>:boolean, :prefix_enforced=>:string}failures: arraypartial: boolean- Class:
System::Ai::Skills::SdwanComposeFullTopologyExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_compose_full_topology_executor.rb - Category: devops
dry_run: booleanplanned_actions: arrayoutputs: {:host_bridges=>:object, :ovn=>:object, :ipfix=>:object}failures: arraypartial: boolean- Class:
System::Ai::Skills::SdwanHostBridgeComposeExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_host_bridge_compose_executor.rb - Category: devops
dry_run: booleanbridge_count: integerplanned_actions: arrayoutputs: {:host_bridge_ids=>[:string], :allocations=>[:object]}failures: arraypartial: boolean- Class:
System::Ai::Skills::SdwanIpfixCollectorComposeExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_ipfix_collector_compose_executor.rb - Category: devops
dry_run: booleanplanned_actions: arrayoutputs: {:ipfix_collector_id=>:string, :created=>:boolean, :name=>:string, :target_endpoint=>:string, :sampling_rate=>:integer, :state=>:string, :is_winning_collector=>:boolean}failures: arraypartial: boolean- Class:
System::Ai::Skills::SdwanOvnApplyAclExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_ovn_apply_acl_executor.rb - Category: devops
dry_run: booleanacl_count: integerplanned_actions: arrayoutputs: {:logical_switch_id=>:string, :ovn_acl_ids=>[:string], :allocations=>[:object], :compiled_plan=>:object}failures: arraypartial: boolean- Class:
System::Ai::Skills::SdwanOvnComposeTopologyExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_ovn_compose_topology_executor.rb - Category: devops
dry_run: booleanswitch_count: integerport_count: integerplanned_actions: arrayoutputs: {:ovn_deployment_id=>:string, :created_deployment=>:boolean, :logical_switch_ids=>[:string], :logical_switch_port_ids=>[:string], :compiled_plan=>:object}failures: arraypartial: boolean- Class:
System::Ai::Skills::ServiceDiscoveryComposerExecutor - Source:
extensions/system/server/app/services/system/ai/skills/service_discovery_composer_executor.rb - Category: devops
service_slug: stringvip_id: stringvip_cidr: stringvip_address: stringoffering_id: stringoffering_slug: stringroute_output_path: stringroute_count: integerdns_record_id: stringdns_record_fqdn: stringpublic_dns_published: booleansteps_completed: arraywarnings: array- Class:
System::Ai::Skills::SuggestArchitecturesForFleetExecutor - Source:
extensions/system/server/app/services/system/ai/skills/suggest_architectures_for_fleet_executor.rb - Category: devops
repository_id: stringsuggested: arrayrationale: arrayfallback: booleanconfidence: string- Class:
System::Ai::Skills::RunbookGenerateExecutor - Source:
extensions/system/server/app/services/system/ai/skills/runbook_generate_executor.rb - Category: documentation
runbook_markdown: stringsection_count: integerpersisted_page_id: stringsource_artifacts: object- Class:
System::Ai::Skills::FederationAcceptanceExecutor - Source:
extensions/system/server/app/services/system/ai/skills/federation_acceptance_executor.rb - Category: federation
peer_id: stringstatus: stringpeer_kind: stringcontract_version_agreed: integeraccepted_at: stringhandshake_at: stringnode_enrollment: objectsdwan_attach: objectgovernance: objectwarnings: array- Class:
System::Ai::Skills::FederationManagerExecutor - Source:
extensions/system/server/app/services/system/ai/skills/federation_manager_executor.rb - Category: federation
account_id: stringran_at: stringcert_rotation_candidates: arraygrants_approaching_expiry: arraygrants_overdue_for_review: arraybroad_scope_grants: arraycapability_drift: arrayfinding_count: integer- Class:
System::Ai::Skills::FederationPeerRemediateExecutor - Source:
extensions/system/server/app/services/system/ai/skills/federation_peer_remediate_executor.rb - Category: federation
remediated: booleanaction: stringreason: stringfederation_peer_id: stringpeer_status: stringreachable: booleandetail: string- Class:
System::Ai::Skills::MultiTenantIsolationExecutor - Source:
extensions/system/server/app/services/system/ai/skills/multi_tenant_isolation_executor.rb - Category: federation
dry_run: booleantenant_key: stringtenant_cidr: stringplanned_actions: arrayoutputs: {:sdwan_network_id=>:string, :sdwan_network_handle=>:string, :vrf_name=>:string, :tenant_cidr=>:string, :firewall_rule_ids=>[:string], :ovn_deployment_id=>:string, :ovn_logical_switch_id=>:string, :ovn_acl_ids=>[:string], :ovn_acl_allocations=>[:object]}failures: arraypartial: boolean- Class:
System::Ai::Skills::SdwanFederationComposeExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_federation_compose_executor.rb - Category: federation
dry_run: booleancount: integertopology: stringrouting_protocol: stringplanned_actions: arrayoutputs: {:sdwan_network_id=>:string, :sdwan_peer_ids=>[:string], :hub_peer_ids=>[:string], :topology_preview=>[:object], :route_policy_preview=>[:object]}failures: arraypartial: boolean- Class:
System::Ai::Skills::ArchitectureCreateExecutor - Source:
extensions/system/server/app/services/system/ai/skills/architecture_create_executor.rb - Category: fleet
architecture: object- Class:
System::Ai::Skills::ArchitectureDeleteExecutor - Source:
extensions/system/server/app/services/system/ai/skills/architecture_delete_executor.rb - Category: fleet
deleted: booleanarchitecture_id: string- Class:
System::Ai::Skills::ArchitectureProposeExecutor - Source:
extensions/system/server/app/services/system/ai/skills/architecture_propose_executor.rb - Category: fleet
proposal_id: stringstatus: stringreview_deadline: datetime- Class:
System::Ai::Skills::ArchitectureUpdateExecutor - Source:
extensions/system/server/app/services/system/ai/skills/architecture_update_executor.rb - Category: fleet
architecture: object- Class:
System::Ai::Skills::DiskImagePromoteExecutor - Source:
extensions/system/server/app/services/system/ai/skills/disk_image_promote_executor.rb - Category: fleet
promoted: booleanpublication_id: stringnode_platform_id: stringoci_ref: stringgit_sha: stringprevious_publication_id: string- Class:
System::Ai::Skills::DiskImageRetentionExecutor - Source:
extensions/system/server/app/services/system/ai/skills/disk_image_retention_executor.rb - Category: fleet
updated: booleannode_platform_id: stringretention_count: integerprevious_retention_count: integer- Class:
System::Ai::Skills::DiskImageRollbackExecutor - Source:
extensions/system/server/app/services/system/ai/skills/disk_image_rollback_executor.rb - Category: fleet
reverted: booleannode_platform_id: stringactivated_publication_id: stringprevious_publication_id: stringprevious_file_object_id: string- Class:
System::Ai::Skills::PromoteReplicaExecutor - Source:
extensions/system/server/app/services/system/ai/skills/promote_replica_executor.rb - Category: fleet
promoted: booleanreplayed: booleanmoved_virtual_ip_ids: arraypromote_task_id: stringfence_command: stringfence_dispatched: booleandata_loss_accepted: booleanblocked: boolean- Class:
System::Ai::Skills::ReapInstanceExecutor - Source:
extensions/system/server/app/services/system/ai/skills/reap_instance_executor.rb - Category: fleet
reaped: booleanfailed_instance_id: stringremoved_sdwan_service_backend_ids: arraystranded_sdwan_service_ids: arrayreplayed: boolean- Class:
System::Ai::Skills::ReapOrphanPoolGuestExecutor - Source:
extensions/system/server/app/services/system/ai/skills/reap_orphan_pool_guest_executor.rb - Category: fleet
reaped: booleanalready_gone: booleaninstance_pool_id: stringcloud_instance_id: stringguest_name: string- Class:
System::Ai::Skills::ReplaceInstanceExecutor - Source:
extensions/system/server/app/services/system/ai/skills/replace_instance_executor.rb - Category: fleet
replacement_instance_id: stringreattached_volume_ids: arrayenrolled_peer_ids: arraymoved_virtual_ip_ids: arrayrehomed_sdwan_service_ids: arrayreplayed_steps: arraypool_ready_count: integerblocked: booleanfailures: arraypartial: booleanreaped: booleanreap_decision: string- Class:
System::Ai::Skills::GovernanceGapProposeExecutor - Source:
extensions/system/server/app/services/system/ai/skills/governance_gap_propose_executor.rb - Category: governance
offer_id: stringdeduped: booleanrecommendation_type: stringmaterialization: object- Class:
System::Ai::Skills::SdwanBgpSessionRemediateExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_bgp_session_remediate_executor.rb - Category: sdwan
resolved: booleansession_id: stringstate: stringlikely_cause: stringrecommended_action: string- Class:
System::Ai::Skills::SdwanCredentialRefreshExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_credential_refresh_executor.rb - Category: sdwan
resolved: booleanmembership_credential_id: stringrevision: integernot_after: string- Class:
System::Ai::Skills::SdwanFailoverExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_failover_executor.rb - Category: sdwan
resolved: booleannetwork_id: stringcurrent_hub_count: integercandidates: {:peer_id=>:string, :endpoint_host=>:string, :endpoint_port=>:integer, :last_handshake_at=>:string}- Class:
System::Ai::Skills::SdwanPeerRemediateExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_peer_remediate_executor.rb - Category: sdwan
resolved: booleanrotated_from_key_id: stringnew_key_id: stringnew_public_key: string- Class:
System::Ai::Skills::SdwanVipFailoverExecutor - Source:
extensions/system/server/app/services/system/ai/skills/sdwan_vip_failover_executor.rb - Category: sdwan
resolved: booleanvirtual_ip_id: stringprevious_holder_peer_id: stringnew_holder_peer_id: stringanycast: boolean- Class:
System::Ai::Skills::CveRemediationOrchestrationExecutor - Source:
extensions/system/server/app/services/system/ai/skills/cve_remediation_orchestration_executor.rb - Category: security
cve_id: stringtriage: objectrefresh_dispatches: arrayrolling_upgrade_plans: arrayexposures_remediating: integerremediation_dispatched: booleanskipped_modules: arrayskipped_reason: string- Class:
System::Ai::Skills::CveResponseExecutor - Source:
extensions/system/server/app/services/system/ai/skills/cve_response_executor.rb - Category: security
cve_id: stringseverity: stringrisk_score: integerexposed_modules: arrayexposed_instance_count: integerremediation_plan: objectrequires_approval: boolean- Class:
System::Ai::Skills::CveRunbookGenerateExecutor - Source:
extensions/system/server/app/services/system/ai/skills/cve_runbook_generate_executor.rb - Category: security
runbook_markdown: stringcve_id: stringexposed_module_count: integerexposed_instance_count: integerrisk_score: integerrequires_approval: booleanpersisted_page_id: string- Class:
System::Ai::Skills::PlatformDeployExecutor - Source:
extensions/system/server/app/services/system/ai/skills/platform_deploy_executor.rb - Category: system
ok: booleancard: objectdeployment: object
Provision a full compute+network+storage stack from a template — composes provision_instance + optional storage volume + optional SDWAN peer enrollment
Inputs
Field Type Required Description template_idstring Yes System::NodeTemplate to instantiate countinteger Yes Number of node instances to provision (1-50) provider_region_idstring Yes System::ProviderRegion target provider_instance_type_idstring Yes System::ProviderInstanceType for each instance network_idstring No Sdwan::Network — when present, every instance this step provisions is enrolled onto the network and the NEW peer ids are returned with_storage_gbinteger No When present, provision a per-instance ProviderVolume of this size dry_runboolean No Plan only — return projected actions without creating any cloud resources Outputs
Relocate a project's compute workload from one region to another via blue/green or drain cutover. Composes ProvisionFullStackExecutor (target) + ProvisioningService.terminate_instance (source).
Inputs
Field Type Required Description project_idstring Yes Ai::Mission id (the provisioning project being relocated) from_region_idstring Yes System::ProviderRegion the workload is leaving (audit hint, no lookup) to_region_idstring Yes System::ProviderRegion the workload is moving to (target for new stack) cutover_strategystring Yes One of: blue_green, drain template_idstring Yes System::NodeTemplate to instantiate at the target region provider_instance_type_idstring Yes Instance type for the target stack countinteger Yes Number of new instances to bring up at the target (1-50) source_instance_idsarray Yes System::NodeInstance ids in the source region to terminate during cutover network_idstring No Sdwan::Network — when present, target instances are wired into the SDWAN topology and peer ids returned with_storage_gbinteger No When present, provision a per-instance ProviderVolume of this size at the target dry_runboolean No Plan only — return projected actions without provisioning or terminating Outputs
Restore a ProviderVolume from one of its completed snapshots. Read restored_in_place in the outputs: true means the volume was rolled back and writes made since the snapshot are DISCARDED; false means the provider copied the snapshot into a new volume (restored_volume_id) and the source volume is unchanged — pass swap_into_place to have the copy swapped onto the source's instance and device (swapped in the outputs). Optionally takes a fresh snapshot first so the pre-restore state stays recoverable. Refuses on providers with no snapshot or no restore primitive rather than reporting a restore that did not happen.
Inputs
Field Type Required Description snapshot_idstring Yes System::ProviderVolumeSnapshot to restore from (must be status 'completed') take_snapshot_firstboolean No Snapshot the volume's CURRENT state before restoring, so the pre-restore data stays recoverable swap_into_placeboolean No Copy-restore only: detach the source volume from its instance and attach the restored copy at the same device. Ignored on an in-place restore and when the source is not attached dry_runboolean No Plan only — no snapshot, no restore, no swap Outputs
Regenerate the reverse-proxy (Traefik) dynamic config for a certificate's account. Use this skill when an operator wants a valid certificate's HTTPS routers brought online (or refreshed) in the reverse proxy — it re-emits the account's dynamic YAML from its valid certs; Traefik file-watches and reloads automatically.
Inputs
Field Type Required Description certificate_idstring Yes AcmeCertificate id (must be status=valid) whose account's reverse-proxy config to regenerate Outputs
Size a FLEET-ATOMIC module upgrade for a NodeModule across all instances of a Template. The upgrade cannot be staged or batched: the served version resolves from a per-MODULE pointer (NodeModule#current_version_id), so every instance carrying the module converges together. PLAN ONLY — the plan is NOT executed; nothing in the platform moves the pointer from this plan. See the class doc for the manual procedure and for real staging options.
Inputs
Field Type Required Description template_idstring Yes - module_idstring Yes - target_version_idstring Yes - max_consecutive_failuresinteger No NOT IMPLEMENTED — echoed into the returned circuit_breaker hash and read by nothing health_timeout_secinteger No NOT IMPLEMENTED — echoed into the returned circuit_breaker hash and read by nothing Outputs
Adapt a provisioning project's footprint — add replicas in-region, remove the newest replicas, plan a vertical resize, or expand into a new region. Composes ProvisionFullStackExecutor + RollingModuleUpgradeExecutor.
Inputs
Field Type Required Description project_idstring Yes Ai::Mission id (the provisioning project being scaled) target_countinteger Yes Number of instances to add (add_replicas / add_region) or remove (remove_replicas) — bounded 1..50. Ignored for vertical_resize. scaling_strategystring Yes One of: add_replicas, vertical_resize, add_region, remove_replicas template_idstring No System::NodeTemplate to instantiate (add_replicas / add_region) or whose fleet is being resized (vertical_resize) provider_region_idstring No Region for new instances (add_replicas: same as project; add_region: NEW region) provider_instance_type_idstring No Instance type for new instances module_idstring No vertical_resize: System::NodeModule whose target_version replaces in-place target_version_idstring No vertical_resize: target System::NodeModuleVersion id network_idstring No add_region: optional Sdwan::Network to attach new instances to with_storage_gbinteger No add_region: optional per-instance volume size name_prefixstring No Blast-radius marker. add_replicas/add_region stamp it onto new node names; remove_replicas refuses any victim whose name lacks it (hard error). Defaults to the mission's own prefix — when the mission declares none the rail is not applied, and outputs.prefix_enforced says so. dry_runboolean No Plan only — return projected actions without creating any cloud resources Outputs
Orchestrate the three SDWAN composition primitives (HostBridge, OVN, IPFIX) in one tool call. Composes SdwanHostBridgeComposeExecutor + SdwanOvnComposeTopologyExecutor + SdwanIpfixCollectorComposeExecutor.
Inputs
Field Type Required Description host_node_instance_idsarray Yes System::NodeInstance ids — passed through to host_bridge_compose kindstring No Optional explicit bridge kind override (linux ovn_topologyobject No Optional OVN composition payload: {nb_db_endpoint, sb_db_endpoint, northd_host?, switches} — when supplied, runs sdwan_ovn_compose_topology ipfix_collectorobject No Optional IPFIX collector payload: {name, host, port, sampling_rate?} — when supplied, runs sdwan_ipfix_collector_compose dry_runboolean No Plan only — invokes each sub-skill in dry_run mode Outputs
Allocate per-host SDWAN bridges (Linux for lightweight profile, OVS for heavyweight) for a set of NodeInstances. Composes Sdwan::HostBridgeAllocator. Idempotent.
Inputs
Field Type Required Description host_node_instance_idsarray Yes System::NodeInstance ids to allocate bridges for (1-100) kindstring No Optional explicit bridge kind override: linux dry_runboolean No Plan only — no Sdwan::HostBridge rows are persisted Outputs
Register an IPFIX collector for an account so the topology compiler can stamp ipfix exporter config onto every heavyweight (ovs-kind) HostBridge in the per-host payload. Idempotent on (account, name). Composes Sdwan::IpfixCollector.
Inputs
Field Type Required Description namestring Yes Display name for the collector — unique per account; reused on re-execution hoststring Yes Collector host (IPv4, IPv6, or hostname). IPv6 addresses are bracketed automatically when emitted to ovs-vsctl. portinteger Yes Collector UDP port (1-65535) sampling_rateinteger No Sampling rate (1 = export every flow). Ignored when re-using an existing collector. dry_runboolean No Plan only — no Sdwan::IpfixCollector row is persisted Outputs
Apply OVN ACLs (firewall rules) to a logical switch — heavyweight-profile only. Composes Sdwan::OvnAcl entries scoped to one switch and re-compiles the deployment plan. Idempotent on (switch, acl_name).
Inputs
Field Type Required Description logical_switch_idstring Yes Sdwan::OvnLogicalSwitch id the ACLs apply to (must belong to the executing account) aclsarray Yes Array of {name, direction, priority?, match, action} (1-100). direction: from-lport dry_runboolean No Plan only — no Sdwan::OvnAcl rows are persisted Outputs
Compose an OVN logical-network topology (deployment + logical switches + ports) for a heavyweight-profile account, then compile the ovn-nbctl plan. Composes Sdwan::OvnDeployment + Sdwan::OvnLogicalSwitch + Sdwan::OvnLogicalSwitchPort + Sdwan::OvnCompiler.
Inputs
Field Type Required Description switchesarray Yes Array of {name, cidr?, ports: [{name, kind, addresses?, host_node_instance_id?}]} (1-50) nb_db_endpointstring No OVN NB DB endpoint (e.g., tcp:127.0.0.1:6641) — required only when the account has no OvnDeployment yet sb_db_endpointstring No OVN SB DB endpoint (e.g., tcp:127.0.0.1:6642) — required only when the account has no OvnDeployment yet northd_hoststring No Advisory hint for which host runs ovn-northd — only used when creating a new deployment dry_runboolean No Plan only — no Sdwan rows are persisted Outputs
Make a backend service discoverable across the fleet over the SDWAN overlay end-to-end — provisions a Virtual IP (auto-advertised via iBGP for in-overlay discovery), publishes a VIP-backed federation service-catalog offering for federated peers, regenerates the local Traefik routes, and OPTIONALLY publishes a public DNS record (A/AAAA/CNAME) for internet-facing names. Use this when an operator asks to 'make discoverable', 'publish to the service catalog', or 'advertise to other sites'.
Inputs
Field Type Required Description service_namestring Yes Human-readable name of the service (catalog display name) service_slugstring Yes Lowercase-alphanumeric-hyphen slug — the catalog's natural key (also names the VIP). e.g. 'orders-api' sdwan_network_idstring Yes SDWAN network the VIP lives in backend_peer_idstring Yes Sdwan::Peer that hosts the service; seated as the VIP's primary holder (and thus the iBGP advertiser) backend_portinteger Yes Port the backend service listens on (advertised in the catalog offering) vip_cidrstring Yes Operator-supplied host CIDR for the VIP (a /128 v6 or /32 v4) within the SDWAN network's /64 protocolstring No Service protocol advertised in the catalog: one of https, http, tcp, tls grant_scopesarray No Default FederationGrant scopes subscribers receive (subset of read, write, admin, migrate). Defaults to ['read'] grant_ttl_daysinteger No Default grant TTL in days (>= 7). Defaults to the offering default traefik_dynamic_dirstring No Override for the Traefik dynamic-config directory (defaults to /etc/traefik/dynamic) public_dnsobject No INTERNET-FACING name only: { dns_credential_id, record_name, record_type? (A Outputs
Suggest which canonical architectures to materialize a package for, based on the current fleet's NodePlatform coverage and the repository's served architectures.
Inputs
Field Type Required Description repository_idstring Yes PackageRepository.id whose architectures bound the suggestion set max_suggestionsinteger No Cap on the number of suggested arches (1-7) Outputs
Generate a markdown operational runbook for a NodeTemplate — boot order, common failure modes, recovery procedures
Inputs
Field Type Required Description template_idstring Yes - persist_as_pageboolean No Save the result as a Pages document so it's reachable via list_pages Outputs
Complete a federation handshake from a single-use acceptance token — runs the full accept chain (accept transition, platform enroll, managed-child operator grant, node_api bootstrap-token issuance, SDWAN overlay attach, and a federation governance health scan). Use when an operator wants to finish peering with a proposed federation peer whose acceptance token they hold.
Inputs
Field Type Required Description acceptance_tokenstring Yes The single-use acceptance token plaintext (from the propose step). Consumed on success. contract_versioninteger Yes Contract version to agree on. Must be one of the supported versions (currently [1]). capabilitiesobject No Forward-compat capability advertisement exchanged with the peer. extension_slugsarray No Extension slugs the peer carries (e.g. ['trading']). endpointsarray No Peer endpoints: array of { url, scope, priority, cidr_hint? }. Outputs
Survey federation peer + grant + cert health for an account and surface findings the operator (or a future autonomy loop) should action.
Outputs
Remediate a stale or cert-expiring federation peer: re-handshake a stale peer over mTLS (recovering it if reachable), degrade an unreachable active peer, or alert the operator that a federation cert needs an operator-driven rotation. Invoked by the fleet DecisionEngine off the FederationPeerLivenessSensor.
Inputs
Field Type Required Description federation_peer_idstring Yes System::FederationPeer to remediate reasonstring No Liveness failure class from the sensor: heartbeat_stale dry_runboolean No Plan-only mode — report the action that would be taken without probing, degrading, or alerting Outputs
Provision a fully-isolated SDWAN network slice for a single tenant inside the account: a dedicated overlay network with its own VRF + isolated iBGP RIB (no shared routing table), a non-overlapping /64 (Sdwan::PrefixAllocator), default-deny nftables firewall rules scoped to the tenant CIDR, an OVN logical switch, and tenant-CIDR OVN ACLs. Composes Sdwan::Network + Sdwan::PrefixAllocator + Sdwan::FirewallRule + SdwanOvnComposeTopologyExecutor + SdwanOvnApplyAclExecutor. SDWAN-native — no k8s NetworkPolicy, no VLAN. Use when an operator asks to 'isolate tenant ', 'give its own segregated network', or 'stand up a blast-radius boundary for '.
Inputs
Field Type Required Description tenant_keystring Yes Stable tenant identifier within the account (slug-safe; used to name the network, firewall rules, OVN switch, and ACLs). e.g. 'acme-prod'. network_namestring No Display name for the tenant's Sdwan::Network (defaults to 'tenant-<tenant_key>'). tenant_cidrstring No Explicit tenant CIDR for the firewall + ACL selectors. When omitted, the /64 auto-allocated for the new network (PrefixAllocator) is used — the recommended path. nb_db_endpointstring No OVN NB DB endpoint (e.g. tcp:127.0.0.1:6641) — required only when the account has no Sdwan::OvnDeployment yet. sb_db_endpointstring No OVN SB DB endpoint (e.g. tcp:127.0.0.1:6642) — required only when the account has no Sdwan::OvnDeployment yet. ovn_switch_namestring No Override the OVN logical switch name (defaults to 'ls-tenant-<tenant_key>'). dry_runboolean No Plan only — no Sdwan rows are persisted. Outputs
Stand up a federation overlay topology (hub-and-spoke OR full-mesh) by composing per-peer Sdwan::PeerEnroller + Sdwan::TopologyCompiler + Sdwan::Bgp::RoutePolicyCompiler. Creates one Sdwan::Network, enrolls each member as a peer (hubs publicly_reachable), and compiles the per-peer WireGuard + FRR route-policy envelope.
Inputs
Field Type Required Description network_namestring Yes Display name for the new federation Sdwan::Network topologystring Yes One of: hub_and_spoke, full_mesh peersarray Yes Member descriptors (1-200). Each: {node_instance_id (required), role: 'hub' routing_protocolstring No One of: static, ibgp — 'ibgp' enables FRR route-policy distribution dry_runboolean No Plan only — no Sdwan::Network/Peer rows are persisted Outputs
Directly create a custom (non-canonical) architecture. Requires system.architectures.manage; surfaces for operator approval via intervention policy.
Inputs
Field Type Required Description namestring Yes - familystring Yes - apt_namestring No - rpm_namestring No - display_namestring No - descriptionstring No - enabledboolean No - publicboolean No - Outputs
Delete a non-canonical architecture. Fails if any NodePlatform still references it. Canonical rows are immutable and return an error.
Inputs
Field Type Required Description architecture_idstring Yes - Outputs
Propose adding a new architecture to the platform-wide catalog (creates an Ai::AgentProposal for human review).
Inputs
Field Type Required Description namestring Yes Canonical lowercase name (e.g. loongarch64, mips64el) familystring Yes One of: x86, arm, power, z, risc-v, mips, other apt_namestring No apt-style name (e.g. amd64 for x86_64) rpm_namestring No rpm-style name (matches namefor most arches)display_namestring No - descriptionstring No - justificationstring No Why this arch is needed — surfaces in the approval UI Outputs
Update a non-canonical architecture's fields. Canonical rows are immutable and return an error.
Inputs
Field Type Required Description architecture_idstring Yes - attributesobject Yes Allowed: name, family, apt_name, rpm_name, display_name, description, kernel_options, enabled, public Outputs
Promote a published disk-image publication to its NodePlatform's active default — every instance provisioned on the platform afterwards boots from it; the previously active publication is retired in the same transaction
Inputs
Field Type Required Description publication_idstring Yes System::DiskImagePublication.id — must be in status published Outputs
Set a NodePlatform's disk-image retention count — how many publications the purge sweep keeps before soft-deleting older artifacts (1..50); reversible GC configuration
Inputs
Field Type Required Description platform_idstring Yes System::NodePlatform.id retention_countinteger Yes Publications to keep, 1..50 Outputs
Roll a NodePlatform's active disk image back to a prior publication — an explicit one, else the newest retired publication, else the newest published one that is not current; restores a retired artifact and retires the previously active publication in one transaction
Inputs
Field Type Required Description platform_idstring Yes System::NodePlatform.id whose active image is rolled back publication_idstring No Target System::DiskImagePublication.id; omitted = auto-select the prior publication Outputs
Promote a postgres streaming replica to primary after the primary is provider-confirmed down: cut the DB VIP over to the replica's SDWAN peer, fence the old primary, and dispatch the module-declared pg_ctl promote. Refuses a live primary outright and refuses an unknown or over-bound replication lag unless the operator accepts the data loss.
Inputs
Field Type Required Description peer_idstring Yes System::FederationPeer carrying the cluster_pg replication record (spawn_mode cluster_member) primary_instance_idstring Yes System::NodeInstance running postgres-primary — the LOST one replica_instance_idstring Yes System::NodeInstance running postgres-replica — the one to promote operation_idstring Yes Idempotency key — the promote is replayed if a FleetEvent already records it for this id virtual_ip_idstring No Restrict the cutover to ONE Sdwan::VirtualIp (default: every VIP the old primary's peers hold) reasonstring No Classified reason from the sensor, carried onto every step event accept_data_lossboolean No Waive the replication-lag bound. Waives NOTHING else — a live primary is refused regardless. dry_runboolean No Plan only — report the safety verdict and what would move, without promoting Outputs
Terminate an unrecoverable NodeInstance whose workload has already been moved to a pooled replacement. The destructive half of a DR replace, gated separately from it.
Inputs
Field Type Required Description instance_idstring Yes System::NodeInstance to terminate — the FAILED one, whose volumes/VIPs have already moved operation_idstring Yes The replace's idempotency key — the terminate is skipped if a FleetEvent already records it for this id reasonstring No Classified reason from the unrecoverable sensor, carried onto the step event Outputs
Destroy a provider guest named for an ephemeral instance pool that no platform row knows — a VM left behind when its record went. Re-checked against the provider inventory and name-verified at the terminate; parks in a protected plane.
Inputs
Field Type Required Description instance_pool_idstring Yes System::InstancePool the guest is named for (places the reap in that pool's plane) cloud_instance_idstring Yes Provider id the guest was listed under guest_namestring Yes The guest's name at the provider; nothing is destroyed unless the id still holds this guest provider_region_idstring No Region whose inventory listed the guest (one of the pool's regions); defaults to the pool's own region Outputs
Replace an unrecoverable NodeInstance with a warm pool member: acquire the replacement, reattach its volumes, re-enrol it on every SDWAN network the failed one held (inheriting the failed peer's routing ROLE rather than the schema defaults, with the endpoint re-derived from the replacement's own address so a replacement hub is not left advertising the dead instance's), move its VIPs, and re-home every published Sdwan::Service that dialled the failed instance by address onto the replacement (the dead member is drained, not removed, until the reap). The terminate of the failed instance is a SEPARATE approval, performed by ReapInstanceExecutor.
Inputs
Field Type Required Description instance_idstring Yes System::NodeInstance the platform classified unrecoverable operation_idstring Yes Idempotency key — every step is skipped if a FleetEvent already records it for this id pool_idstring No System::InstancePool to draw the replacement from (defaults to the failed instance's own pool) pool_namestring No Pool by name, when the failed instance is not itself a pool member reasonstring No Classified reason from the unrecoverable sensor, carried onto every step event reapboolean No Ask for the failed instance to be terminated. Handed to ReapInstanceExecutor under system.instance_reap as a second approval; this executor never terminates anything itself. dry_runboolean No Plan only — report what would be moved without acquiring, attaching or enrolling Outputs
File (or update) the one reviewable improvement offer for a governance gap the fleet tick detected — a declared category nobody owns, an agent without skills, a lane bound to no skill, an executor without a catalog row, a missing lineage edge or delegation policy — and materialise the runtime-closable ones under the Platform Architect's gates
Inputs
Field Type Required Description gapobject Yes GovernanceGapSensor payload: gap_kind, subject, recommendation_type, summary, files, materialization fingerprintstring Yes The signal's fingerprint — the offer's dedup key severitystring No Signal severity (low dry_runboolean No Report the plan; file and materialise nothing Outputs
Triage an unhealthy iBGP session; returns a plan with likely cause + recommended next step. v1 does NOT auto-restart FRR.
Inputs
Field Type Required Description bgp_session_idstring No - peer_idstring No Local peer (resolves session via peer_id + neighbor_address) neighbor_addressstring No - dry_runboolean No - Outputs
Re-issue an SDWAN peer's expiring membership credential server-side, without touching the WireGuard keypair
Inputs
Field Type Required Description peer_idstring Yes Sdwan::Peer whose membership credential is expiring dry_runboolean No Plan-only mode — report the current credential and whether a refresh would issue Outputs
Plan an SDWAN hub failover for an unreachable network; identifies promotion candidates without auto-flipping
Inputs
Field Type Required Description network_idstring Yes - dry_runboolean No v1 only supports dry_run=true — auto-promotion deferred Outputs
Rotate an SDWAN peer's keypair and force the agent to re-establish its tunnel on next reconcile
Inputs
Field Type Required Description peer_idstring Yes Sdwan::Peer to remediate dry_runboolean No Plan-only mode — return what would happen without rotating keys Outputs
Promote the next failover candidate of a silent-holder Sdwan::VirtualIp. Anycast VIPs return informational only.
Inputs
Field Type Required Description virtual_ip_idstring Yes - dry_runboolean No - Outputs
Orchestrate the full CVE → exposure → rebuild → rolling-upgrade chain for one CVE
Inputs
Field Type Required Description cve_idstring Yes Canonical CVE id, e.g. CVE-2026-12345 severitystring No critical affected_module_idsarray No Optional pre-resolved list of module ids — when omitted, derived from CveExposure rows exposure_idsarray No Optional list of CveExposure ids to transition to remediating Outputs
Triage a CVE entry against the fleet — enumerates exposure, scores risk, proposes a remediation plan
Inputs
Field Type Required Description cve_idstring Yes Canonical CVE id, e.g. CVE-2026-12345 severitystring Yes critical affected_packagesarray Yes [{name: 'openssl', version: '<3.1.4'}, ...] summarystring No - persistboolean No Persist computed CveExposure rows instead of only returning the keyword-overlap stub (IMP-702d27f2d384 — was accepted by #perform but missing here) Outputs
Generate a markdown remediation runbook for a CVE — exposed modules, recommended steps, verification commands
Inputs
Field Type Required Description cve_idstring Yes Canonical CVE id, e.g. CVE-2026-12345 persist_as_pageboolean No Save the runbook as a Pages document so it's reachable via list_pages Outputs
Deploy a new Powernode platform. Pass mode='standalone' for a sovereign platform. With no params, returns a wizard payload describing the form the operator should fill in. mode='federated' is NOT available here — it mints a single-use acceptance token that this surface cannot deliver; operators deploy federated platforms over POST /api/v1/system/platform/deployments, which reveals the token once in its HTTP response.
Inputs
Field Type Required Description modestring No Deployment mode: standalone. Omit to receive a wizard payload. 'federated' is refused here with the operator path to use instead. namestring No Human-readable name for the new platform / deployment. template_slugstring No NodeTemplate slug to use (default: powernode-hub). parent_urlstring No Federated-only — reachable URL of THIS platform that the child posts back to. Supply it on the operator API path; federated mode is refused here. spawn_modestring No Federated-only — one of: managed_child, autonomous_peer, cluster_member. Supply it on the operator API path; federated mode is refused here. regionstring No Optional provider region preference. instance_sizestring No Optional provider instance type preference. service_rolestring No Service role for the PlatformDeployment row (default: api). public_dns_hostnamestring No Optional public DNS hostname for the new platform. Outputs
- Class:
Given a failed NodeInstance, rank recent module changes + promotions by likelihood of being the cause
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
instance_id |
string | Yes | - |
lookback_hours |
integer | No | - |
Outputs
Plan a canary-first, halt-on-failure in-place boot-image upgrade across all drifted instances on a node platform, converging the fleet onto the promoted image.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
instance_id |
string | Yes | A drifted NodeInstance — the rollout resolves its platform + all drifted siblings |
batch_pct |
integer | No | Percent of drifted instances per batch (canary = first batch) |
max_consecutive_failures |
integer | No | Halt the rollout after this many recent failed upgrades on the platform |
dry_run |
boolean | No | Plan only — no tasks created (the require_approval gate path) |
Outputs
Recommend instance count or instance-type adjustments for a Template's fleet based on heartbeat health and assignment density
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
template_id |
string | Yes | - |
target_min_active |
integer | No | Minimum number of healthy active instances the fleet must maintain |
Outputs
Create an SDWAN network for a project, attach the supplied instances as peers, optionally provision a project VIP, and compile the topology preview. Composes Sdwan::Network + Sdwan::PeerEnroller + Sdwan::VirtualIp + Sdwan::TopologyCompiler.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
project_id |
string | Yes | Ai::Mission id (the provisioning project receiving the overlay) |
instance_ids |
array | Yes | System::NodeInstance ids to enroll as peers (1-100) |
network_name |
string | Yes | Display name for the new Sdwan::Network |
topology |
string | Yes | One of: hub_and_spoke, mesh |
with_vip |
boolean | No | When true, provision a project-level VirtualIp held by the first peer |
vip_name |
string | No | Optional VIP name (defaults to '<network_name>-vip') |
vip_cidr |
string | No | VIP CIDR — required when with_vip is true (operator must provide a /128 in the network's /64) |
dry_run |
boolean | No | Plan only — no Sdwan::Network/Peer/VirtualIp rows are persisted |
Outputs
Deploy a Git repository onto a provisioned NodeInstance via SSH+systemd
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
node_instance_id |
string | Yes | Target System::NodeInstance.id (provisioned earlier in the plan) |
repo_url |
string | Yes | Git remote URL (https or ssh) |
branch |
string | No | Git branch to deploy |
start_command |
string | No | Command to run as the systemd ExecStart (e.g. 'npm start'). Inferred from repo if omitted. |
deploy_key_id |
string | No | Secret ID for a private repo deploy key (resolved by CodeDeployService) |
mission_id |
string | No | Auto-injected by PlanComposer — the Ai::Mission this deploy belongs to |
dry_run |
boolean | No | Plan only — return projected actions without touching the node |
Outputs
Intent-based package discovery — describe a capability need ('reverse proxy', 'distributed cache') and get ranked packages from accessible repositories. Use system_search_packages instead when you already know the package name and just want filter/browse.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
intent |
string | Yes | Free-text capability description — what the package should do |
repository_ids |
array | No | PackageRepository UUIDs to restrict the search to |
kind |
string | No | Repository kind filter — apt |
architectures |
array | No | Canonical arch names (amd64, arm64) to filter against — cross-kind expanded |
license |
string | No | Exact license string to require (e.g. 'MIT', 'Apache-2.0') |
top_k |
integer | No | Max results to return (1-50) |
Outputs
Provision a managed Docker daemon on a NodeInstance — auto-registers as a Devops::DockerHost bound to the SDWAN overlay /128
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
node_instance_id |
string | Yes | NodeInstance to provision (must already have an Sdwan::Peer with assigned overlay) |
dry_run |
boolean | No | Plan-only — return projected actions without creating the DockerHost row |
Outputs
Compare a NodeInstance's running modules against its assigned modules; returns a planned action set + estimated disruption %. PLANS ONLY — it applies nothing, so resolved is true only when there was no drift to apply
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
instance_id |
string | Yes | NodeInstance to reconcile |
max_disruption_pct |
integer | No | Disruption threshold above which the skill returns requires_approval=true |
Outputs
Expose a backend service locally at a friendly /svc/ path on the platform's own host(s), authenticated by the reverse proxy (ForwardAuth). Use this when an operator asks to 'publish for our users', 'put behind /svc/ with login', or otherwise make an overlay/internal service reachable to the site's own authenticated users (NOT the public internet — use expose_service_publicly for that). Creates or updates the Sdwan::Service, enables its local-exposure facet, and regenerates the reverse proxy.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
service_id |
string | No | Existing Sdwan::Service id to expose (omit to create a new service from the fields below) |
slug |
string | No | URL slug for the /svc/ mount (required when creating; lowercase alnum + hyphen, <=64, not a reserved platform path) |
name |
string | No | Human-friendly service name (required when creating) |
protocol |
string | No | Backend protocol Traefik connects with: https or http (default https) |
backend_vip_id |
string | No | Sdwan::VirtualIp id of the overlay backend (provide this or backend_host when creating) |
backend_host |
string | No | Static backend host/IP if not using a VIP (provide this or backend_vip_id when creating) |
backend_port |
integer | No | Backend service port (required when creating; 1-65535) |
auth_mode |
string | No | public (no auth) |
required_permission |
string | No | Permission name required for scoped mode (e.g. services.grafana.view) |
required_group |
string | No | Group/role name required for scoped mode (used when no required_permission is given) |
strip_prefix |
boolean | No | Strip /svc/ before proxying so the backend sees '/' (default true; advertises X-Forwarded-Prefix) |
certificate_id |
string | No | System::AcmeCertificate id whose CN the /svc/ router mounts under (default: the account's primary valid cert) |
Outputs
Toggle a backend service's public (Path B) TLS-carrying TCP exposure via Traefik HostSNI routing. Use this when an operator asks to 'publish on the public internet over raw TLS/TCP', 'turn on/off public exposure for ', or otherwise flip Sdwan::Service#public_enabled. EXPOSE (enabled: true, default) validates the service's protocol is tls, that a HostSNI host resolves, and — under edge_mode terminate — that a matching valid ACME certificate exists, before enabling. UNEXPOSE (enabled: false) simply disables it. NOT for HTTP(S) (use expose_service_publicly) or the site-local /svc plane (use expose_service_local).
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
service_id |
string | Yes | Existing Sdwan::Service id to toggle public (Path B) TCP exposure for |
enabled |
boolean | No | true (default) to EXPOSE (enable public_enabled); false to UNEXPOSE (disable it) |
Outputs
Expose a backend service to the public internet end-to-end — provisions an SDWAN Virtual IP, a hub DNAT port mapping (443 for https / 80 for http), an ACME TLS certificate for the hostname, and regenerates the reverse proxy. Use this when an operator asks to 'make reachable from the internet at ', 'put a public endpoint in front of ', or otherwise publish an internal service with TLS.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
service_hostname |
string | Yes | Public DNS hostname the service will answer on, e.g. app.example.com |
service_protocol |
string | Yes | Public-facing protocol: http or https |
sdwan_network_id |
string | Yes | SDWAN network the VIP + port mapping live in |
sdwan_hub_peer_id |
string | Yes | Publicly-reachable hub peer that terminates the public port |
vip_cidr |
string | Yes | Operator-supplied host CIDR for the VIP (typically a /128 v6 or /32 v4) within the SDWAN network's /64 |
target_peer_id |
string | No | Backend peer to front (provide exactly one of target_peer_id / target_instance_id) |
target_instance_id |
string | No | Backend NodeInstance to front (provide exactly one of target_peer_id / target_instance_id) |
backend_port |
integer | Yes | Port the backend service listens on (the DNAT target_port) |
tls_issuer |
string | No | ACME issuer slug for the certificate |
challenge_type |
string | No | ACME challenge type (dns-01 / http-01) |
dns_credential_id |
string | No | Credential id for the DNS provider (dns-01 challenges) |
Outputs
On-demand: turn an NL capability request into a running, leased instance. Composes a plan and creates a DURABLE System::FulfillmentRequest (state machine); approval is an out-of-band transition on the persisted, frozen plan.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
request |
string | Yes | Free-form capability request, e.g. 'give me a running memcached instance' |
count |
integer | No | Instances to provision (default 1; capped by SiteSetting system.fulfill.max_instances) |
approved |
boolean | No | false (default) → create the request in composed and return the plan + id for OUT-OF-BAND approval. true (autonomous callers) → also transition composed→approved and drive the first advance inline. |
base_os_module_name |
string | No | - |
platform_id |
string | No | Restrict module composition to a NodePlatform (defaults to the base-os module's platform) |
provider_region_id |
string | No | Override region for provisioning (defaults to account's first enabled region / SiteSetting) |
provider_instance_type_id |
string | No | Override instance type (defaults to account's cheapest / SiteSetting) |
Outputs
Apply one approved GitOps drift proposal to live fleet state (template / module / assignment / pool / platform diffs) and mark it implemented; a stale-conflict or unsupported diff is refused with the reason
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
proposal_id |
string | Yes | Ai::AgentProposal.id — an approved proposal with source gitops |
Outputs
Register a Git repository as a declarative source of fleet state the GitOps Reconciler syncs every 5 minutes (branch, path prefix, Vault credential path, auto_apply, SSH host key); the first sync runs on the next reconcile tick
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Display name, unique within the account (<= 64 chars) |
repo_url |
string | Yes | Clone URL (https or ssh); never put credentials in it — use vault_credential_path |
branch |
string | No | Branch to track (default main) |
vault_credential_path |
string | No | Vault path holding the clone credentials |
path_prefix |
string | No | Directory inside the repo holding fleet.yaml (default repo root) |
auto_apply |
boolean | No | Apply non-destructive drift without operator review (default false) |
ssh_host_key |
string | No | The git host's SSH PUBLIC host key line (' ', as ssh-keyscan prints it) the sync verifies against; omitted, an SSH remote is keyscanned and the result pinned |
Outputs
Sync one registered GitOps repository now: clone/fast-forward it, diff its desired fleet state against the live fleet and open one Ai::AgentProposal per drifted resource; returns the finalized sync run handle. Applies nothing
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
repository_id |
string | Yes | System::GitopsRepository.id |
Outputs
Summarize the package repositories configured for the operator's account — counts, kinds (apt/rpm/dnf), visibility (shared vs account), sync status. Use for 'how many package repos', 'what package sources', 'list my repositories', or similar inventory queries.
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
intent |
string | Yes | Free-text query — typically the user's natural-language ask about repositories |
Outputs
Compose a Template draft from a workload description — SEMANTICALLY ranks modules (embedding cosine, keyword fallback), runs conflict checks, and surfaces package gaps to materialize when no module covers a capability
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
description |
string | Yes | Free-form workload description, e.g. 'nginx web server with SSL and metrics' |
platform_id |
string | No | Restrict the search to modules for a specific NodePlatform |
max_modules |
integer | No | - |
Outputs
Compose a newly-built module onto a pooled instance atop base-os and assert it's healthy (systemd unit active, manifest health endpoint answers, ldd closure complete)
Inputs
| Field | Type | Required | Description |
|---|---|---|---|
module_name |
string | No | NodeModule name to smoke-verify (module_name or module_id required) |
module_id |
string | No | NodeModule id to smoke-verify (module_name or module_id required) |
base_os_module_name |
string | No | Base-os module composed alongside the target module |
template_id |
string | No | Existing NodeTemplate to reuse instead of the acquired instance's own template |
instance_id |
string | No | Verify THIS already-provisioned instance in place (caller-owned: not acquired from a pool, not released/terminated). Omit to self-acquire an ephemeral pool member for a standalone smoke (which IS released afterward). |
Outputs