Skip to content

Rework harness and agent concepts - #607

Merged
Rachael-Graham merged 8 commits into
mainfrom
feedback4
Oct 15, 2026
Merged

Rachael-Graham merged 8 commits into
mainfrom
feedback4

Conversation

@Rachael-Graham

@Rachael-Graham Rachael-Graham commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Reworks the Agent harness page, and corrects claims on the pages that share its subject matter.

The harness page is now organized around choosing a runtime. kagent, codex, claude, and byo each get a section carrying that runtime's settings, limits, and a complete example, replacing the old split between a comparison table, a settings section, and two examples.

Several claims were wrong. kagent#3153 removed the controller-owned telemetry variable list in 1.0.0-alpha13, so a Harness that sets one of those variables now overrides the installation default. The page said it was rejected. The provider matrix called Mistral unresolvable, though it has worked since alpha7, and gave a single rejection reason for three providers that fail in two different ways. The readiness section pointed readers at a Harness READY column that nothing writes. References to a Python engine are gone.

Worth a close look: the telemetry sections. The ownership model inverted, so those paragraphs are rewritten rather than edited.

Signed-off-by: Rachael Graham <rachael.graham@solo.io>
Signed-off-by: Rachael Graham <rachael.graham@solo.io>
@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Docs preview

Link Points at
Branch preview The newest push to this branch. Updates in place.
Commit preview 6917de0 only. Frozen.

Both are uploaded Worker versions and serve no production traffic.

Signed-off-by: Rachael Graham <rachael.graham@solo.io>
Signed-off-by: Rachael Graham <rachael.graham@solo.io>
@Rachael-Graham
Rachael-Graham marked this pull request as ready for review October 14, 2026 23:04
Align 1.x documentation with the harness model and clarify BYO agent responsibilities, runtime requirements, Actor environment limits, and pgvector setup for agent memory.

