Skip to content

SDK Parity Matrix

This is the canonical Ironflow capability catalog and the exhaustive companion to the SDK Comparison page. Its schema and exposure boundaries are recorded in ADR 0065 after the implementation-evidence audit of 2026-08-26. Where the comparison page answers “which SDK should I use”, this matrix answers “exactly how is this capability exposed, and how sure are we”.

Statuses: full (verified end to end), partial (works with a documented limit), indirect (delivered through a different mechanism than the named endpoint), missing (implemented on the server, no exposure here), intentionally-excluded (a deliberate product or trust boundary), not-applicable, unverified (support could not be proved from source — treat as unknown, not as ❌). Tests/Docs record the audited state per capability, and Classification names the dominant gap class for the row (none means no gap).

The ironflow serve command wires NATS, PubSub, the NATS-backed secrets manager, and an engine with a worker manager. Embedded servers can omit those dependencies, which changes the routes that are actually mounted:

SurfaceRequired dependencyBehavior when dependency is absent
PubSubService (ConnectRPC)PubSub bridge and consumer managerService is not mounted.
Pub/sub publish (REST)PubSub bridgeRoute remains mounted and returns HTTP 503.
Pub/sub subscriptions (WebSocket)PubSub managerUpgrade succeeds; subscribe requests return PubSub not configured.
KV and config (REST and WebSocket watch)NATS providerRoutes are not mounted.
Secrets (REST)Secrets managerRoutes are not mounted. The standard CLI manager is NATS-backed.
WorkerService (ConnectRPC)Engine with a worker managerService is not mounted.
Pull-worker polling (REST)None for route mounting; engine for dispatchRoutes remain mounted. Engine-backed work is unavailable.

The REST route manifest is the immutable SDK-generation catalog, so it still lists optional REST routes that an embedded instance did not mount. The ConnectRPC portion is built from that instance’s mounted-service snapshot.

Nine capability rows cover server push and live delivery. This is a capability inventory, not a count of wire endpoints: Pub/sub subscription has both a ConnectRPC stream and the generic WebSocket transport.

Capability IDServer transport
exec-push-serveEngine HTTP POST to the SDK-owned serve() endpoint
exec-streaming-workerWorkerService/Connect bidirectional stream
proj-stream-eventsProjectionService/StreamProjectionEvents server stream
proj-catchupProjectionService/WaitProjectionCatchupStream server stream
pubsub-subscribePubSubService/Subscribe server stream and GET /ws
pubsub-subscribe-bidiDedicated RPC is unimplemented; SDKs compose subscribe plus acknowledgments
pubsub-cg-joinPubSubService/JoinConsumerGroup server stream
kv-watchGET /api/v1/kv/buckets/{bucket}/watch WebSocket upgrade
config-watchGET /api/v1/config/{name}/watch WebSocket upgrade

The KV and config watch routes are present in sdk-parity.yaml and measured in sdk-coverage.json. The generic GET /ws transport is deliberately skipped by the endpoint ledger and represented by the pubsub-subscribe capability row.

IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
event-emitEmit/trigger eventnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
event-emit-syncSynchronous triggernoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
event-emit-batchBatch triggernoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
event-listList eventsnoAPI key/JWTfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
event-namesList event namesnoAPI key/JWTfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
event-getGet event by IDnoAPI key/JWTfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
function-registerRegister functionyesAPI keynot-applicablefullnot-applicablefullfullnot-applicablefullnot-applicabletesteddocumentednone
function-listList functionsnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
function-getGet function detailnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
function-invokeDirect invoke by IDnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
function-statusEnable/disable functionnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
function-deleteDelete functionnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
function-historyFunction version historynoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
function-at-versionGet function at versionnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
function-rollbackRollback function versionnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
deployment-registerRegister executable deploymentnoAPI key/JWT; functions:registernot-applicablefullnot-applicablemissingmissingintentionally-excludedfullnot-applicabletestedunverifieddocumentation gap
deployment-readRead deployments and execution routingnoAPI key/JWT; functions:readnot-applicablefullnot-applicablemissingmissingintentionally-excludedfullnot-applicabletestedunverifieddocumentation gap
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
run-listList runsnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
run-getGet runnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
run-stepsRun step listnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
run-cancelCancel runnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
run-resumeResume runnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
run-pausePause runnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
run-paused-stateGet paused-run statenoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
run-auditPer-run audit trailnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
run-streamsEntity streams touched by runnoAPI key/JWTfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
step-patchLive patching of step outputnononenot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
step-inject-outputInject step output into paused runnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
tt-run-state-atRun state at timestampnoRPC-onlynot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
tt-run-timelineRun mutation timelinenoRPC-onlynot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
tt-step-output-atHistorical step outputnoRPC-onlynot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
step-run-memoizedstep.run memoizationyesTier-1 SDKs onlynot-applicablenot-applicablefullfullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
step-sleepDurable sleep/sleepUntilyesTier-1 SDKs onlynot-applicablenot-applicablefullfullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
step-wait-for-eventwaitForEvent yieldyesTier-1 SDKs onlynot-applicablenot-applicablefullfullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
step-invokestep.invoke / invokeAsyncyesTier-1 SDKs only; ADR 0010not-applicablenot-applicablefullfullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
step-parallelParallel branchesyesTier-1 SDKs only; client-side executionnot-applicablenot-applicableindirectfullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
step-compensateSaga compensationyesTier-1 SDKs onlynot-applicablenot-applicablefullfullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
exec-push-servePush mode serve()yesPushTimeout budget; optional HMAC signaturenot-applicablenot-applicablefullfullfullintentionally-excludedindirectnot-applicabletesteddocumentednone
exec-pull-workerPull worker protocol (register/heartbeat/poll/ack/update)yesREST routes always mount; engine required for dispatch; parity-manifest excludedfullnot-applicablenot-applicablefullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
exec-workers-listList connected workersnoAPI key/JWTfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
exec-streaming-workerStreaming worker (bidi)yesopt-in; Connect service mounts only when the engine has a worker managernot-applicablefullnot-applicablefullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
stream-appendAppend entity eventnooptimistic concurrencynot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
stream-readRead stream eventsnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
stream-infoStream infonoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
stream-listList entity streamsnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
stream-historyUnified entity historynoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
snapshot-createCreate snapshotnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
snapshot-getGet snapshotnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
proj-registerRegister projection (external runner)yesworker-SDK surfacenot-applicablefullnot-applicablefullfullnot-applicableintentionally-excludednot-applicabletesteddocumentednone
proj-unregisterUnregister projectionyesworker-SDK surfacenot-applicablefullnot-applicablefullfullnot-applicableintentionally-excludednot-applicabletesteddocumentednone
proj-runner-transportRunner transport (poll/save-state/ack/rebuild-progress)yesRPC_SKIP transport plumbingnot-applicablefullnot-applicablefullfullnot-applicableintentionally-excludednot-applicabletestedunverifiednone
proj-stream-eventsStream projection eventsyesserver-stream; Go delivers via polling insteadnot-applicablefullnot-applicableindirectfullnot-applicablefullnot-applicabletesteddocumentednone
proj-getGet projectionnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
proj-listList projectionsnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
proj-statusProjection status/lagnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
proj-partitionsPartition listingnoAPI key/JWT; browser operator boundaryfullnot-applicablenot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
proj-rebuildRebuild projectionnoAPI key/JWT; browser operator boundarynot-applicablefullnot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
proj-rebuild-statusRebuild job statusnoAPI key/JWT; browser operator boundarynot-applicablefullnot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
proj-rebuild-cancelCancel rebuildnoAPI key/JWT; browser operator boundarynot-applicablefullnot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
proj-pausePause projectionnoAPI key/JWT; browser operator boundarynot-applicablefullnot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
proj-resumeResume projectionnoAPI key/JWT; browser operator boundarynot-applicablefullnot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
proj-deleteDelete projectionnoAPI key/JWT; browser operator boundaryfullnot-applicablenot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
proj-sql-createCreate managed SQL projectionnoGo uses raw SQL; browser operator boundarynot-applicablefullnot-applicableintentionally-excludedfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
proj-sql-queryQuery SQL projectionnoAPI key/JWTnot-applicablefullnot-applicableintentionally-excludedfullfullfullnot-applicabletesteddocumentednone
proj-catchupWait for projection catchupno#473; stream variant existsnot-applicablefullfullfullfullfullfullnot-applicabletesteddocumentednone
proj-catchup-batchBatch catchup waitnoAPI key/JWT; browser operator boundarynot-applicablefullnot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
proj-wait-for-eventWait for event appliednoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
worker-projection-managedManaged (pure reducer) projection handleryesTier-1 SDKs onlynot-applicablenot-applicablefullfullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
worker-projection-externalExternal (side-effect) projection handleryesTier-1 SDKs onlynot-applicablenot-applicablefullfullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
event-upcastersClient-side upcaster registryyesruntime registration Tier-1 only; Browser and Python have no worker runtime; server dry-run separatenot-applicablenot-applicablefullfullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
pubsub-publishPublish to topicnoNATS required; REST and Connect return 503 without a bridgenot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
pubsub-subscribeSubscribe replay+livenoNATS required; Connect service is late-mounted; WebSocket subscribe errors without a manager; Go path near-untestednot-applicablefullfullfullfullfullpartialnot-applicablepartialpartialSDK transport gap
pubsub-subscribe-bidiBidirectional subscribenoDedicated Connect method is late-mounted but unimplemented; SDKs compose subscribe plus acknowledgmentsnot-applicablepartialnot-applicableindirectindirectindirectnot-applicablenot-applicabletesteddocumentedstreaming transport gap
pubsub-cg-manageConsumer group CRUDnoNATS required; Connect service is late-mountednot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
pubsub-cg-joinJoin consumer groupnoNATS required; Connect service is late-mountednot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
pubsub-topicsList topicsnoNATS required; Connect service is late-mounted; browser operator boundarynot-applicablefullnot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
pubsub-topic-statsTopic statsnoNATS required; Connect service is late-mounted; browser operator boundarynot-applicablefullnot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
kv-bucketsKV bucket CRUDnoNATS required; REST routes are absent without a providerfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
kv-keysKV key CRUD + listnoNATS required; REST routes absent without a provider; Python exposes conditional headers as generated kwargsfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
kv-watchWatch KV bucketnoNATS required; REST watch route is absent without a providerfullnot-applicablefullfullfullfullmissingnot-applicabletestedpartialstreaming transport gap
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
config-readGet/list confignoNATS required; REST routes are absent without a providerfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
config-writeSet/patch/delete confignoNATS required; REST routes are absent without a provider; server-onlyfullnot-applicablenot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
config-watchWatch confignoNATS required; REST watch route is absent without a provider; browser uses a WebSocket topic insteadfullnot-applicablefullfullfullindirectmissingnot-applicabletestedpartialstreaming transport gap
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
secret-crudSecrets CRUD (values write-only)noSecrets manager required; REST routes are absent without one; browser-excluded by designfullnot-applicablenot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
schema-registerRegister schema versionnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
schema-readList/get schemasnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
schema-deleteDelete schema versionnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
schema-test-upcastDry-run upcaster chainnoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
webhook-ingestInbound provider webhooknoifwh_ token waiver (ADR 0048); not SDK-callablefullnot-applicablenot-applicablenot-applicablenot-applicablenot-applicablenot-applicablenot-applicableunverifieddocumentedintentional product boundary
webhook-source-crudWebhook source managementnosnake_case codec (ADR 0023)not-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
webhook-secret-opsRotate/expire secrets + ingest tokennoreturns minted secrets to caller incl. browsernot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
webhook-verify-testTest verification confignorequest carries signing secret; dashboard diagnosticnot-applicablefullnot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialdocumentedintentional product boundary
webhook-deliveriesDelivery lognoAPI key/JWTnot-applicablefullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
agent-tool-registerRegister agent toolyesURL guard on callbacksnot-applicablefullnot-applicablefullfullnot-applicablefullnot-applicabletesteddocumentednone
agent-tool-invokeInvoke agent toolyesserver-driven HMAC dispatchnot-applicablefullnot-applicableindirectindirectnot-applicablefullnot-applicabletesteddocumentednone
agent-tool-unregisterUnregister agent toolyesworker-SDK surfacenot-applicablefullnot-applicablefullfullnot-applicablefullnot-applicabletesteddocumentednone
agent-tool-listList agent toolsnoAPI key/JWTnot-applicablefullnot-applicablefullfullnot-applicablefullnot-applicabletesteddocumentednone
agent-authoringAgent authoring runtime (agent/defineTool/exposeMcp/llm/memory/spawn/approve)yesTier-1 SDKs onlynot-applicablenot-applicablefullfullfullintentionally-excludedintentionally-excludednot-applicabletesteddocumentednone
agent-client-invokeInvoke agent + read memory (client composition)noInvokeFunctionSync for invoke; projection composition for readMemoryindirectindirectnot-applicableindirectindirectfullindirectnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
langgraph-checkpointerLangGraph checkpointer (IronflowSaver)nocheckpointer-only product scope; list() without thread_id throws; no endpoint drift gateindirectindirectnot-applicablenot-applicablenot-applicablenot-applicablenot-applicablefulltesteddocumenteddrift-detection gap
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
browser-offline-queueOffline write queue (IndexedDB + multitab lock)noADR 0053; browser-onlynot-applicablenot-applicablenot-applicablenot-applicablenot-applicablefullnot-applicablenot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
circuit-breaker-manageCircuit breakers list/resetnoCLI ironflow circuit-breaker is the supported route; ADR 0037fullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialdocumentedintentional product boundary
capacity-viewsCapacity observabilitynoread-only ops surfacefullnot-applicablenot-applicableintentionally-excludedmissingintentionally-excludedfullnot-applicablepartialunverifiedintentional product boundary
debounce-manageDebounce list/cancelnoops surfacefullnot-applicablenot-applicableintentionally-excludedmissingintentionally-excludedfullnot-applicablepartialunverifiedintentional product boundary
outbox-dlqOutbox DLQ list/requeue/discardnoCLI ironflow outbox dlq is the supported routefullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialdocumentedintentional product boundary
flow-edgesFlow map edges (emit/stream/topic/invoke/wait/webhook)nodashboard surface (#1262)fullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialunverifiedintentional product boundary
sql-executeRaw SQL querynoAPI key/JWTnot-applicablefullnot-applicablefullintentionally-excludedmissingfullnot-applicabletesteddocumentednone
audit-env-wideEnvironment-wide auditnoruns:read RBACfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
audit-exportFiltered Audit Log JSONL exportnoruns:read RBAC; dashboard download and direct HTTP streamfullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedintentionally-excludednot-applicabletesteddocumentedintentional product boundary
auth-auditAuthentication and authorization auditnoruns:read RBAC; generated Python onlynot-applicablefullnot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
project-crudProject CRUDnoserver-side surfacefullnot-applicablenot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentednone
env-crudEnvironment CRUDnoEnvironmentService mounted; hand-written SDK methods remain REST-backed per ADR 0065fullfullnot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentednone
env-rotate-apikeyRotate environment API keynorotates by key id over REST (apikey-rotate’s route); compatibility RPC rejects ambiguous multi-key admin rotationindirectfullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
apikey-crudAPI key CRUDnoifkey_/ifplatform_ prefixesfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
apikey-rotateRotate API keynominted secret returned to callerfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
apikey-rolesReplace key rolesnoadmin RBAC; generated Python onlyfullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialunverifiedintentional product boundary
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
org-crudOrganization CRUDnoRBAC + IsPlatform; tenant POST /orgs returns 403fullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
org-exportNDJSON customer-data exportnoauthenticated administrators; no SDK wrapper; per-node single-flight (#774)fullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedintentionally-excludednot-applicableunverifieddocumentedintentional product boundary
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
role-crudRole CRUDnoadmin RBACfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
role-policy-attachRole-policy bindingnoadmin RBACfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
policy-crudCEL policy CRUDnoadmin RBAC; mutations bump policy epoch (#793)fullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
policy-dry-runDry-run policynoadmin RBAC; generated Python onlyfullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialunverifiedintentional product boundary
policy-versionsPolicy versions + rollbacknoadmin RBAC; generated Python onlyfullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialunverifiedintentional product boundary
policy-templatesPolicy templates list + installnoadmin RBAC; generated Python onlyfullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialunverifiedintentional product boundary
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
user-crudUser CRUDnoserver-onlyfullnot-applicablenot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
user-passwordChange user passwordnoself-only authenticated route; server-only browser boundaryfullnot-applicablenot-applicablefullfullintentionally-excludedfullnot-applicabletesteddocumentedintentional product boundary
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
tenant-provisionProvision tenantnoadmin RBACfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
tenant-listList tenantsnoadmin RBACfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
platform-authPlatform login + bootstrapnologin public; bootstrap needs tenant admin keyfullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialunverifiedintentional product boundary
platform-adminPlatform users/roles/policies/tenants/auditnoRequirePlatform(); ifplatform_ keyfullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialunverifiedintentional product boundary
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
auth-dashboard-sessionDashboard login/validate/desktop-sessionnoexcluded from SDK parity by designfullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedintentionally-excludednot-applicableunverifiedunverifiedintentional product boundary
IDCapabilityWorkerRestrictionsRESTConnectRPCOtherGoNodeBrowserPythonLangGraphTestsDocsClassification
cluster-opsCluster health + rotate-tokennometa control plane; not tenant-callablefullnot-applicablenot-applicableintentionally-excludedintentionally-excludedintentionally-excludedfullnot-applicablepartialunverifiedintentional product boundary
health-readyLiveness/readinessnopublic pathsfullfullnot-applicablefullfullfullfullnot-applicabletesteddocumentednone
metrics-endpointPrometheus metricsnoconditional on metrics enabledfullnot-applicablenot-applicablenot-applicablenot-applicablenot-applicablenot-applicablenot-applicableunverifiedunverifiednone
capabilities-discoveryServer capability discoverynopublic; SDK transport detectionfullnot-applicablenot-applicablefullfullfullfullnot-applicabletesteddocumentednone
openapi-specOpenAPI 3.1 specnoREST-only contract; WS surfaces absent from artifactfullnot-applicablenot-applicablenot-applicablenot-applicablenot-applicablenot-applicablenot-applicableunverifieddocumenteddocumentation gap
server-introspectionOverview/routes/debug/SPA/pprofnoparity-excluded tooling surfacesfullnot-applicablenot-applicablenot-applicablenot-applicablenot-applicablenot-applicablenot-applicableunverifiedunverifiednone
server-infoServer infonoCLI ironflow server info; RPC_SKIP transport metadata; no SDK wrappernot-applicablefullnot-applicablenot-applicablenot-applicablenot-applicablenot-applicablenot-applicabletesteddocumentedintentional product boundary