Run a pocket agent
Grill a small loop, test one pass, then boot it. The folder is a Routine.
A pocket agent is a small unattended loop: one job, one machine, one user. The saved folder is still a Routine at ~/.dora/harness/<slug>/.
This page shows one use case all the way through. Install the four skills and Hermes first.
npx skills add saif-shines/doraval --yes
Worked example: Slack mention, then approve the PR
You want this: poll a Slack channel. If a message mentions you, says approve, and has a PR link, approve that PR. Do not merge.
1. Start
/ask-dora I have a use case where I want to run a routine that looks at a slack channel and approve a pr on my behalf
Empty /ask-dora or “what can you help with” prints the map. A real idea loads grilling-for-routine.
2. Loop-able and pocket
The grill asks if Slack is a poll or a webhook, and if you must confirm every PR.
You say: someone mentions you, writes approve, and pastes the PR link. The job approves that PR. You want a short loop later.
That is loop-able. Same prompt on a timer. No human on that Tick.
That is pocket. One job. One machine. One user.
Do not set 1 minute yet. Default is 1 hour. Change it after a good run.
3. Lock the facts
You give:
- Channel:
#pr-review - Mention:
@you - Trigger:
@you+approve+ a PR link - Action: approve only. No merge.
4. Gate
The grill still needs three answers.
- Skills to run:
none(MCP tools are enough). - Skills to refer to:
none. - Scalekit Agent Gateway MCP URL: paste yours. Do not invent one.
Skills to run: none
Skills to refer to: none
MCP URL: https://<your-env>.scalekit.cloud/mcp
Slug: slack-pr-approve
5. Night prompt
The grill writes prompt.md. It looks like this:
1. Poll Slack channel #pr-review for new messages.
Done-when: new items since the last tick are listed, or the list is empty.
2. Keep a message only if it mentions @you, contains the word approve, and has a pull request URL.
Done-when: each new message is kept or skipped with a reason.
3. For each kept message, approve that pull request. Do not merge.
Done-when: each kept PR is approved or skipped with a reason.
A Tick has no last chat. Prefer a search before a create. GitHub approve is already safe. A calendar create is not. Search first, or use a tick handoff: read handoff.md at the start, overwrite it at the end. Missing file means first Tick. Dora does not write that file.
When Hermes runs that prompt, Dora appends:
Human-visible messages end with: Sent by pocket agent slack-pr-approve
Do not put that line in prompt.md. A Slack post then ends with Sent by pocket agent slack-pr-approve.
6. One pass
The grill prints:
dora harness new --accept --yes --slug slack-pr-approve --prompt-file <prompt.md> --mcp-url https://<your-env>.scalekit.cloud/mcp
Run that in a real terminal. Hermes is quiet (-q). The terminal can look empty. That is the first test. It is not the hourly loop.
If it sits with no output, the usual cause is a missing login. Ctrl+C, then:
hermes mcp login scalekit
Dora does not run that login. Then run the one-pass again.
Folder after accept: ~/.dora/harness/slack-pr-approve/.
7. Boot and watch
dora harness boot slack-pr-approve
hermes mcp login scalekit
Dora prints Runtime watch commands:
hermes cron list
hermes cron runs
hermes logs
hermes dashboard
8. Check it
Post in #pr-review: @you approve and the PR link.
To avoid waiting an hour, edit interval in ~/.dora/harness/slack-pr-approve/routine.yml to 1m after a good run. Or say run one tick and fire one pass now.
Laptop close is sleep. That is not pause.
Another shape: Skill script, no Gateway
Some jobs use a Skill script and an API key. They do not use Agent Gateway.
Pass --mcp-url none. After save, open ~/.dora/harness/<slug>/.env in an editor and put the key there. Do not paste the key into chat.
Dora does not copy .env from the original skill.
Common mistakes
- Treating a quiet one-pass as a hang. Wait, or Ctrl+C and run
hermes mcp login scalekit. - Booting before login.
- Setting a 1 minute interval during the grill.
- Expecting a Dora logs verb. Use the Runtime watch commands.
- Putting secrets in
prompt.md.