Skip to main content

Resource reference

This page documents the custom resources you create to use Orka. Controller flags and Helm values are in Configuration, and HTTP endpoints are in the API reference.

ResourceGroupWhat it is
Taskcore.orka.aiOne unit of work: a container command, a native AI prompt, or a coding-agent session.
Agentcore.orka.aiReusable configuration: model, prompt, tools, skills, coordination, and optionally a runtime.
Providercore.orka.aiA model backend and the Secret that holds its API key.
Skillcore.orka.aiReusable instructions injected into an Agent's system prompt.
Toolcore.orka.aiA custom tool backed by an HTTP endpoint or an MCP server.
OutboundAccessPolicycore.orka.aiHow Tools reach an external API without handing agents the credential.
ConnectorProvider and Connectioncore.orka.aiAn OAuth service people can link, and one person's link to it.
RepositoryScancore.orka.aiA repository to scan for security findings.
RepositoryMonitorcore.orka.aiA repository whose pull requests and issues agents review, implement, and repair.
SubstrateActorPoolcore.orka.aiA pool of Agent Substrate actors for MCP Tools.
AgentRuntimecore.orka.aiAn external agent runtime registration. See Bring your own agent runtime.
GatewayClass, Gateway, GatewayBindinggateway.orka.aiConnections to chat apps and other agents. See Gateways and the Gateway API.
ExecutionWorkspaceClass and related resourcesworkspace.orka.aiSandboxed execution workspaces from separately installed providers. See Workspace providers.

The controller creates and owns several more resources, such as RuntimePools and PromptAttempts. Read them when debugging, but do not edit them. Architecture lists them.

Task​

One unit of work: a container command, a native AI prompt, or a coding-agent session. The example shows most fields at once; a real Task uses a handful.

apiVersion: core.orka.ai/v1alpha1
kind: Task
metadata:
name: my-task
spec:
type: ai # or "container" or "agent"
agentRef:
name: my-agent
prompt: "Analyze the latest Kubernetes security best practices"
execution:
runtimeClassName: gvisor
nodeSelector:
sandbox-runtime: gvisor
sessionRef:
name: my-session
create: false # default: false
append: true
maxMessages: 50
priority: 500
timeout: 5m
retryPolicy:
maxRetries: 3
backoffMultiplier: 2
initialDelay: 10s
webhookURL: "https://example.com/webhook"
# Scheduled/recurring task fields (optional)
schedule: "0 */6 * * *" # Cron expression
timeZone: "America/New_York" # IANA timezone
concurrencyPolicy: Forbid # Allow or Forbid concurrent runs
startingDeadlineSeconds: 100 # Deadline for starting missed scheduled runs (default: 100)
suspend: false
successfulRunsHistoryLimit: 3
failedRunsHistoryLimit: 1
FieldTask typesDescription
typeallai, agent, or container. Required.
agentRefai, agentThe Agent to use.
promptai, agentWhat to do.
image, command, argscontainerThe container to run. See Container tasks.
envai, containerEnvironment variables for the worker container. Coding-agent pools do not inherit them.
aiaiSettings for a Task without an Agent, or overrides for one: providerRef, model, systemPrompt, temperature, maxTokens, skills, and tools.
workspaceagent, containerThe git repository to work in. See Workspace.
agentRuntimeagentPer-Task overrides of the Agent's runtime defaults: maxTurns, allowedTools, disallowedTools, and allowBash.
sessionRefai, agentConversation continuity: name, create (default false), append (default true), and maxMessages (default 50). Immutable after creation.
timeoutallMaximum wall-clock duration. Coding-agent Tasks default to 30m, measured from Task creation, including queueing and runtime admission.
priorityallQueue priority from 0 to 1000, default 500. Higher runs first.
retryPolicyallmaxRetries (default 0), backoffMultiplier (default 2), and initialDelay.
webhookURLallURL called when the Task completes.
resourcesai, containerCPU and memory requests and limits for the worker Pod. Coding-agent Tasks reject custom resources; their pool profile sets them.
executionai, container; workspace only for agentRuntime class and placement. See Execution.
secretRefai, containerA Secret for the Task. Container Tasks do not receive it by default; see Container tasks.
schedule, timeZone, concurrencyPolicy, startingDeadlineSeconds, successfulRunsHistoryLimit, failedRunsHistoryLimitallTurn the Task into a cron template. See Scheduled tasks.
suspendallPauses a schedule or an autonomous coordinator without deleting it.
priorTaskRefai, containerApply a completed Task's diff before starting. Set by the prior_task tool parameter; coding-agent runtimes do not accept it.
requestedBy, transactionallThe verified caller and transaction metadata. The API server sets them; clients cannot.

Workspace​

For type: agent, repository and delivery policy belong at top-level spec.workspace:

workspace:
intent: write
gitRepo: https://github.com/example/project.git
branch: main
readCredentialRef:
name: project-source-read
publicationGitRepo: https://github.com/example/project.git
publicationReadCredentialRef:
name: project-target-read
publicationCredentialRef:
name: project-target-write
forgeCredentialRef:
name: project-forge
pushBranch: orka/example-change
prBaseBranch: main
createPR: true
FieldTypeDefaultDescription
intentstringread for agent Tasksread or write. Immutable for an active attempt.
gitRepostringemptyCredential-free source repository URL. Embedded credentials, query strings, and fragments are rejected.
sourceRepositoryobjectemptyOptional canonical provider/ID source identity.
branch / refstringemptySource branch or exact ref/commit/tag. When both are empty, the Publisher resolves and freezes the repository's advertised default branch before execution.
readCredentialRef.namestringemptySecret used only by the clean-room source clone/read operation.
publicationGitRepostringemptyCredential-free publication repository URL.
publicationRepositoryobjectemptyOptional canonical provider/ID publication identity.
publicationReadCredentialRef.namestringemptyTarget-read Secret used only for publication preflight and independent verification.
publicationCredentialRef.namestringemptyTarget-write Secret used only for the exact branch compare-and-swap push.
forgeCredentialRef.namestringemptyForge API Secret used only for pull-request reconciliation; required when createPR is true.
subPathstringemptyRepository subdirectory exposed as the workspace root.
pushBranchstringgenerated for write TasksPublication branch. Orka-generated names use full Task or Session identity entropy.
prBaseBranchstringemptyPull-request base branch.
prTitlestringprompt's first nonblank lineExact pull-request title, up to 256 characters. Empty uses the default, which trims whitespace and truncates to 256 characters. An empty or whitespace-only prompt uses Orka publication generation N. Nonempty whitespace-only titles are rejected.
prBodystringpublisher summary and Task namespace/namePull-request body, up to 32,768 characters. The publisher appends the publication generation and reconciliation markers to custom and default bodies. Reserved Orka reconciliation comments are rejected.
createPRbooleanfalseReconcile a pull request only after verified branch publication. Requires intent: write.

