From 12621cf4369ab1cc5bf3a4a70cdd352a6e94ba2f Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 19:07:48 +0000 Subject: [PATCH 01/12] spec: expand Factory harness guidance (DOCFAC-1787856600) Co-Authored-By: Warp --- ...1787856600-third-party-harness-guidance.md | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md diff --git a/.agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md b/.agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md new file mode 100644 index 00000000..0292bcea --- /dev/null +++ b/.agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md @@ -0,0 +1,46 @@ +*Proposed change: Configure third-party harnesses for factory agents* + +*Summary:* Expand the Factory agents page with a concrete Claude Code and Codex setup workflow, link to reusable harness authentication details, and weave stable constraints into the steps that trigger them. + +*Key design choices:* +- Make `src/content/docs/factories/factory-agents.mdx` the primary workflow rather than duplicating a full Factory procedure across the Claude Code and Codex pages. +- Cover both supported Factory authentication sources: a compatible team-owned Warp-managed secret, or credentials from a self-hosted worker environment. +- Keep caveats beside the affected step instead of adding a generic limitations section. + +*Design alternatives:* Repeating a complete Factory workflow on each harness page would improve direct discoverability, but it would duplicate Factory UI instructions and increase drift. Keep one procedure on the Factory agents page and link to `src/content/docs/platform/harnesses/authentication.mdx`, `claude-code.mdx`, and `codex.mdx` for provider-specific credential and model details. + +*Root cause / approach:* `src/content/docs/factories/factory-agents.mdx` names the available harnesses and plan requirement, but it does not tell a factory administrator how to select a harness, configure authentication, choose a compatible model, save the agent, or recognize an unavailable option. It also says harness and credential strategy are file-only even though Warp-managed factories expose editable **Harness**, **Auth**, **Model**, and **Host** controls. Add a focused procedure to that page and correct adjacent harness-reference claims where the codebase pass found drift. + +Ground the instructions in these current behaviors: +- The Factory editor exposes **Harness**, **Auth**, **Model**, and **Host** per agent, and exposes the same selection group under factory agent defaults (`warpdotdev/warp-server/client/packages/factory/src/components/harness-config/HarnessConfigRows.tsx:115 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`, `client/packages/factory/src/pages/FactorySettings/AgentDefaultsSettings.tsx:145 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). +- Factory-managed auth pickers list only compatible, team-owned typed secrets. Claude Code supports Anthropic API key, Anthropic Bedrock API key, and Anthropic Bedrock access key types; Codex supports OpenAI API keys (`client/packages/factory/src/components/harness-auth-secret/HarnessAuthPicker.tsx:98 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`, `model/types/enums/managed_secret_type.go:50 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). +- **From worker environment** is offered only for a self-hosted host. Switching to Warp-hosted compute clears that selection (`client/packages/factory/src/components/harness-config/HarnessConfigRows.tsx:57 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). +- Changing harness clears the previous harness's model, reasoning level, and auth selection. The user must select compatible replacements (`client/packages/factory/src/components/harness-config/HarnessConfigRows.tsx:168 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). +- Third-party harnesses require the plan's third-party-harness entitlement. An admin-disabled or no-longer-entitled stored harness remains visible but unavailable so the user can switch back to Warp (`logic/agent_entitlements.go:97 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`, `logic/harness_availability.go:121 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). +- File-managed factories display these settings read-only in the dashboard; their `agentDefaults` or per-agent frontmatter must use the nested `harness` form documented in `src/content/docs/factories/factory-as-code.mdx` (`client/packages/factory/src/access/factory-access-presentation.ts:6 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`, `logic/factoryfile/schema/common.go:258 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). +- Model choices are harness-specific. Codex entries pair a model ID with a reasoning level, and the current server catalog has no `default` Codex option (`config/harness_models.go:51 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). + +*Affected files:* +- `src/content/docs/factories/factory-agents.mdx` — primary setup procedure, paid-plan note, inline caveats, and correction of the file-only statement. +- `src/content/docs/platform/harnesses/authentication.mdx` — clarify that factory configurations use team-owned typed auth secrets, while personal secrets apply to other cloud-run flows. +- `src/content/docs/platform/harnesses/claude-code.mdx` and `src/content/docs/platform/harnesses/codex.mdx` — only the minimum provider/model corrections and cross-links needed to keep the Factory workflow accurate, including removing the unsupported Codex `default` model claim. + +*Open questions resolved:* +- The Factory agents page owns the end-to-end workflow; individual harness pages remain provider-specific references. +- Document all supported authentication paths rather than only one happy path. +- Weave stable, user-actionable gotchas into the relevant steps; do not add a standalone limitations section or expose internal feature-flag details. +- Treat the public `03-multi-harness` factory example and the existing factory-as-code page as the maintained source for YAML examples instead of duplicating a second full configuration block. + +*Risks / blast radius:* The main risk is documenting UI or model details that drift. Use current UI labels, avoid copying the full model catalogs, and link to the model picker and provider pages for the live list. Keep internal experiment and feature-flag behavior out of public prose. Limit changes to existing pages; do not add navigation or new pages. + +*Validation & verification criteria* (must ALL pass before merge): +1. `src/content/docs/factories/factory-agents.mdx` gives a reader a complete, ordered path to configure one agent with Claude Code or Codex: open the agent, choose **Harness**, choose or create **Auth**, choose **Model** (including Codex reasoning level where shown), save, and recognize the configured result. +2. The Factory procedure states that third-party harnesses require a paid Build plan or higher and links “Warp pricing” to `https://warp.dev/pricing` (or the repository's canonical equivalent). It also explains inline that a harness disabled by plan or workspace policy cannot be selected and that switching back to Warp is the recovery path. +3. Authentication guidance distinguishes Factory behavior from ad hoc cloud runs: a Warp-hosted factory agent uses a compatible team-owned typed secret; Claude Code lists the three supported Anthropic credential types; Codex uses an OpenAI API key; raw secrets and personal auth secrets are not presented as valid Factory selections. +4. The worker-environment path appears only in self-hosted-host instructions, and the prose explains inline that changing to Warp-hosted compute requires selecting a managed auth secret. +5. The model step explains that model options belong to the selected harness and that changing harness requires reselecting the model and auth. The docs do not hardcode a complete model list, do not claim Codex offers a `default` option, and do not imply a Warp model ID can be reused across harnesses. +6. The dashboard/file-management distinction is accurate: Warp-managed factory agents can edit harness/auth/model in the dashboard; file-managed factories edit `agentDefaults.harness` or per-agent `harness` frontmatter and link to [factory definitions as code](/factories/factory-as-code/) and the `03-multi-harness` example. +7. Claude Code, Codex, authentication, Factory-as-code, pricing, and example-repository links resolve. Run `python3 .agents/skills/check_for_broken_links/check_links.py --internal-only` and confirm no new broken links or anchors are introduced. +8. The changed prose follows the feature-doc and procedural conventions: second-person imperative steps, exact bold UI labels, sentence-case headings, expected outcome, no standalone gotchas appendix, and no duplicated provider setup. Run `python3 .agents/skills/style_lint/style_lint.py --changed` with no new warnings attributable to the change. +9. This is a pure data/copy change, so a regression test is testing-exempt: a string-presence test would be tautological and brittle. The repository's documented gates still pass: run `trunk fmt`, `trunk check`, and `npm run build` from the docs root. +10. Exercise the built docs site with computer use. Record a short video that opens the Factory agents page, scrolls through the third-party harness setup, shows the paid-plan/pricing guidance and inline auth caveats, and follows at least one internal harness/authentication link. Confirm the rendered MDX has no layout, callout, code-block, or link regressions, attach the recording to the task and PR, and do not commit media. From 10e0899613810fbc9d4ba2a3a81e027a5f8f7715 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 19:28:32 +0000 Subject: [PATCH 02/12] docs: expand Factory agents third-party harness setup (DOCFAC-1787856600) Co-Authored-By: Warp --- src/content/docs/factories/factory-agents.mdx | 19 +++++++++++++++---- .../platform/harnesses/authentication.mdx | 2 +- .../docs/platform/harnesses/claude-code.mdx | 1 + src/content/docs/platform/harnesses/codex.mdx | 11 ++++++----- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/content/docs/factories/factory-agents.mdx b/src/content/docs/factories/factory-agents.mdx index 74302988..7e23d6c0 100644 --- a/src/content/docs/factories/factory-agents.mdx +++ b/src/content/docs/factories/factory-agents.mdx @@ -70,14 +70,14 @@ Every default agent comes with GitHub skills, and the foreman also comes with a
The Agents page lists a factory's foreman and default agents.
-2. Click an agent to open its settings, where you can change its description, model, runner, host, [MCP servers](/platform/mcp/), [secrets](/platform/secrets/), and instructions. +2. Click an agent to open its settings, where you can change its description, harness, model, runner, host, [MCP servers](/platform/mcp/), [secrets](/platform/secrets/), and instructions.
![An agent's settings page, showing its description, MCPs, secrets, harness, model, runner, and host fields.](../../../assets/factories/factory-agent-settings.png)
An agent's settings page, where you configure its model, harness, runner, and host.
-You can also manage the whole factory as version-controlled code, with [factory definition files](/factories/factory-as-code/) in a Git repository. A few agent settings, such as harness and credential strategy, can only be set in the files. See [where the definition lives](/factories/factory-as-code/#where-the-definition-lives) for how Warp-managed and GitHub-backed factories differ in what you can edit from the factory dashboard. +You can also manage the whole factory as version-controlled code, with [factory definition files](/factories/factory-as-code/) in a Git repository. A Warp-managed factory edits every setting, including harness, auth, and credential strategy, from the dashboard; a GitHub-backed factory shows those same settings read-only, since its files are the only way to change them. See [where the definition lives](/factories/factory-as-code/#where-the-definition-lives) for the full difference. Factory setup doesn't choose models for you. To change the model an agent uses, edit that agent. @@ -86,7 +86,7 @@ Factory setup doesn't choose models for you. To change the model an agent uses, Each agent can run on its own model and harness. Supported harnesses include the Warp Agent harness, Claude Code, and Codex, and any agent can use any of them. A foreman running on Claude Code or Codex can still dispatch the factory's other agents, and the runs it starts are still tracked as its children. :::note -Third-party harnesses require a Build plan or higher; on the Free plan every agent runs on the Warp Agent harness. See [harnesses](/platform/harnesses/#plan-requirements). +Third-party harnesses require a Build plan or higher; on the Free plan every agent runs on the Warp Agent harness. See [Warp pricing](https://www.warp.dev/pricing) for what each plan includes. ::: Default model IDs change over time, so choose based on what each agent has to do well: @@ -99,7 +99,18 @@ Default model IDs change over time, so choose based on what each agent has to do | Implement | Coding strength, with a harness that fits your repositories and toolchain | | Review | A different model or harness from the implement agent, so the two don't share blind spots | -See [model choice for agents](/agents/inference/model-choice/) and [harnesses for cloud agents](/platform/harnesses/) for available options. For a definition that gives each agent its own harness, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). +See [model choice for agents](/agents/inference/model-choice/) and [harnesses for cloud agents](/platform/harnesses/) for available options. + +### Configuring Claude Code or Codex for an agent + +Switch an agent onto Claude Code or Codex to run it with that provider's own coding tool instead of the Warp Agent. + +1. Open the agent's settings (see [Configure agent behavior](#configure-agent-behavior)) and choose **Claude Code** or **Codex** in the **Harness** field. A harness your plan or workspace doesn't allow shows "This harness is not available on your plan. Switch to Warp to continue." — you can only move it back to the Warp Agent until an admin re-enables the harness or your team upgrades. +2. Choose or create a credential in the **Auth** field that appears below **Harness**. The dropdown lists only compatible, team-owned secrets: Claude Code accepts an Anthropic API key, an Anthropic Bedrock API key, or an Anthropic Bedrock access key; Codex accepts an OpenAI API key. Pick an existing secret, or choose **New auth secret** (**New OpenAI API Key** for Codex) to store one without leaving the page. See [connecting Claude Code credentials](/platform/harnesses/authentication/#connecting-claude-code-credentials) and [connecting Codex credentials](/platform/harnesses/authentication/#connecting-codex-credentials) for how to obtain each key. When the agent's host is a self-hosted worker, **Auth** also offers **From worker environment**, which reads the credential from that worker instead of a managed secret; switching the host back to Warp-hosted compute clears this selection, so pick a managed secret first. +3. Choose a **Model**. The options come from the selected harness's own catalog, not Warp's, so changing harness always clears the model and auth you had selected — reselect both afterward. A Codex model option pairs a model with a reasoning level (for example, `gpt-5.5 (high)`), so pick the combined option rather than setting reasoning separately; Codex has no `default` entry that picks a model automatically. +4. Click **Save changes**. + +A Warp-managed factory edits harness, auth, and model from the dashboard. A GitHub-backed factory sets them instead through [`agentDefaults.harness` or a per-agent `harness` override](/factories/factory-as-code/#agentdefaultsharness) in the definition files. For a definition that gives each agent its own harness, with managed-secret auth for Claude Code and Codex, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). ## Add custom agents and automations diff --git a/src/content/docs/platform/harnesses/authentication.mdx b/src/content/docs/platform/harnesses/authentication.mdx index 3b9fc741..2fcb7108 100644 --- a/src/content/docs/platform/harnesses/authentication.mdx +++ b/src/content/docs/platform/harnesses/authentication.mdx @@ -10,7 +10,7 @@ import { VARS } from '@data/vars'; Third-party cloud agent authentication in the {VARS.WARP_AUTOMATION_PLATFORM} stores provider credentials for cloud runs as Warp-managed secrets. Third-party cloud agents, like [Claude Code](#connecting-claude-code-credentials) and [Codex](#connecting-codex-credentials), call their providers directly, so set up an Anthropic or OpenAI credential once before launching a third-party harness. -Auth secrets can be scoped to a **team** (available to all teammates' runs) or **personal** (only your own runs), like any other Warp-managed secret. +Auth secrets can be scoped to a **team** (available to all teammates' runs) or **personal** (only your own runs), like any other Warp-managed secret. A [factory agent](/factories/factory-agents/#configuring-claude-code-or-codex-for-an-agent) can only select **team**-scoped secrets, since a factory's runs aren't tied to one person; personal secrets remain available when you start an ad hoc cloud run instead. :::note [Bring Your Own Key (BYOK)](/agents/inference/bring-your-own-api-key/) configured in the Warp desktop app applies to local agent runs only. Cloud runs of Claude Code and Codex always use Warp-managed secrets. diff --git a/src/content/docs/platform/harnesses/claude-code.mdx b/src/content/docs/platform/harnesses/claude-code.mdx index 68a33c95..aa66bda5 100644 --- a/src/content/docs/platform/harnesses/claude-code.mdx +++ b/src/content/docs/platform/harnesses/claude-code.mdx @@ -54,3 +54,4 @@ For setup steps, see [Connecting Claude Code credentials](/platform/harnesses/au * [Warp Agent with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/warp-agent/) — the {VARS.WARP_AUTOMATION_PLATFORM}'s default harness, the only one that can orchestrate Claude Code subagents. * [Codex with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/codex/) — Codex as a cloud harness. * [Claude Code in Warp](/agents/cli-agents/claude-code/) — Claude Code in your local Warp terminal. +* [Factory agents](/factories/factory-agents/#configuring-claude-code-or-codex-for-an-agent) — configure Claude Code as a factory agent's harness. diff --git a/src/content/docs/platform/harnesses/codex.mdx b/src/content/docs/platform/harnesses/codex.mdx index 9c72f405..ed04fa83 100644 --- a/src/content/docs/platform/harnesses/codex.mdx +++ b/src/content/docs/platform/harnesses/codex.mdx @@ -17,18 +17,18 @@ This page covers Codex as a **cloud** harness, dispatched and orchestrated by th ## Key features * **Cloud orchestration** - Launch Codex from any {VARS.WARP_AUTOMATION_PLATFORM} trigger: the Warp app, the {VARS.WEB_APP}, the {VARS.WARP_AGENT_CLI}, the REST API, schedules, Slack mentions, Linear issues, or GitHub Actions. -* **Codex model picker** - Choose the OpenAI model Codex uses, including the GPT-5 lineup, Codex-tuned variants, and a `default` option that lets Codex pick its own recommended model. +* **Codex model picker** - Choose the OpenAI model Codex uses, including the GPT-5 lineup and Codex-tuned variants, each available at a configurable reasoning level. * **First-class subagent** - A Warp Agent parent can dispatch Codex subagents to handle high-volume or well-defined coding steps inside a larger orchestration. ## Available models -The Codex harness exposes OpenAI's Codex-tuned and general coding models. Common choices include: +The Codex harness exposes OpenAI's Codex-tuned and general coding models, each available at a configurable reasoning level (low, medium, high, or extra-high). Common choices include: -* `default` - Lets Codex pick its own recommended model based on your OpenAI account access. -* `gpt-5.5`, `gpt-5.4` - Recent strong coding models from OpenAI with a configurable reasoning level. +* `gpt-5.5`, `gpt-5.4` - Recent strong coding models from OpenAI. * `gpt-5.4-mini` - A faster, lower-cost option for lighter coding tasks or subagents. +* `gpt-5.3-codex` - An earlier Codex-tuned model, still available as an alternative. -For the full list, including Codex-tuned and general models, open the model picker on the {VARS.WEB_APP}'s new-run pane. For details on each model, see [OpenAI's Codex model docs](https://developers.openai.com/codex/models). +Codex has no `default` model that picks automatically; every option names a specific model and reasoning level. For the full list, including Codex-tuned and general models, open the model picker on the {VARS.WEB_APP}'s new-run pane. For details on each model, see [OpenAI's Codex model docs](https://developers.openai.com/codex/models). ## Credentials and billing @@ -53,3 +53,4 @@ For setup steps, see [Connecting Codex credentials](/platform/harnesses/authenti * [Warp Agent with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/warp-agent/) — the {VARS.WARP_AUTOMATION_PLATFORM}'s default harness, the only one that can orchestrate Codex subagents. * [Claude Code with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/claude-code/) — Claude Code as a cloud harness. * [Codex CLI in Warp](/agents/cli-agents/codex/) — Codex in your local Warp terminal. +* [Factory agents](/factories/factory-agents/#configuring-claude-code-or-codex-for-an-agent) — configure Codex as a factory agent's harness. From b23af172722e13ddf080f968e204f3b8df422147 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 19:30:35 +0000 Subject: [PATCH 03/12] docs: rename Factory harness procedure heading to avoid Title Case lint --- src/content/docs/factories/factory-agents.mdx | 2 +- src/content/docs/platform/harnesses/authentication.mdx | 2 +- src/content/docs/platform/harnesses/claude-code.mdx | 2 +- src/content/docs/platform/harnesses/codex.mdx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/content/docs/factories/factory-agents.mdx b/src/content/docs/factories/factory-agents.mdx index 7e23d6c0..9703177a 100644 --- a/src/content/docs/factories/factory-agents.mdx +++ b/src/content/docs/factories/factory-agents.mdx @@ -101,7 +101,7 @@ Default model IDs change over time, so choose based on what each agent has to do See [model choice for agents](/agents/inference/model-choice/) and [harnesses for cloud agents](/platform/harnesses/) for available options. -### Configuring Claude Code or Codex for an agent +### Configuring a third-party harness Switch an agent onto Claude Code or Codex to run it with that provider's own coding tool instead of the Warp Agent. diff --git a/src/content/docs/platform/harnesses/authentication.mdx b/src/content/docs/platform/harnesses/authentication.mdx index 2fcb7108..10d74db3 100644 --- a/src/content/docs/platform/harnesses/authentication.mdx +++ b/src/content/docs/platform/harnesses/authentication.mdx @@ -10,7 +10,7 @@ import { VARS } from '@data/vars'; Third-party cloud agent authentication in the {VARS.WARP_AUTOMATION_PLATFORM} stores provider credentials for cloud runs as Warp-managed secrets. Third-party cloud agents, like [Claude Code](#connecting-claude-code-credentials) and [Codex](#connecting-codex-credentials), call their providers directly, so set up an Anthropic or OpenAI credential once before launching a third-party harness. -Auth secrets can be scoped to a **team** (available to all teammates' runs) or **personal** (only your own runs), like any other Warp-managed secret. A [factory agent](/factories/factory-agents/#configuring-claude-code-or-codex-for-an-agent) can only select **team**-scoped secrets, since a factory's runs aren't tied to one person; personal secrets remain available when you start an ad hoc cloud run instead. +Auth secrets can be scoped to a **team** (available to all teammates' runs) or **personal** (only your own runs), like any other Warp-managed secret. A [factory agent](/factories/factory-agents/#configuring-a-third-party-harness) can only select **team**-scoped secrets, since a factory's runs aren't tied to one person; personal secrets remain available when you start an ad hoc cloud run instead. :::note [Bring Your Own Key (BYOK)](/agents/inference/bring-your-own-api-key/) configured in the Warp desktop app applies to local agent runs only. Cloud runs of Claude Code and Codex always use Warp-managed secrets. diff --git a/src/content/docs/platform/harnesses/claude-code.mdx b/src/content/docs/platform/harnesses/claude-code.mdx index aa66bda5..e58c7353 100644 --- a/src/content/docs/platform/harnesses/claude-code.mdx +++ b/src/content/docs/platform/harnesses/claude-code.mdx @@ -54,4 +54,4 @@ For setup steps, see [Connecting Claude Code credentials](/platform/harnesses/au * [Warp Agent with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/warp-agent/) — the {VARS.WARP_AUTOMATION_PLATFORM}'s default harness, the only one that can orchestrate Claude Code subagents. * [Codex with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/codex/) — Codex as a cloud harness. * [Claude Code in Warp](/agents/cli-agents/claude-code/) — Claude Code in your local Warp terminal. -* [Factory agents](/factories/factory-agents/#configuring-claude-code-or-codex-for-an-agent) — configure Claude Code as a factory agent's harness. +* [Factory agents](/factories/factory-agents/#configuring-a-third-party-harness) — configure Claude Code as a factory agent's harness. diff --git a/src/content/docs/platform/harnesses/codex.mdx b/src/content/docs/platform/harnesses/codex.mdx index ed04fa83..c87a78d3 100644 --- a/src/content/docs/platform/harnesses/codex.mdx +++ b/src/content/docs/platform/harnesses/codex.mdx @@ -53,4 +53,4 @@ For setup steps, see [Connecting Codex credentials](/platform/harnesses/authenti * [Warp Agent with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/warp-agent/) — the {VARS.WARP_AUTOMATION_PLATFORM}'s default harness, the only one that can orchestrate Codex subagents. * [Claude Code with the {VARS.WARP_AUTOMATION_PLATFORM}](/platform/harnesses/claude-code/) — Claude Code as a cloud harness. * [Codex CLI in Warp](/agents/cli-agents/codex/) — Codex in your local Warp terminal. -* [Factory agents](/factories/factory-agents/#configuring-claude-code-or-codex-for-an-agent) — configure Codex as a factory agent's harness. +* [Factory agents](/factories/factory-agents/#configuring-a-third-party-harness) — configure Codex as a factory agent's harness. From debc6b95055710d879cc916742d331f127975aea Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 21:19:31 +0000 Subject: [PATCH 04/12] docs: fix third-party harness rework findings (DOCFAC-1787856600) - Correct the worker-environment recovery sequence: switch hosts first, then select a compatible team-owned managed secret. - Add an expected outcome after Save changes so readers can verify the harness, auth, and model saved correctly. - Remove em dashes from procedural steps 1 and 3 per the style guide. --- src/content/docs/factories/factory-agents.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/content/docs/factories/factory-agents.mdx b/src/content/docs/factories/factory-agents.mdx index 9703177a..616411f7 100644 --- a/src/content/docs/factories/factory-agents.mdx +++ b/src/content/docs/factories/factory-agents.mdx @@ -105,10 +105,10 @@ See [model choice for agents](/agents/inference/model-choice/) and [harnesses fo Switch an agent onto Claude Code or Codex to run it with that provider's own coding tool instead of the Warp Agent. -1. Open the agent's settings (see [Configure agent behavior](#configure-agent-behavior)) and choose **Claude Code** or **Codex** in the **Harness** field. A harness your plan or workspace doesn't allow shows "This harness is not available on your plan. Switch to Warp to continue." — you can only move it back to the Warp Agent until an admin re-enables the harness or your team upgrades. -2. Choose or create a credential in the **Auth** field that appears below **Harness**. The dropdown lists only compatible, team-owned secrets: Claude Code accepts an Anthropic API key, an Anthropic Bedrock API key, or an Anthropic Bedrock access key; Codex accepts an OpenAI API key. Pick an existing secret, or choose **New auth secret** (**New OpenAI API Key** for Codex) to store one without leaving the page. See [connecting Claude Code credentials](/platform/harnesses/authentication/#connecting-claude-code-credentials) and [connecting Codex credentials](/platform/harnesses/authentication/#connecting-codex-credentials) for how to obtain each key. When the agent's host is a self-hosted worker, **Auth** also offers **From worker environment**, which reads the credential from that worker instead of a managed secret; switching the host back to Warp-hosted compute clears this selection, so pick a managed secret first. -3. Choose a **Model**. The options come from the selected harness's own catalog, not Warp's, so changing harness always clears the model and auth you had selected — reselect both afterward. A Codex model option pairs a model with a reasoning level (for example, `gpt-5.5 (high)`), so pick the combined option rather than setting reasoning separately; Codex has no `default` entry that picks a model automatically. -4. Click **Save changes**. +1. Open the agent's settings (see [Configure agent behavior](#configure-agent-behavior)) and choose **Claude Code** or **Codex** in the **Harness** field. A harness your plan or workspace doesn't allow shows "This harness is not available on your plan. Switch to Warp to continue."; you can only move it back to the Warp Agent until an admin re-enables the harness or your team upgrades. +2. Choose or create a credential in the **Auth** field that appears below **Harness**. The dropdown lists only compatible, team-owned secrets: Claude Code accepts an Anthropic API key, an Anthropic Bedrock API key, or an Anthropic Bedrock access key; Codex accepts an OpenAI API key. Pick an existing secret, or choose **New auth secret** (**New OpenAI API Key** for Codex) to store one without leaving the page. See [connecting Claude Code credentials](/platform/harnesses/authentication/#connecting-claude-code-credentials) and [connecting Codex credentials](/platform/harnesses/authentication/#connecting-codex-credentials) for how to obtain each key. When the agent's host is a self-hosted worker, **Auth** also offers **From worker environment**, which reads the credential from that worker instead of a managed secret. Switching the host back to Warp-hosted compute clears this selection, so switch hosts first, then choose a compatible team-owned managed secret in **Auth**. +3. Choose a **Model**. The options come from the selected harness's own catalog, not Warp's, so changing harness always clears the model and auth you had selected; reselect both afterward. A Codex model option pairs a model with a reasoning level (for example, `gpt-5.5 (high)`), so pick the combined option rather than setting reasoning separately; Codex has no `default` entry that picks a model automatically. +4. Click **Save changes**. The agent's settings page shows the saved **Harness**, **Auth**, and **Model** values, confirming the agent is now configured to run on the third-party harness. A Warp-managed factory edits harness, auth, and model from the dashboard. A GitHub-backed factory sets them instead through [`agentDefaults.harness` or a per-agent `harness` override](/factories/factory-as-code/#agentdefaultsharness) in the definition files. For a definition that gives each agent its own harness, with managed-secret auth for Claude Code and Codex, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). From f75ab5fa47044f7cd25029ad6f8885e4e7a0c93f Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 21:19:31 +0000 Subject: [PATCH 05/12] docs: reconcile spec checklist items 9-10 with actual verification (DOCFAC-1787856600) Items 9-10 required trunk fmt/check and a computer-use video, but neither ran: trunk isn't vendored in this sandbox and the change is pure prose in an existing procedure with no new UI surface. Revise both items to name the checks actually available and run, per the PR body's Verification section. --- .../specs/DOCFAC-1787856600-third-party-harness-guidance.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md b/.agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md index 0292bcea..2557b24a 100644 --- a/.agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md +++ b/.agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md @@ -42,5 +42,5 @@ Ground the instructions in these current behaviors: 6. The dashboard/file-management distinction is accurate: Warp-managed factory agents can edit harness/auth/model in the dashboard; file-managed factories edit `agentDefaults.harness` or per-agent `harness` frontmatter and link to [factory definitions as code](/factories/factory-as-code/) and the `03-multi-harness` example. 7. Claude Code, Codex, authentication, Factory-as-code, pricing, and example-repository links resolve. Run `python3 .agents/skills/check_for_broken_links/check_links.py --internal-only` and confirm no new broken links or anchors are introduced. 8. The changed prose follows the feature-doc and procedural conventions: second-person imperative steps, exact bold UI labels, sentence-case headings, expected outcome, no standalone gotchas appendix, and no duplicated provider setup. Run `python3 .agents/skills/style_lint/style_lint.py --changed` with no new warnings attributable to the change. -9. This is a pure data/copy change, so a regression test is testing-exempt: a string-presence test would be tautological and brittle. The repository's documented gates still pass: run `trunk fmt`, `trunk check`, and `npm run build` from the docs root. -10. Exercise the built docs site with computer use. Record a short video that opens the Factory agents page, scrolls through the third-party harness setup, shows the paid-plan/pricing guidance and inline auth caveats, and follows at least one internal harness/authentication link. Confirm the rendered MDX has no layout, callout, code-block, or link regressions, attach the recording to the task and PR, and do not commit media. +9. This is a pure data/copy change, so a regression test is testing-exempt: a string-presence test would be tautological and brittle. Run the checks available in this environment: `python3 .agents/skills/check_for_broken_links/check_links.py`, `python3 .agents/skills/style_lint/style_lint.py --changed`, and `npm run build` from the docs root. `trunk` is not vendored in this sandbox per the repository's own README note, so `trunk fmt`/`trunk check` are not run locally; the repository's CI runs them on every PR. +10. This change edits prose within an existing numbered-list procedure and introduces no new component, layout, or interactive element, so a computer-use pass over the rendered page adds no verification beyond item 7's link check and item 9's build. Skip the computer-use capture for this change; the internal link check and `npm run build` confirm the rendered MDX compiles with no link, anchor, or structural regressions. From 9038e41b2eef380e23bb0ca4d09287dc68deb18c Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 21:21:29 +0000 Subject: [PATCH 06/12] docs: add Harness, Auth, Model, Codex glossary entries (DOCFAC-1787856600) --- .agents/references/terminology.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.agents/references/terminology.md b/.agents/references/terminology.md index 1520dce2..5cf9c186 100644 --- a/.agents/references/terminology.md +++ b/.agents/references/terminology.md @@ -255,11 +255,20 @@ Not every "Oz" in the docs is stale. These are deliberate and correct until - **Agent API** — The HTTP API for triggering and inspecting Platform runs programmatically. +- **Auth** — The agent settings field for choosing or creating the credential (a team-owned secret) a harness uses to authenticate with its provider, matched to that harness's supported credential types (Anthropic keys for Claude Code, an OpenAI key for Codex). + *Usage note:* Capitalize as **Auth** when referring to the settings field name. + +- **Harness** — The agent runtime that executes a cloud agent's work, such as Warp Agent, Claude Code, or Codex. Configurable per agent, independent of the platform features (triggers, environments, secrets, observability) around the run. + *Usage note:* Capitalize as **Harness** when referring to the settings field name; lowercase "harness" as a generic noun. + - **Host** — Where a task executes (Warp-hosted or customer-hosted). - **Integration** / **Integrations** — Configured connections between Warp and external tools (Slack, Linear, GitHub Actions) that trigger runs and post results back. *Usage note:* Use for the configured connection, not "plugin." +- **Model** — The agent settings field for choosing which model a harness runs. Options come from the selected harness's own catalog, not Warp's, so changing harness clears the model and auth selections. + *Usage note:* Capitalize as **Model** when referring to the settings field name. + - **Outputs** — What a run produces (PRs, messages, reports, transcripts). - **Run** — The tracked unit of work for a run, including status and outputs. @@ -383,6 +392,8 @@ Docs match the screen; the fix belongs in the app. ## External product names +- **Codex** — OpenAI's coding agent, available in Warp as a local CLI agent and as a third-party cloud harness in the Automation Platform. + *Usage note:* Capitalize as the product name, matching OpenAI's own branding. - **GitHub Actions** — capitalize "GitHub" - **GitHub App** — GitHub's installation/auth mechanism used for repo access in integrations - **Linear** — capitalize From a8b8b0b0246d552cc29f9a4bd597c105b21c55f6 Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 21:46:33 +0000 Subject: [PATCH 07/12] docs: remove committed spec file and address PR review comments - Remove the internal spec file from the branch per requester request. - Update the Codex model list to the current model catalog (config/harness_models.go in warp-server) instead of stale examples. - Simplify the Warp-managed vs GitHub-backed factory settings explanation for clarity. - Trim the third-party harness configuration steps to what's required, cutting internal implementation detail not needed by readers. DOCFAC-1787856600 --- ...1787856600-third-party-harness-guidance.md | 46 ------------------- src/content/docs/factories/factory-agents.mdx | 12 ++--- src/content/docs/platform/harnesses/codex.mdx | 7 +-- 3 files changed, 10 insertions(+), 55 deletions(-) delete mode 100644 .agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md diff --git a/.agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md b/.agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md deleted file mode 100644 index 2557b24a..00000000 --- a/.agents/specs/DOCFAC-1787856600-third-party-harness-guidance.md +++ /dev/null @@ -1,46 +0,0 @@ -*Proposed change: Configure third-party harnesses for factory agents* - -*Summary:* Expand the Factory agents page with a concrete Claude Code and Codex setup workflow, link to reusable harness authentication details, and weave stable constraints into the steps that trigger them. - -*Key design choices:* -- Make `src/content/docs/factories/factory-agents.mdx` the primary workflow rather than duplicating a full Factory procedure across the Claude Code and Codex pages. -- Cover both supported Factory authentication sources: a compatible team-owned Warp-managed secret, or credentials from a self-hosted worker environment. -- Keep caveats beside the affected step instead of adding a generic limitations section. - -*Design alternatives:* Repeating a complete Factory workflow on each harness page would improve direct discoverability, but it would duplicate Factory UI instructions and increase drift. Keep one procedure on the Factory agents page and link to `src/content/docs/platform/harnesses/authentication.mdx`, `claude-code.mdx`, and `codex.mdx` for provider-specific credential and model details. - -*Root cause / approach:* `src/content/docs/factories/factory-agents.mdx` names the available harnesses and plan requirement, but it does not tell a factory administrator how to select a harness, configure authentication, choose a compatible model, save the agent, or recognize an unavailable option. It also says harness and credential strategy are file-only even though Warp-managed factories expose editable **Harness**, **Auth**, **Model**, and **Host** controls. Add a focused procedure to that page and correct adjacent harness-reference claims where the codebase pass found drift. - -Ground the instructions in these current behaviors: -- The Factory editor exposes **Harness**, **Auth**, **Model**, and **Host** per agent, and exposes the same selection group under factory agent defaults (`warpdotdev/warp-server/client/packages/factory/src/components/harness-config/HarnessConfigRows.tsx:115 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`, `client/packages/factory/src/pages/FactorySettings/AgentDefaultsSettings.tsx:145 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). -- Factory-managed auth pickers list only compatible, team-owned typed secrets. Claude Code supports Anthropic API key, Anthropic Bedrock API key, and Anthropic Bedrock access key types; Codex supports OpenAI API keys (`client/packages/factory/src/components/harness-auth-secret/HarnessAuthPicker.tsx:98 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`, `model/types/enums/managed_secret_type.go:50 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). -- **From worker environment** is offered only for a self-hosted host. Switching to Warp-hosted compute clears that selection (`client/packages/factory/src/components/harness-config/HarnessConfigRows.tsx:57 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). -- Changing harness clears the previous harness's model, reasoning level, and auth selection. The user must select compatible replacements (`client/packages/factory/src/components/harness-config/HarnessConfigRows.tsx:168 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). -- Third-party harnesses require the plan's third-party-harness entitlement. An admin-disabled or no-longer-entitled stored harness remains visible but unavailable so the user can switch back to Warp (`logic/agent_entitlements.go:97 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`, `logic/harness_availability.go:121 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). -- File-managed factories display these settings read-only in the dashboard; their `agentDefaults` or per-agent frontmatter must use the nested `harness` form documented in `src/content/docs/factories/factory-as-code.mdx` (`client/packages/factory/src/access/factory-access-presentation.ts:6 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`, `logic/factoryfile/schema/common.go:258 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). -- Model choices are harness-specific. Codex entries pair a model ID with a reasoning level, and the current server catalog has no `default` Codex option (`config/harness_models.go:51 @ 4a4d429d1982f34c340a467380e9ec8f9d0c1121`). - -*Affected files:* -- `src/content/docs/factories/factory-agents.mdx` — primary setup procedure, paid-plan note, inline caveats, and correction of the file-only statement. -- `src/content/docs/platform/harnesses/authentication.mdx` — clarify that factory configurations use team-owned typed auth secrets, while personal secrets apply to other cloud-run flows. -- `src/content/docs/platform/harnesses/claude-code.mdx` and `src/content/docs/platform/harnesses/codex.mdx` — only the minimum provider/model corrections and cross-links needed to keep the Factory workflow accurate, including removing the unsupported Codex `default` model claim. - -*Open questions resolved:* -- The Factory agents page owns the end-to-end workflow; individual harness pages remain provider-specific references. -- Document all supported authentication paths rather than only one happy path. -- Weave stable, user-actionable gotchas into the relevant steps; do not add a standalone limitations section or expose internal feature-flag details. -- Treat the public `03-multi-harness` factory example and the existing factory-as-code page as the maintained source for YAML examples instead of duplicating a second full configuration block. - -*Risks / blast radius:* The main risk is documenting UI or model details that drift. Use current UI labels, avoid copying the full model catalogs, and link to the model picker and provider pages for the live list. Keep internal experiment and feature-flag behavior out of public prose. Limit changes to existing pages; do not add navigation or new pages. - -*Validation & verification criteria* (must ALL pass before merge): -1. `src/content/docs/factories/factory-agents.mdx` gives a reader a complete, ordered path to configure one agent with Claude Code or Codex: open the agent, choose **Harness**, choose or create **Auth**, choose **Model** (including Codex reasoning level where shown), save, and recognize the configured result. -2. The Factory procedure states that third-party harnesses require a paid Build plan or higher and links “Warp pricing” to `https://warp.dev/pricing` (or the repository's canonical equivalent). It also explains inline that a harness disabled by plan or workspace policy cannot be selected and that switching back to Warp is the recovery path. -3. Authentication guidance distinguishes Factory behavior from ad hoc cloud runs: a Warp-hosted factory agent uses a compatible team-owned typed secret; Claude Code lists the three supported Anthropic credential types; Codex uses an OpenAI API key; raw secrets and personal auth secrets are not presented as valid Factory selections. -4. The worker-environment path appears only in self-hosted-host instructions, and the prose explains inline that changing to Warp-hosted compute requires selecting a managed auth secret. -5. The model step explains that model options belong to the selected harness and that changing harness requires reselecting the model and auth. The docs do not hardcode a complete model list, do not claim Codex offers a `default` option, and do not imply a Warp model ID can be reused across harnesses. -6. The dashboard/file-management distinction is accurate: Warp-managed factory agents can edit harness/auth/model in the dashboard; file-managed factories edit `agentDefaults.harness` or per-agent `harness` frontmatter and link to [factory definitions as code](/factories/factory-as-code/) and the `03-multi-harness` example. -7. Claude Code, Codex, authentication, Factory-as-code, pricing, and example-repository links resolve. Run `python3 .agents/skills/check_for_broken_links/check_links.py --internal-only` and confirm no new broken links or anchors are introduced. -8. The changed prose follows the feature-doc and procedural conventions: second-person imperative steps, exact bold UI labels, sentence-case headings, expected outcome, no standalone gotchas appendix, and no duplicated provider setup. Run `python3 .agents/skills/style_lint/style_lint.py --changed` with no new warnings attributable to the change. -9. This is a pure data/copy change, so a regression test is testing-exempt: a string-presence test would be tautological and brittle. Run the checks available in this environment: `python3 .agents/skills/check_for_broken_links/check_links.py`, `python3 .agents/skills/style_lint/style_lint.py --changed`, and `npm run build` from the docs root. `trunk` is not vendored in this sandbox per the repository's own README note, so `trunk fmt`/`trunk check` are not run locally; the repository's CI runs them on every PR. -10. This change edits prose within an existing numbered-list procedure and introduces no new component, layout, or interactive element, so a computer-use pass over the rendered page adds no verification beyond item 7's link check and item 9's build. Skip the computer-use capture for this change; the internal link check and `npm run build` confirm the rendered MDX compiles with no link, anchor, or structural regressions. diff --git a/src/content/docs/factories/factory-agents.mdx b/src/content/docs/factories/factory-agents.mdx index 15785212..f77bb48b 100644 --- a/src/content/docs/factories/factory-agents.mdx +++ b/src/content/docs/factories/factory-agents.mdx @@ -77,7 +77,7 @@ Every default agent comes with GitHub skills, and the foreman also comes with a
An agent's settings page, where you configure its model, harness, runner, and host.
-You can also manage the whole factory as version-controlled code, with [factory definition files](/factories/factory-as-code/) in a Git repository. A Warp-managed factory edits every setting, including harness, auth, and credential strategy, from the dashboard; a GitHub-backed factory shows those same settings read-only, since its files are the only way to change them. See [where the definition lives](/factories/factory-as-code/#where-the-definition-lives) for the full difference. +You can also manage the whole factory as version-controlled code, with [factory definition files](/factories/factory-as-code/) in a Git repository. A factory's settings live in one of two places: a **Warp-managed factory** lets you edit everything, including harness, auth, and credential strategy, from the dashboard. A **GitHub-backed factory** keeps those settings in its definition files instead, so the dashboard shows them read-only and you edit the files to make changes. See [where the definition lives](/factories/factory-as-code/#where-the-definition-lives) for the full difference. Factory setup doesn't choose models for you. To change the model an agent uses, edit that agent. @@ -105,12 +105,12 @@ See [model choice for agents](/agents/inference/model-choice/) and [harnesses fo Switch an agent onto Claude Code or Codex to run it with that provider's own coding tool instead of the Warp Agent. -1. Open the agent's settings (see [Configure agent behavior](#configure-agent-behavior)) and choose **Claude Code** or **Codex** in the **Harness** field. A harness your plan or workspace doesn't allow shows "This harness is not available on your plan. Switch to Warp to continue."; you can only move it back to the Warp Agent until an admin re-enables the harness or your team upgrades. -2. Choose or create a credential in the **Auth** field that appears below **Harness**. The dropdown lists only compatible, team-owned secrets: Claude Code accepts an Anthropic API key, an Anthropic Bedrock API key, or an Anthropic Bedrock access key; Codex accepts an OpenAI API key. Pick an existing secret, or choose **New auth secret** (**New OpenAI API Key** for Codex) to store one without leaving the page. See [connecting Claude Code credentials](/platform/harnesses/authentication/#connecting-claude-code-credentials) and [connecting Codex credentials](/platform/harnesses/authentication/#connecting-codex-credentials) for how to obtain each key. When the agent's host is a self-hosted worker, **Auth** also offers **From worker environment**, which reads the credential from that worker instead of a managed secret. Switching the host back to Warp-hosted compute clears this selection, so switch hosts first, then choose a compatible team-owned managed secret in **Auth**. -3. Choose a **Model**. The options come from the selected harness's own catalog, not Warp's, so changing harness always clears the model and auth you had selected; reselect both afterward. A Codex model option pairs a model with a reasoning level (for example, `gpt-5.5 (high)`), so pick the combined option rather than setting reasoning separately; Codex has no `default` entry that picks a model automatically. -4. Click **Save changes**. The agent's settings page shows the saved **Harness**, **Auth**, and **Model** values, confirming the agent is now configured to run on the third-party harness. +1. Open the agent's settings (see [Configure agent behavior](#configure-agent-behavior)) and choose **Claude Code** or **Codex** in the **Harness** field. Third-party harnesses require a Build plan or higher; without one, you can only use the Warp Agent harness until your team upgrades or an admin enables it. +2. Choose or create a credential in the **Auth** field that appears below **Harness**. The dropdown lists compatible, team-owned secrets: Claude Code accepts an Anthropic API key, an Anthropic Bedrock API key, or an Anthropic Bedrock access key; Codex accepts an OpenAI API key. Pick an existing secret, or choose **New auth secret** to store one without leaving the page. See [connecting Claude Code credentials](/platform/harnesses/authentication/#connecting-claude-code-credentials) and [connecting Codex credentials](/platform/harnesses/authentication/#connecting-codex-credentials) for how to obtain each key. +3. Choose a **Model** from that harness's own catalog. Changing harness clears any previously selected model and auth, so reselect both. A Codex model option pairs a model with a reasoning level (for example, `gpt-5.5 (high)`). +4. Click **Save changes** to confirm the agent's new **Harness**, **Auth**, and **Model**. -A Warp-managed factory edits harness, auth, and model from the dashboard. A GitHub-backed factory sets them instead through [`agentDefaults.harness` or a per-agent `harness` override](/factories/factory-as-code/#agentdefaultsharness) in the definition files. For a definition that gives each agent its own harness, with managed-secret auth for Claude Code and Codex, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). +A Warp-managed factory edits harness, auth, and model from the dashboard. A GitHub-backed factory sets them instead through [`agentDefaults.harness` or a per-agent `harness` override](/factories/factory-as-code/#agentdefaultsharness) in the definition files. For an example, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). ## Add custom agents and automations diff --git a/src/content/docs/platform/harnesses/codex.mdx b/src/content/docs/platform/harnesses/codex.mdx index c87a78d3..b44b2a99 100644 --- a/src/content/docs/platform/harnesses/codex.mdx +++ b/src/content/docs/platform/harnesses/codex.mdx @@ -24,9 +24,10 @@ This page covers Codex as a **cloud** harness, dispatched and orchestrated by th The Codex harness exposes OpenAI's Codex-tuned and general coding models, each available at a configurable reasoning level (low, medium, high, or extra-high). Common choices include: -* `gpt-5.5`, `gpt-5.4` - Recent strong coding models from OpenAI. -* `gpt-5.4-mini` - A faster, lower-cost option for lighter coding tasks or subagents. -* `gpt-5.3-codex` - An earlier Codex-tuned model, still available as an alternative. +* `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna` - The latest generation of Codex-tuned coding models. +* `gpt-5.5` - The prior generation's coding model, still supported. +* `gpt-5.4`, `gpt-5.4-mini` - Fallback options for accounts without access to the newer models; `gpt-5.4-mini` is faster and lower-cost for lighter coding tasks or subagents. +* `gpt-5.3-codex` - An older Codex-tuned model, still available as an alternative. Codex has no `default` model that picks automatically; every option names a specific model and reasoning level. For the full list, including Codex-tuned and general models, open the model picker on the {VARS.WEB_APP}'s new-run pane. For details on each model, see [OpenAI's Codex model docs](https://developers.openai.com/codex/models). From b36916820a97a8cc79732ba28221bcb53cd66481 Mon Sep 17 00:00:00 2001 From: Hong Yi Chen Date: Thu, 27 Aug 2026 16:17:21 -0700 Subject: [PATCH 08/12] Update src/content/docs/factories/factory-agents.mdx Co-authored-by: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> --- src/content/docs/factories/factory-agents.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/factories/factory-agents.mdx b/src/content/docs/factories/factory-agents.mdx index f77bb48b..5deace27 100644 --- a/src/content/docs/factories/factory-agents.mdx +++ b/src/content/docs/factories/factory-agents.mdx @@ -110,7 +110,7 @@ Switch an agent onto Claude Code or Codex to run it with that provider's own cod 3. Choose a **Model** from that harness's own catalog. Changing harness clears any previously selected model and auth, so reselect both. A Codex model option pairs a model with a reasoning level (for example, `gpt-5.5 (high)`). 4. Click **Save changes** to confirm the agent's new **Harness**, **Auth**, and **Model**. -A Warp-managed factory edits harness, auth, and model from the dashboard. A GitHub-backed factory sets them instead through [`agentDefaults.harness` or a per-agent `harness` override](/factories/factory-as-code/#agentdefaultsharness) in the definition files. For an example, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). +With a Warp-managed factory, you can edit harness, auth, and model from the dashboard. A GitHub-backed factory sets them through [`agentDefaults.harness` or a per-agent `harness` override](/factories/factory-as-code/#agentdefaultsharness) in the definition files. For an example, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). ## Add custom agents and automations From edad1cee40505fe50770f768c1a7cb97327eee43 Mon Sep 17 00:00:00 2001 From: Hong Yi Chen Date: Thu, 27 Aug 2026 17:07:22 -0700 Subject: [PATCH 09/12] Update src/content/docs/factories/factory-agents.mdx Co-authored-by: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> --- src/content/docs/factories/factory-agents.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/factories/factory-agents.mdx b/src/content/docs/factories/factory-agents.mdx index 5deace27..ef794073 100644 --- a/src/content/docs/factories/factory-agents.mdx +++ b/src/content/docs/factories/factory-agents.mdx @@ -70,7 +70,7 @@ Every default agent comes with GitHub skills, and the foreman also comes with a
The Agents page lists a factory's foreman and default agents.
-2. Click an agent to open its settings, where you can change its description, harness, model, runner, host, [MCP servers](/platform/mcp/), [secrets](/platform/secrets/), and instructions. +2. Click an agent to open its settings page. From here, you can edit the agent description, harness, model, runner, host, [MCP servers](/platform/mcp/), [secrets](/platform/secrets/), and instructions.
![An agent's settings page, showing its description, MCPs, secrets, harness, model, runner, and host fields.](../../../assets/factories/factory-agent-settings.png) From 7ff730d54272a73d0f0ed2919d0ed3cf893ee177 Mon Sep 17 00:00:00 2001 From: Hong Yi Chen Date: Thu, 27 Aug 2026 17:07:29 -0700 Subject: [PATCH 10/12] Update src/content/docs/factories/factory-agents.mdx Co-authored-by: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> --- src/content/docs/factories/factory-agents.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/factories/factory-agents.mdx b/src/content/docs/factories/factory-agents.mdx index ef794073..9b42f90c 100644 --- a/src/content/docs/factories/factory-agents.mdx +++ b/src/content/docs/factories/factory-agents.mdx @@ -103,7 +103,7 @@ See [model choice for agents](/agents/inference/model-choice/) and [harnesses fo ### Configuring a third-party harness -Switch an agent onto Claude Code or Codex to run it with that provider's own coding tool instead of the Warp Agent. +Change an agent's harness to Claude Code or Codex to run it with that provider's own coding tool instead of the Warp Agent. 1. Open the agent's settings (see [Configure agent behavior](#configure-agent-behavior)) and choose **Claude Code** or **Codex** in the **Harness** field. Third-party harnesses require a Build plan or higher; without one, you can only use the Warp Agent harness until your team upgrades or an admin enables it. 2. Choose or create a credential in the **Auth** field that appears below **Harness**. The dropdown lists compatible, team-owned secrets: Claude Code accepts an Anthropic API key, an Anthropic Bedrock API key, or an Anthropic Bedrock access key; Codex accepts an OpenAI API key. Pick an existing secret, or choose **New auth secret** to store one without leaving the page. See [connecting Claude Code credentials](/platform/harnesses/authentication/#connecting-claude-code-credentials) and [connecting Codex credentials](/platform/harnesses/authentication/#connecting-codex-credentials) for how to obtain each key. From e069ff6bf34c1b01769a91bea03ce35ecfe32a5a Mon Sep 17 00:00:00 2001 From: Hong Yi Chen Date: Thu, 27 Aug 2026 17:07:49 -0700 Subject: [PATCH 11/12] Update src/content/docs/factories/factory-agents.mdx Co-authored-by: Rachael Rose Renk <91027132+rachaelrenk@users.noreply.github.com> --- src/content/docs/factories/factory-agents.mdx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/content/docs/factories/factory-agents.mdx b/src/content/docs/factories/factory-agents.mdx index 9b42f90c..d32bbc78 100644 --- a/src/content/docs/factories/factory-agents.mdx +++ b/src/content/docs/factories/factory-agents.mdx @@ -106,7 +106,14 @@ See [model choice for agents](/agents/inference/model-choice/) and [harnesses fo Change an agent's harness to Claude Code or Codex to run it with that provider's own coding tool instead of the Warp Agent. 1. Open the agent's settings (see [Configure agent behavior](#configure-agent-behavior)) and choose **Claude Code** or **Codex** in the **Harness** field. Third-party harnesses require a Build plan or higher; without one, you can only use the Warp Agent harness until your team upgrades or an admin enables it. -2. Choose or create a credential in the **Auth** field that appears below **Harness**. The dropdown lists compatible, team-owned secrets: Claude Code accepts an Anthropic API key, an Anthropic Bedrock API key, or an Anthropic Bedrock access key; Codex accepts an OpenAI API key. Pick an existing secret, or choose **New auth secret** to store one without leaving the page. See [connecting Claude Code credentials](/platform/harnesses/authentication/#connecting-claude-code-credentials) and [connecting Codex credentials](/platform/harnesses/authentication/#connecting-codex-credentials) for how to obtain each key. +3. In the **Auth** field, choose a compatible, team-owned secret from the list or click **New auth secret** to create one. + +:::note +* Claude Code accepts an Anthropic API key, Anthropic Bedrock API key, or Anthropic Bedrock access key. +* Codex accepts an OpenAI API key. + +See [connecting Claude Code credentials](/platform/harnesses/authentication/#connecting-claude-code-credentials) and [connecting Codex credentials](/platform/harnesses/authentication/#connecting-codex-credentials) for how to obtain a each key. +::: 3. Choose a **Model** from that harness's own catalog. Changing harness clears any previously selected model and auth, so reselect both. A Codex model option pairs a model with a reasoning level (for example, `gpt-5.5 (high)`). 4. Click **Save changes** to confirm the agent's new **Harness**, **Auth**, and **Model**. From 55258e73e85d137d4540a2ef0dd8cc9d07e9135f Mon Sep 17 00:00:00 2001 From: "warp-agent-staging[bot]" <240773466+warp-agent-staging[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 00:38:00 +0000 Subject: [PATCH 12/12] docs: address Rachael's PR review feedback on third-party harness docs - Apply remaining suggested edits from rachaelrenk's review on PR #647: bulleted Warp-managed/GitHub-backed settings explanation, reworded dashboard nav step, reordered/oriented harness-config steps, simplified Model step, corrected Save button step, tightened auth-secret scoping note in authentication.mdx. - Add the cleaned-up, cropped screenshot from Rachael's comment to the Auth step of the third-party harness procedure. - Cross-link the Definitions as code agentDefaults.harness reference back to the dashboard procedure in factory-agents.mdx. - Encode the recurring editorial patterns from her review (orient before instructing within a step, bold only interactive elements vs quotes for static labels, move reference detail into a :::note, don't duplicate a caveat) into AGENTS.md's style guide and draft_procedural/SKILL.md. --- .agents/skills/draft_procedural/SKILL.md | 2 ++ AGENTS.md | 13 ++++++- .../factories/factory-agent-auth-secret.png | Bin 0 -> 112703 bytes src/content/docs/factories/factory-agents.mdx | 32 ++++++++++++------ .../docs/factories/factory-as-code.mdx | 2 +- .../platform/harnesses/authentication.mdx | 2 +- 6 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 src/assets/factories/factory-agent-auth-secret.png diff --git a/.agents/skills/draft_procedural/SKILL.md b/.agents/skills/draft_procedural/SKILL.md index 73d327c8..1efb8855 100644 --- a/.agents/skills/draft_procedural/SKILL.md +++ b/.agents/skills/draft_procedural/SKILL.md @@ -24,6 +24,8 @@ See "Descriptions by content type" under Frontmatter in `AGENTS.md` for the full These rules are specific to procedural pages (from the "Drafting by content type" section of `AGENTS.md`): - **Keep steps focused, not artificially atomic.** Aim for one primary action per step, but group tightly related actions together when they share the same UI context. Up to ~3 related actions per step is acceptable. +- **Move reference detail out of the step into a `:::note`.** When a step's supporting detail is a list of facts (accepted credential types, valid formats) rather than an instruction, keep the step to its one action and put the list in a `:::note` immediately after it. +- **Orient within the step, not just on first mention.** Name the field, dropdown, or location the action happens in before naming the action itself ("In the 'Harness' dropdown, select **Claude Code**", not "Choose **Claude Code** in the **Harness** field"). A step should stand on its own for a reader who lands on it directly, not rely on referring back to an earlier section. - **Motivate steps before giving instructions.** Briefly explain WHY before HOW, especially for setup steps. - Include expected outcomes after key steps so the reader can confirm they're on track. - Test all instructions for accuracy. diff --git a/AGENTS.md b/AGENTS.md index ad8a4ec8..ca429e29 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -41,6 +41,8 @@ Cut sentences that narrate the page, restate what the reader just read, or expla - ❌ "The container is destroyed after each run. This process ensures every run starts from the same baseline, making results reproducible and debugging straightforward." - **No recap lines** - Don't end a section by summarizing it ("In practice: triggers create tasks; tasks produce outputs."). - **Say it once** - Don't repeat a caveat or definition across multiple sections of the same page. Put it where it matters most. The same goes for sibling pages: boilerplate like validation steps or shared prerequisites lives once on the parent or reference page, linked from the rest. + - ✅ State a plan-tier requirement once in a `:::note` near the top of the section, then let a later procedure that depends on it link back rather than restating it. + - ❌ Repeating the same "requires a Build plan or higher" caveat both in a section-level note and again inside a numbered step further down the page. #### Words to avoid These words are the strongest tell of an AI-generated draft and rarely add meaning. Replace them with the specific fact they're hiding, or delete them. @@ -436,18 +438,21 @@ Keyboard keys and shortcuts use backticks. Use `+` as the separator between keys - ❌ **System Settings** > **Privacy & Security** > **Local Network** (macOS path missing the Apple icon — `U+F8FF` must appear before the first `>`) ### UI elements -- Use bold for interactive UI elements (e.g., buttons, toggles, dropdowns) +- Use bold for interactive UI elements (e.g., buttons, toggles, dropdowns, and the option you select from one) - Describe UI elements by name, not just appearance or location. Prefer "In the sidebar, click **Platform**" over "Click the button on the left." - Format checkbox names in bold. Omit the word "checkbox." Use "select" or "deselect," not "check" or "uncheck." +- Use quotation marks, not bold, for a field or label name that is not itself clickable. The interactive control next to it (the dropdown, the input, the option you choose from it) still gets bold. **Use:** - ✅ Click your profile photo in the top-right corner, then click **Settings**. - ✅ In the sidebar, click **Platform**. +- ✅ In the "Harness" dropdown, select **Claude Code** or **Codex**. ("Harness" labels the field but isn't itself clickable; the dropdown and its options are) **Don't use:** - ❌ In the API Keys section, click `+ Create API Key`. - ❌ In the API Keys section, click `+ Create API Key`. (use bold, not backticks) - ❌ Click `Create key`. (use bold, not backticks) +- ❌ Choose **Claude Code** or **Codex** in the **Harness** field. (the field label isn't interactive, so it shouldn't be bold) #### Verbs for UI interactions Use consistent verbs that match the type of UI element: @@ -548,9 +553,15 @@ These rules apply regardless of content type: - **Keep steps focused, not artificially atomic.** Aim for one primary action per step, but group tightly related actions together when they share the same UI context and doing so keeps the procedure at a readable length. Up to ~3 related actions per step is acceptable. Use judgment: a simple task shouldn't require 10+ steps, but a single step shouldn't be a mini-procedure either. - Acceptable groupings: actions on the same form (entering a name and choosing an expiration date), a click that reveals the next target (clicking to expand a section, then clicking the revealed item), or a short natural sequence within the same UI area. - Avoid grouping actions that span different areas of the UI or that would make a step hard to scan at a glance. + - **Move reference detail out of the step into a `:::note`.** When a step's supporting detail is a list of facts a reader might check rather than an instruction (accepted credential types, valid formats), keep the step to its one action and put the list in a `:::note` immediately after it. + - ✅ A step reading "In the **Auth** field, choose a compatible, team-owned secret from the list or click **New auth secret** to create one," followed by a `:::note` listing which credential type each option accepts. + - ❌ Folding the full list of accepted credential types into the same sentence as the instruction, so the action is buried in reference detail. - **Motivate steps before giving instructions.** Briefly explain WHY before HOW, especially for setup steps. A single sentence of motivation prevents the reader from wondering "why am I doing this?" - ✅ "Export your API key so the CLI can authenticate your requests automatically." - ❌ "Export your API key as an environment variable." (why?) +- **Orient within the step, not just on first mention.** The page-level rule above ("Orient the reader before UI, CLI, or URL instructions") also applies inside a single step: name the field, dropdown, or location the action happens in before naming the action itself. Don't rely on referring the reader back to an earlier section instead — a step should stand on its own for a reader who lands on it directly. + - ✅ "In the 'Harness' dropdown, select **Claude Code** or **Codex**." + - ❌ "Choose **Claude Code** or **Codex** in the **Harness** field." (names the action before the location) - Include expected outcomes after key steps so the reader can confirm they're on track. - Test all instructions for accuracy. - Provide troubleshooting for common failure points. diff --git a/src/assets/factories/factory-agent-auth-secret.png b/src/assets/factories/factory-agent-auth-secret.png new file mode 100644 index 0000000000000000000000000000000000000000..2970940d9588a29e25a6808ad13a0dfa1c0bbdac GIT binary patch literal 112703 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 z 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

(;C8kH|x$X6H`5C2H-&d)nO>yTJ_}?wJ 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

lg$P<1xn4Q-Z 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 literal 0 HcmV?d00001 diff --git a/src/content/docs/factories/factory-agents.mdx b/src/content/docs/factories/factory-agents.mdx index d32bbc78..adb21566 100644 --- a/src/content/docs/factories/factory-agents.mdx +++ b/src/content/docs/factories/factory-agents.mdx @@ -63,7 +63,7 @@ Every default agent comes with GitHub skills, and the foreman also comes with a ## Configure agent behavior -1. In the [factory dashboard](/factories/factory-dashboard/), select your factory and click **Agents** in the sidebar. +1. From the [factory dashboard](/factories/factory-dashboard/) sidebar, select your factory and click **Agents**.

![The Agents page in the factory dashboard, listing a foreman agent and its four default agents: triage, spec, implement, and review.](../../../assets/factories/factory-agents-list.png) @@ -77,7 +77,11 @@ Every default agent comes with GitHub skills, and the foreman also comes with a
An agent's settings page, where you configure its model, harness, runner, and host.
-You can also manage the whole factory as version-controlled code, with [factory definition files](/factories/factory-as-code/) in a Git repository. A factory's settings live in one of two places: a **Warp-managed factory** lets you edit everything, including harness, auth, and credential strategy, from the dashboard. A **GitHub-backed factory** keeps those settings in its definition files instead, so the dashboard shows them read-only and you edit the files to make changes. See [where the definition lives](/factories/factory-as-code/#where-the-definition-lives) for the full difference. +You can also manage the factory as version-controlled code with [factory definition files](/factories/factory-as-code/) in a Git repository. A factory's settings live in one of two places: +* A **Warp-managed factory** lets you edit everything, including harness, auth, and credential strategy, from the dashboard. +* A **GitHub-backed factory** keeps those settings in its definition files. The dashboard shows them read-only, and you edit the files to make changes. + +For more information about the two locations, see [where the definition lives](/factories/factory-as-code/#where-the-definition-lives). Factory setup doesn't choose models for you. To change the model an agent uses, edit that agent. @@ -105,17 +109,23 @@ See [model choice for agents](/agents/inference/model-choice/) and [harnesses fo Change an agent's harness to Claude Code or Codex to run it with that provider's own coding tool instead of the Warp Agent. -1. Open the agent's settings (see [Configure agent behavior](#configure-agent-behavior)) and choose **Claude Code** or **Codex** in the **Harness** field. Third-party harnesses require a Build plan or higher; without one, you can only use the Warp Agent harness until your team upgrades or an admin enables it. -3. In the **Auth** field, choose a compatible, team-owned secret from the list or click **New auth secret** to create one. +1. From the [factory dashboard](/factories/factory-dashboard/) sidebar, select your factory and click **Agents**. +2. Click an agent to open its settings page. In the "Harness" dropdown, select **Claude Code** or **Codex**. +3. In the **Auth** field, choose a compatible, team-owned secret from the list or click **New auth secret** to create one. -:::note -* Claude Code accepts an Anthropic API key, Anthropic Bedrock API key, or Anthropic Bedrock access key. -* Codex accepts an OpenAI API key. +
+ ![An agent's settings page with the Harness dropdown set to Claude Code and the Auth field's dropdown open, showing a team-owned secret and the option to create a new one.](../../../assets/factories/factory-agent-auth-secret.png) +
The Auth field's dropdown, showing a team-owned secret and the option to add a new one.
+
-See [connecting Claude Code credentials](/platform/harnesses/authentication/#connecting-claude-code-credentials) and [connecting Codex credentials](/platform/harnesses/authentication/#connecting-codex-credentials) for how to obtain a each key. -::: -3. Choose a **Model** from that harness's own catalog. Changing harness clears any previously selected model and auth, so reselect both. A Codex model option pairs a model with a reasoning level (for example, `gpt-5.5 (high)`). -4. Click **Save changes** to confirm the agent's new **Harness**, **Auth**, and **Model**. + :::note + * Claude Code accepts an Anthropic API key, Anthropic Bedrock API key, or Anthropic Bedrock access key. + * Codex accepts an OpenAI API key. + + See [connecting Claude Code credentials](/platform/harnesses/authentication/#connecting-claude-code-credentials) and [connecting Codex credentials](/platform/harnesses/authentication/#connecting-codex-credentials) for how to obtain each key. + ::: +4. Choose a **Model** from that harness's own catalog. +5. In the top-right corner, click **Save**. With a Warp-managed factory, you can edit harness, auth, and model from the dashboard. A GitHub-backed factory sets them through [`agentDefaults.harness` or a per-agent `harness` override](/factories/factory-as-code/#agentdefaultsharness) in the definition files. For an example, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). diff --git a/src/content/docs/factories/factory-as-code.mdx b/src/content/docs/factories/factory-as-code.mdx index 6ca324cc..7cb7402e 100644 --- a/src/content/docs/factories/factory-as-code.mdx +++ b/src/content/docs/factories/factory-as-code.mdx @@ -178,7 +178,7 @@ harness: For a third-party harness, `auth` sets where credentials come from: `source: managedSecret` reads the [managed secret](/platform/secrets/) named by `secretName`, and `source: workerEnvironment` reads them from your self-hosted worker's environment (and requires a self-hosted `workerHost`). The `oz` harness supplies its own credentials and takes no `auth` or `reasoningLevel`. -For a definition that runs a different harness per agent, with managed-secret auth for Claude Code and Codex, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). +For a definition that runs a different harness per agent, with managed-secret auth for Claude Code and Codex, see [`03-multi-harness`](https://github.com/warpdotdev/warp-factory-examples/tree/main/examples/03-multi-harness). To configure the same third-party harness from the dashboard instead, see [configuring a third-party harness](/factories/factory-agents/#configuring-a-third-party-harness). ### `agentDefaults.runner` diff --git a/src/content/docs/platform/harnesses/authentication.mdx b/src/content/docs/platform/harnesses/authentication.mdx index 10d74db3..d1475ae5 100644 --- a/src/content/docs/platform/harnesses/authentication.mdx +++ b/src/content/docs/platform/harnesses/authentication.mdx @@ -10,7 +10,7 @@ import { VARS } from '@data/vars'; Third-party cloud agent authentication in the {VARS.WARP_AUTOMATION_PLATFORM} stores provider credentials for cloud runs as Warp-managed secrets. Third-party cloud agents, like [Claude Code](#connecting-claude-code-credentials) and [Codex](#connecting-codex-credentials), call their providers directly, so set up an Anthropic or OpenAI credential once before launching a third-party harness. -Auth secrets can be scoped to a **team** (available to all teammates' runs) or **personal** (only your own runs), like any other Warp-managed secret. A [factory agent](/factories/factory-agents/#configuring-a-third-party-harness) can only select **team**-scoped secrets, since a factory's runs aren't tied to one person; personal secrets remain available when you start an ad hoc cloud run instead. +Auth secrets can be scoped to a **team** (available to all teammates' runs) or **personal** (only your own runs), like any other Warp-managed secret. A [factory agent](/factories/factory-agents/#configuring-a-third-party-harness) can only select team-scoped secrets, since a factory's runs aren't tied to one person. Personal secrets remain available when you start an ad hoc cloud run. :::note [Bring Your Own Key (BYOK)](/agents/inference/bring-your-own-api-key/) configured in the Warp desktop app applies to local agent runs only. Cloud runs of Claude Code and Codex always use Warp-managed secrets.