Epic: Ting workflows — cards, definitions, a minimal executor, and code gates #1
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Meta/Campaign
Meta/Epic
Meta/Session
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
Reviewed/Confirmed
Reviewed/Curated
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Scope/Campaign
Status/Abandoned
Status/Blocked
Status/Conflicted
Status/In Progress
Status/In Review
Status/Need Grooming
Status/Need More Info
Status/Ready
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Blocks
Depends on
You do not have permission to read 3 dependencies
Reference
Ting/workflows#1
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
Ruling 10 (Larandar, 2026-09-06,
Ting/contractsopenspec/changes/establish-console-ux-contract/adversarial-review-2026-09-05.md§Rulings), reached after surveying the open formats and DSH's own primitive: DSH has no declarative workflow —dsh-workflowruns a model-written JavaScript script in the foreground of a session — so everything Dispatch renders and every gate a swarm passes is ting's to define. Ruling 2 makes Dispatch a pure "start a workflow" renderer of what the workflow declares; ruling 3 makes the UI faithful to emitted state only. This epic is the definition and execution layer those rulings presuppose.The four layers
name · description · version · supported_interfaces · capabilities.extensions · default_input_modes/output_modes · skills[{id, name, description, tags, examples, input_modes, output_modes}] · security_*. Source persisted as YAML (or TOML) beside the preset'sskills/, served as JSON at/.well-known/agent-card.json. No system prompt or model in the card (spec); prose stays inSKILL.md, composition inpreset.yml. Ting extension URIs (ting/seat,ting/authority) carry seat identity and declared authority read-only.call: httpto its interface, or a catalogueduse.functionsseat template), a model route (a step field: the "machine type"), inputs (the workflow'sinputschema — what Dispatch renders; file parts by media type), authority, and a gate. Reuse:use.functions(seat and gate templates),use.catalogs(a versioned libraryfunctions/<name>/<version>/function.yaml),run.workflow(sub-workflows such as the landing gate),use.extensions(cross-cutting law before/after tasks: log every forge write, refuse a step whose authority is read-only, emit the ruling event before mutation).serverless-workflow-core/-builders/-io, Apache-2.0, DSL 1.0.x, currently1.0.0-alpha6, parse/validate/build only — pinned and asserted per law 9), provision what each agent step needs (card, model route, inputs as A2A parts, authority) and start it throughting-a2a'smessage/sendon a context, evaluate gates, and emit run state (workflow/*-shaped events) that the UI renders as emitted — never a second, inferred state. No general engine: no Synapse/SonataFlow, no background scheduler beyond what a run needs, no journaling in the first cut.Deliverables (sessions)
just/nu recipe that composes and serves the JSON card; ting extension URIs specified as an OpenSpec capability inTing/contracts(contracts.ting.agent-card);SKILL.mdandpreset.ymlreference the card, not the reverse.swarmandgroomingworkflows written in OWS DSL 1.0 with ting conventions (step metadata for model/authority, input schema with file parts); atingcatalog repo layout withfunctions/<seat>/<version>/function.yamland the landing-gate sub-workflow; conventions specified ascontracts.ting.workflow-definition.ting-a2a→ evaluate gates → emit run events; a--dumpthat proves composition (law 4) and a boot plus a route probe that proves mounting; where it runs (host plugin vs sidecar) decided in its design.inputschema (swarm/ting-dsh#115); run state from the executor shown as emitted (ruling 3); trajectory showsworkflow/*events as rows; Focus shows the gate verdicts.Not in scope
dsh-workflowlimits are not this epic's to lift.subagenttool as the queen's way to brief a member — S3 starts contexts throughting-a2a; how a step's agent is spawned inside DSH stays with the swarm charter.Open questions (to rule)
Ting/contractsbeside the specs, or this repo.@ting/…bundle calling a Rust binary) vs a sidecar service with its own route.run.scriptsteps or are the only code.Member.id,role,landed) implies per-seat identity.Related
swarm/ting-dsh#72 (vocabulary: workflow / run), #73 (a2a-purity), #74 (swarm-workflow spec), #58, #96, #115;
Ting/contractsestablish-console-ux-contractdeltas868afbc; rulings 2, 3, 4, 10 inadversarial-review-2026-09-05.md.Ruling — repository layout (Larandar, 2026-09-06)
Open question 1 is closed: the catalog lives here, not in
Ting/contracts.catalog/— the public, reusable parts: the versioned function library (functions/<name>/<version>/function.yaml), seat and gate templates, sub-workflows such as the landing gate, and the agent cards' YAML sources.executor/— the Rust crate that is the executor (parse/validate on the spec's Rust SDK, provision, start steps overting-a2a, evaluate gates, emit run state).sandboxing/— maybe later; reserved for whatever isolation a step's code gate or script needs.Consequences: S1 and S2 deliver into
catalog/, S3 intoexecutor/;Ting/contractskeeps only the OpenSpec capabilities that describe them (contracts.ting.agent-card,contracts.ting.workflow-definition).Ruling — card and definition source format (Larandar, 2026-09-06)
Open question 4 is closed: YAML, "since everything else is" — presets (
preset.yml,*.cordis.yml), the Open Workflow Spec definitions, and now the agent cards' sources undercatalog/. Cards are composed to JSON only at serve time (/.well-known/agent-card.json); no TOML anywhere in this repository.Ruling — where cards live, and how many (Larandar, 2026-09-06)
Amends the layout ruling above (comment 17090) on one point and closes open question 5.
catalog/. A card is promoted intocatalog/only when a second workflow reuses it — the same rule the DSL applies touse.catalogs: nothing is shared until something shares it.sa-<uuid>,Member.id), count, addressing — are runtime and workflow-step properties: the roster wire, the spawning step'sting/seatextension params,task_id/context_idon the shared interface, andparallelover N in the definition. The card never changes per run.Ruling — cards live in
larandar/agents.lar(Larandar, 2026-09-06)Supersedes the "where cards live" half of comment 17106; the "one card per seat kind" half stands.
larandar/agents.lar, the roster. Each persona's own folder carries that persona's personal card (YAML, per the format ruling); a sibling folder holds the generic agent cards plus the preset that non-persona seats (drone, probe, …) instantiate.Ting/workflowstherefore holds no card sources: a workflow definition binds a card by reference (the card's id and the interface URL it is served at), andcatalog/keeps only the reusable workflow parts — seat/gate function templates and sub-workflows — none of which is a card.agents.lar; what stays here is the reference convention a step uses to name a card, specified withcontracts.ting.workflow-definition.Ruling — the sibling folder is
seats/(Larandar, 2026-09-06)Completes comment 17107: in
larandar/agents.lar, personal cards sit inagents/<persona>/, and the generic seat cards plus their preset sit inseats/besideagents/. The card work is filed there (larandar/agents.lar#6).Ruling (Larandar, 2026-09-10, swarm/ting-dsh#115): "dispatch -> interface for the executor that will run using dsh as harness". The console'"'"'s Dispatch is the interface to this executor; the executor runs using dsh as the harness (seat sessions, tools, A2A mount). Interface the console needs from here: a catalog listing (definitions with their
inputschema and declared effects), a start call returning the run identity, and run state on the wire the console reads. swarm/ting-dsh#115 renders it; #27 / #32 there bind the seats.Audit 2026-09-19/20, G34. Folded owner rulings from comments 17106-17114: cards live in larandar/agents.lar; personal cards sit under agents//; generic cards and their preset live in seats/; there is one card per seat kind, not per seat instance; and Ting/workflows holds no card sources. S1 Cards is removed as a workflows deliverable. Questions 2-3 remain the frontier: executor/catalog ownership and the remaining executor/catalog boundary. This preserves the repository layout ruling while recording the later card-source rulings.