Skip to content

render-workflows: make Blueprint the preferred deploy path - #15

Closed
ojusave wants to merge 1 commit into
render-oss:codex/update-render-workflows-sdk-local-devfrom
ojusave:blueprint-workflows-workflows-skill
Closed

ojusave wants to merge 1 commit into
render-oss:codex/update-render-workflows-sdk-local-devfrom
ojusave:blueprint-workflows-workflows-skill

Conversation

@ojusave

@ojusave ojusave commented Sep 18, 2026

Copy link
Copy Markdown

Stacked on #13. Base is codex/update-render-workflows-sdk-local-dev, not main, because these edits sit on the SDK 1.x rewrite. Merge #13 first and this retargets to main cleanly. The rest of the Blueprint work is in #14, which is independent of both.

The skill said Blueprints were not compatible with Workflows:

Workflows are deployed as a Workflow service type in the Render Dashboard. Blueprints (render.yaml) are not yet compatible with Workflows.

That stopped being true on 2026-09-16 (changelog). An agent reading this would refuse a perfectly valid render.yaml workflow or send the user to the Dashboard for no reason. This replaces that guidance with a validated example and makes Blueprint the preferred path when the repo already uses IaC.

Behaviours documented here

Each of these came out of testing against the live API and CLI rather than from the docs, and each is something an agent would otherwise get wrong.

buildCommand and repo are required in practice. The published schema's required array is [type, name, runtime, region, startCommand], but the validator also rejects a workflow missing either of:

buildCommand is required for non-docker workflows
repo is required for git-based services

repo is required even when validating from inside the repository with an origin remote. A web service in the same directory validates without it, so this is workflow-specific and easy to trip over.

Blueprint runtimes are narrower than the CLI's. render.yaml accepts python and node. render workflows create --runtime also accepts go, ruby, and elixir. A workflow in one of those runtimes cannot be declared in a Blueprint at all, so the skill now points those cases at the CLI or Dashboard.

A passing validate does not prove a runtime is supported. render blueprints validate returns valid: true for runtime: docker on a workflow, while the published schema rejects it. The troubleshooting table previously claimed the CLI raises a schema error there, which would send someone chasing the wrong problem. Corrected to say the CLI is lenient and to check the schema.

Preview environments skip workflow services. Other Blueprint resources still replicate, and there is no previews.generation knob that forces a workflow into a preview stack.

Validation

The type: workflow example passes both the JSON schema and render blueprints validate (CLI v2.28.0), which returns a plan with a workflows entry.

I also deployed the documented example to a live workspace rather than relying on validation alone. Using the exact main.py pattern this skill teaches (@app.task, TaskContext first, chaining via ctx.run), the workflow built, registered all three tasks, and the chained task returned {"greet": "hello deployed-world", "ping": "pong"}. The local path in render workflows dev produced the same result. The test workflow and repository have been deleted.

This also confirms two claims the SDK 1.x work in #13 makes: pip install render resolves to "Python SDK for Render Workflows" 1.1.0, and TaskContext, Workflows, Render, RenderAsync, and Retry all import from render.

The skill stated that Blueprints were not compatible with Workflows. That
stopped being true on 2026-09-16, so an agent reading it would refuse a
render.yaml workflow or send the user to the Dashboard unnecessarily.

Replaces that guidance with a validated type: workflow example and records
four behaviours confirmed against the live API and CLI:

- buildCommand and repo are required in practice. The published schema's
  required array omits both, but the validator rejects a workflow without
  either. repo is required even when validating from inside the repository,
  which is not how web and other git-based types behave.
- Blueprint runtime is python or node only, narrower than
  render workflows create, which also takes go, ruby, and elixir.
- render blueprints validate accepts runtime: docker on a workflow even
  though the schema rejects it, so a passing validate does not prove a
  runtime is supported.
- Preview environments skip workflow services.

Verified by deploying the documented example to a live workspace: the
workflow built, registered its tasks, and a chained ctx.run task returned
the expected result.

