Prerequisites
- Slack connected (self-healing and the agent’s progress run in the configured channel).
- A connected Git provider (GitHub, GitLab, or Azure DevOps) so the agent can push a commit to the PR branch.
- Familiarity with programmable agents and Bolt self-healing.
Steps
1
Create the agent
In the Agent app, open Agents, select New agent, and start from the Goal:Backstory:Model: leave Auto selected.Allowed tools (everything else is refused, see the Tools Reference):
bolt-ci-healer template (or Start from scratch). Fill in the builder fields with the content below, then select Deploy and choose Open a pull request: self-healing selects agents from .dinoai/agents/*.yml on the schedule’s git branch, so the agent definition must be merged there. See Build an agent in the UI for a tour of the builder. (Prefer YAML? The PR the builder opens contains the file, .dinoai/agents/bolt-ci-healer.yml, which you can edit by hand from then on.)Name: bolt-ci-healerRole:read_file,search_files_and_directories,ripgrep_searchrun_sql_querylist_pull_requests,read_pull_requestget_bolt_run_logsrun_terminal_command
The tool allowlist is deliberately narrow and deliberately excludes PR creation: read access, CI observability (
get_bolt_run_logs), PR awareness (list_pull_requests, read_pull_request), and a terminal to run the autofixers and git commit/git push to the PR branch. There is no create_pull_request, because a CI failure already has a PR, so the fix is committed to that branch, not a new one. No Slack tool is needed either, because self-healing already threads the agent’s output into the channel.2
Enable self-healing on the Turbo CI schedule
Point your Turbo CI schedule’s self-healing at this agent, from the UI or as YAML. See Set up self-healing for the walkthrough. The
agent_name must match a .dinoai/agents/*.yml merged on the schedule’s git branch:paradime_schedules.yml
3
Watch the first heal
Open a PR that deliberately breaks CI, such as an unformatted model (pre-commit) or a model with a bad
ref() (dbt). The next time Turbo CI runs and fails, open the failure thread in your self-healing channel. You’ll see the healing session start, the flow run (CI logs, then failure class, then target branch, then prior attempts), and either a commit link pushed to the PR’s branch (which re-triggers Turbo CI automatically) or an “already tried this, needs a human” escalation when the loop-guard trips.On a fresh CI failure, the agent pushes a fix commit to the PR branch and posts the link in the thread; Turbo CI re-runs on the new commit. On a repeat of an error a prior healing commit already addressed, it posts an escalation instead of pushing again. Once CI goes green, review and merge the PR as normal.
How the loop-guard works
The loop-guard is what makes this agent safe to leave running unattended on every PR. Because a CI fix is itself re-tested by CI, a naive healer could push, fail, heal, and push forever. The guard caps the agent at one fix attempt per distinct error and is driven by three pieces of context the agent reasons over:
The agent stops and escalates instead of pushing another commit only when both hold: the current error matches an error from a prior CI-healing attempt on the same branch, and a healing commit addressing that error already exists on the branch while CI is still failing the same way. If either fails (the error is genuinely new, or the prior attempt cleared and a different check is now red), it proceeds with the fix.
Paradime injects a “Prior CI-healing attempts for this PR / branch” block into the agent’s prompt automatically when prior sessions exist for the same branch. That is what gives the agent recall across CI re-runs without a memory tool, and it is exactly what the loop-guard reads to decide whether it has already tried.
Next steps
Set up self-healing
Enable self-healing on a Bolt schedule.
Bolt pipeline healer
The same pattern for failed scheduled runs.
Build an agent in the UI
Create this agent visually instead of by hand.
Programmable Agents reference
The agent YAML schema and tools.