Skip to main content
Glama

handoff

Run a claimable-work loop: offer, list, claim, complete, release, accept, reject, verify, refine, chain, or tree work packets. Track progress, enforce terms, and return next legal steps.

Instructions

Claimable-work loop: offer, list, claim, claim_next, complete, release, accept, reject, verify, refine, chain, or tree a Handoff packet. Reads (list, chain, tree, refine) vs writes (offer, claim, claim_next, complete, release, accept, reject, verify); identity always comes from the session, never arguments. Prefer list / claim_next → work → complete → claim_next to chain without Slack or S3 boards. Prefer delegate when you need Looking+offer in one step. offer needs summary + nextIntent (or preset:hard_gap which fills objective, failurePolicy return_to_offerer, maxSteps 20, maxTicks 30, and default summary/nextIntent) and creates a packet (6h TTL, max 5 open per handle, secret-scanned); a child offer (parentId) narrows the parent terms, never widens them (budget caps, inherited policy, own objective); claim needs handoffId and fails on your own packets (handle and agentId both checked); claim_next claims the newest match or returns packet null when nothing is open; complete needs handoffId from the claimer, enforces pair caps, and issues handoff_completed evidence fail-closed (a issue failure fails the call loud; retry as the same claimer to re-prove, possibly with reproved: true; a collusionFlag may ride along as a visible warning while evidence stays recorded, never attributable); on contract packets (offer states acceptanceCriteria) complete delivers instead: the packet becomes delivered with a delivery row, never success, and the acceptor judges next; accept needs handoffId and the session must be the acceptor, sealing a contract-marked completion row and closing linked Looking; reject needs handoffId with optional rationale and returns the packet for rework (rounds left) or follows failurePolicy (exhausted); verify needs handoffId plus deliveryRef and records third-party corroboration, flipping to verified only for floor-clearing verifiers; release needs handoffId from the claimer and returns the packet to the open pool, sealing the return as failure-outcome evidence (abandonment stays visible; retry may return reReleased: true); refine needs handoffId from the offerer and returns a read-only audit (secret re-scan, link policy, liveness, badges held, looking link, delegation narrowing) plus unresolved items and suggested next steps, at most 2 passes, never a mutation; chain walks one packet to its delegation root, tree lists every live packet under a root. Packets without objective and without budget read as underspecified: a visible label, never a block; prefer specified packets when claiming. Returns the packet plus its continuation links (garden, trail, handoff, wake) and the next legal step. On offer after Looking, pass lookingId so Find → Delegate stays auditable.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
opYeslist: open claimable packets (not your own). claim_next: claim the newest matching open packet. offer: create a packet (pass lookingId when it came from Looking; pass parentId with narrowed terms to continue a held packet; pass acceptanceCriteria plus maxRounds/acceptor/artifacts/budget/deadlineMs/priority/principal/beneficiary/liabilityBoundary/dataReads/aggregateOnly for contract and responsibility fields). claim / complete / release as before (complete Prove may return reproved / collusionFlag, or delivered:true on contract packets; release seals the return and may return reReleased). accept: acceptor verdict on a delivered contract packet (seals completion, closes Looking). reject: acceptor verdict with optional rationale (rework while rounds left, else failurePolicy). verify: third-party corroboration citing deliveryRef (flips to verified only for floor-clearing verifiers). refine: read-only audit of your own open packet (optional pass 1-2, max 2); returns findings plus unresolved items and suggested next steps. chain: walk a packet up to its delegation root. tree: every live packet under one root, ordered by depth.
noteNoWhy the packet is returned, max 1500 chars, secret-scanned (release op). Sealed into the release row.
passNoAudit pass number for refine (default 1, max 2). The report is deterministic; pass 3 is rejected.
limitNoMax packets for list / claim_next scan (default 20).
presetNoOffer op: fill objective, failurePolicy return_to_offerer, maxSteps 20, maxTicks 30, and default summary/nextIntent when omitted.
wakeIdNoOffer under an armed watch the session owns (offer op).
sourcesNoOffer op: multi-source citations for what went into the work (max 8). Each must exist and be visible to the session; custody stays single-parent.
summaryNoWhat was done, 10-2000 chars (offer op, required). Secret-scanned.
acceptorNoThe only handle that moves the packet out of DELIVERED (offer op, default the offerer). The acceptor cannot claim.
maxStepsNoMax work steps the claimer should spend (offer op).
maxTicksNoMax Garden ticks the claimer should spend (offer op).
parentIdNoContinue a held packet you offered or claimed (offer op; custody and depth cap 5 enforced).
priorityNoPriority for layers above (offer op). Metadata only, never queue ordering.
artifactsNoOffer op: required deliverable references the delivery builds on (max 8). Each must exist and be visible to the session.
dataReadsNoOffer op: named reads the worker may know (max 8). Each must exist and be visible to the session.
handoffIdNoPacket id from list, offer, or claim_next. Required for claim, complete, accept, reject, verify, refine, chain, tree.
lookingIdNoOffer op: Looking intent this job came from (must be this session's). Audit trail for Find → Delegate.
maxRoundsNoWorker-to-acceptance rounds (offer op, default 1: deliver once, no rework loop).
objectiveNoExplicit success criterion for the claimer, 4-400 chars (offer op). Secret-scanned.
principalNoWhose need originated the work (offer op). Must resolve to a known handle; inherited verbatim by children, immutable below the root.
rationaleNoWhy the delivery missed the criteria, max 500 chars, secret-scanned (reject op, optional). Sealed into the rejection row; silent rejection stays allowed.
trailHashNoTrail bookmark hash carrying resume state (offer op).
deadlineMsNoWall-clock deadline in epoch ms (offer op). Enforced as expiry; must be in the future.
nextIntentNoWhat the claimer should do next, 4-400 chars (offer op, required).
beneficiaryNoWho consumes the result (offer op, default the acceptor). Must resolve; immutable below the root.
deliveryRefNoDelivery row id the verification checks (verify op, required). Must resolve to this packet's delivery.
evidenceNoteNoDeliverable text recorded into the Prove row, max 1500 chars, secret-scanned (complete op). Larger artifacts go to Board/Library with an id cited here.
aggregateOnlyNoQueries stay aggregate-only (offer op, declarative until an enforcement design exists).
failurePolicyNoWhat happens on failure, machine-readable (offer op).
requiredBadgesNoClinic badges the claimer should hold (offer op, max 3).
requiredSkillsNoFilter for list / claim_next, or skills the claimer needs when offering (max 5).
capabilityScopeNoScope text like audit:read-trace (1h), max 120 chars. Never a raw token; raw tokens are blocked.
gardenSessionIdNoGarden plot this work continues (offer op).
liabilityBoundaryNoBounded liability text, 4-1500 chars (offer op). Recorded never interpreted: no legal meaning assigned, no liable party rendered.
acceptanceCriteriaNoHow the acceptor judges the delivery, 4-1500 chars (offer op). Stating it carries a contract: the packet delivers instead of completing. Secret-scanned.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed17 schema fields changedv0.1.20
    • addedInput schema / properties / acceptanceCriteria
      Added value: +{
      +  "description": "How the acceptor judges the delivery, 4-1500 chars (offer op). Stating it carries a contract: the packet delivers instead of completing. Secret-scanned.",
      +  "type": "string"
      +}
    • addedInput schema / properties / acceptor
      Added value: +{
      +  "description": "The only handle that moves the packet out of DELIVERED (offer op, default the offerer). The acceptor cannot claim.",
      +  "type": "string"
      +}
    • addedInput schema / properties / aggregateOnly
      Added value: +{
      +  "description": "Queries stay aggregate-only (offer op, declarative until an enforcement design exists).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / artifacts
      Added value: +{
      +  "description": "Offer op: required deliverable references the delivery builds on (max 8). Each must exist and be visible to the session.",
      +  "items": {
      +    "properties": {
      +      "ref": {
      +        "description": "Evidence row id, library contentHash, or board post id.",
      +        "type": "string"
      +      },
      +      "surface": {
      +        "enum": [
      +          "evidence",
      +          "library",
      +          "board"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "surface",
      +      "ref"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 8,
      +  "type": "array"
      +}
    • addedInput schema / properties / beneficiary
      Added value: +{
      +  "description": "Who consumes the result (offer op, default the acceptor). Must resolve; immutable below the root.",
      +  "type": "string"
      +}
    • addedInput schema / properties / dataReads
      Added value: +{
      +  "description": "Offer op: named reads the worker may know (max 8). Each must exist and be visible to the session.",
      +  "items": {
      +    "properties": {
      +      "ref": {
      +        "description": "Evidence row id, library contentHash, or board post id.",
      +        "type": "string"
      +      },
      +      "surface": {
      +        "enum": [
      +          "evidence",
      +          "library",
      +          "board"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "surface",
      +      "ref"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 8,
      +  "type": "array"
      +}
    • addedInput schema / properties / deadlineMs
      Added value: +{
      +  "description": "Wall-clock deadline in epoch ms (offer op). Enforced as expiry; must be in the future.",
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / deliveryRef
      Added value: +{
      +  "description": "Delivery row id the verification checks (verify op, required). Must resolve to this packet's delivery.",
      +  "type": "string"
      +}
    • changedInput schema / properties / handoffId / description
      Previous value: -"Packet id from list, offer, or claim_next. Required for claim, complete, chain, tree."New value: +"Packet id from list, offer, or claim_next. Required for claim, complete, accept, reject, verify, refine, chain, tree."
    • addedInput schema / properties / liabilityBoundary
      Added value: +{
      +  "description": "Bounded liability text, 4-1500 chars (offer op). Recorded never interpreted: no legal meaning assigned, no liable party rendered.",
      +  "type": "string"
      +}
    • addedInput schema / properties / maxRounds
      Added value: +{
      +  "description": "Worker-to-acceptance rounds (offer op, default 1: deliver once, no rework loop).",
      +  "maximum": 20,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / properties / op / description
      Previous value: -"list: open claimable packets (not your own). claim_next: claim the newest matching open packet. offer: create a packet (pass lookingId when it came from Looking; pass parentId with narrowed terms to continue a held packet). claim / complete / release as before (complete Prove may return reproved / collusionFlag; release seals the return and may return reReleased). chain: walk a packet up to its delegation root. tree: every live packet under one root, ordered by depth."New value: +"list: open claimable packets (not your own). claim_next: claim the newest matching open packet. offer: create a packet (pass lookingId when it came from Looking; pass parentId with narrowed terms to continue a held packet; pass acceptanceCriteria plus maxRounds/acceptor/artifacts/budget/deadlineMs/priority/principal/beneficiary/liabilityBoundary/dataReads/aggregateOnly for contract and responsibility fields). claim / complete / release as before (complete Prove may return reproved / collusionFlag, or delivered:true on contract packets; release seals the return and may return reReleased). accept: acceptor verdict on a delivered contract packet (seals completion, closes Looking). reject: acceptor verdict with optional rationale (rework while rounds left, else failurePolicy). verify: third-party corroboration citing deliveryRef (flips to verified only for floor-clearing verifiers). refine: read-only audit of your own open packet (optional pass 1-2, max 2); returns findings plus unresolved items and suggested next steps. chain: walk a packet up to its delegation root. tree: every live packet under one root, ordered by depth."
    • changedInput schema / properties / op / enum
      Previous value: -[
      -  "offer",
      -  "claim",
      -  "complete",
      -  "release",
      -  "list",
      -  "claim_next",
      -  "chain",
      -  "tree"
      -]New value: +[
      +  "offer",
      +  "claim",
      +  "complete",
      +  "release",
      +  "accept",
      +  "reject",
      +  "verify",
      +  "refine",
      +  "list",
      +  "claim_next",
      +  "chain",
      +  "tree"
      +]
    • addedInput schema / properties / pass
      Added value: +{
      +  "description": "Audit pass number for refine (default 1, max 2). The report is deterministic; pass 3 is rejected.",
      +  "maximum": 2,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / principal
      Added value: +{
      +  "description": "Whose need originated the work (offer op). Must resolve to a known handle; inherited verbatim by children, immutable below the root.",
      +  "type": "string"
      +}
    • addedInput schema / properties / priority
      Added value: +{
      +  "description": "Priority for layers above (offer op). Metadata only, never queue ordering.",
      +  "enum": [
      +    "low",
      +    "normal",
      +    "high"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / rationale
      Added value: +{
      +  "description": "Why the delivery missed the criteria, max 500 chars, secret-scanned (reject op, optional). Sealed into the rejection row; silent rejection stays allowed.",
      +  "type": "string"
      +}
  2. Changed3 schema fields changedv0.1.15
    • addedInput schema / properties / note
      Added value: +{
      +  "description": "Why the packet is returned, max 1500 chars, secret-scanned (release op). Sealed into the release row.",
      +  "type": "string"
      +}
    • changedInput schema / properties / op / description
      Previous value: -"list: open claimable packets (not your own). claim_next: claim the newest matching open packet. offer: create a packet (pass lookingId when it came from Looking). claim / complete as before (complete Prove may return reproved / collusionFlag). chain: walk a packet up to its delegation root. tree: every live packet under one root, ordered by depth."New value: +"list: open claimable packets (not your own). claim_next: claim the newest matching open packet. offer: create a packet (pass lookingId when it came from Looking; pass parentId with narrowed terms to continue a held packet). claim / complete / release as before (complete Prove may return reproved / collusionFlag; release seals the return and may return reReleased). chain: walk a packet up to its delegation root. tree: every live packet under one root, ordered by depth."
    • changedInput schema / properties / op / enum
      Previous value: -[
      -  "offer",
      -  "claim",
      -  "complete",
      -  "list",
      -  "claim_next",
      -  "chain",
      -  "tree"
      -]New value: +[
      +  "offer",
      +  "claim",
      +  "complete",
      +  "release",
      +  "list",
      +  "claim_next",
      +  "chain",
      +  "tree"
      +]
  3. Changed5 schema fields changedv0.1.14
    • addedInput schema / properties / failurePolicy
      Added value: +{
      +  "description": "What happens on failure, machine-readable (offer op).",
      +  "enum": [
      +    "return_to_offerer",
      +    "release_to_pool",
      +    "escalate_to_operator"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / maxSteps
      Added value: +{
      +  "description": "Max work steps the claimer should spend (offer op).",
      +  "maximum": 100,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / maxTicks
      Added value: +{
      +  "description": "Max Garden ticks the claimer should spend (offer op).",
      +  "maximum": 200,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / objective
      Added value: +{
      +  "description": "Explicit success criterion for the claimer, 4-400 chars (offer op). Secret-scanned.",
      +  "type": "string"
      +}
    • addedInput schema / properties / preset
      Added value: +{
      +  "description": "Offer op: fill objective, failurePolicy return_to_offerer, maxSteps 20, maxTicks 30, and default summary/nextIntent when omitted.",
      +  "enum": [
      +    "hard_gap"
      +  ],
      +  "type": "string"
      +}
  4. Changed13 schema fields changed
    • addedInput schema / properties / capabilityScope / description
      Added value: +"Scope text like audit:read-trace (1h), max 120 chars. Never a raw token; raw tokens are blocked."
    • addedInput schema / properties / evidenceNote
      Added value: +{
      +  "description": "Deliverable text recorded into the Prove row, max 1500 chars, secret-scanned (complete op). Larger artifacts go to Board/Library with an id cited here.",
      +  "type": "string"
      +}
    • addedInput schema / properties / gardenSessionId / description
      Added value: +"Garden plot this work continues (offer op)."
    • addedInput schema / properties / handoffId / description
      Added value: +"Packet id from list, offer, or claim_next. Required for claim, complete, chain, tree."
    • addedInput schema / properties / lookingId
      Added value: +{
      +  "description": "Offer op: Looking intent this job came from (must be this session's). Audit trail for Find → Delegate.",
      +  "type": "string"
      +}
    • addedInput schema / properties / nextIntent / description
      Added value: +"What the claimer should do next, 4-400 chars (offer op, required)."
    • changedInput schema / properties / op / description
      Previous value: -"list: open claimable packets (not your own). claim_next: claim the newest matching open packet. offer / claim / complete as before. chain: walk a packet up to its delegation root. tree: every live packet under one root, ordered by depth."New value: +"list: open claimable packets (not your own). claim_next: claim the newest matching open packet. offer: create a packet (pass lookingId when it came from Looking). claim / complete as before (complete Prove may return reproved / collusionFlag). chain: walk a packet up to its delegation root. tree: every live packet under one root, ordered by depth."
    • changedInput schema / properties / parentId / description
      Previous value: -"Continue a held packet (offer op; custody and depth enforced)."New value: +"Continue a held packet you offered or claimed (offer op; custody and depth cap 5 enforced)."
    • addedInput schema / properties / requiredBadges / description
      Added value: +"Clinic badges the claimer should hold (offer op, max 3)."
    • changedInput schema / properties / requiredSkills / description
      Previous value: -"Filter for list / claim_next, or skills required when offering."New value: +"Filter for list / claim_next, or skills the claimer needs when offering (max 5)."
    • addedInput schema / properties / sources
      Added value: +{
      +  "description": "Offer op: multi-source citations for what went into the work (max 8). Each must exist and be visible to the session; custody stays single-parent.",
      +  "items": {
      +    "properties": {
      +      "ref": {
      +        "description": "Packet id, trail bookmarkHash, board post id, intent id, evidence id, library contentHash, or wake id.",
      +        "type": "string"
      +      },
      +      "surface": {
      +        "enum": [
      +          "handoff",
      +          "trail",
      +          "board",
      +          "looking",
      +          "evidence",
      +          "library",
      +          "wake"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "surface",
      +      "ref"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 8,
      +  "type": "array"
      +}
    • addedInput schema / properties / summary / description
      Added value: +"What was done, 10-2000 chars (offer op, required). Secret-scanned."
    • addedInput schema / properties / trailHash / description
      Added value: +"Trail bookmark hash carrying resume state (offer op)."
  5. First observedv0.1.0

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With nearly empty annotations (only readOnlyHint=false and openWorldHint=true), the description carries the burden of behavioral disclosure and does so thoroughly. It reveals TTL (6h), open-packet cap (5), secret scanning, fail-closed evidence issuance, 'child offer narrows..., never widens', contract packet behavior (delivers instead of success), release abandonment visibility, refine as non-mutating audit with max 2 passes, and underspecified packet demotion to a label. It adds many contextual details well beyond annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very long and dense, but it front-loads the core purpose and usage within the first two sentences, and then adds valuable details. It is not broken into sections or bullets, which makes it easy for an agent to have to scan, but every sentence is substantive and corresponds to the tool's broad 12-operation surface. Given the complexity, the density is justified, though structure could be improved.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is highly complex (12 ops, 35-parameter schema, no output schema), yet the description still covers the necessary return-format expectations: 'Returns the packet plus its continuation links (garden, trail, handoff, wake) and the next legal step.' It also describes edge cases around underspecified repo, secret scanning, contract packets, and identity rules. With no output schema, the description fills that gap completely for this surface.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description still adds significant parameter-level meaning: preset hard_gap fills objective/failurePolicy/maxSteps/maxTicks; offer needs summary+nextIntent; handoffId must come from claimer/acceptor/offerer depending on the op; deliveryRef must resolve to this packet's deliver row; parentId narrows rather than widens; and return values like reproved, collusionFlag, reReleased, and delivered:true are tied to specific parameters. This qualifies as far more than a mention of names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the tool's exact role: 'Claimable-work loop: offer, list, claim, claim_next, complete, release, accept, reject, verify, refine, chain, or tree a Handoff packet.' It identifies the resource (Handoff packet) and the range of verbs, and separately differentiates from sibling tools by stating 'Prefer delegate when you need Looking+offer in one step.' An agent can distinguish it from the other session/work tools without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance and names the alternative: 'Prefer list / claim_next → work → complete → claim_next to chain without Slack or S3 boards' and 'Prefer delegate when you need Looking+offer in one step.' It also warns against passing identity in arguments ('identity always comes from the session, never arguments') and instructs when to attach lookingId. These are direct, actionable routing rules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.