skills/taskflow/SKILL.md
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
npx skillsauth add steipete/clawdis taskflowInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use TaskFlow when a job needs to outlive one prompt or one detached run, but you still want one owner session, one return context, and one place to inspect or resume the work.
currentStep, stateJson, and waitJsonIt does not own branching or business logic. Put that in Lobster, acpx, or the calling code.
Canonical plugin/runtime entrypoint:
api.runtime.tasks.flowapi.runtime.taskFlow still exists as an alias, but api.runtime.tasks.flow is the canonical shapeBinding:
api.runtime.tasks.flow.fromToolContext(ctx) when you already have trusted tool context with sessionKeyapi.runtime.tasks.flow.bindSession({ sessionKey, requesterOrigin }) when your binding layer already resolved the session and delivery contextManaged-flow lifecycle:
createManaged(...)runTask(...)setWaiting(...) when waiting on a person or an external systemresume(...) when work can continuefinish(...) or fail(...)requestCancel(...) or cancel(...) when the whole job should stopstateJson as the persisted state bag. There is no separate setFlowOutput or appendFlowOutput API.flow.revision after each successful mutation.runTask(...) links the child task to the flow. Use it instead of manually creating detached tasks when you want parent orchestration.const taskFlow = api.runtime.tasks.flow.fromToolContext(ctx);
const created = taskFlow.createManaged({
controllerId: "my-plugin/inbox-triage",
goal: "triage inbox",
currentStep: "classify",
stateJson: {
businessThreads: [],
personalItems: [],
eodSummary: [],
},
});
const classify = taskFlow.runTask({
flowId: created.flowId,
runtime: "acp",
childSessionKey: "agent:main:subagent:classifier",
runId: "inbox-classify-1",
task: "Classify inbox messages",
status: "running",
startedAt: Date.now(),
lastEventAt: Date.now(),
});
if (!classify.created) {
throw new Error(classify.reason);
}
const waiting = taskFlow.setWaiting({
flowId: created.flowId,
expectedRevision: created.revision,
currentStep: "await_business_reply",
stateJson: {
businessThreads: ["slack:thread-1"],
personalItems: [],
eodSummary: [],
},
waitJson: {
kind: "reply",
channel: "slack",
threadKey: "slack:thread-1",
},
});
if (!waiting.applied) {
throw new Error(waiting.code);
}
const resumed = taskFlow.resume({
flowId: waiting.flow.flowId,
expectedRevision: waiting.flow.revision,
status: "running",
currentStep: "finalize",
stateJson: waiting.flow.stateJson,
});
if (!resumed.applied) {
throw new Error(resumed.code);
}
taskFlow.finish({
flowId: resumed.flow.flowId,
expectedRevision: resumed.flow.revision,
stateJson: resumed.flow.stateJson,
});
Use the flow runtime for state and task linkage. Keep decisions in the authoring layer:
business → post to Slack and waitpersonal → notify the owner nowlater → append to an end-of-day summary bucketblockedSummary or structured wait metadata in waitJson.getTaskSummary(flowId) when the orchestrator needs a compact health view of child work.requestCancel(...) when a caller wants the flow to stop scheduling immediately.cancel(...) when you also want active linked child tasks cancelled.skills/taskflow/examples/inbox-triage.lobsterskills/taskflow/examples/pr-intake.lobsterskills/taskflow-inbox-triage/SKILL.md for a concrete routing patterntools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.