@ojusave ojusave left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Notes on the four hunks that encode tested behaviour rather than documented behaviour. Each one is a case where following the published docs or schema alone produces a Blueprint that does not work.


Do **not** set `plan` on a workflow service. Task compute is configured in code (`plan` on the task), not on the service. MCP cannot create workflow services.

Blueprint `runtime` is `python` or `node` only, which is narrower than `render workflows create`, whose `--runtime` also accepts `go`, `ruby`, and `elixir`. Create a workflow in one of those runtimes with the CLI or Dashboard, not a Blueprint. Note that `render blueprints validate` currently accepts `runtime: docker` on a workflow even though the published schema rejects it, so a passing validate is not proof that a runtime is supported.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Two separate traps in one paragraph.

The runtime sets do not match: render.yaml takes python and node, while render workflows create --runtime also takes go, ruby, and elixir. There is a live workflow running runtime: go that could not be expressed in a Blueprint, which is what prompted the note.

The second half matters more for agents: render blueprints validate returns valid: true for runtime: docker on a workflow even though the schema rejects it. An agent that treats a passing validate as confirmation will ship a broken service.

sync: false
```

Keep `repo` on workflow services. Unlike `web` and other Git-based types, `render blueprints validate` reports `repo is required for git-based services` for a workflow even when the file is validated from inside that repository with an `origin` remote. Set `repo` explicitly so validation passes.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This corrects something I had initially written the other way round.

I had assumed repo could be omitted when render.yaml lives alongside the workflow, and that validate only needed it when run from outside. Testing disproved it: running validate from inside the repository, with a correct origin remote, still fails with repo is required for git-based services. A web service in the same directory validates without it, so the requirement is specific to workflows.


Required Blueprint fields: `type`, `name`, `runtime`, `region`, `startCommand`, plus `buildCommand` and `repo` in practice. Optional: `branch`, `rootDir`, `buildFilter`, `autoDeployTrigger`, `envVars` (applied to every task run).

The published JSON schema lists only `type`, `name`, `runtime`, `region`, and `startCommand` as required, but Render's validator also rejects a workflow that omits `buildCommand` (`buildCommand is required for non-docker workflows`) or `repo` (`repo is required for git-based services`). Always include both. Do not treat the schema's `required` array as the complete set.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

The schema's required array is [type, name, runtime, region, startCommand], but the validator also rejects a workflow missing buildCommand or repo. Since agents are pointed at the schema URL as the source of truth, the gap is worth stating explicitly.

If you would rather fix the schema than document around it, I am happy to open an issue and reduce this to a short pointer.

| Symptom | Cause | Fix |
|---------|-------|-----|
| Schema / validate error on `plan` | Service-level `plan` is not allowed on workflows | Remove `plan`. Set compute on the task in code. |
| Workflow deploys but behaves unexpectedly with `runtime: docker` | Workflow runtimes are `python` and `node` only. `render blueprints validate` currently accepts `runtime: docker` on a workflow even though the published schema rejects it, so a passing validate is not proof the runtime is supported | Use `runtime: python` or `runtime: node`. Validate against `https://render.com/schema/render.yaml.json` rather than trusting the CLI result alone |

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

This row previously said runtime: docker produces a schema error from the CLI. It does not: validate returns valid: true. Someone hitting a broken Docker workflow would have gone looking for a validation error that never appears.

Rewritten around the observable symptom, with the fix pointing at the schema rather than the CLI.

@ojusave

ojusave commented Sep 18, 2026

Copy link
Copy Markdown
Author

Closing: opened against the wrong repo. Internal development happens in renderinc/skills, which syncs to this one, so these have been reopened there as renderinc/skills#42 (Blueprint, deploy, and platform skills) and renderinc/skills#43 (render-workflows, stacked on the SDK 1.x PR).

Thanks @ttacon for the pointer. The internal versions also update evals.json, which does not exist in this repo: one assertion there required that the agent NOT suggest Blueprints for workflows, which would have failed a correct answer after this change.

@ojusave ojusave closed this Sep 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant