---title: "Core Model"description: "The main data and runtime concepts in executor today."---The most important thing to understand about executor is that it does **not** model the system as one flat `source` row.The current model has a few separate concepts that each exist for a different reason.## The primary concepts### Source bindingA source is the workspace-local installation record.It answers:- what is this integration called in this workspace?- is it enabled?- what namespace should its tools use?- what install-local config does it have?This is why a source carries local concerns like name, namespace, enabled state, binding config, and status.### RecipeA recipe is the shareable integration identity.It answers:- what integration definition is this?- what adapter produced it?- what broad catalog kind does it belong to?A recipe is meant to converge across workspaces when the underlying integration definition is the same.### Revision / materializationA recipe revision is the compiled result of an import.It answers:- what source config produced this compiled shape?- what manifest, documents, schema bundles, and operations belong to it?This is the durable execution artifact layer.### Operation IROperations are the canonical callable tool index.They answer:- what tools exist?- how should they be searched and described?- how does invocation find the right persisted operation quickly?The operation layer exists because raw upstream documents are not a good direct query surface for search, policy, and invocation lookup.### CredentialCredentials are private auth bindings.They answer:- who can authenticate for this binding?- for which slot?- using what auth kind and secret refs?Credentials are actor-scoped by default because two users in the same workspace may connect different identities to the same source.## Why the split mattersThis split fixes a few old problems:- shareable definition is no longer confused with workspace-local installation- auth is no longer implicitly one-token-per-source- materialized tool content is no longer stored directly under one workspace source- provider-specific import details do not need to become universal top-level columns## Binding configSource-specific connection config now lives in adapter-owned binding payloads:- `bindingVersion`- `binding`That means the core model does not need built-in fields forever for every provider-specific connection knob.Examples:- OpenAPI binding can carry `specUrl` and `defaultHeaders`- MCP binding can carry `transport`, `queryParams`, and `headers`- internal bindings can be emptyThe adapter owns serialization, decoding, defaults, and validation for that payload.## Catalog kinds vs adaptersExecutor separates broad catalog kinds from adapter keys.Catalog kinds:- `imported`- `internal`Adapters are more specific:- `openapi`- `graphql`- `mcp`- `google_discovery`- future `postman_collection`- future `snippet_bundle`The important distinction is that execution now belongs to adapters. The shared catalog stays broad and stable, while connect/auth/invoke behavior is described through adapter strategies instead of one top-level runtime family enum.## Why this is the right shapeThe current model is designed so that new support usually means:- add or evolve an adapter- compile into the same recipe/revision/operation layersand not:- redesign how source persistence fundamentally worksThat is the main goal of the current architecture.
---
title: "Core Model"
description: "The main data and runtime concepts in executor today."
---
The most important thing to understand about executor is that it does **not** model the system as one flat `source` row.
The current model has a few separate concepts that each exist for a different reason.
## The primary concepts
### Source binding
A source is the workspace-local installation record.
It answers:
- what is this integration called in this workspace?
- is it enabled?
- what namespace should its tools use?
- what install-local config does it have?
This is why a source carries local concerns like name, namespace, enabled state, binding config, and status.
### Recipe
A recipe is the shareable integration identity.
It answers:
- what integration definition is this?
- what adapter produced it?
- what broad catalog kind does it belong to?
A recipe is meant to converge across workspaces when the underlying integration definition is the same.
### Revision / materialization
A recipe revision is the compiled result of an import.
It answers:
- what source config produced this compiled shape?
- what manifest, documents, schema bundles, and operations belong to it?
This is the durable execution artifact layer.
### Operation IR
Operations are the canonical callable tool index.
They answer:
- what tools exist?
- how should they be searched and described?
- how does invocation find the right persisted operation quickly?
The operation layer exists because raw upstream documents are not a good direct query surface for search, policy, and invocation lookup.
### Credential
Credentials are private auth bindings.
They answer:
- who can authenticate for this binding?
- for which slot?
- using what auth kind and secret refs?
Credentials are actor-scoped by default because two users in the same workspace may connect different identities to the same source.
## Why the split matters
This split fixes a few old problems:
- shareable definition is no longer confused with workspace-local installation
- auth is no longer implicitly one-token-per-source
- materialized tool content is no longer stored directly under one workspace source
- provider-specific import details do not need to become universal top-level columns
## Binding config
Source-specific connection config now lives in adapter-owned binding payloads:
- `bindingVersion`
- `binding`
That means the core model does not need built-in fields forever for every provider-specific connection knob.
Examples:
- OpenAPI binding can carry `specUrl` and `defaultHeaders`
- MCP binding can carry `transport`, `queryParams`, and `headers`
- internal bindings can be empty
The adapter owns serialization, decoding, defaults, and validation for that payload.
## Catalog kinds vs adapters
Executor separates broad catalog kinds from adapter keys.
Catalog kinds:
- `imported`
- `internal`
Adapters are more specific:
- `openapi`
- `graphql`
- `mcp`
- `google_discovery`
- future `postman_collection`
- future `snippet_bundle`
The important distinction is that execution now belongs to adapters. The shared catalog stays broad and stable, while connect/auth/invoke behavior is described through adapter strategies instead of one top-level runtime family enum.
## Why this is the right shape
The current model is designed so that new support usually means:
- add or evolve an adapter
- compile into the same recipe/revision/operation layers
and not:
- redesign how source persistence fundamentally works
That is the main goal of the current architecture.