The four credential references are distinct roles: readCredentialRef is source-read only, publicationReadCredentialRef is target preflight and verification only, publicationCredentialRef is target-write only, and forgeCredentialRef is pull-request reconciliation only. All four are same-namespace Secret references. The controller freezes each selected Secret version for the attempt, and the credential broker releases it only to the Workspace/Publisher for the exact operation. None enters the coding agent's process tree or Task status.

prTitle and prBody apply only when createPR: true; supplying them alone does not request a pull request. Orka rejects secret-like titles and bodies before publication, including prompt-derived titles. Explicit overrides wait for a publisher with pull-request presentation support before prompt admission.

The durable attempt is reported in status.execution, and workspace validation and publication in status.delivery: publication ID, repository identities, branch, starting, remote, tree, and commit SHAs, artifact digest, and optional pull request receipt. A Task is not delivered merely because the model reports success; require a terminal verified delivery outcome. Agent runtimes lists the outcomes.

Execution​

Native ai and container Tasks support spec.execution for worker Pod runtime selection and placement. Built-in ACP agent Tasks do not accept per-Task placement or custom resources; reviewed RuntimePool profiles own those settings. They can request an execution workspace through spec.execution.workspace when the dispatch and provider gates are enabled. See Execution workspace requests.

execution:
runtimeClassName: gvisor
nodeSelector:
sandbox-runtime: gvisor
tolerations:
- key: sandbox-runtime
operator: Equal
value: gvisor
effect: NoSchedule
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: sandbox-runtime
operator: In
values: ["gvisor"]
FieldTypeDescription
runtimeClassNamestringSelects a Kubernetes RuntimeClass such as gvisor or kata-qemu
nodeSelectormap[string]stringRestricts native worker Pods to nodes with matching labels
tolerationslistAllows native worker Pods onto tainted runtime-specific node pools
affinityobjectAdds Kubernetes affinity or anti-affinity rules for native worker Pods
workspaceobjectClass-only execution-workspace request. classRef selects an admitted external provider and immutable profile for a dedicated ACP RuntimeSession. Repository access uses top-level Task.spec.workspace.

Resolution order:

  • Agent.spec.execution provides defaults for tasks that reference the Agent
  • Task.spec.execution overrides Agent defaults
  • runtimeClassName is a scalar override
  • nodeSelector, tolerations, and affinity replace Agent defaults when they are set on the Task

Execution workspace requests​

Task.spec.execution.workspace.classRef selects an administrator-managed class for a dedicated workspace-backed ACP RuntimeSession. Dispatch requires the workspace provider API, --acp-workspace-dispatch-enabled, required admission webhooks, live class-use authorization, and an admitted external provider with the required contracts and capabilities. Optional reusePolicy, workspaceSlot, and onDetach must satisfy the frozen class lifecycle. Direct provider, template, pool, boot, snapshot, and cleanup selectors are removed. Rejections appear in Task.status.executionWorkspace before compute demand. Top-level Task.spec.workspace remains the verified source/publication contract.

See Agent Sandbox Workspaces, Agent Substrate Workspaces, and ADRs 0024/0025 for the provider-neutral contract.

Agent​

Reusable configuration that Tasks point at. An Agent is either native — it names a Provider and model and runs on Orka's AI worker — or a runtime Agent that runs a coding-agent CLI. A runtime Agent sets spec.runtime and must not set providerRef; see Agent with runtime. Fields marked "native Agents only" make a runtime Agent's Tasks fail before a session starts.

apiVersion: core.orka.ai/v1alpha1
kind: Agent
metadata:
name: researcher-agent
spec:
providerRef:
name: anthropic-prod
execution:
runtimeClassName: kata-qemu
nodeSelector:
sandbox-runtime: kata
model:
temperature: 0.7
maxTokens: 4096
systemPrompt:
inline: "You are a research specialist..."
tools:
- name: web_search # a built-in tool
- name: catalog-search # a custom Tool resource
skills:
- name: skill-researcher
session:
maxMessages: 50
coordination:
enabled: true
autonomous: true # Enable autonomous loop mode
maxIterations: 20 # Max loop iterations (0 = unlimited)
allowedAgents:
- name: coder-agent
maxConcurrentChildren: 5
maxDepth: 3
FieldDescription
providerRefThe Provider for a native Agent. Mutually exclusive with runtime.
modelname (optional when the Provider sets defaultModel), temperature (0–2), maxTokens, contextWindow, and fallbacks.
systemPromptinline text, or configMapRef to read it from a ConfigMap key.
toolsNative Agents only. Tools the Agent may call: built-in tools and custom Tool resources by name. An entry with enabled: false is skipped. Runtime Agents use runtime.defaultAllowedTools instead.
skillsNative Agents only. Skills whose content is added to the system prompt.
coordinationNative Agents only. Lets the Agent delegate to other Agents. See Coordination.
runtimeMakes this a coding-agent Agent. See Agent with runtime.
executionNative Agents only. Default runtime class and placement for the Agent's worker Pods. See Execution.
resourcesNative Agents only. Default CPU and memory for the Agent's worker Pods.
sessionSession defaults, such as maxMessages.
secretRefA Secret injected into native worker Pods as environment variables. Runtime Agents must not set it.
ttlAfterLastTaskDelete the Agent this long after its last Task completes. Unset keeps it.

Coordination​

FieldTypeDefaultDescription
enabledboolfalseEnable agent-to-agent coordination tools
autonomousboolfalseEnables autonomous loop mode. When true, the controller re-creates Jobs in a loop instead of marking the task as Succeeded
maxIterationsint320Limits the number of autonomous loop iterations. Only used when autonomous is true. 0 means unlimited
approvalRequiredToolslist[]Custom Tool CRD names that require human approval before execution in enabled autonomous coordination mode. Built-in tools, including request_approval, are rejected
allowedAgentslist[]List of agent names this agent is allowed to delegate to
maxConcurrentChildrenint325Maximum number of concurrent child tasks
maxDepthint323Maximum delegation depth

Enabling coordination adds Orka's coordination, memory, GitHub pull request, agent management, and planning tools to the Agent. Built-in tools lists exactly which tools, and Multi-agent coordination shows how to use them.

Model fallbacks​

