Agent skill

Workflow Authoring

by tellahq in tellahq/opensession

Author, revise, or debug Open Session dynamic workflow scripts.

MITAuto-check passed

Install Workflow Authoring

skills CLI
$ npx skills add tellahq/opensession --skill workflow-authoring -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install tellahq/opensession workflow-authoring --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/tellahq/opensession.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/workflow-authoring .claude/skills/workflow-authoring && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
workflow-authoring
GitHub stars
394
Token cost
~2.8k tokens
SKILL.md length
1,116 words
Files
1
Skills in repo
15
Repo updated
First seen
Licence
MIT

At a glance

Author, revise, or debug Open Session dynamic workflow scripts.

  • Works in 10 steps: Confirm fan-out provides real value over… → Call workflow_capabilities if model… → Give every agent a self-contained prompt… → …
  • SKILL.md covers Start with current capabilities, Script shape, Injected globals and Agent or tool?, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Workflow Authoring is an agent skill from tellahq/opensession. Author, revise, or debug Open Session dynamic workflow scripts. Use before writing a non-trivial runworkflow script, choosing agent versus MCP calls, using parallel or pipeline fan-out, spawning durable child sessions, or designing replay-safe workflow logic.

Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It works with Model Context Protocol. The licence is MIT.

Example prompts

  • “/workflow-authoring”

Workflow steps

10 steps, taken from the first numbered list in SKILL.md.

  1. Confirm fan-out provides real value over doing the task directly.
  2. Call workflow_capabilities if model choice or run size matters.
  3. Give every agent a self-contained prompt and a short stable label.
  4. Use direct MCP calls for data and agents for judgement.
  5. Filter inputs in JavaScript before model calls.
  6. Add schemas where downstream code requires structured values.
  7. Put independent work in parallel; use pipeline for dependent per-item stages.
  8. Use durable sessions only when visibility, steering, worktrees, or PRs matter.
  9. Pass nondeterministic values in args.
  10. Return a compact useful result and poll workflow_status after launch.

What it can do on your machine

Read from SKILL.md and the folder at commit 068618d. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Workflow Authoring loads about 2.8k tokens when it runs. Until then it costs about 70 tokens; SKILL.md has 1,116 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~70
When it runs · the whole SKILL.md, loaded when a task matches
~2.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from tellahq/opensession at commit 068618d, republished under its MIT licence (© tellahq). 1,116 words, ~2,769 tokens.

