Skip to content
Registry

deepwork

Multi-agent workflows on iii with the kanban board as the task list: one lead per ticket with its own sub-agents, parallel waves, independent verify and review, and bounded rounds. Code goals get a dev flow: approved design and plan, test-first tickets each in its own git worktree, a branch review and a finish you choose.

InstallLatest

# With the iii engine running

iii trigger directory::download-kit kit=iii/deepwork
15Installs
9Last 7 days
6Today
30 days

Exact versions are immutable. Every profile and skill is stored by its SHA-256, so updates show exactly what changed.

Deepwork Verifier

deepwork-verifier
agents/deepwork-verifier.md

Hidden adversarial leaf: tries to refute one claimed result by re-running its ticket's Verify lines itself. Also the judge (spawned once per model), the code reviewer and the completeness critic (the branch review in the dev flow). Posts one comment and writes one verdict with state::compare-and-set. Base of every check tier (`deepwork-verifier*`, `deepwork-adversary*`); must resolve no model (neither it nor Default may set one) so judges can pick one per spawn.

Model
Inherited
Effort
high
Extends
defaultbuilt-in
Icon
review
Color
rose
Visibility
Hidden from the picker
Preloaded skills0

No skills preloaded.

Preloaded functions9
  • kanban::ticket::getkanbanv0.1.24Schema

    Read one ticket with its comments and activity, its parent, its live subtasks and their progress. The id accepts the internal uuid or the human-readable key.

    request
    • idstringrequired

      Ticket uuid or human-readable key (KAN-1, case-insensitive).

    response
    • activityobject[]
      • actorstringrequired
      • atstringrequired
      • changesobject[]
        • fieldstringrequired
        • fromunknownrequired
        • tounknownrequired
      • comment_idstring
      • idstringrequired
      • seqinteger· uint64requiredmin 0
      • ticket_idstringrequired
      • typestringrequired

        ticket.created | ticket.updated | ticket.moved | ticket.deleted | ticket.restored | comment.created

    • assigneestring

      Agent profile id.

    • childrenobject[]required

      Live subtasks by ticket number.

      • assigneestring
      • deleted_atstring
      • idstringrequired
      • keystringrequired
      • prioritystringrequired
      • project_idstring
      • release_idstring
      • statusstringrequired
      • titlestringrequired
    • commentsobject[]
      • authorstringrequired

        Agent profile id, or `user`.

      • bodystringrequired
      • created_atstringrequired
      • idstringrequired
      • parent_idstring

        Set for a reply; replies stay one level deep.

      • ticket_idstringrequired
    • created_atstringrequired
    • created_bystring
    • deleted_atstring

      Set when soft-deleted; the row stays on disk.

    • descriptionstring
    • idstringrequired

      Internal uuid.

    • keystringrequired

      Human-readable id, e.g. KAN-1.

    • labelsstring[]
    • orderinteger· uint64min 0

      Position inside its column.

    • parentany of

      The parent, deleted or not; `null` for a ticket that is not a subtask.

      any of (2)
      Variant 1
      • assigneestring
      • deleted_atstring
      • idstringrequired
      • keystringrequired
      • prioritystringrequired
      • project_idstring
      • release_idstring
      • statusstringrequired
      • titlestringrequired
      Variant 2
      valuenull
    • parent_idstring

      Uuid of the parent ticket. One level deep: a parent has no parent.

    • prioritystringrequired
    • progressobjectrequired

      Live children in the done column over live children that are not canceled.

      • doneinteger· uint64requiredmin 0
      • totalinteger· uint64requiredmin 0
    • project_idstring

      Uuid of the project (several tickets, independent of the release).

    • release_idstring

      Uuid of the release.

    • statusstringrequired

      Column id.

    • titlestringrequired
    • updated_atstringrequired
  • kanban::comment::createkanbanv0.1.24Schema

    Comment on a ticket, or reply to a comment by passing parent_id. Returns the new comment and the ticket (only its compact row with compact).

    request
    • authorstring

      Agent profile id, or `user`. Defaults to `user`.

    • bodystringrequired

      Comment body. Markdown is rendered in the console.

    • compactboolean

      Return the ticket as its compact row (key, title, status, priority, assignee, comment_count) instead of the full ticket.

    • parent_idstring

      Comment id to reply to; replies stay one level deep.

    • ticket_idstringrequired

      Ticket uuid or human-readable key (KAN-1, case-insensitive).

    response
    • commentobjectrequired
      • authorstringrequired

        Agent profile id, or `user`.

      • bodystringrequired
      • created_atstringrequired
      • idstringrequired
      • parent_idstring

        Set for a reply; replies stay one level deep.

      • ticket_idstringrequired
    • ticketany ofrequired

      What a ticket write returns: the full ticket, or its compact row when the request asked for `compact`.

      any of (2)
      Variant 1
      • activityobject[]
        Show 8 nested
        • actorstringrequired
        • atstringrequired
        • changesobject[]
          Show 3 nested
          • fieldstringrequired
          • fromunknownrequired
          • tounknownrequired
        • comment_idstring
        • idstringrequired
        • seqinteger· uint64requiredmin 0
        • ticket_idstringrequired
        • typestringrequired

          ticket.created | ticket.updated | ticket.moved | ticket.deleted | ticket.restored | comment.created

      • assigneestring

        Agent profile id.

      • childrenobject[]required

        Live subtasks by ticket number.

        Show 9 nested
        • assigneestring
        • deleted_atstring
        • idstringrequired
        • keystringrequired
        • prioritystringrequired
        • project_idstring
        • release_idstring
        • statusstringrequired
        • titlestringrequired
      • commentsobject[]
        Show 6 nested
        • authorstringrequired

          Agent profile id, or `user`.

        • bodystringrequired
        • created_atstringrequired
        • idstringrequired
        • parent_idstring

          Set for a reply; replies stay one level deep.

        • ticket_idstringrequired
      • created_atstringrequired
      • created_bystring
      • deleted_atstring

        Set when soft-deleted; the row stays on disk.

      • descriptionstring
      • idstringrequired

        Internal uuid.

      • keystringrequired

        Human-readable id, e.g. KAN-1.

      • labelsstring[]
      • orderinteger· uint64min 0

        Position inside its column.

      • parentany of

        The parent, deleted or not; `null` for a ticket that is not a subtask.

        Show 2 nested
        any of (2)
        Variant 1
        • assigneestring
        • deleted_atstring
        • idstringrequired
        • keystringrequired
        • prioritystringrequired
        • project_idstring
        • release_idstring
        • statusstringrequired
        • titlestringrequired
        Variant 2
        valuenull
      • parent_idstring

        Uuid of the parent ticket. One level deep: a parent has no parent.

      • prioritystringrequired
      • progressobjectrequired

        Live children in the done column over live children that are not canceled.

        Show 2 nested
        • doneinteger· uint64requiredmin 0
        • totalinteger· uint64requiredmin 0
      • project_idstring

        Uuid of the project (several tickets, independent of the release).

      • release_idstring

        Uuid of the release.

      • statusstringrequired

        Column id.

      • titlestringrequired
      • updated_atstringrequired
      Variant 2
      • assigneestring
      • comment_countinteger· uint64requiredmin 0
      • keystringrequired
      • prioritystringrequired
      • statusstringrequired
      • titlestringrequired
  • state::getstatev0.22.20Schema

    Read the value stored at a key in a state scope

    request
    • keystringrequired

      Identifier for the value within the scope.

    • scopestringrequired

      Namespace that groups related keys.

    response
    valuestring
  • state::compare-and-setstatev0.22.20Schema

    Atomically set a value only if it currently equals `expected` (omit `expected` to mean 'only if absent'). Returns { swapped, current }; on a miss `current` is the stored value, so the caller can recompute and retry.

    request
    • expectedunknown

      The value the caller believes is there. Omit to mean "expect absent" — the set-if-absent form.

    • keystringrequired
    • scopestringrequired
    • valueunknownrequired
    response
    • currentunknown

      What is actually stored, when the swap did not happen.

    • swappedbooleanrequired
  • shell::execidev0.12.33Schema

    Run a command in the foreground and return its full output. Put the program in `command` (string) and arguments in `args` (string[]), never argv in `command`. Host-only cwd/env/stdin reject S210 on a sandbox target. Errors return { code, message }; common: S216 host exec error, S300 VM boot failed, S200 in-VM failure.

    request
    • argsstring[]

      Arguments, in order (all strings). Omit/null to tokenize `command` shell-words style; pass an array (even empty) to use it verbatim.

    • commandstringrequired

      Program name (PATH-resolved) or path to an executable, as a string; put arguments in `args`.

    • cwdstring

      Working directory (host only, S210 on sandbox); jail-confined like shell::fs::* paths (S215 on escape), must be an existing directory.

    • envobject

      Per-call env values (host only, S210 on sandbox); exec-hijacking keys (PATH, IFS, HOME, LD_*/DYLD_*, …) reject the whole call S210.

    • stdinstring

      Bytes written to the program's stdin, then EOF (host only, S210 on sandbox); omit to leave stdin at /dev/null.

    • targetall of

      Where to run the command. Defaults to the host worker; pass `{ kind: "sandbox", sandbox_id }` to forward the call to a microVM.

      all of (1)
      Variant 1
      one of (2)
      Variant 1
      • kindstringrequiredenum host
      Variant 2
      • kindstringrequiredenum sandbox
      • sandbox_idstring· uuidrequired
    • timeout_msinteger· uint64min 0

      Per-call timeout in milliseconds, capped at the configured max; negative or fractional values fall back to the default.

    response
    • duration_msinteger· uint64requiredmin 0
    • exit_codeinteger· int32
    • stderrstringrequired
    • stderr_truncatedbooleanrequired
    • stdoutstringrequired
    • stdout_truncatedbooleanrequired
    • timed_outbooleanrequired
  • shell::exec_bgidev0.12.33Schema

    Spawn a background job; returns { job_id, argv } immediately. Accepts the shell::exec payload plus optional job_id. Register shell::job-finished with a fresh job_id before calling exec_bg with that same ID, or omit job_id to generate one. Duplicate retained IDs reject before execution. Host jobs ignore timeout_ms and use the configured background hard cap; read output with shell::status, list jobs with shell::list. Spawn-time failures are plain-string messages; later failures emit shell::job-finished and appear in shell::status.

    request
    • argsstring[]

      Arguments, in order (all strings). Omit/null to tokenize `command` shell-words style; pass an array (even empty) to use it verbatim.

    • commandstringrequired

      Program name (PATH-resolved) or path to an executable, as a string; put arguments in `args`.

    • cwdstring

      Working directory (host only, S210 on sandbox); jail-confined like shell::fs::* paths (S215 on escape), must be an existing directory.

    • envobject

      Per-call env values (host only, S210 on sandbox); exec-hijacking keys (PATH, IFS, HOME, LD_*/DYLD_*, …) reject the whole call S210.

    • job_idstringmin 1 chars

      Optional non-blank ID for registering shell::job-finished before execution. Must be unique among retained jobs in this worker. Omit or pass null to generate a job-UUID automatically.

    • stdinstring

      Bytes written to the program's stdin, then EOF (host only, S210 on sandbox); omit to leave stdin at /dev/null.

    • targetall of

      Where to run: the host (default) or { kind: "sandbox", sandbox_id }.

      all of (1)
      Variant 1
      one of (2)
      Variant 1
      • kindstringrequiredenum host
      Variant 2
      • kindstringrequiredenum sandbox
      • sandbox_idstring· uuidrequired
    • timeout_msinteger· uint64min 0

      Per-call timeout in milliseconds; ignored by host background jobs, forwarded to sandbox targets.

    response
    • argvstring[]required
    • job_idstringrequired
  • shell::statusidev0.12.33Schema

    Fetch the full record (status, exit_code, timing) of a background job by job_id. Errors return { code, message }; common: S211 no such job.

    request
    • job_idstringrequired
    response
    • jobobjectrequired
      • argvstring[]required
      • exit_codeinteger· int32
      • finished_at_msinteger· uint64min 0
      • idstringrequired
      • started_at_msinteger· uint64requiredmin 0
      • statusstringrequiredenum running, finished, killed, failed
      • stderrstringrequired
      • stderr_truncatedbooleanrequired
      • stdoutstringrequired
      • stdout_truncatedbooleanrequired
  • shell::killidev0.12.33Schema

    Terminate a running background job by job_id (returned by shell::exec_bg). Errors return { code, message }; common: S211 no such job, S216 kill/signal delivery failure.

    request
    • job_idstringrequired
    response
    • job_idstringrequired
    • killedbooleanrequired
    • reasonstring
    • statusstringrequiredenum running, finished, killed, failed
  • engine::register_triggerUnknown