Signed-off-by: Rachael Graham <rachael.graham@solo.io>
@Rachael-Graham Rachael-Graham changed the title Rework harness concepts Rework harness and agent concepts Oct 15, 2026
Signed-off-by: Rachael Graham <rachael.graham@solo.io>
Signed-off-by: Rachael Graham <rachael.graham@solo.io>
| One of `kagent`, `codex`, `claude`, `byo` | Yes | The runtime that executes the agent. Naming none, or more than one, is rejected. For the available runtimes, see [Choose a runtime](#choose-a-runtime). |
| `workload.image` | Yes | The runtime image, pinned by `sha256` digest. A tag alone is rejected, because a revision must be reproducible. |
| `workload.command` | For `byo` | Overrides the image entrypoint, up to 32 entries. Required for the `byo` runtime, optional otherwise. Every runtime honors an explicit value, the `kagent` runtime included, regardless of the language its image is written in. |
| One of `kagent`, `codex`, `claude`, `byo` | Yes | The harness that executes the agent. Naming none, or more than one, is rejected. For the four available, see [Choose a harness](#choose-a-harness). |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
| One of `kagent`, `codex`, `claude`, `byo` | Yes | The harness that executes the agent. Naming none, or more than one, is rejected. For the four available, see [Choose a harness](#choose-a-harness). |
| One of `kagent`, `codex`, `claude`, `byo` | Yes | The harness that executes the agent. Naming none, or more than one, is rejected. For the four harness types that are available, see [Choose a harness](#choose-a-harness). |

| `byo` | A container image of your own that implements kagent's A2A contract | You already have an agent that is built with an agent framework, and you want to run that agent in kagent. For more information, see [Bring your own agent]({{< link path="agents/bring-your-own-agent" >}}). |

`spec.kagent` is the only runtime block that takes settings of its own. The rest are empty.
The harnesses differ in two ways that decide what an agent running on them can do. They accept different model providers, which [Model provider support](#model-provider-support) lists, and they accept different AgentTemplate features, which [Tool and skill support](#tool-and-skill-support) lists.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The harnesses differ in two ways that decide what an agent running on them can do. They accept different model providers, which [Model provider support](#model-provider-support) lists, and they accept different AgentTemplate features, which [Tool and skill support](#tool-and-skill-support) lists.
The harnesses accept different model providers, which [Model provider support](#model-provider-support) lists, and they accept different AgentTemplate features, which [Tool and skill support](#tool-and-skill-support) lists.

| `SAPAICore` | ❌ | ❌ | ❌ | ❌ |

kagent rejects `AnthropicVertexAI`, `GeminiVertexAI`, and `SAPAICore` on every runtime, because each authenticates with a credential that the egress gateway cannot place in an HTTP header. No agent can use these providers. For the alternatives, see [About model providers]({{< link path="setup/model-providers/about-model-providers#credentials-that-do-not-compile" >}}).
kagent reaches a model provider through the egress gateway, which holds the credential and adds it to each request as an HTTP header. The three rejected providers authenticate in a way that this design cannot serve:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
kagent reaches a model provider through the egress gateway, which holds the credential and adds it to each request as an HTTP header. The three rejected providers authenticate in a way that this design cannot serve:
By default, kagent reaches a model provider through the egress gateway, which holds the credential and adds it to each request as an HTTP header. However, the following providers authenticate in a way that this design cannot serve:

| A subagent binding cannot itself carry tools, skills, plugins, or nested agents, and must use the same provider and credentials as the agent that binds it. | `codex`, `claude` |
| An {{< gloss "MCP" >}}MCP{{< /gloss >}} server is bound whole. Claude does not support partial tool selection, so the agent sees every tool the server offers rather than only the ones a binding names. The compiler warns rather than failing. | `claude` |
| A `RemoteMCPServer` must use the `STREAMABLE_HTTP` protocol. `SSE` is rejected. | `codex` |
| An {{< gloss "MCP" >}}MCP{{< /gloss >}} server is bound whole. Claude does not support partial tool selection, so the agent sees every tool that the server offers. The Agent still reconciles, and reports the decision in `status.warnings` as `Claude RemoteMCPServer "<name>" does not support partial tool selection`. | `claude` |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An {{< gloss "MCP" >}}MCP{{< /gloss >}} server is bound whole. >> not sure what this means

| `Ready` | Whether Agent Substrate finished preparing the agent's capacity. |

`Ready` covers the Harness's own dependencies, not whether a given agent runs on it. Whether a template compiles against this Harness is reported on the Agent that pairs the two, because an AgentTemplate does not report status of its own. For that check and the conditions it reports, see [Your first agent]({{< link path="get-started/your-first-agent" >}}).
An Agent can also reconcile and still report a non-blocking decision in `status.warnings`, such as Claude binding an MCP server whole. For the conditions in full, see [Your first agent]({{< link path="get-started/your-first-agent" >}}).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same comment about binding whole

This page applies to [declarative agents]({{< link path="agents/declarative-agents" >}}), which run on the `kagent` harness. Compaction is a `spec.kagent` setting, so a Harness that selects `codex`, `claude`, or `byo` does not take compaction settings. Omitting the `compaction` block leaves the history uncompacted.

Compaction is a `spec.kagent` setting, so it applies to the **kagent runtime only**. A Harness that selects `codex`, `claude`, or `byo` has no compaction settings. Omitting the `compaction` block leaves the history uncompacted.
Compaction is configured on the {{< gloss "Harness" >}}Harness{{< /gloss >}}, not on the {{< gloss "AgentTemplate" >}}AgentTemplate{{< /gloss >}}. The setting belongs to the runner that drives the root agent, which makes compaction harness policy rather than portable agent behavior. [Agent memory]({{< link path="agents/agent-memory" >}}) follows the same Harness-versus-AgentTemplate split. An AgentTemplate cannot enable, disable, or tune compaction on its own.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

which makes compaction harness policy rather than portable agent behavior >> I feel like something is missing in this sentence

Takes Nadine's suggestions on the Harness field table and the
Choose a harness intro. The intro sentence they replace counted the
ways the harnesses differ, which goes stale the moment a fifth
difference appears.

Drops "an MCP server is bound whole" in both places it appeared. The
clause after it already said the same thing in plain words, so the
phrase carried no information a reader could not get from the rest of
the row.

Replaces "which makes compaction harness policy rather than portable
agent behavior" with the consequence it was gesturing at: the same
AgentTemplate compacts differently on two Harnesses that set different
values. Moves the agent memory pointer to the end so the paragraph
finishes on compaction.

Normalizes the label for the set of four. The pages had drifted into
four names for one thing -- "harness types", "options", "ways", and
"harnesses" -- so they all say harnesses now. Where that collided with
the resource of the same name, the resource takes the longer form.

On the provider rejection sentence, takes "However" and "the following
providers" but not "By default". Every model call reaches the provider
through the egress gateway, so only the credential-holding half varies,
and whether apiKeyPassthrough survives the gateway's header injection is
still an open REVIEW note on about-model-providers.md.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Signed-off-by: Rachael Graham <rachael.graham@solo.io>
@Rachael-Graham
Rachael-Graham merged commit a8abf76 into main Oct 15, 2026
4 checks passed
@Rachael-Graham
Rachael-Graham deleted the feedback4 branch October 15, 2026 14:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants