Automation #600 · design reading · 19 October 2026

Which agent did the automation actually launch?

You choose a profile with delegation tools. The scheduled run cannot delegate. The proposal moves conversation creation to the backend that owns the profile, then makes the runner attach.

Current failures ≠ proposed behaviorFourth issue revisionNo fresh live-run verification
If you only read one thing

Use plugin-spec automations for the future prompt flow. Let the service launch the selected profile at dispatch. Keep OHE behind the tools-and-secrets fix. A matching profile ID alone cannot prove the right capabilities.

Reading guide to automation #600, including its 19 October decisions. The issue owns the proposal and reported reproduction. Older comments describe superseded designs.

01 / The root problem

Two routes lose the profile in different ways.

A profile is a saved agent configuration: its model, tools and references. An automation selects work and a trigger. The runner is the process in the sandbox that sends the work to an agent conversation.

Today · prompt / plugin presets

The runner builds a default agent.

Selected profile
↓ not consumed by agent construction
get_default_agent(…)
↓
Default tool set

The selected profile never supplies the agent. The reported prompt run had four default tools and no task tool.

Profile ignored.

Preset construction · automation b6fa62d

Today · plugin-spec conversations on OHE

The runner asks the wrong profile store.

Enterprise profile ID
↓ sent inside the sandbox
Sandbox agent-server
↓ local store has no enterprise profile
404 · profile not found

The runner does pass the profile ID. That works locally. On OHE, enterprise owns the profile; the sandbox does not have its record.

Profile cannot resolve.

Runner launch · automation b6fa62d · Store lookup · SDK 1.56.0

A profile ID needs its owner.

Sending the same UUID to a different server does not transfer the profile. The SDK launch request explicitly resolves it using that server’s own stores. Request contract ↗

What the Beta reproduction establishes

Reported in #600 on 19 October: automation 1.21.0, agent-server 1.55.1. An interactive control offered five tools, including task_tool_set, and recorded the launched profile. A prompt-preset automation offered terminal, file_editor, task_tracker and FinishTool, with agent_profile_id: null and no profile tag. Supplying a profile to the preset API returned 422; asking the sandbox to resolve the enterprise profile returned 404. These are the issue’s test results, not tests rerun for this page.

02 / The chosen proposal · not shipped by this page

The service creates. The runner attaches.

Keep backend-specific launch knowledge in the automation service’s existing per-mode backends. Create the conversation once the run’s sandbox is ready. Pass its ID to the runner only after checking the launched profile.

Proposed dispatch-time launch, with a check before the runner startsA saved profile enters dispatch. The local backend calls the local agent-server; the cloud backend calls enterprise for the run's owned sandbox. A matching launched profile permits attaching the runner. A mismatch fails the run before runner execution. AUTOMATION SERVICEDispatchSaved profile ID LOCAL BACKEND → PROFILE OWNERLocal agent-serverPOST /api/conversations CLOUD BACKEND → PROFILE OWNEREnterprisePOST /api/v1/app-conversationsUse the run’s owned sandbox_id Profile IDmatches?Check launch tag yesRunnerattachesSend work, wait noFail visibly. Do not start the runner.NEW: owner-side creation + provenance checkRETAINED: runner prompt, wait and completion reporting
The proposal changes who creates the conversation. The runner still handles the event-context prompt and run reporting.
  1. Service dispatches the saved profile.Wait for the sandbox to be ready.
  2. Ask the profile owner.Local agent-server, or enterprise using the run’s owned sandbox.
  3. Check launched identity.Mismatch → fail visibly before runner execution.
  4. Runner attaches by conversation ID.Send the event-context prompt, wait, report completion.
At automation creation · proposed

Save the user’s choice.

POST /v1/plugin-spec accepts an optional profile ID. Validate it against the manifest’s exact allowlists. Without an explicit choice, use the manifest’s default_name.

Canvas defaults its picker to the user’s active profile at creation. Later active-profile changes do not silently switch this automation.

At dispatch · proposed

Resolve, check, hand off.

Re-check the stored profile against the allowlists. Launch via the owning backend. On enterprise, poll the start task for the conversation ID. Verify launched_agent_profile identifies the requested profile.

Pass AUTOMATION_CONVERSATION_ID; the runner uses RemoteConversation.attach(…). Follow-up runs reuse the subject conversation when it exists.

A typed prompt becomes a plugin-spec automation too.

A stock conversation plugin receives the per-automation prompt through configuration. Canvas needs a plugin-spec create flow and profile picker. Legacy preset endpoints remain frozen and continue rejecting agent_profile_id.

Proposal, API fields, follow-up reuse and prompt options: #600 · Proposed solution / Design. Launch work: #601. Launch experience: #609.

03 / A small worked example

Follow one profile across the boundary.

Imagine a saved profile called Researcher that allows delegation. These cases illustrate the reported failures and proposed checks. They do not call any backend.

Illustrative trace · choose a case
1 · SelectionResearcher chosen in UI
2 · Launch pathPreset builds a default agent
3 · Check / capabilityNo selected-profile provenance; no task tool

The profile never reaches agent construction.

The issue reports this failure for the prompt-preset run. A profile picker cannot fix a runner that builds its own agent.

The successful local trace is a target acceptance case, not a claim that the new dispatch path is implemented. #600 · Acceptance Criteria

04 / The important catch

Correct identity is only the first check.

Enterprise can stamp the right profile while constructing a different effective agent. According to #600’s source audit, its current path replaces the profile’s tools with defaults, drops its prompt suffix, and does not apply secret_refs.

Check one · provenance

“Did we launch the requested profile?”

Compare launched-profile identity with the requested ID. This detects a wrong profile or the reported fallback to composed settings.

Mismatch → stop before the runner starts.

Check two · effective configuration

“Did that profile actually constrain the agent?”

Verify the model receives exactly the allowed tools and the intended secret scope. A correct ID tag cannot establish either.

Right ID + wrong tools is still a failed rollout.

OHE rollout waits for enterprise #763.

The manifest’s “all and only these tools / secrets” promise cannot hold while enterprise replaces tools and ignores secret references. #600 treats #763 as a hard dependency. The unknown-profile fallback (#759) and worker secret boundary (#854) also need explicit attention.

These enterprise details are publicly described in #600 · Verified contracts / Known OHE limitations. Linked enterprise issues may require repository access. This page adds no private enterprise source excerpts.

Another distinction: saving a profile ID does not freeze its contents forever. The definition can be edited. Dispatch revalidation and recorded launch revision help explain what a later run actually used; immutable profile snapshots are not a stated requirement of this proposal.

05 / The design decision

Why create at dispatch?

The current plugin-spec runner prepares nothing before creating the conversation. The service already knows the mode, sandbox and user identity. Moving creation there puts failures before runner execution without adding a runner-to-service launch endpoint.

OptionAttractive because…Trade-off / current decision
Chosen: service creates at dispatchOne backend-specific launch boundary; runner only attaches.Requires a new backend method and provenance check. Keeps existing runner reporting.
A · Repair presetsFixes today’s prompt UI path sooner.Invests in a path being frozen; also needs finish-policy contracts that plugin specs do not need.
B · Runner requests creation from serviceAllows workspace preparation first.There is no such preparation today. An extra endpoint and round trip buy little.
C · Runner calls the profile ownerAvoids changing service-side launch.Duplicates local/cloud API knowledge in runners; uses the user key from the sandbox.
D · Service drives everything; no runnerAvoids per-run SDK installation.Completion, watchdog and progress currently assume a sandbox process. Possible later simplification.
Still an implementation choice

Where does the stock prompt plugin live?

Either an extensions plugin with arguments rendered from config, or a built-in plugin shipped with the automation service. Both preserve the chosen plugin-spec path.

Explicitly parked

Structured finish and model override.

The plugin-spec runner has no finish hook. Structured TaskOutcome and an independent LLM override are outside this change. The agent profile owns the model.

Why older comments seem to disagree

#600 evolved through four designs: service-driven API execution → runner calls the owner → runner requests creation from the service → service creates at dispatch for plugin specs. The fourth design is the current issue body. The run-conversation endpoint in older discussion is alternative B, not another step in the chosen design.

All options and decisions: #600 · Alternatives considered / Decisions / Revision history.

06 / Delivery and proof

Local first. OHE after the capability gate.

Stage 1 · local
Prove the launch path.

Implement dispatch creation, attachment, optional profile choice and the prompt plugin. Give every user a usable profile. No enterprise dependency.

Stage 2 · OHE
Prove profile fidelity.

Release enterprise #763 and bump it in the chart. Verify exact effective tools and secret scope before enabling the profile-based path.

The work crosses three visible boundaries.

BoundaryWork to landTracking
Automation service → conversation ownerPer-backend creation, provenance check, runner attachment; optional selected profile; stock prompt plugin.#601 · #600
Canvas → automation APIPlugin-spec creation and profile picker; hide the misleading preset pill; show cloud tools editor.#609 · #18569 · #18656
Profile → effective agentUsable profile seeding; tools/secrets fidelity and fail-closed enterprise launch.SDK #5982 · enterprise #763 / #759 / #854 (see #600)
Deployment is a separate gate · reported 19 October snapshot
EnvironmentAutomationPlugin-spec API
Beta1.21.0Available
OHE 0.811.19.1Not yet
OHE 0.82 / 0.831.21.0Available
SaaS1.19.1Not yet

API availability does not mean the proposed fixes or Canvas flow have shipped. The issue audits automation main at 1.22.0 and SDK 1.56.0 separately from those deployed versions. Treat this as a dated report, not live telemetry.

What would count as done?

  • Identity: local and OHE runs record the requested launched profile; mismatch visibly fails before runner execution.
  • Capabilities: record the actual tools sent to the model, including delegation when selected; OHE gets exactly the allowed tools and intended secret scope.
  • Selection: accept a profile within the manifest allowlists; reject one outside them.
  • User flow: typing a prompt creates a plugin-spec automation on the chosen profile; the runner attaches rather than creates.
  • Delivery: release automation, deploy to SaaS/Beta and bump the OHE chart. A green source test alone is not deployment proof.
A useful review question

Can a run show both which profile revision launched and which capabilities the model actually received? Keep those as separate pieces of evidence. That catches both the wrong-owner bug and the right-tag/wrong-agent bug.

Acceptance and rollout are taken from #600 · Work breakdown / Acceptance Criteria. The final review question is this walkthrough’s synthesis.