Spec: the swarm workflow definition — a dispatched multi-agent run that proposes one PR (moved from swarm/ting-dsh#74) #35

Open
opened 2026-09-10 14:49:54 +00:00 by larandar · 0 comments
Owner

Moved from swarm/ting-dsh#74 on 2026-09-10 (freeholder: "Move to Ting/workflows"). This is the spec of the swarm workflow definition for this executor: a catalog entry whose steps bind the seat cards (queen, vinculum, drone, probe, resistance; cards in larandar/agents.lar seats/), with AC3 as the gate: a dispatched swarm run decomposes work, delegates to seat-holders, and proposes one PR. Two rulings since it was written: ruling 10 (2026-09-06: Open Workflow Specification definitions, ting's own Rust executor, OpenSpec + Datalog gates) and 2026-09-10 (swarm/ting-dsh#115: "dispatch -> interface for the executor that will run using dsh as harness"). Read the body below in that layering: where it says the console mints a context or the queen interprets a pattern, the executor now does it through dsh sessions; the roster half stays in swarm/ting-dsh#32. The 2026-09-04 decision map it cites is in the ting-dsh wiki (DecisionMap-swarm-workflow).


Spec (PRD) for the change swarm-workflow. Grounded in
~/openspec/ting-dsh-wiki/DecisionMap-swarm-workflow.md (the seven locked
decisions, 2026-09-04 rulings) and the fixed seat charter
(presets/swarm/skills/swarm/SKILL.md). Vocabulary is CONTEXT.md and #72:
a dispatch family is a workflow; one execution is a run — "pass" is
retired. AC3 is the acceptance bar.

Depends on #72 and the a2a-purity spec (#73).

Problem Statement

The estate can dispatch a single-session run of a workflow family, but it
cannot yet dispatch the swarm workflow: a run that decomposes work across
the seats of the swarm charter (queen, vinculum, drone, probe, resistance)
and proposes one PR as its proof of work. Today's dispatch mints one a2a
context and enqueues one brief; there is no queen that splits the work, no
durable seat sessions under it, no landing gate that reads real artifacts,
no curated single-PR outcome. The roster (@ting/dsh-swarm,
GET /ting/api/swarm) is the surface meant to show who holds which seat, but
its report/withdraw writers are dead — nothing wires a spawned seat onto
it, so the roster is permanently empty and a swarm's membership is invisible.
The seat charter is written and fixed, yet no workflow drives it end to end.

The acceptance bar (AC3): a dispatched swarm run decomposes work, delegates
to seat-holders, and proposes one PR.

Solution

Build the swarm workflow as a multi-stage dispatched run, homed in the
domain bundle @ting/dsh-swarm (a2a stays a pure A2A-spec implementation —
that cut is the prerequisite change a2a-purity, #73). A run is minted by a
dispatch route — after a2a-purity's rename, /swarm/api/runs — that binds an
a2a context. Space setup is mechanical and scripted: a deterministic step
provisions the queen's tree for the chosen isolation mode FIRST, and only then
is the queen's first-turn brief composed (from the task, the bound workspace,
and the isolation mode) and the queen seat spawned into that ready tree.

The queen then delegates by INVOKING a sub-workflow per drone: each
sub-workflow provisions an isolated tree off the queen's tip, spawns and
briefs the drone on its deliverable, and returns the branch for the
vinculum's gate. Execution is hybrid: probe (mechanical, no-thinking) runs
as an in-session subagent (the swarm preset already mounts subagent/
subagent_fork); every complex-contract or recyclable seat — queen,
vinculum, drone, resistance — runs as an A2A multi-session (a separate DSH
session per seat) so it is durable, visible on the roster, and recyclable.

The outcome flow is invariant: the vinculum LANDS (gates each member's real
artifact against the brief's acceptance and composes the collective result),
the queen CURATES the landed work — pulling each approved branch into its own
tree and reshaping git history into feature-sized commits — and the queen
PROPOSES the single PR. Every run ends in a proposed PR: there is no
--apply gate and no dry-run swarm; the PR is the proof of work. Spawned
seats become visible by wiring the roster's report/withdraw so a seat
registers on spawn and withdraws on exit.

User Stories

  1. As a freeholder/operator, I want to dispatch a swarm run with a task and
    a bound workspace, so that a queen decomposes the work and returns a single
    PR I can review.
  2. As a freeholder/operator, I want to choose the isolation mode at dispatch —
    ad-hoc on my live worktree, or clean-room in a scratchpad clone — so that
    the swarm either curates around my concurrent changes or works off a clean
    fastlane@origin tip.
  3. As a freeholder/operator, I want the dispatch route to mint a run and return
    its id immediately, so that I can open the run's surface without waiting for
    it to finish.
  4. As a freeholder/operator, I want every swarm run to end in a proposed PR, so
    that I always have a concrete artifact to accept or reject — never a dry-run
    with nothing to show.
  5. As a freeholder/operator, I want to see who holds which seat on the roster,
    so that a running swarm's membership is visible rather than empty.
  6. As a queen, I want a first-turn brief carrying the task, the bound workspace
    and its folders/repos, and the isolation mode, so that I can decompose the
    work knowing my context — the charter already carries my role behaviour.
  7. As a queen, I want my tree provisioned for the chosen mode — my live
    worktree (ad-hoc) or a shallow fastlane@origin clone in a scratchpad
    (clean-room) — so that my base is correct before I delegate.
  8. As a queen, I want to delegate by invoking a drone-space sub-workflow per
    deliverable, so that each drone gets an isolated tree off my tip, is spawned
    and briefed on its deliverable, and returns its branch — delegation is
    composition, not a bare spawn.
  9. As a queen, I want to brief each drone on its own deliverable, not on my
    whole plan, so that a drone ships precisely what it was asked for.
  10. As a queen, I want to monitor seats and recycle a failing one with a fresh
    clone off my tip, so that a stuck drone does not stall the run.
  11. As a queen, I want to own the merge-write — pulling each vinculum-approved
    branch into my own tree — so that composition lands under one hand.
  12. As a queen, I want to curate git history — rebase, squash, split — so that
    the proposed PR carries feature-sized commits, not one commit per
    deliverable.
  13. As a queen, I want to propose the single PR from the mode-appropriate base
    (push to origin in clean-room; cut from the freeholder base in ad-hoc), so
    that the run always ends in exactly one PR.
  14. As a vinculum, I want to read each member's real artifact — a file, a diff,
    a test run — against the brief's acceptance items, so that I land work on
    evidence and never on a claim of "done".
  15. As a vinculum, I want to bounce a rejected landing back to its author with
    the evidence, so that repair is directed, never silent.
  16. As a vinculum, I want to compose the members' separate results into one
    collective artifact the queen can accept whole, so that the queen curates a
    landed result rather than raw member output.
  17. As a vinculum, I want to work read-only on the drone clones, so that I gate
    by reading the real artifact and never by writing it.
  18. As a drone, I want an isolated tree cloned off the queen's tip and a brief
    naming my deliverable, so that I can ship it exactly as briefed without
    colliding with another drone.
  19. As a drone, I want to raise a contradiction and pause when the ground
    contradicts my brief, so that the queen reconciles it rather than my
    guessing past it.
  20. As a probe, I want to run as an in-session subagent sharing the queen's
    cwd, so that a mechanical, effectively read-only errand needs no isolated
    tree.
  21. As a resistance, I want to argue against a landing read-only on the drone
    clones with the probe's mechanical findings as ammunition, so that what
    survives the gate deserves to.
  22. As any seat, I want to register on the roster when I am spawned and
    withdraw when I exit, so that the roster reflects the live membership of the
    swarm.
  23. As a freeholder/operator, I want a failing seat replaced by a fresh session
    in the same seat, so that recycling a member is a new durable session, not a
    lost run.

Implementation Decisions

Restating the seven locked decisions as module/interface decisions. No file
paths, no code snippets.

  1. Charter fixed; identity deferred. The seats and their contracts are a
    given from the preset charter; this change does NOT redefine them. Identity
    assignment (named identities per seat) is OUT of v1 — a seat is held by a
    nameless ad-hoc agent that takes the seat's contract. (Identity waits on the
    seat-granting framework, #59.)

  2. The dispatch route. The swarm workflow is dispatched by a domain route
    — after a2a-purity, /swarm/api/runs — that mints an a2a context, composes
    the queen's first-turn brief, writes the run's own domain document, and
    answers the run id, without awaiting the run's completion. Brief composition
    is one pure function of (task, workspace, isolation mode); the charter
    carries role behaviour, the brief carries only task and context.

  3. Hybrid execution. probe is an in-session subagent spawned inside the
    spawner's own loop (the preset already mounts the delegation tools). Every
    complex-contract or recyclable seat — queen, vinculum, drone, resistance —
    is an A2A multi-session: a separate durable DSH session per seat, visible on
    the roster and recyclable by replacement.

  4. Isolation provisioning (mechanical, scripted — runs first). Space setup
    is a deterministic scripted step, NOT agent work: within each stage the tree
    is provisioned FIRST, then the agent is spawned and briefed into the ready
    tree. A provisioning interface maps an isolation mode to a queen space: ad-hoc
    = the freeholder's live worktree (curated around the freeholder's concurrent
    changes); clean-room = a shallow clone of fastlane@origin tip into a
    scratchpad directory (a real scratchpad, never /tmp). Drones always clone
    the tip of the QUEEN's clone (isolated per drone) — again a scripted clone,
    not an agent action. Vinculum and resistance are read-only on the drone
    clones; probe shares the queen cwd (effectively read-only). This ties to
    decision 2's "mechanical" framing: the deterministic script provisions the
    space, the agent only inhabits it.

  5. The multi-stage pipeline and the drone-space sub-workflow. The run is a
    staged setup, each stage a scripted provision then a spawn: Stage 1 the
    script provisions the queen space, THEN spawns the queen; Stage 2 the queen
    delegates by INVOKING a sub-workflow per drone. The queen-callable
    drone-space sub-workflow is the new primitive this change must build (the
    research gap): it first provisions an isolated tree off the queen tip
    (scripted), then spawns and briefs the drone's session into that ready tree
    with its deliverable, and returns the branch for the vinculum's gate.
    Delegation is nested composition, not a bare spawn call.

  6. Domain home and roster wiring. All swarm concepts live in
    @ting/dsh-swarm; a2a stays a pure A2A-spec implementation (the a2a-purity
    prerequisite moves the swarm surfaces out). Member visibility is the
    @ting/dsh-swarm roster (/ting/api/swarm), whose report/withdraw
    writers — dead today — get wired so a spawned seat registers on the roster
    and withdraws on exit. The membership/lineage link is ting-swarm's own
    domain state, projected over a2a's generic context/task ledger, never a new
    field in the a2a context record.

  7. The queen merge + history curation, and the always-PR outcome. The
    outcome flow is invariant: vinculum lands (gates each member's real artifact
    against the brief's acceptance, composes) → queen curates (owns the
    merge-write of approved branches into its tree, and reshapes git history into
    feature-sized commits) → queen proposes the single PR. Every run ends in a
    proposed PR — no --apply, no dry-run. Clean-room mode pushes the curated
    branch to origin and opens the PR; ad-hoc mode cuts the curated branch from
    the freeholder base and opens the PR (the curated commits may also remain on
    the working copy). The queen owns the merge-write; the vinculum only gates.

Testing Decisions

Only external behaviour. Prior art is scripts/verify.nu and
scripts/check.nu (home-isolated under .dsh-check/). All seams below are
PROPOSED, pending freeholder confirmation — they were not yet confirmed live.

  1. Isolation-space provisioning (seam) — PROPOSED. The most testable seam
    and the one that runs FIRST in the pipeline: a mechanical, scripted,
    deterministic setup step — not an agent turn. Given a mode, the queen space
    is set up correctly (ad-hoc worktree vs shallow scratchpad clone) and drone
    spaces clone off the queen tip — testable against a temporary git repo, no
    agents at all, since space setup is a script.
  2. Brief composition (unit, pure) — PROPOSED. The queen's first-turn brief
    composed from (task, workspace, isolation mode), assembled AFTER the tree is
    provisioned and used to brief the agent into the ready tree. Prior art: the
    BRIEFS composer map in dispatch.
  3. Roster projection (just verify) — PROPOSED. /ting/api/swarm reflects
    spawned seats via the wired report/withdraw.
  4. Dispatch route (just verify) — PROPOSED. /swarm/api/runs mints a run
    and returns its id.
  5. Full AC3 outcome — LIVE, not a deterministic test. The end-to-end
    outcome (decompose → drones → vinculum gate → queen curate → PR) is proven by
    a LIVE dispatched run producing a PR plus a browser, NOT by a deterministic
    test. Per AGENTS.md law 4, composed is not mounted and only the real run and
    a browser prove the rendered, mounted outcome — a deterministic test cannot
    stand in for it. This is stated explicitly as the acceptance method for AC3.

Out of Scope

  • Identity assignment (#59). Named identities per seat — deferred to the
    seat-granting framework; v1 seats are nameless ad-hoc agents.
  • Redefining the seat charter. The preset charter's seats and contracts are
    fixed; this change consumes them, it does not re-litigate them.
  • The a2a-purity refactor itself. Moving the swarm-specific surfaces out of
    a2a is the separate prerequisite change (#73), not part of this one.
  • Per-seat model-tier ENFORCEMENT. Queen/vinculum strong, drone/probe fast
    is dispatcher guidance only for now; the preset plane enforcing a model per
    seat is future backlog.

Further Notes

  • Depends on #72 (the workflow/run vocabulary — "pass" retired) and the
    a2a-purity spec (#73), which lands first to give this change a clean base with
    the swarm surfaces homed in @ting/dsh-swarm and the routes renamed
    /*/api/runs.
  • AC3 is the bar: a dispatched swarm decomposes work, delegates to
    seat-holders, and proposes one PR.
  • Residual fog to resolve in follow-up tickets (not decided here): the
    landing-gate mechanics (how the vinculum reads each member's real artifact
    against acceptance and how a rejected landing bounces back); the recycling
    mechanism (how the queen replaces a failing seat with a fresh clone off its
    tip); and model tiers per seat (dispatcher guidance until the preset plane
    enforces it).
  • Law 4 (composed is not mounted): a completion claim names the command
    that proved it — --dump-config proves composition, a boot plus a route probe
    proves mounting, a browser proves rendering; AC3's outcome is proven live.
  • Law 9 (pin and assert): contracts here were read from @deepseek-ai/dsh
    0.1.1-rc.2; an upgrade is a re-derivation, not a version bump.
Moved from swarm/ting-dsh#74 on 2026-09-10 (freeholder: "Move to Ting/workflows"). This is the spec of the `swarm` workflow definition for this executor: a catalog entry whose steps bind the seat cards (queen, vinculum, drone, probe, resistance; cards in `larandar/agents.lar` `seats/`), with AC3 as the gate: a dispatched `swarm` run decomposes work, delegates to seat-holders, and proposes one PR. Two rulings since it was written: ruling 10 (2026-09-06: Open Workflow Specification definitions, ting's own Rust executor, OpenSpec + Datalog gates) and 2026-09-10 (swarm/ting-dsh#115: "dispatch -> interface for the executor that will run using dsh as harness"). Read the body below in that layering: where it says the console mints a context or the queen interprets a pattern, the executor now does it through dsh sessions; the roster half stays in swarm/ting-dsh#32. The 2026-09-04 decision map it cites is in the ting-dsh wiki (`DecisionMap-swarm-workflow`). --- Spec (PRD) for the change `swarm-workflow`. Grounded in `~/openspec/ting-dsh-wiki/DecisionMap-swarm-workflow.md` (the seven locked decisions, 2026-09-04 rulings) and the fixed seat charter (`presets/swarm/skills/swarm/SKILL.md`). Vocabulary is `CONTEXT.md` and #72: a dispatch family is a **workflow**; one execution is a **run** — "pass" is retired. AC3 is the acceptance bar. Depends on #72 and the a2a-purity spec (#73). ## Problem Statement The estate can dispatch a single-session run of a workflow family, but it cannot yet dispatch the `swarm` workflow: a run that decomposes work across the seats of the swarm charter (queen, vinculum, drone, probe, resistance) and proposes one PR as its proof of work. Today's dispatch mints one a2a context and enqueues one brief; there is no queen that splits the work, no durable seat sessions under it, no landing gate that reads real artifacts, no curated single-PR outcome. The roster (`@ting/dsh-swarm`, `GET /ting/api/swarm`) is the surface meant to show who holds which seat, but its `report`/`withdraw` writers are dead — nothing wires a spawned seat onto it, so the roster is permanently empty and a swarm's membership is invisible. The seat charter is written and fixed, yet no workflow drives it end to end. The acceptance bar (AC3): a dispatched `swarm` run decomposes work, delegates to seat-holders, and proposes one PR. ## Solution Build the `swarm` workflow as a multi-stage dispatched run, homed in the domain bundle `@ting/dsh-swarm` (a2a stays a pure A2A-spec implementation — that cut is the prerequisite change a2a-purity, #73). A run is minted by a dispatch route — after a2a-purity's rename, `/swarm/api/runs` — that binds an a2a context. Space setup is mechanical and scripted: a deterministic step provisions the queen's tree for the chosen isolation mode FIRST, and only then is the queen's first-turn brief composed (from the task, the bound workspace, and the isolation mode) and the queen seat spawned into that ready tree. The queen then delegates by INVOKING a sub-workflow per drone: each sub-workflow provisions an isolated tree off the queen's tip, spawns and briefs the drone on its deliverable, and returns the branch for the vinculum's gate. Execution is hybrid: `probe` (mechanical, no-thinking) runs as an in-session subagent (the swarm preset already mounts `subagent`/ `subagent_fork`); every complex-contract or recyclable seat — queen, vinculum, drone, resistance — runs as an A2A multi-session (a separate DSH session per seat) so it is durable, visible on the roster, and recyclable. The outcome flow is invariant: the vinculum LANDS (gates each member's real artifact against the brief's acceptance and composes the collective result), the queen CURATES the landed work — pulling each approved branch into its own tree and reshaping git history into feature-sized commits — and the queen PROPOSES the single PR. Every run ends in a proposed PR: there is no `--apply` gate and no dry-run swarm; the PR is the proof of work. Spawned seats become visible by wiring the roster's `report`/`withdraw` so a seat registers on spawn and withdraws on exit. ## User Stories 1. As a freeholder/operator, I want to dispatch a `swarm` run with a task and a bound workspace, so that a queen decomposes the work and returns a single PR I can review. 2. As a freeholder/operator, I want to choose the isolation mode at dispatch — ad-hoc on my live worktree, or clean-room in a scratchpad clone — so that the swarm either curates around my concurrent changes or works off a clean `fastlane@origin` tip. 3. As a freeholder/operator, I want the dispatch route to mint a run and return its id immediately, so that I can open the run's surface without waiting for it to finish. 4. As a freeholder/operator, I want every swarm run to end in a proposed PR, so that I always have a concrete artifact to accept or reject — never a dry-run with nothing to show. 5. As a freeholder/operator, I want to see who holds which seat on the roster, so that a running swarm's membership is visible rather than empty. 6. As a queen, I want a first-turn brief carrying the task, the bound workspace and its folders/repos, and the isolation mode, so that I can decompose the work knowing my context — the charter already carries my role behaviour. 7. As a queen, I want my tree provisioned for the chosen mode — my live worktree (ad-hoc) or a shallow `fastlane@origin` clone in a scratchpad (clean-room) — so that my base is correct before I delegate. 8. As a queen, I want to delegate by invoking a drone-space sub-workflow per deliverable, so that each drone gets an isolated tree off my tip, is spawned and briefed on its deliverable, and returns its branch — delegation is composition, not a bare spawn. 9. As a queen, I want to brief each drone on its own deliverable, not on my whole plan, so that a drone ships precisely what it was asked for. 10. As a queen, I want to monitor seats and recycle a failing one with a fresh clone off my tip, so that a stuck drone does not stall the run. 11. As a queen, I want to own the merge-write — pulling each vinculum-approved branch into my own tree — so that composition lands under one hand. 12. As a queen, I want to curate git history — rebase, squash, split — so that the proposed PR carries feature-sized commits, not one commit per deliverable. 13. As a queen, I want to propose the single PR from the mode-appropriate base (push to origin in clean-room; cut from the freeholder base in ad-hoc), so that the run always ends in exactly one PR. 14. As a vinculum, I want to read each member's real artifact — a file, a diff, a test run — against the brief's acceptance items, so that I land work on evidence and never on a claim of "done". 15. As a vinculum, I want to bounce a rejected landing back to its author with the evidence, so that repair is directed, never silent. 16. As a vinculum, I want to compose the members' separate results into one collective artifact the queen can accept whole, so that the queen curates a landed result rather than raw member output. 17. As a vinculum, I want to work read-only on the drone clones, so that I gate by reading the real artifact and never by writing it. 18. As a drone, I want an isolated tree cloned off the queen's tip and a brief naming my deliverable, so that I can ship it exactly as briefed without colliding with another drone. 19. As a drone, I want to raise a contradiction and pause when the ground contradicts my brief, so that the queen reconciles it rather than my guessing past it. 20. As a probe, I want to run as an in-session subagent sharing the queen's cwd, so that a mechanical, effectively read-only errand needs no isolated tree. 21. As a resistance, I want to argue against a landing read-only on the drone clones with the probe's mechanical findings as ammunition, so that what survives the gate deserves to. 22. As any seat, I want to register on the roster when I am spawned and withdraw when I exit, so that the roster reflects the live membership of the swarm. 23. As a freeholder/operator, I want a failing seat replaced by a fresh session in the same seat, so that recycling a member is a new durable session, not a lost run. ## Implementation Decisions Restating the seven locked decisions as module/interface decisions. No file paths, no code snippets. 1. **Charter fixed; identity deferred.** The seats and their contracts are a given from the preset charter; this change does NOT redefine them. Identity assignment (named identities per seat) is OUT of v1 — a seat is held by a nameless ad-hoc agent that takes the seat's contract. (Identity waits on the seat-granting framework, #59.) 2. **The dispatch route.** The `swarm` workflow is dispatched by a domain route — after a2a-purity, `/swarm/api/runs` — that mints an a2a context, composes the queen's first-turn brief, writes the run's own domain document, and answers the run id, without awaiting the run's completion. Brief composition is one pure function of (task, workspace, isolation mode); the charter carries role behaviour, the brief carries only task and context. 3. **Hybrid execution.** `probe` is an in-session subagent spawned inside the spawner's own loop (the preset already mounts the delegation tools). Every complex-contract or recyclable seat — queen, vinculum, drone, resistance — is an A2A multi-session: a separate durable DSH session per seat, visible on the roster and recyclable by replacement. 4. **Isolation provisioning (mechanical, scripted — runs first).** Space setup is a deterministic scripted step, NOT agent work: within each stage the tree is provisioned FIRST, then the agent is spawned and briefed into the ready tree. A provisioning interface maps an isolation mode to a queen space: ad-hoc = the freeholder's live worktree (curated around the freeholder's concurrent changes); clean-room = a shallow clone of `fastlane@origin` tip into a scratchpad directory (a real scratchpad, never `/tmp`). Drones always clone the tip of the QUEEN's clone (isolated per drone) — again a scripted clone, not an agent action. Vinculum and resistance are read-only on the drone clones; probe shares the queen cwd (effectively read-only). This ties to decision 2's "mechanical" framing: the deterministic script provisions the space, the agent only inhabits it. 5. **The multi-stage pipeline and the drone-space sub-workflow.** The run is a staged setup, each stage a scripted provision then a spawn: Stage 1 the script provisions the queen space, THEN spawns the queen; Stage 2 the queen delegates by INVOKING a sub-workflow per drone. The queen-callable drone-space sub-workflow is the new primitive this change must build (the research gap): it first provisions an isolated tree off the queen tip (scripted), then spawns and briefs the drone's session into that ready tree with its deliverable, and returns the branch for the vinculum's gate. Delegation is nested composition, not a bare spawn call. 6. **Domain home and roster wiring.** All swarm concepts live in `@ting/dsh-swarm`; a2a stays a pure A2A-spec implementation (the a2a-purity prerequisite moves the swarm surfaces out). Member visibility is the `@ting/dsh-swarm` roster (`/ting/api/swarm`), whose `report`/`withdraw` writers — dead today — get wired so a spawned seat registers on the roster and withdraws on exit. The membership/lineage link is ting-swarm's own domain state, projected over a2a's generic context/task ledger, never a new field in the a2a context record. 7. **The queen merge + history curation, and the always-PR outcome.** The outcome flow is invariant: vinculum lands (gates each member's real artifact against the brief's acceptance, composes) → queen curates (owns the merge-write of approved branches into its tree, and reshapes git history into feature-sized commits) → queen proposes the single PR. Every run ends in a proposed PR — no `--apply`, no dry-run. Clean-room mode pushes the curated branch to origin and opens the PR; ad-hoc mode cuts the curated branch from the freeholder base and opens the PR (the curated commits may also remain on the working copy). The queen owns the merge-write; the vinculum only gates. ## Testing Decisions Only external behaviour. Prior art is `scripts/verify.nu` and `scripts/check.nu` (home-isolated under `.dsh-check/`). All seams below are PROPOSED, pending freeholder confirmation — they were not yet confirmed live. 1. **Isolation-space provisioning (seam) — PROPOSED.** The most testable seam and the one that runs FIRST in the pipeline: a mechanical, scripted, deterministic setup step — not an agent turn. Given a mode, the queen space is set up correctly (ad-hoc worktree vs shallow scratchpad clone) and drone spaces clone off the queen tip — testable against a temporary git repo, no agents at all, since space setup is a script. 2. **Brief composition (unit, pure) — PROPOSED.** The queen's first-turn brief composed from (task, workspace, isolation mode), assembled AFTER the tree is provisioned and used to brief the agent into the ready tree. Prior art: the `BRIEFS` composer map in dispatch. 3. **Roster projection (`just verify`) — PROPOSED.** `/ting/api/swarm` reflects spawned seats via the wired `report`/`withdraw`. 4. **Dispatch route (`just verify`) — PROPOSED.** `/swarm/api/runs` mints a run and returns its id. 5. **Full AC3 outcome — LIVE, not a deterministic test.** The end-to-end outcome (decompose → drones → vinculum gate → queen curate → PR) is proven by a LIVE dispatched run producing a PR plus a browser, NOT by a deterministic test. Per AGENTS.md law 4, composed is not mounted and only the real run and a browser prove the rendered, mounted outcome — a deterministic test cannot stand in for it. This is stated explicitly as the acceptance method for AC3. ## Out of Scope - **Identity assignment (#59).** Named identities per seat — deferred to the seat-granting framework; v1 seats are nameless ad-hoc agents. - **Redefining the seat charter.** The preset charter's seats and contracts are fixed; this change consumes them, it does not re-litigate them. - **The a2a-purity refactor itself.** Moving the swarm-specific surfaces out of a2a is the separate prerequisite change (#73), not part of this one. - **Per-seat model-tier ENFORCEMENT.** Queen/vinculum strong, drone/probe fast is dispatcher guidance only for now; the preset plane enforcing a model per seat is future backlog. ## Further Notes - **Depends on** #72 (the workflow/run vocabulary — "pass" retired) and the a2a-purity spec (#73), which lands first to give this change a clean base with the swarm surfaces homed in `@ting/dsh-swarm` and the routes renamed `/*/api/runs`. - **AC3 is the bar:** a dispatched swarm decomposes work, delegates to seat-holders, and proposes one PR. - **Residual fog to resolve in follow-up tickets** (not decided here): the landing-gate mechanics (how the vinculum reads each member's real artifact against acceptance and how a rejected landing bounces back); the recycling mechanism (how the queen replaces a failing seat with a fresh clone off its tip); and model tiers per seat (dispatcher guidance until the preset plane enforces it). - **Law 4 (composed is not mounted):** a completion claim names the command that proved it — `--dump-config` proves composition, a boot plus a route probe proves mounting, a browser proves rendering; AC3's outcome is proven live. - **Law 9 (pin and assert):** contracts here were read from `@deepseek-ai/dsh` 0.1.1-rc.2; an upgrade is a re-derivation, not a version bump.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
Ting/workflows#35
No description provided.