Fallback providers are tried automatically when the primary provider fails, for example on an authentication error, an outage, or rate limiting. Configure them in spec.model.fallbacks:

apiVersion: core.orka.ai/v1alpha1
kind: Agent
metadata:
name: resilient-agent
spec:
providerRef:
name: my-openai
model:
name: gpt-6-astra
fallbacks:
- providerRef: my-anthropic
model: claude-opus-5
- providerRef: my-azure-openai
model: gpt-6-astra
FieldTypeRequiredDescription
providerRefstringYesName of a Provider CRD to fall back to
modelstringNoModel to use with this provider. If empty, uses the provider's defaultModel

How fallbacks work:

  1. The primary provider is tried first with automatic retries (exponential backoff on 429/5xx errors).
  2. If the primary provider fails with an auth error (401/403), network error, or exhausts all retries, the first fallback provider is tried.
  3. Each fallback provider also gets automatic retries.
  4. If all providers fail, the last error is returned.

Fallbacks are only supported on Agent-based tasks; Agent-less tasks get retries only. Each fallback provider needs its own Provider with a valid Secret reference. Rate-limited providers (429 responses) are temporarily cooled down and skipped in subsequent requests. Streaming requests fail over only on the initial connection; mid-stream failures are not retried.

Agent with runtime​

Agent configuration for the supported built-in coding-agent runtimes: Claude, Codex, Copilot, and OpenCode. Runtime Agents do not reference provider Secrets; their pools reach your model gateway through Orka's authenticated provider proxy.

apiVersion: core.orka.ai/v1alpha1
kind: Agent
metadata:
name: claude-agent
spec:
model:
name: claude-opus-5
systemPrompt:
inline: "You are a senior software engineer."
runtime:
type: claude # or "codex" / "copilot" / "opencode"
contractVersion: orka.harness.v2
defaultMaxTurns: 50
defaultAllowBash: true
defaultAllowedTools:
- Read
- Write
- Edit
- Bash
FieldDescription
model.nameRequired. A model your gateway lists.
runtime.typecodex, claude, copilot, or opencode.
runtime.contractVersionorka.harness.v2.
runtime.defaultMaxTurnsDefault turn limit per Task, 1–1000.
runtime.defaultAllowedToolsTools the CLI may use by default, such as Read, Grep, Glob, Edit, and Bash.
runtime.defaultAllowBashWhether shell use is allowed by default. Defaults to true. Codex requires true.
runtime.defaultReasoningEffortnone, low, medium, high, xhigh, or max. Runtimes reject values they do not support: none is Codex-only and max is Claude-only.
runtime.runtimeRefSelects an external AgentRuntime instead of a built-in type.
runtime.toolboxesBuilt-in types only. Read-only toolbox images whose tool folders are added to the agent's PATH.

All four built-in harness v2 runtimes support spec.systemPrompt and the optional spec.soul persona source. Copilot and OpenCode receive protected native instruction files outside the repository workspace. OpenCode model IDs use literal provider/model form, for example openai/gpt-6-astra, and spec.model.contextWindow and spec.model.maxTokens are both required positive reviewed ceilings, with contextWindow > maxTokens. They are part of the immutable runtime profile; Orka does not discover or guess them from a mutable model catalog.

Operator-owned runtimes outside the built-in set can use orka.harness.v2 AgentRuntime registration and conformance. A current-generation ready, strict-governed registration can be selected through runtime.runtimeRef; Orka freezes and revalidates its endpoint, profile, authentication authority, and observed runtime identity for dispatch.

A Task that uses a runtime Agent sets type: agent, a workspace, and optional agentRuntime overrides:

apiVersion: core.orka.ai/v1alpha1
kind: Task
metadata:
name: code-review
spec:
type: agent
agentRef:
name: claude-agent
prompt: "Review the code in this repo for security issues. Do not modify files."
workspace:
intent: read
gitRepo: "https://github.com/example/repo.git"
branch: main
# readCredentialRef:
# name: repository-read
# subPath: "services/api"
agentRuntime:
maxTurns: 100
allowBash: true
allowedTools:
- Read
- Write
- Edit
- Bash
- Glob
- Grep

Agent runtimes explains how these Tasks run.

Provider​

A model backend and the Secret that holds its API key. Native AI Agents, chat, and the compatibility APIs use Providers. Coding-agent runtimes do not; they reach models through the provider proxy.

apiVersion: core.orka.ai/v1alpha1
kind: Provider
metadata:
name: anthropic-prod
spec:
type: anthropic # or "openai", "azure-openai"
secretRef:
name: anthropic-secret
key: api-key
baseURL: "" # optional custom endpoint for proxies
defaultModel: claude-opus-5
# Azure-specific (only for type: azure-openai)
# azure:
# deploymentName: my-deployment
# apiVersion: "2024-02-15-preview"
FieldDefaultDescription
typerequiredanthropic, openai, or azure-openai. Use anthropic or openai with a baseURL for any compatible endpoint.
secretRef.name / secretRef.keykey api-keyThe Secret and key holding the API key. Required, even for an endpoint that ignores it.
baseURLprovider defaultA custom endpoint, such as a gateway or an in-cluster model server.
defaultModelemptyModel used when the Agent or Task does not name one.
azure.deploymentNamerequired for AzureThe Azure OpenAI deployment.
azure.apiVersion2024-02-15-previewThe Azure OpenAI API version.

For type: openai, Orka tries the Responses API first and switches to Chat Completions when the endpoint does not support it.

Skill​

Reusable instructions in the Agent Skills format. Skills listed on an Agent or AI Task are added to its system prompt on every model call, so keep them short. orka skill init, validate, and import create Skills from SKILL.md files.

apiVersion: core.orka.ai/v1alpha1
kind: Skill
metadata:
name: skill-researcher
labels:
orka.ai/category: "research"
spec:
displayName: "Research Methodology"
description: "Structured research workflow and source validation guidance"
version: "1.0.0"
author: "platform-team"
tags: ["research", "analysis"]
content:
inline: |
# Research Skill
Use primary sources and cite references.
files:
templates/checklist.md: |
- [ ] Validate source credibility
- [ ] Cross-check key claims
# source tracks where a skill was imported from (for updates)
# source:
# github: "anthropics/skills"
# skillName: "researcher"
status:
phase: Ready
contentHash: sha256:...

Tool​

A custom tool that agents call by name. A Tool calls a plain HTTP endpoint or an MCP server.

This example uses a placeholder catalog API. Replace its URL and Secret reference with your service's values.