Download SKILL.mdSave it as .claude/skills/workflow-authoring/SKILL.md (or your agent's skills folder).
name
workflow-authoring
description
Author, revise, or debug Open Session dynamic workflow scripts. Use before writing a non-trivial run_workflow script, choosing agent versus MCP calls, using parallel or pipeline fan-out, spawning durable child sessions, or designing replay-safe workflow logic.

Workflow authoring

Use this guide when a task benefits from deterministic fan-out across many focused agents, direct MCP data calls, or durable child sessions. Do not use a workflow for one small sequential task that the current session can do directly.

Start with current capabilities

Call mcp__opensession-workflows__workflow_capabilities when model choice or run size matters. It returns the live model ids, default model, concurrency, lifetime, timeout, and child-session limits. Do not guess model ids or copy an old model list into a script.

Script shape

Pass plain JavaScript, not TypeScript, to run_workflow. Do not use imports. Export meta, then write the async body with top-level await and return:

javascript
export const meta = {
  name: "route-audit",
  description: "Audit routes for missing auth checks",
  phases: [{ title: "List" }, { title: "Audit" }, { title: "Rank" }],
};

phase("List");
const files = await agent("List the route files. Return only a JSON array.", {
  schema: { type: "array", items: { type: "string" } },
});
if (!files) return "Listing failed";

phase("Audit");
const findings = await parallel(
  files.map(
    (file) => () =>
      agent(`Read ${file} and report missing auth or validation checks.`, {
        label: file,
      }),
  ),
);

phase("Rank");
return findings.filter(Boolean);

meta.name is required and should be a short slug. description and phases are optional. Predeclared phases make progress understandable before work reaches them.

Injected globals

agent(prompt, opts?)

Run one focused model turn. Agents begin with no conversation context, so every prompt must include the paths, constraints, and output contract it needs.

Options:

javascript
{
  label,   // short progress label
  phase,   // phase override for this call
  schema,  // JSON Schema; returns parsed validated data
  model,   // current model id from workflow_capabilities
  effort,  // low, medium, high, xhigh, or max when supported
  write,   // opt into a branch-producing write agent
}

A successful unstructured call resolves to final text. A schema call resolves to the parsed value. An errored call resolves to null, so filter nulls before synthesis. Unsupported effort levels are ignored rather than failing the call.

Agents are read-only by default. Use write only when a lightweight branch-producing agent is sufficient. A successful write call returns an object containing text, structured, seq, branch, worktreeDir, changed, files, insertions, and deletions. Use a durable child session when work needs an inspectable transcript, steering, a worktree, or a pull request.

merge(writeResults)

Land selected write-agent branches back onto the session branch, sequentially. Pass one write result, an array of results, or bare { seq, branch } items. Null, unchanged, and branchless values are ignored.

javascript
const edits = await parallel(
  files.map(
    (file) => () =>
      agent(`Fix the issue in ${file} and commit the change.`, {
        label: file,
        write: true,
      }),
  ),
);
const merged = await merge(edits);
return merged;

The result is { merged, conflicts, skipped, error }. A conflicted branch is reported instead of rejecting the whole batch, and the remaining branches continue. Inspect the result rather than assuming every write landed.

parallel([...thunks])

Run zero-argument functions concurrently and wait for all results:

javascript
const reports = await parallel(
  files.map(
    (file) => () => agent(`Audit ${file}`, { label: file, phase: "Audit" }),
  ),
);

Pass thunks, not already-started promises. A thrown thunk becomes null and does not reject the batch.

pipeline(items, ...stages)

Run a per-item stage chain without a global barrier. Item B may start stage 2 while item A is still in stage 1. Each stage receives (previousResult, originalItem, index). A throwing stage drops that item to null and skips its remaining stages.

javascript
const findings = await pipeline(
  files,
  (file) => agent(`Inspect ${file}`, { label: file }),
  (report, file) => (report && report !== "none" ? `${file}: ${report}` : null),
);

Use parallel for one independent pass. Use pipeline when each item has a sequence of dependent transformations and early filtering should free capacity for other items.

Direct MCP calls

Call tools from the script without spending a model turn:

javascript
const alerts = await mcp.grafana.list_alert_groups({ state: "new" });
const issues = await mcp.linear.list_issues({ team: "ENG" });

Available forms:

  • mcp.<server>.<tool>(args)
  • mcp.call(server, tool, args) for dynamic names
  • mcp.servers() to list the script's allowed servers
  • mcp.tools(server) to return tool names, descriptions, and input schemas

A direct call returns the structured result, or parses text as JSON when possible. It rejects on failure. Catch failures explicitly or run calls inside parallel, where a throw degrades to null.

The script receives the current run's policy-scoped MCP surface. Per-user restrictions still apply, and confirmation-gated tools are unavailable.

Progress and inputs
  • phase(title) sets the progress group for subsequent calls.
  • log(message) appends a short narrator line to the live progress feed.
  • args is the parsed args_json value passed to run_workflow.
  • budget exposes { total, spent(), remaining() } for the optional advisory output-token budget.

Pass timestamps, seeds, file lists, and other varying inputs through args so a resumed run receives the same values.

Agent or tool?

Use direct mcp.* for retrieval and mutation that a connected tool already performs. Use agent() only when the step needs judgement, such as reading code, reconciling evidence, classifying, ranking, or synthesizing.

Filter and join data in JavaScript before sending it to agents. Every row removed in the script is context and model work not spent.

javascript
export const meta = { name: "alert-triage" };

const alerts = await mcp.grafana.list_alert_groups({ state: "new" });
const issues = await mcp.linear.list_issues({ team: "ENG", state: "started" });
const unclaimed = alerts.filter(
  (alert) => !issues.some((issue) => issue.title.includes(alert.title)),
);

log(`${unclaimed.length} unclaimed of ${alerts.length}`);
return await parallel(
  unclaimed.map(
    (alert) => () =>
      agent(
        `Assess this alert and suggest an owner: ${JSON.stringify(alert)}`,
        {
          label: alert.id,
        },
      ),
  ),
);
Show full SKILL.md (503 more words)Show less

Durable child sessions

Use spawnSession() for code work that needs a visible, durable Open Session with its own transcript, branch, worktree, steering, and PR lifecycle.

javascript
const child = await spawnSession({
  prompt: "Implement the auth fix and open a PR. Do not merge it.",
  repo: "tellahq/example",
  mode: "code",
  workspace: { type: "isolated-worktree", baseRef: "main" },
});

const pushed = await waitSession(child.id, {
  until: "branch_pushed",
  timeout: 30 * 60_000,
});
return pushed;

Session API:

  • spawnSession({ prompt, repo, mode?, workspace?, branch? }) returns { id, url, repo, branch, parentSessionId } once the visible session exists.
  • sessionStatus(id) returns current status, branch/worktree, and PR data.
  • waitSession(id, { until, timeout? }) waits for lifecycle or PR milestones, including pr_checks_passed, pr_checks_failed, pr_changes_requested, pr_approved, and pr_merged.
  • sendToSession(id, message) steers a child spawned by this workflow.
  • autofixSession(id, reason?) queues the standard review and failing-CI fix handoff for a child with a PR.
  • cancelSession(id) cancels a child spawned by this workflow.
  • reconcileSessions(desired, opts) maintains a refillable child pool with bounded concurrency and optional durable retries.
  • workflowState.get(key) / workflowState.compareAndSet(key, version, value) provide replay-lineage-scoped CAS state.

Use spawnSession({ ..., runner, admission: { tokens, costUsd } }) when work needs a specific authorized Runner and up-front budget reservation.

For dependent branches, wait for the base child to push, then create an isolated worktree with baseSessionId instead of baseRef.

Nested sessions inherit the parent session's user, repositories, model/account, and MCP scope. They cannot merge. A human owns every merge decision.

Replay and determinism

Completed agent(), mcp.*, and session API calls are journaled. Resume and restart recovery replay matching completed calls instead of firing them again. spawnSession() also uses a stable durable creation identity, so a crash between child creation and journaling does not duplicate the session, branch, or worktree.

Keep scripts deterministic:

  • Date.now(), argumentless new Date(), and Math.random() throw. Pass timestamps and seeds through args.
  • Keep call order and prompts stable when you want completed work to replay.
  • Do not embed transient discovery in a prompt when it can be supplied through args or a journaled MCP call.
  • Catch expected tool failures and return explicit fallbacks.
  • Make labels and phases stable so recovery and telemetry remain understandable.

A paused workflow stops active agents cleanly and preserves the journal. Resume continues it in place. Recovery after a process restart creates a new lineage run that replays completed journal entries and re-adopts durable child sessions.

Model and effort selection

Call workflow_capabilities immediately before choosing a non-default model. Prefer the default unless a phase has a clear reason to differ.

Use stronger reasoning for verification, ranking, architecture, and synthesis. Use lower effort for mechanical extraction or classification. Avoid spreading the strongest model and highest effort across every fan-out item when one final verifier can evaluate cheaper parallel results.

Authoring checklist

Before calling run_workflow:

  1. Confirm fan-out provides real value over doing the task directly.
  2. Call workflow_capabilities if model choice or run size matters.
  3. Give every agent a self-contained prompt and a short stable label.
  4. Use direct MCP calls for data and agents for judgement.
  5. Filter inputs in JavaScript before model calls.
  6. Add schemas where downstream code requires structured values.
  7. Put independent work in parallel; use pipeline for dependent per-item stages.
  8. Use durable sessions only when visibility, steering, worktrees, or PRs matter.
  9. Pass nondeterministic values in args.
  10. Return a compact useful result and poll workflow_status after launch.

© tellahq, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/workflow-authoring of tellahq/opensession.

Open the folder on GitHubat commit 068618d

Compare with similar skills

Workflow Authoring next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Workflow Authoring compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Workflow Authoring this skilltellahq/opensession394—~2.8kAutomated safety check: PassMIT
MCP Server Builderanthropics/skills180k63 repos~2.3kAutomated safety check: PassApache-2.0
MCP Server BuildershareAI-lab/learn-claude-code78k4 repos~1.2kAutomated safety check: PassMIT
MCP Integration for Pluginsanthropics/claude-plugins-official38k11 repos~3.1kAutomated safety check: PassApache-2.0
Figma use_figma Plugin API Ruleswarpdotdev/warp65k4 repos~4.4kAutomated safety check: PassAGPL-3.0
Stitch to Remotion Walkthrough Videosgoogle-labs-code/stitch-skills8.5k6 repos~3.2kAutomated safety check: NotesApache-2.0

Similar skills

  • MCP Server Builder

    anthropics/skills

    Official

    Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.

    180k GitHub starsUsed in 63 repos~2.3k tokens
    Agent WorkflowsAuto-check passed
  • MCP Server Builder

    shareAI-lab/learn-claude-code

    Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.

    78k GitHub starsUsed in 4 repos~1.2k tokens
    Agent WorkflowsAuto-check passed
  • MCP Integration for Plugins

    anthropics/claude-plugins-official

    Official

    Explains how to bundle Model Context Protocol servers in a Claude Code plugin, covering config files, stdio, SSE, HTTP and WebSocket server types, and authentication.

    38k GitHub starsUsed in 11 repos~3.1k tokens
    Agent WorkflowsAuto-check passed
  • Required groundwork before any use_figma call: the rules and reference files for running JavaScript in a Figma file through the Plugin API without common failures.

    65k GitHub starsUsed in 4 repos~4.4k tokens
    Frontend & DesignAuto-check passed
  • Stitch to Remotion Walkthrough Videos

    google-labs-code/stitch-skills

    Official

    Builds walkthrough videos from Stitch design projects using Remotion, with transitions, zoom effects and text overlays on each screen.

    8.5k GitHub starsUsed in 6 repos~3.2k tokens
    Media & CreativeAuto-check: notes
  • MCP Development

    coollabsio/coolify

    A skill your agent uses for Laravel MCP development. An agent skill from coollabsio/coolify.

    63k GitHub starsUsed in 1 repo~949 tokens
    Frontend & DesignAuto-check passed

More from tellahq/opensession

All 15 skills in this repo
  • Effect TS

    tellahq/opensession

    Write idiomatic Effect v4 TypeScript verified against the pinned effect@4.0.0-rc.112 source.

    394 GitHub stars~3.7k tokensUpdated today
    Auto-check passed
  • Reflect

    tellahq/opensession

    Spawn three parallel review child sessions over the active transcript, surface learnings, and route each to a concrete edit on an existing skill.

    394 GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Show Me

    tellahq/opensession

    Help the user understand the current topic visually with concise diagrams, code-shape sketches, and focused HTML artifacts.

    394 GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Automate Me

    tellahq/opensession

    A skill your agent uses for "automate me", "create/update/refresh my -mode skill", "turn/capture my preferences or working style into a skill", or wanting agents to follow how the user works.

    394 GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • PR Autofix

    tellahq/opensession

    Auto-fix a PR — address ALL reviewers' open feedback + failing CI, push, and reply in each addressed thread with honest attribution

    394 GitHub stars~1.5k tokensUpdated today
    Auto-check passed
  • Swarm

    tellahq/opensession

    Fan out N parallel workers, drain them, and return one report.

    394 GitHub stars~609 tokensUpdated today
    Auto-check passed

Questions about Workflow Authoring

What does Workflow Authoring do?

Author, revise, or debug Open Session dynamic workflow scripts. Workflow Authoring is an agent skill from tellahq/opensession. Author, revise, or debug Open Session dynamic workflow scripts.

How do I install Workflow Authoring in Claude Code?

Run `npx skills add tellahq/opensession --skill workflow-authoring -a claude-code`. Or copy the skill folder (.agents/skills/workflow-authoring in tellahq/opensession) into .claude/skills/workflow-authoring in your project. Claude Code loads it when a task matches its description.

How do I install Workflow Authoring in Codex?

Run `npx skills add tellahq/opensession --skill workflow-authoring -a codex`. Or copy the skill folder (.agents/skills/workflow-authoring in tellahq/opensession) into .agents/skills/workflow-authoring in your project. Codex loads it when a task matches its description.

Can I use Workflow Authoring in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tellahq/opensession --skill workflow-authoring -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/workflow-authoring, .gemini/skills/workflow-authoring, .github/skills/workflow-authoring and .opencode/skills/workflow-authoring in your project.

What does Workflow Authoring need to run?

SKILL.md names no scripts, command-line tools or credentials: Workflow Authoring is instructions for the agent only.

Does Workflow Authoring access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Workflow Authoring safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Workflow Authoring use?

Workflow Authoring is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Workflow Authoring use?

About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Workflow Authoring?

Skills that share tags, products or a category with Workflow Authoring: MCP Server Builder (anthropics/skills, 180k stars), MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars), MCP Integration for Plugins (anthropics/claude-plugins-official, 38k stars) and Figma use_figma Plugin API Rules (warpdotdev/warp, 65k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Workflow Authoring?

tellahq (a GitHub organization) maintains it in tellahq/opensession, which has 394 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on October 9, 2026.

Source: tellahq/opensession on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.