@unblocklabs/openclaw-keep-going
v0.3.4
Published
OpenClaw Slack continuation plugin that starts a same-session follow-up run when the validator sees unfinished work
Readme

Keep Going
keep-going is a native OpenClaw plugin that watches completed Slack turns and starts one same-session follow-up run when an LLM validator believes the assistant stopped before the task was actually done.
The plugin is intentionally narrow:
- Slack sessions only
- one follow-up run per completed turn
- no resume-in-place mutation of the original run
- no continuation for heartbeat, cron, subagent, or spawned-session runs
How It Works
The runtime flow is:
- Turn A completes normally.
- The plugin receives
agent_end. - The plugin reconstructs the session route and recent transcript window.
- The validator decides whether the assistant still owns remaining work.
- If yes, the plugin starts Turn B on the same session and Slack thread.
Turn B is advisory. It is explicitly told to stop immediately if the previous turn was already complete or truly blocked.
Install
Prerequisites:
- OpenClaw
2026.5.3or newer - an OpenAI validator key configured through
validator.llm.apiKeyRef,validator.llm.apiKey,KEEP_GOING_OPENAI_API_KEY, or sharedOPENAI_API_KEY
Remote install:
openclaw plugins install keep-going --marketplace unblocklabs-ai/keep-going
openclaw plugins enable keep-goingLocal iteration:
git clone https://github.com/unblocklabs-ai/keep-going.git
cd keep-going
npm install
npm run build
cd ..
openclaw plugins install --link ./keep-going
openclaw plugins enable keep-goingThen restart the gateway and verify:
openclaw plugins list --enabled
openclaw plugins inspect keep-goingConfig
The plugin exposes a small config surface through openclaw.plugin.json:
{
"enabled": true,
"debug_logs": false,
"channels": ["slack"],
"timeoutMs": 120000,
"continuationReaction": {
"enabled": true
},
"continuationNotice": {
"mode": "fallbackOnly",
"text": ":eyes: continuing..."
},
"validator": {
"llm": {
"model": "gpt-5.4-mini",
"systemPrompt": "Optional override for the built-in continuation validator prompt.",
"apiKeyRef": {
"source": "file",
"provider": "openai_keys",
"id": "/KEEP_GOING_OPENAI_API_KEY"
},
"apiKeyEnv": "KEEP_GOING_OPENAI_API_KEY",
"maxMessages": 10,
"maxChars": 20000,
"includeCurrentTurnOnly": true,
"recentUserMessages": 3,
"temperature": 0.2,
"timeoutMs": 15000
}
}
}Notes:
enableddefaults totruechannelsdefaults to["slack"]; other channels are ignoredcontinuationReaction.enableddefaults totrue; when enabled, the plugin adds aneyesreaction to the assistant Slack message only after the validator approves a continuation and the assistant message id is a Slack timestampcontinuationNotice.modedefaults tofallbackOnly; if the reaction is skipped or fails, the plugin posts:eyes: continuing...in the Slack thread so users can see the continuation firedvalidator.llm.modeldefaults togpt-5.4-minivalidator.llm.apiKeyRefaccepts an OpenClaw SecretRef and takes precedence over inline/env key settings when it resolves successfullyvalidator.llm.apiKeyis supported as the inline override afterapiKeyRef, but usually not desirablevalidator.llm.apiKeyEnvdefaults toKEEP_GOING_OPENAI_API_KEY, which overrides the sharedOPENAI_API_KEYwhen setOPENAI_API_KEYis used as the fallback validator credential from OpenClaw config env, configured OpenAI provider auth, or process env so normal OpenClaw OpenAI config works without extra plugin setupincludeCurrentTurnOnlykeeps the validator focused on the current task while still allowing a small amount of recent contextdebug_logs: trueenables structured step-by-step plugin logging; whenfalse, only error logs are emitted
For the apiKeyRef example above, define the matching file provider in OpenClaw config:
{
"secrets": {
"providers": {
"openai_keys": {
"source": "file",
"path": "~/.openclaw/secrets.json",
"mode": "json"
}
}
}
}Runtime Behavior
The plugin includes a few guards to avoid bad continuations:
- plugin-started follow-up runs are tagged and skipped on re-entry
- only top-level Slack sessions are eligible
- the parent turn is skipped while child subagents are still active
- continuation launch is aborted if newer session activity appears during validation
- model, provider, auth profile, and Slack routing are reused from the existing session route
The validator is called directly against OpenAI and does not create its own OpenClaw run. When reaction posting is enabled, the wake marker is a Slack reaction. If the reaction target cannot be confirmed as a Slack message timestamp or Slack rejects the reaction, Keep Going falls back to a short in-thread continuation notice.
Development
Run the plugin tests with:
npm testRun the local plugin preflight with:
npm run preflightThe preflight follows the same narrow check shape as OpenClaw's Kitchen Sink fixture: runtime checks, plugin-inspector package inspection, install-shape checks, package dry-run, and runtime dependency audit. Set OPENCLAW_CHECKOUT=/path/to/openclaw to force inspector compatibility checks against a specific local OpenClaw checkout. The inspector step fails if no checkout is available unless CHECK_INSPECTOR_ALLOW_NO_OPENCLAW=1 is set.
Repository Layout
index.tsregisters the native plugin entrydist/index.jsis the compiled plugin entry loaded by OpenClawsrc/plugin.tswires the event hooks, validator call, and continuation launch flowsrc/llm-validator.tsbuilds the transcript window and calls the structured validator responsesrc/session-route.tsrestores Slack routing and auth continuity from session metadatasrc/launcher.tsstarts the same-session follow-up run
Maintainer release notes live in docs/RELEASE.md.
License
MIT