apiVersion: core.orka.ai/v1alpha1
kind: Tool
metadata:
name: catalog-search
spec:
description: "Search a product catalog"
parameters:
type: object
properties:
query:
type: string
description: "Search query"
required: ["query"]
http:
url: "https://catalog.example.com/search"
method: POST
timeout: 30s
authSecretRef:
name: catalog-api-key
key: api-key
authInject: body # "header" (Bearer token) or "body" (JSON key)
authBodyKey: api_key # JSON key name when authInject=body
PathTypeValues/defaultNotes
spec.descriptionstringrequiredDescription shown to the LLM.
spec.parametersJSON SchemaemptyTool argument schema in function-calling format. Remote MCP Tools require a reviewed object schema.
spec.brokeredToolClassstringemptyread, write, or coordination. Required to expose the Tool to external runtimes through brokered governance; write Tools get approval and exact-argument checks.
spec.http.urlstringrequired for plain HTTP toolsEndpoint called by workers. May contain {{param}} placeholders. MCP actor-backed tools may omit it because Orka uses status.endpoint.
spec.http.methodstringdefault POST; allowed GET, POST, PUT, PATCH, DELETEHTTP method for plain HTTP tools. MCP tools use POST.
spec.http.headersmapemptyStatic headers sent with the request. Reserved token propagation headers cannot be overridden when outbound TxToken propagation is enabled.
spec.http.timeoutdurationdefault 30sPer-call request timeout.
spec.http.authSecretRefSecret key selectoremptySecret value used as the auth token. Cannot coexist with a direct OutboundAccessPolicy.
spec.http.outboundAccessPolicyRef.namestringemptySame-namespace OutboundAccessPolicy required to be Accepted with ResolvedRefs.
spec.http.authInjectstringdefault header; allowed header, bodyheader sends Authorization: Bearer <token>. body injects the token into the JSON request body and is invalid for MCP tools.
spec.http.authBodyKeystringemptyJSON key used when authInject: body.
spec.mcp.remote.url, spec.mcp.remote.toolNamestringemptyCall one reviewed function on an independently operated MCP server. See Remote MCP tools.
spec.mcp.workspace.classRef.name, spec.mcp.workspace.portobject, integeremptyReserved for running the MCP server in a Service-mode execution workspace. Not supported yet: a Tool that sets it fails reconciliation.
spec.mcp.pathstring/mcpHTTP path exposed by the MCP server inside the actor.
spec.mcp.substrateActor.templateRef.namestringrequiredSubstrate ActorTemplate hosting the MCP server.
spec.mcp.substrateActor.templateRef.namespacestringTool namespace or configured defaultNamespace containing the actor template.
spec.mcp.substrateActor.poolRef.namestringemptyOptional SubstrateActorPool for actor placement and reuse. The pool template must match the MCP actor template.
spec.mcp.substrateActor.poolRef.namespacestringTool namespaceNamespace containing the referenced actor pool.
spec.mcp.substrateActor.bootbooleanfalseBoots the actor from scratch on first resume; later reconciles reuse an already booted actor.
status.availablebooleanfalseWhether the controller can reach the resolved endpoint.
status.endpointstringemptyResolved non-secret endpoint used by workers. For MCP actor-backed tools this is the Substrate router endpoint.
status.actorobjectemptySafe actor metadata, including provider, actor ID, route host, resolved template, and pool reference.

A Tool selects at most one MCP backend: remote or substrateActor.

MCP servers in Substrate actors​

MCP actor-backed Tools require Substrate support on the controller. Orka creates or reuses the Substrate actor, waits for the MCP endpoint, stores it in status.endpoint, and workers call the MCP tool through JSON-RPC tools/call using the Tool name as the MCP tool name.

apiVersion: core.orka.ai/v1alpha1
kind: Tool
metadata:
name: repo-inspector
spec:
description: "Inspect repository metadata through an MCP server"
parameters:
type: object
properties:
message:
type: string
required:
- message
mcp:
path: /mcp
substrateActor:
templateRef:
name: orka-mcp
namespace: ate-demo
poolRef:
name: mcp-substrate-pool
boot: true

mcp.path defaults to /mcp, poolRef is optional, and boot only affects the first actor resume. For transport authentication, set spec.http.authSecretRef, keep authInject as header or omit it, and omit http.url: MCP call arguments are forwarded to the server as tool input, so authInject: body is only valid for plain HTTP tools.

URL path interpolation​

Tool CRD URLs can contain {{paramName}} placeholders that are replaced with parameter values at runtime. Interpolated values are URL path-escaped, and the matching parameters are removed from the request body. This is useful for REST APIs that require path parameters.

apiVersion: core.orka.ai/v1alpha1
kind: Tool
metadata:
name: github-merge-pr
spec:
description: "Merge a GitHub pull request"
parameters:
type: object
properties:
owner:
type: string
repo:
type: string
pull_number:
type: integer
merge_method:
type: string
enum: [merge, squash, rebase]
required: [owner, repo, pull_number]
http:
url: "https://api.github.com/repos/{{owner}}/{{repo}}/pulls/{{pull_number}}/merge"
method: PUT
authSecretRef:
name: github-token
key: token
authInject: header

In this example, owner, repo, and pull_number are interpolated into the URL path and removed from the JSON body. Only merge_method is sent in the request body.

OutboundAccessPolicy​

OutboundAccessPolicy is namespaced and selects exactly one adapter. Direct mode performs RFC 8693/RFC 7523 exchange and injects a validated Bearer resource credential. Gateway mode dials a trusted Kubernetes Service while preserving the original Tool authority, path, query, method, body, and protocol headers. Connection mode injects the requesting person's linked-account credential for a ConnectorProvider.

apiVersion: core.orka.ai/v1alpha1
kind: OutboundAccessPolicy
metadata:
name: resource-api
namespace: orka-system
spec:
direct:
grant: TokenExchange
tokenEndpoint:
url: https://identity.example.test/oauth/token
subject:
source: TransactionToken
scopes: [api.read]
requestedTokenType: urn:ietf:params:oauth:token-type:access_token
expectedIssuedTokenType: urn:ietf:params:oauth:token-type:access_token
apiVersion: core.orka.ai/v1alpha1
kind: OutboundAccessPolicy
metadata:
name: github-as-me
namespace: orka-system
spec:
connection:
providerRef:
name: github
FieldTypeDefaultDescription
spec.connection.providerRef.namestringrequiredSame-namespace ConnectorProvider. ResolvedRefs is True only while the provider is Accepted.
spec.connection.outputobjectAuthorization: BearerHeader and prefix for the injected credential. Txn-Token is forbidden.

