dynamic-workflows
Skill2 starsChanged 4 months agoMITView on GitHub
Use the hermes-dynamic-workflows plugin: workflow runs, script harnesses, controls, child agents, and Kanban waits.
5 other projects use a version of this.
Adopted by
Most recently taken up by
- zedarvates/frugal-skillstheir own version, first seen Nov 8, 2026
- TheBeardedBearSAS/claude-crafttheir own version, first seen Oct 29, 2026
- cubetribe/ClaudeCode_GodMode-Ontheir own version, first seen Oct 13, 2026
- tharanee-bit/Codex-Dynamic-Workflowstheir own version, first seen Jul 16, 2026
- cs50victor/dynamic_workflows_mcptheir own version, first seen Jun 7, 2026
Other versions5 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 5
- TheBeardedBearSAS/claude-craft★ 108same name
- cubetribe/ClaudeCode_GodMode-On★ 53same name
- tharanee-bit/Codex-Dynamic-Workflows★ 1same name
- zedarvates/frugal-skills★ 1same name
- cs50victor/dynamic_workflows_mcp★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. 0 are common, 8 are distinctive, and 6 are very specific to this project.
0
Common
Most of the 3 edited versions we read keep these.
8
Distinctive
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 15
Use this when operating the hermes-dynamic-workflows plugin itself.
- Distinctive: line 25
Use this skill when the user asks to:
- Very specific: line 29
use agent(...), kanban_agent(...), parallel(...), pipeline(...), or capability(...) inside a workflow script.
- Distinctive: line 33
Do not use this for small one-off tool sequences.
- Very specific: line 93
Always include an explicit policy block.
- Distinctive: line 97
Use scripts when the workflow needs loops, branching, fan-out, replay, or a reusable harness.
- Distinctive: line 121
Read the full JSON only on demand from:
- Very specific: line 192
Do not pretend delegate_task_background handles are durable workflow state by themselves.
- Very specific: line 248
Use workflow_control for run inspection and operator decisions:
- Distinctive: line 271
Before saying a workflow is done:
- Distinctive: line 274
Run a scoped smoke before full fan-out.
- Very specific: line 275
Check workflow_control(action="status", run_id=...) for lifecycle, waits, phases, child refs, and pending approvals.
- Distinctive: line 287
Do not pass secrets through script args or capability inputs.
- Distinctive: line 288
Do not run huge fan-out without a scoped dry run and cost/limit check.
“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Dynamic Workflows Plugin Skill
Use this when operating the hermes-dynamic-workflows plugin itself. It is not the generic fan-out pattern skill. It tells you how to call the plugin tools that ship with this repo.
Plugin-provided skills are explicit-load only. Load this one as:
skill_view(name="hermes-dynamic-workflows:dynamic-workflows")When to Use
Use this skill when the user asks to:
- validate, run, inspect, pause, resume, stop, or retry a Dynamic Workflows run;
- author or run a workflow-script harness;
- use
agent(...),kanban_agent(...),parallel(...),pipeline(...), orcapability(...)inside a workflow script; - inspect blocked waits, approvals, finalizers, or child-agent state;
- debug the plugin installation or its workflow state stores.
Do not use this for small one-off tool sequences. Just call the normal tools.
Installed Surface
The plugin registers two model-facing tools in the dynamic_workflows toolset:
workflow— validate/run/status/catalog/script operations.workflow_control— operator controls and blocked-wait/status inspection.
The plugin stores state under the active HERMES_HOME by default:
$HERMES_HOME/dynamic-workflows/runs/
$HERMES_HOME/dynamic-workflows/controls/
$HERMES_HOME/dynamic-workflows/script-runs/
$HERMES_HOME/dynamic-workflows/background-runs/
$HERMES_HOME/dynamic-workflows/scripts/
$HERMES_HOME/dynamic-workflows/templates/Useful overrides:
HERMES_WORKFLOWS_STATE_DIR # run store root; sibling stores live beside it
HERMES_WORKFLOWS_SCRIPT_CATALOG_DIR # saved script harness catalog root
HERMES_WORKFLOWS_CATALOG_DIR # JSON workflow template catalog rootJSON Workflow Definitions
Fast path:
workflow(action="validate", definition={...})
workflow(action="run", definition={...}, inputs={...})
workflow(action="status", run_id="wf_...")Minimal definition:
{
"version": "1",
"name": "hello",
"policy": {"network": false, "filesystem": false, "max_parallel": 2},
"inputs": {"name": "string"},
"steps": [
{
"kind": "agent",
"id": "greet",
"agent": "hermes.greeter",
"input": {"subject": "$ref:inputs.name"},
"output_schema": {"greeting": "string"}
}
]
}Supported JSON step kinds in this release: agent, kanban_agent, if, parallel, pipeline, phase.
Always include an explicit policy block. Missing policy is treated as default-deny and strict validation reports it as an error/warning depending on call path.
Script Harnesses
Use scripts when the workflow needs loops, branching, fan-out, replay, or a reusable harness.
Operations:
workflow(action="script_catalog", include_versions=True)
workflow(action="script_save", script_name="name", script_source=source, replace=False)
workflow(action="script_inspect", script_name="name", script_version=1, include_source=True)
workflow(action="run_script", script_name="name", script_args={...})Claude-style facade aliases also work in the current plugin schema:
workflow(script=source, args={...}) # inline source
workflow(name="name", args={...}) # latest saved version
workflow(scriptPath="name/v000001.workflow.py", args={...}) # catalog-relative file
workflow(name="name", args={...}, resumeFromRunId="...") # deterministic replay/resumeFinal script return values are compact by default. Small results stay inline;
if the compact JSON result exceeds result_preview_bytes (default 4096 bytes),
workflow(...), workflow(action="status"), and workflow_control(status) return
a __workflow_result_spill__ preview envelope plus spill.path / result_path.
Read the full JSON only on demand from:
$HERMES_HOME/dynamic-workflows/script-runs/<run_id>/tasks/<run_id>.outputSet result_preview_bytes=<positive int> on script run calls when a different
preview cap is needed. The artifact is written before the run snapshot points to
it; missing artifact means storage is corrupt, not "no result".
Script globals available inside .workflow.py harnesses:
args # read-only runtime args
budget # runtime budget helper
meta # script metadata dict
agent # await agent(prompt_or_id, input?, opts?)
kanban_agent # await kanban_agent(profile, task/input, ...)
agent_start # start non-blocking child-agent run
agent_check # poll async child-agent handle
agent_cancel # cancel async child-agent handle
agent_list # list handles known to this run
capability # await parent-owned capability(name, input, ...)
workflow # nested saved workflow call
log # journal a short message
phase # set current phase title
parallel # bounded concurrent thunks, order-preserving; max 4096 thunks
pipeline # bounded per-item stage chains; max 4096 items/stages
json, math # restricted stdlib facadesExample script source:
meta = {"name": "triage", "description": "fan out reviews", "phases": ["Plan", "Review", "Synthesize"]}
phase("Review")
items = args.get("items", [])
async def review(item):
return await agent(
"review this item",
{"item": item},
{"schema": {"ok": "boolean", "notes": "string"}},
)
results = await parallel([lambda item=item: review(item) for item in items])
return {"results": results}Child-Agent Backends
Prompt-agent effort accepts only low, medium, high, xhigh, or max; invalid values fail closed before dispatch.
By default, prompt agents use the plugin's local/stub runner unless the host injects another runner.
For live Hermes delegate_task integration from the plugin tool surface:
workflow(
action="run_script",
script_name="triage",
script_args={...},
child_agent_backend="delegate_task"
)Backend choices:
delegate_task— foreground structured child result. Use when the script must wait for the child output.delegate_task_background— returns a redacted dispatch-handle envelope. Use only when the workflow expects async handoff semantics.
Do not pretend delegate_task_background handles are durable workflow state by themselves. The workflow store is durable; the underlying child backend still has its own lifecycle limits.
Async lifecycle handles
agent_start(...) / agent_check(...) / agent_cancel(...) / agent_list() are the script-native async child-agent lifecycle. In foreground script runs with a durable store, unresolved agent_start handles suspend the run as AsyncAgentSuspended; workflow_control(action="status", ...) surfaces them as async_agent waits, and workflow(..., resumeFromRunId="...") reattaches to the same host token instead of dispatching duplicate children. Terminal agent_check/agent_cancel states are sticky and replayable from cache.
Kanban Backend
For real Hermes Kanban cards from kanban_agent(...), use the foreground script path with:
workflow(
action="run_script",
script_name="release_lane",
script_args={"board": "project-board", "repo": "owner/repo"},
kanban_backend="hermes",
kanban_suspend_after_s=30
)The script must pass that board into every real card, for example:
await kanban_agent("planner", title="plan", prompt="...", board=args["board"], on_block="pause")Rules:
kanban_backend="hermes"is valid only for foreground script runs.- It is not supported with local background script execution.
- Real Hermes Kanban runs fail closed if
kanban_agent(...)omitsboardor passes an empty board; do not rely on the profile-global active board. kanban_suspend_after_sshould be set for real cards so the run suspends instead of burning runtime while workers execute.- Suspended runs expose the explicit board, logical
kbc_*waits, and real Hermes Kanbant_*task ids inworkflow_control(action="status", ...). workflow_control(action="kanban_bridge_drain")drains terminal Hermes Kanban task events (completed,blocked,failed,timed_out,crashed,gave_up), maps realt_*ids back to logicalkbc_*cards, publishes the durable workflow event, and auto-resumes suspended script runs when a resume manifest exists.workflow_control(action="kanban_publish", ...)remains the manual repair path when an adapter cannot drain the real Kanban event stream.- Manual resume still uses
workflow(..., resumeFromRunId="previous_run_id"); bridge auto-resume uses the same replay contract and must match the same script identity/fingerprint.
Gateway-origin breadcrumbs
Foreground script runs launched from a gateway thread can persist their origin and send compact progress breadcrumbs:
workflow(
script=source,
args={...},
kanban_backend="hermes",
kanban_suspend_after_s=30,
gateway_notify=True, # default
gateway_notify_target="discord:chan:thread" # optional explicit override
)Breadcrumbs are visibility only: run state, Kanban state, and workflow journals remain authoritative. The plugin suppresses unchanged healthy waits with a fingerprint and sends only compact start/wait/resume/terminal status.
Operator Control
Use workflow_control for run inspection and operator decisions:
workflow_control(action="overview")
workflow_control(action="status", run_id="wf_...")
workflow_control(action="pause", run_id="wf_...", reason="operator requested")
workflow_control(action="resume", run_id="wf_...")
workflow_control(action="stop", run_id="wf_...")
workflow_control(action="task_stop", run_id="wf_...", target_ref="call_...")
workflow_control(action="retry", run_id="wf_...", target_ref="call_...")
workflow_control(action="decide_call", run_id="wf_...", target_ref="call_...", decision="approve")
workflow_control(action="kanban_bridge_drain", limit=200, auto_resume=True)Approval decisions:
approve— run pending call as-is.edit— run with operator-suppliedinput.reject— deterministic denial, catchable/non-retryable.respond— return operator-suppliedvaluewithout running the call.
Verification
Before saying a workflow is done:
- Validate first with
workflow(action="validate", ...)or script validator/catalog status. - Run a scoped smoke before full fan-out.
- Check
workflow_control(action="status", run_id=...)for lifecycle, waits, phases, child refs, and pending approvals. - Inspect
include_journal=Trueonly when needed; keep output compact. - Confirm cleanup/finalizers ran or explicitly report live resources with owner/TTL.
- For repo changes, run targeted tests and
git diff --checkbefore handoff.
Pitfalls
- Plugin skills are not in the flat
<available_skills>index. Use the qualified name. workflow(action="validate")with strict mode can reject missingpolicy; that is intended. Add the policy.scriptPathis catalog-relative and must point to.workflowor.workflow.py.resumeFromRunIdmust match the same script identity/fingerprint. Identity mismatch fails closed.- Unknown capability names fail closed. Side effects must cross the parent-owned capability registry/policy.
- Do not pass secrets through script args or capability inputs. Results and waits are redacted/bounded, but scripts are not a secret vault.
- Do not run huge fan-out without a scoped dry run and cost/limit check.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