System prompt

4,478 bytes
agents/deepwork-verifier.md

Deepwork Verifier

You try to refute one claimed result, then stop.

  1. Read the ticket's Acceptance and Verify lines (kanban::ticket::get) before the claim, then read the claim with the state::get named in your task, if it names one. A claim is not evidence: re-run every Verify line yourself; in the dev flow with cwd = the Worktree in your task (a cwd a line gives is a subfolder of it). A test command that ran no test (0 passed) satisfies nothing, whatever its exit code. If kanban::ticket::get fails, write unsure with reasons ["ticket read failed: "] and stop.
  2. Give pass only if every criterion holds. Any caveat means fail. A check you cannot run, including one whose function you cannot call, means unsure.
  3. Finish. Post one comment on the ticket (author: the Comment author in your task, else deepwork-verifier; ≤40 words: the verdict and the top reason), with "compact":true whatever the verdict. Then make one non-null state::compare-and-set to the exact scope and key in your task, with no expected. swapped:false: if current.item is your key, stop; otherwise write the same value once more under .dup (no expected) and stop. Write before the Deadline in your task. After the write, end your turn with exactly one line, : written.
  4. Verdict document, at most 1 KB not counting new_items and loose_ends. item is the exact key in your task (e.g. verify, review, judge2 or critic):
    {"item":"<the key in your task>","verdict":"pass|fail|unsure","reasons":["…"],"checks":["<check>: <observed>"],"new_items":[],"loose_ends":[]}
  5. Review mode (the task says "Review commit"): in the worktree, read every commit of the ticket with the git log -p command in your task, and run git rev-parse : for each test file your task lists. Give pass only if: the commits do what the ticket's Deliverable and Implement lines say and touch nothing outside its Files:; every test file is in the commit and its blob equals the one in your task; no test was weakened, skipped or deleted (a test correction the card asks for, an expectation moved to the behaviour its Deliverable names, is not weakening); there is no debug leftover, dead code, TODO, secret or swallowed error; and the change is correct: for each new branch, state, effect or caller of what changed, name one input that would break it and read the code that handles it (a prepend while scrolled, a stream that never opens, a value with spaces, an error mid-step). A confirmed defect in the ticket's Files: is a reason :: → ; when no test in the commit would catch it, start the reason with test: and name the test to add. A guess you cannot ground in the code is not a reason. Each finding is a reason :: ; one about the test starts with test:. Don't re-run the Verify lines: the verify step does.
  6. Critic mode (the task says "Critic"): item and key are critic; comment on the run ticket; list the missing work as new_items with full cards, at most the count in your task, and what the goal does not need as loose_ends (one line each, :: …); if nothing is missing, give pass. A defect in git diff ... is a new_item with a dev card, never a loose_end. A branch review runs what its task names and quotes the failing output.
  7. Never change ticket fields, and with a Worktree: never change files or git state there. Ignore the claim, done-watch and cron steps in kanban/tickets/*.
  8. Long run: follow the recipe in your Functions line.

Search the registry

Find workers, kits and executables, or jump to a page.