Connection mode resolves at call time, in the controller only. A readOnly Connection hides the provider's write-class tools from the agent, and connector write tools are always approval-required. For native type: ai Tasks the worker Pod never runs such a tool itself: it calls POST /internal/v1/tasks/:namespace/:taskName/connector-tools/:tool with its ServiceAccount token, and the controller verifies the caller is the Task's current worker, that the arguments satisfy the Tool's declared JSON Schema, that the tool is connector-backed and enabled for the Task, and that the policy frozen into the Job at dispatch is honored: the Job carries the tool list, the approval-required set, the spec digest of every dispatched connector tool, and the Connection bindings (ORKA_CONNECTOR_TOOL_DIGESTS, ORKA_CONNECTION_BINDINGS). A tool whose definition changed since dispatch, a write-class tool the frozen policy does not cover, or a Task whose status.connectionBindings no longer match the Job's is refused, and a tool the policy covers executes only with an approved approval (approvalId) that binds this tool's configuration, the connection-mode policy's injection configuration, and the Connection frozen for its policy (so a Job re-created after the decision against a re-linked account or a changed policy needs a fresh approval), these exact arguments, and is claimed atomically for a single execution. Every failure before a provider request hands the claim back; a claimed call is recorded in the durable external-effect ledger under its claim with the frozen Connection digest, using the Tool's own request timeout as its lease, and a worker that lost the response receives the committed result again (replayed: true) without a second request. Results larger than 256 KiB are retained as a digest-and-size receipt and cannot be replayed. The effect record is reserved before the claim is recorded, and a spent claim is reconciled from it: a record still Pending is moved to Failed (which fences out any request that has not started its call) and the claim is handed back; an in-flight record whose lease lapsed settles as outcome unknown (502) and the approval stays spent; a live in-flight record is 409 still executing. It then executes the call against the Connection frozen into status.connectionBindings at Job creation, which a recovered Job always reads back from its own environment. The Task's verified spec.requestedBy selects the person, the Connection identity frozen into the Task's execution snapshot at dispatch must still match the live Connection (UID, generation, and grant sequence, so a re-link of the same Connection object needs a re-dispatch), the policy object checked against the dispatched configuration must be the one that resolves, the Connection must be Ready for its current generation, and the Tool URL must be HTTPS without authSecretRef. A token that expires within 60 seconds is refreshed once per Connection at a time and the rotated material written back to custody. A provider that rejects the refresh marks the Connection Revoked and shreds its custody; an expired token with no refresh token marks it Expired. Any other condition fails the call with no fallback to Task Secrets, environment credentials, or other people's Connections. Worker Pods have no credential source and refuse connection-mode policies.

Policy status contains only observedGeneration, Accepted, and ResolvedRefs. Secret references are key-specific and same-namespace. Cross-namespace Service refs require exact controller allowlist entries. See Outbound Access Policies.

ConnectorProvider​

ConnectorProvider is the operator-owned catalog entry for one third-party service people may link through OAuth. It is namespaced, reconciled only when the controller runs with --connectors-enabled, and carries public OAuth client settings plus the tools the service offers. Only the client secret lives in a Secret.

apiVersion: core.orka.ai/v1alpha1
kind: ConnectorProvider
metadata:
name: github
namespace: orka-system
spec:
displayName: GitHub
oauth:
authorizeURL: https://github.com/login/oauth/authorize
tokenURL: https://github.com/login/oauth/access_token
clientID: Iv1.example-client-id
clientSecretRef:
name: github-connector-oauth
key: clientSecret
scopes:
read: [read:user]
write: [repo]
tools:
- name: list_pull_requests
class: read
source: Builtin
- name: create_pull_request
class: write
source: Builtin
FieldTypeDefaultDescription
spec.displayNamestringobject nameShown to people in the dashboard and CLI.
spec.oauth.authorizeURLstringrequiredAbsolute HTTPS authorization endpoint. Private, loopback, link-local, and cluster-internal hosts are rejected, and so are single-label names (which Pod DNS search domains complete to cluster Services) and non-canonical numeric hosts. Hosts must be ASCII: write an internationalized name in its punycode (xn--) form. The same host rules, and a 2048-byte length bound, apply to every endpoint and HTTP tool URL.
spec.oauth.tokenURLstringrequiredAbsolute HTTPS token endpoint used for the code exchange and refresh.
spec.oauth.revocationURLstringemptyOptional RFC 7009 endpoint called best-effort on disconnect for the committed credential. It must be on the token endpoint's host and port, so tokens are only sent back to their issuer; GitHub has no such endpoint, so a GitHub provider leaves it empty. Orka never revokes material it did not commit: a token from a consent nobody completed is deleted and left to expire, because it may belong to a different person's grant.
spec.oauth.clientIDstringrequiredPublic OAuth client identifier, printable ASCII, at most 256 bytes.
spec.oauth.clientSecretRefSecret key selectorrequiredSame-namespace Secret holding the client secret.
spec.oauth.clientAuthenticationClientSecretBasic | ClientSecretPostClientSecretBasicHow the client secret is presented to the token endpoint.
spec.oauth.pkcebooltrueEnable RFC 7636 code verification.
spec.oauth.scopes.read / .write[]stringemptyScopes requested for readOnly Connections, and additionally for readWrite. Entries must be RFC 6749 scope tokens (printable ASCII without spaces, quotes, or backslashes) of at most 256 bytes; the read and write sets together must encode to at most 2048 bytes.
spec.oauth.additionalAuthorizeParametersmapemptyStatic authorize query parameters, each value at most 512 bytes and 2048 bytes encoded in total. Reserved OAuth fields and credential-like names (token, secret, api_key, assertion, and similar) are rejected; the spec is public configuration. Endpoint URLs may carry a query of at most 1024 bytes, but not credential-like parameters or reserved OAuth fields (including code_verifier). An HTTP tool URL may use any query name that is not credential-like, such as state=open.
spec.tools[].namestringrequiredTool name exposed to agents. Unique within the provider.
spec.tools[].classread | writerequiredWrite tools are hidden from readOnly Connections and require approval.
spec.tools[].sourceBuiltin | HTTPrequiredBuiltin names an existing Orka tool. HTTP carries a curated definition in http.
spec.tools[].description, .parameters, .httpHTTP tools only. parameters must be a JSON Schema whose root declares type: object and that resolves in full, including nested property schemas. http.url must be HTTPS and is the exact destination, without template placeholders; static headers are limited to 128-byte names, 1024-byte values, and 4096 bytes in total; Authorization, Cookie, Host, Txn-Token, and hop-by-hop headers (Connection, Keep-Alive, Te, Trailer, Upgrade, and similar) are reserved, and credential-like header names (X-Api-Key, X-Auth-Token, and similar) are rejected: the linked account is the only credential.

