In this repo the Go engine lives at the repository root. CLI command wiring lives under internal/cli/ (split by command domain), while app orchestration entrypoints live under platform/workflow/app/.
Shared contracts should live under platform/core/contracts/ to avoid stale cross-package contract copies.
docs/ARCHITECTURE_OWNERSHIP.mddocs/BINARY_PROFILES_ADR.mdCanonical ownership and dependency direction rules for provider, router, runtime, simulator, and CLI orchestration domains are frozen in docs/ARCHITECTURE_OWNERSHIP.md.
Binary command ownership contracts for runfabric, runfabricd, and runfabricw are frozen in docs/BINARY_PROFILES_ADR.md.
That ADR is the source of truth for:
platform/extensions importer rule.| CLI command | File | Calls app boundary |
|---|---|---|
runfabric deploy |
internal/cli/lifecycle/deploy.go |
platform/workflow/app.Deploy (or DeployFromSourceURL for --source) |
runfabric remove |
internal/cli/lifecycle/remove.go |
platform/workflow/app.Remove |
runfabric invoke run |
internal/cli/invocation/invoke.go |
platform/workflow/app.Invoke |
runfabric invoke logs |
internal/cli/invocation/logs.go |
platform/workflow/app.Logs |
internal/cli/common/app_service.go provides a small app-service interface used by CLI command handlers.
Location: platform/workflow/app/
Core pieces:
bootstrap.go loads config, resolves extensions, and wires state backends.provider_dispatch.go resolves provider mode:
dispatchInternaldispatchAPIdispatchPlugindeploy.go, remove.go, invoke.go, and logs.go route behavior by mode.Location: platform/extensions/registry/resolution/ and platform/extensions/providerpolicy/
platform/extensions/providerpolicy/providers.go is the single platform importer of root extensions/... plugin implementations.platform/deploy/core/api (Run, Remove, Invoke, Logs).platform/workflow/lifecycle.platform/deploy/controlplane orchestrates lock/journal/recovery behavior and uses platform/deploy/exec as the phase engine.internal/cli/lifecycle/recover.goplatform/workflow/app/recover.goplatform/workflow/recoveryRecover operations execute through provider recovery capability with durable journal state.
Workflow execution currently uses a single in-process durable runtime loop (not separate scheduler and dispatcher services).
runfabric workflow run|status|cancel|replay) in internal/cli/common/workflow.go.platform/workflow/app/workflow.go.platform/deploy/controlplane/workflow_runtime.go.platform/deploy/controlplane/workflow_typed_steps.go.platform/core/state/core/runs.go under .runfabric/runs/<stage>/<runId>.json.WorkflowRuntime loop that performs both responsibilities:
WorkflowStepHandler,Two distinct binding layers exist and should not be conflated:
code, ai-*, human-approval) to typed handler behavior in workflow_typed_steps.go.WorkflowRuntime step scheduling loop.platform/deploy/controlplane/workflow_ai_runtime.go behind AIStepRunner.TypedStepHandler routes ai-retrieval, ai-generate, ai-structured, and ai-eval to AIRunner.workflow_mcp_runtime.go and policy-checked in core runtime.Do not add AI execution logic to provider adapters. Keep AI execution in controlplane/runtime so behavior remains cloud-agnostic, testable, and policy-consistent.
Built-in provider implementations live under extensions/providers/<name>/.
extensions/providers/
├── aws/
├── gcp/
├── azure/
├── cloudflare/
├── vercel/
├── netlify/
├── kubernetes/
├── alibaba/
├── digitalocean/
├── fly/
└── ibm/
Related built-in plugin roots:
extensions/runtimes/extensions/routers/extensions/simulators/extensions/secretmanagers/extensions/states/API dispatch wiring remains provider-neutral in platform/deploy/core/api/ and provider policy mapping in platform/extensions/providerpolicy/.
AWS uses the controlplane path.
See also: ARCHITECTURE_OWNERSHIP.md, DEPLOY_PROVIDERS.md, COMMAND_REFERENCE.md