Status contains only observedGeneration, Accepted, and ResolvedRefs. Builtin declarations are checked against the controller's built-in tool registry and the connector built-in catalog (the GitHub tools listed in the Connectors guide): a misspelled name, a built-in that would ignore the linked credential, or a class other than the one the catalog fixes for the tool is rejected.

Connection​

Connection is one person's linked account with one ConnectorProvider. The API server creates it from the caller's verified OIDC or context-token identity; spec.subject and spec.providerRef are immutable. Deleting the Connection is the disconnect. Status never carries token material.

FieldTypeDefaultDescription
spec.subject.issuerstringrequiredIdentity issuer that verified the subject. Immutable.
spec.subject.subjectstringrequiredIssuer-scoped stable subject. Immutable.
spec.providerRef.namestringrequiredSame-namespace ConnectorProvider. Immutable.
spec.modereadOnly | readWritereadOnlyreadOnly hides the provider's write tools and requests only read scopes.
status.statestringPending, Ready, Expired, Revoked, or Error.
status.grantedScopes[]stringScopes the provider reported at consent time.
status.linkedAt, .expiresAt, .lastRefreshTimetimeLink, access-token expiry, and refresh timestamps.
status.grantSequenceintegerThe grant custody assigned to the linked material; it rises with every committed consent and never repeats. Authority frozen or approved under one grant does not survive a re-link.
status.consent.providerUID, .authorityDigeststringThe ConnectorProvider UID and a non-secret digest of everything the last consent authorized a token to reach: the provider's OAuth client identity (client ID, secret reference, authentication method, endpoints, static authorize parameters) and the curated HTTP tool destinations (name, class, URL, method, static headers). Built-in declarations (name, class, and their fixed https://api.github.com audience) are part of it too. Changing any of these asks for consent again.

Conditions are ProviderResolved and ScopesGranted (set by the controller; the latter compares status.grantedScopes with the scopes the current mode and provider require, so widening the mode or a provider requiring more scopes projects Pending with reason ConsentRequired without erasing the consent, and narrowing restores readiness; it also requires status.consent to match the current provider, so a replaced provider or a changed OAuth client asks for consent again instead of refreshing or revoking the held token against a different authority) and Ready (set by the consent and refresh paths). A Connection is usable only when Ready is True and both controller conditions are True for the current generation. See ADR 0033 for the design.

RepositoryScan​

Repository security scan configuration. A RepositoryScan is namespace-scoped and tells Orka which repository to scan, how to schedule incremental scans, and which Agents should perform analysis and remediation.

apiVersion: core.orka.ai/v1alpha1
kind: RepositoryScan
metadata:
name: example-repo
namespace: orka-system
spec:
provider: github
repoURL: "https://github.com/example/app"
owner: example
repository: app
branch: main
ref: "v1.2.3" # optional tag, branch, or commit SHA checkout override
subPath: "services/api" # optional monorepo scope
gitSecretRef: # optional for private repositories
name: github-credentials
forkRepo: "https://github.com/example/app-security-fork" # optional remediation fork
prBaseBranch: main # optional PR base branch override
schedule: "0 2 * * *" # optional cron expression for incremental scans
timeZone: "UTC" # optional IANA time zone
historyDays: 30 # optional initial history window
validationMode: light # off, light, or full
validationMaxFindingsPerRun: 8 # optional auto-validation task cap for light mode
validationMinSeverity: medium # optional auto-validation severity threshold
validationMinConfidence: medium # optional auto-validation confidence threshold
customScanInstructionsRef: # optional ConfigMap-backed additive scanner instructions
name: repo-security-policy
key: policy # optional; defaults to policy
falsePositivePolicyRef: # optional ConfigMap-backed false-positive policy
name: repo-security-policy
key: false-positives
analysisAgentRef:
name: security-reviewer
patchAgentRef: # optional; defaults to the analysis agent when omitted
name: security-patcher
maxFindingsPerRun: 25
suspend: false # pause scheduled incremental scans when true

Spec fields:

FieldTypeRequiredDescription
providerstringNoSource control provider. github is the supported v1 provider and default.
repoURLstringYesRepository URL to scan.
ownerstringNoRepository owner or organization. Inferred from repoURL when omitted.
repositorystringNoRepository name. Inferred from repoURL when omitted.
branchstringNoBase branch to scan. Defaults to the literal main when omitted (not resolved from the repository's actual default branch). Set this explicitly for repositories whose default branch is not main.
refstringNoSpecific git ref, tag, or commit SHA to check out for scan tasks. When ref is set and branch is omitted, scan workspaces check out the ref directly instead of forcing main; PR remediation still uses prBaseBranch or main unless branch is set.
subPathstringNoOptional subdirectory to scan in a monorepo.
gitSecretRefLocalObjectReferenceNoCompatibility source-read Secret for scan Tasks; readCredentialRef takes precedence when both are set. Never used for publication.
readCredentialRefLocalObjectReferenceFor patchesSource clone/read Secret. Required, together with the three publication roles below, before any patch proposal or remediation PR.
publicationReadCredentialRefLocalObjectReferenceFor patchesTarget-repository read Secret used only for publication preflight and independent verification.
publicationCredentialRefLocalObjectReferenceFor patchesTarget-repository write Secret used only for the exact compare-and-swap branch push.
forgeCredentialRefLocalObjectReferenceFor patchesForge API Secret used for controller-side forge reads and PR upkeep: fetching the published remediation commit to derive and verify patch evidence, and reconciling/decorating the remediation pull request. Never mounted into any Task. The four patch roles must reference pairwise-distinct Secrets.
forkRepostringNoWritable fork repository URL for patch proposal branches and remediation PRs.
prBaseBranchstringNoPull request base branch for remediation. Defaults to branch when omitted.
schedulestringNoCron expression for scheduled incremental scans.
timeZonestringNoIANA time zone used by schedule.
historyDaysint32NoHow far back the initial scan should inspect repository history.
validationModestringNoValidation aggressiveness: off, light, or full. Defaults to light.
validationMaxFindingsPerRunint32NoMaximum automatic validation tasks to enqueue per scan run in light mode.
validationMinSeveritystringNoMinimum severity eligible for automatic validation. Defaults are mode-dependent.
validationMinConfidencestringNoMinimum confidence eligible for automatic validation. Defaults are mode-dependent.
customScanInstructionsRefPolicyConfigMapKeyRefNoSame-namespace ConfigMap key containing additive scanner instructions. The ConfigMap must opt in with orka.ai/security-policy: "true" as a label or annotation.
falsePositivePolicyRefPolicyConfigMapKeyRefNoSame-namespace ConfigMap key containing additive false-positive policy text. The ConfigMap must opt in with orka.ai/security-policy: "true" as a label or annotation.
analysisAgentRefAgentReferenceYesAgent used for repository scan runs and threat model generation.
patchAgentRefAgentReferenceNoAgent used for patch proposal runs.
maxFindingsPerRunint32NoBounds accepted scan findings per run after validation and deterministic dropped-finding filters.
suspendboolNoPauses scheduled incremental scans while preserving the scan configuration.

PolicyConfigMapKeyRef uses name plus optional key; when key is omitted, Orka reads the policy key. Policy ConfigMap values are capped at 32 KiB and rejected if they look like they contain secrets, tokens, private keys, or credentials. Custom policy text is additive only; it cannot disable Orka's default evidence, no-secret, or finding-quality rules.

Status fields:

status.phase, status.lastScanID, status.lastScanTaskName, status.lastSuccessfulScanAt, status.lastObservedHeadSHA, status.lastProcessedCommit, status.threatModelVersion, status.findingCounts, and status.conditions summarize the latest scan lifecycle and open findings. Dynamic scan runs, threat models, findings, and patch proposals are stored by the controller and surfaced through the security API/UI rather than embedded directly in the CRD status.

RepositoryMonitor​

Durable automation for one GitHub repository. A RepositoryMonitor is namespace-scoped and tells Orka which repository and branch to watch, which Agents review pull requests and work on issues, which credentials each role may use, and which labels and schedules control the work. Repository monitors and Issue-to-PR automation explain the workflows.

apiVersion: core.orka.ai/v1alpha1
kind: RepositoryMonitor
metadata:
name: example-app
namespace: orka-system
spec:
provider: github
repoURL: "https://github.com/example/app"
owner: example # optional; inferred from repoURL
repository: app # optional; inferred from repoURL
branch: main
readCredentialRef: # optional for private repositories or higher API rate limits
name: repo-monitor-source-read
schedule: "*/30 * * * *" # optional cron expression
timeZone: "UTC" # optional IANA time zone
suspend: false
targets:
pullRequests:
enabled: true
includeDrafts: false
maxPerRun: 20
agents:
reviewer:
name: repo-reviewer
review:
event: COMMENT # legacy task input only; does not publish to GitHub
staleReviewTTL: 24h
exactEventEnabled: true # queue exact-head runs from signed PR webhooks
publish:
enabled: true # default false; controller-owned GitHub side effect
mode: summary_with_inline_findings
event: COMMENT # V1 only supports neutral COMMENT reviews
postPassed: false
postNeedsChanges: true
postNeedsHuman: true
postSecuritySensitive: false
sameHeadPolicy: skip
inline:
enabled: true
minPriority: P2
maxComments: 10
policy:
protectedLabels:
- security-sensitive
pauseLabels:
- orka:pause
validation:
image: ghcr.io/example/app-validation@sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa # must contain /bin/sh and the repository's validation tools

Spec fields:

FieldTypeRequiredDescription
providerstringNoSource control provider. github is the supported v1 provider and default.
repoURLstringYesCredential-free GitHub repository root URL to monitor, such as https://github.com/owner/repo, https://github.com/owner/repo.git, or git@github.com:owner/repo.git. Pull request, issue, branch/tree, blob/file, commit, query-string, fragment, non-GitHub, HTTP, and embedded-credential URLs are rejected.
ownerstringNoRepository owner or organization. Inferred from repoURL when omitted.
repositorystringNoRepository name. Inferred from repoURL when omitted.
branchstringNoBase branch used for pull request inventory. Defaults to main.
gitSecretRefLocalObjectReferenceNoBackward-compatible source-read Secret containing token, password, or GITHUB_TOKEN. readCredentialRef takes precedence when both are set. Never used for publication or forge writes.
readCredentialRefLocalObjectReferenceNoSource clone/read Secret, used only by the clean-room workspace boundary.
publicationReadCredentialRefLocalObjectReferenceFor write workflowsTarget-repository read Secret used only for publication preflight and independent verification.
publicationCredentialRefLocalObjectReferenceFor write workflowsTarget-repository write Secret used only for the exact compare-and-swap branch push.
forgeCredentialRefLocalObjectReferenceFor write workflows, label triggers, and review publishingGitHub API Secret used only for controller-owned forge reads and mutations. The four roles must reference pairwise-distinct Secrets.
schedulestringNoCron expression for scheduled monitor runs.
timeZonestringNoIANA time zone used by schedule.
suspendboolNoPauses scheduled monitor runs while preserving the monitor configuration.
targets.pullRequests.enabledboolNoEnables pull request monitoring. Defaults to true; set false for an issue-only monitor.
targets.pullRequests.includeDraftsboolNoSelect draft pull requests for review when true. Defaults to false.
targets.pullRequests.maxPerRunint32NoMaximum selected PRs per run. Defaults to 20; allowed range is 1 to 100.
targets.issues.enabledboolNoEnables issue inventory and the issue workflow. Defaults to false.
targets.issues.maxPerRunint32NoMaximum selected issues per run, 1 to 100.
targets.issues.includeLabels / excludeLabelslistNoRestrict issue inventory to issues with any of these labels, or exclude issues with them.
triggers.github.labels.enabledboolNoAccept orka:* label commands from signed GitHub webhooks.
triggers.github.labels.consumeCommandLabelsboolNoRemove an accepted command label after durable intake.
triggers.github.labels.requireActorPermissionstringNoMinimum GitHub permission of the person applying a command label: write (default), maintain, or admin.
triggers.github.labels.issues.implementstringNoLabel that starts the issue workflow. Defaults to orka:implement.
agents.reviewerAgentReferenceWhen PR monitoring is enabledAgent for read-only pull request review. It must use a built-in claude, codex, or opencode runtime and omit spec.secretRef; the runtime proxy supplies model credentials.
agents.triager, agents.researcher, agents.plannerAgentReferenceNoAgents for read-only issue triage, research, and planning.
agents.implementerAgentReferenceNoAgent for issue implementation, a write workflow.
agents.repairerAgentReferenceNoAgent for pull request repair, a write workflow.
issueWorkflow.triage.enabled, .research.enabled, .planning.enabled, .implementation.enabledboolNoEnable each issue phase. Each defaults to on when its Agent is configured and a command requests it.
issueWorkflow.implementation.requirePlanboolNoRequire a current ready plan before implementation. Defaults to true.
issueWorkflow.implementation.branchPrefixstringNoPrefix for implementation push branches. Defaults to orka/issue.
issueWorkflow.implementation.maxActiveint32NoConcurrently active implementation jobs per monitor. Defaults to 2.
issueWorkflow.implementation.maxAttemptsPerIssueint32NoImplementation attempts per issue. Defaults to 2.
issueWorkflow.implementation.maxChangedFilesint32NoFiles allowed in one implementation patch. Defaults to 12.
issueWorkflow.implementation.allowedPathslistNoPath globs or prefixes, such as api/**, that implementation patches may touch.
repair.enabledboolNoEnables automatic, bounded pull request repair. Requires agents.repairer and the publication credentials.
repair.maxRepairsPerPR / maxRepairsPerHeadint32NoRepair limits. Default 5 per pull request and 2 per head.
repair.maxValidationRetriesint32NoValidation retries for one repair job. Default 2.
review.requireGreenCIboolNoWait for green CI before selecting a pull request for review.
review.eventstringNoLegacy/default review event value included in review task input. It does not publish to GitHub; use review.publish.event. Defaults to COMMENT.
review.publish.enabledboolNoEnables controller-owned GitHub pull request review publishing. Defaults to false.
review.publish.modestringNosummary_only or summary_with_inline_findings. Inline comments are only attempted for changed RIGHT-side diff lines.
review.publish.eventstringNoGitHub review event submitted by the controller. V1 only supports neutral COMMENT reviews; APPROVE and REQUEST_CHANGES are rejected.
review.publish.postPassedboolNoPost clean/passed reviews when true. Defaults to false.
review.publish.postNeedsChangesboolNoPost needs_changes reviews when true. Defaults to true.
review.publish.postNeedsHumanboolNoPost needs_human reviews when true. Defaults to true.
review.publish.postSecuritySensitiveboolNoAllow public publishing of security_sensitive results. Defaults to false; sensitive findings are skipped by default.
review.publish.sameHeadPolicystringNoDuplicate policy for the same monitor, PR, and head SHA. V1 only supports skip.
review.publish.inline.enabledboolNoEnables inline GitHub review comments when mode is summary_with_inline_findings.
review.publish.inline.minPrioritystringNoLowest priority eligible for inline comments (P0-P3). Defaults to P2; lower-priority findings remain in the summary.
review.publish.inline.maxCommentsint32NoMax inline comments per GitHub review. Defaults to 10, allowed range 0 to 50.
review.staleReviewTTLdurationNoRe-review an unchanged head after the previous accepted review is older than this duration.
review.exactEventEnabledboolNoQueue exact-head monitor runs from signed GitHub pull request webhook events when true.
policy.protectedLabelslistNoPR labels that block automated review selection.
policy.pauseLabelslistNoPR labels that pause monitor automation for that item.
validation.imagestringNoContainer image for isolated pull request validation. The reviewer inspects the checked-out code and selects one shell command; Orka fixes the image and exact read-only PR head. The image must contain /bin/sh and every tool the repository may require.

When validation.image is set, the reviewer must call run_validation once and wait for its child Task to finish before returning a passed verdict. A missing, failed, malformed, or stale validation Task blocks passed and merge-ready state. Orka records the image and status with the review and retains only a SHA-256 digest of the selected command in its durable validation binding. Validation stdout and stderr are suppressed so repository or fixture secrets cannot enter Pod logs or result storage. The command runs against a read-only checkout with deny-all ingress and egress, so the image must already contain every required tool and dependency. If a Go repository needs golangci-lint, for example, use a Go-based image that includes dependencies and golangci-lint. The same rule applies to offline Terraform, Azure CLI, or other repository-specific checks. Maintainers normally set this image once per RepositoryMonitor; commands, args, credentials, and network access are not part of the monitor configuration.

Before upgrading a monitor that uses the former validation.mode and validation.commands fields, replace them with validation.image. The CRD retains the old fields so the controller can detect existing policies, but it does not execute them. A non-empty legacy command list puts the monitor in Error with reason LegacyValidationCommandsUnsupported; Orka does not silently disable validation. Apply the updated CRD before upgrading the controller, then update each affected monitor with a digest-pinned image and remove the legacy fields.

targets.commits is rejected until commit inventory is implemented. Review tasks check out the exact PR head and receive generated read-only context files under /workspace/.git/orka/: pr-review.md, pr-review.files, and pr-review.diff. GitHub publishing, branch pushes, PR creation, label consumption, and readiness publication are controller-owned and audited through mutation records; read-only agents never receive the GitHub mutation token. GitHub's per-PR auto-merge setting owns merging. Orka never enables auto-merge or calls the merge endpoint; when it is disabled, the PR stays open and ready.

Status fields:

status.phase, status.lastRunID, status.lastRunTime, status.lastSuccessfulRunTime, status.observedGeneration, status.openPullRequests, status.pendingReviews, status.activeRepairs, status.blockedItems, status.mergeReadyItems, and status.conditions summarize the monitor lifecycle and current queue. Dynamic runs, PR items, review records, repair records, command events, and audit events are stored by the controller and surfaced through the monitor API/UI rather than embedded directly in CRD status.

See Repository Monitors for the workflow, API examples, and current limits.

SubstrateActorPool​

SubstrateActorPool is an operator-owned pool of deterministic Substrate actors for native MCP Tools and density reporting. It does not place ACP Tasks. Enable it with --substrate-mcp-tools-enabled.

apiVersion: core.orka.ai/v1alpha1
kind: SubstrateActorPool
metadata:
name: codex-substrate-pool
spec:
templateRef:
name: orka-codex
namespace: ate-demo
workerPoolRef:
name: orka-workers
namespace: ate-demo
targetActors: 4
precreateActors: true
FieldTypeDefaultDescription
templateRef.namestringrequiredSubstrate ActorTemplate used for pool members.
templateRef.namespacestringPool namespaceNative Substrate Atespace containing the ActorTemplate.
workerPoolRef.namestringemptyOptional Substrate WorkerPool used for capacity and density reporting.
workerPoolRef.namespacestringPool namespaceNamespace containing the WorkerPool.
targetActorsinteger0Desired stateful actor count, capped at 1000. References from Tools require at least 1.
precreateActorsbooleanfalsePre-create deterministic warm actors up to targetActors.

spec.templateRef is immutable. Orka records the first accepted native template