Skip to main content

Squillify development is paused indefinitely. Read why, and discover what this experiment achieved. Read the story

MicroSkills Reference

Task List Batch Editor

productivity.todo_update

ProductionBounded custom (Class B)Deterministicstrictfastv1.0.0
No network

Overview

You send a task list and a list of edits, and we hand back the list as it stands after those edits plus a per-operation receipt saying what each one did. Targets are named exactly, by identity, by position or by whole title, and never by a pattern or a similarity score, so an edit either hits the item you meant or tells you it hit nothing. Nothing outside the response changes: there is no tracker behind this, and the value we return is the whole of the result.

An agent that edits a checklist by rewriting Markdown loses the identities that told it which item was which, and the next read cannot tell an edit from a coincidence.

Reliability

Same list, same operations, same bytes back. Replaying a batch converges: a completion already applied comes back as ALREADY_IN_STATE, and an addition already present is refused unless you asked for duplicates. Failures, none worth retrying unchanged: TODO_UPDATE_LIST_INVALID means an entry was missing its id, text or state, carried an unexpected property, or ran past a stated cap, so fix that entry; TODO_UPDATE_ITEM_ID_DUPLICATE means two entries claimed one identity, and the response names the position of the second; TODO_UPDATE_OPERATIONS_INVALID means an operation was malformed, most often an ADD or RETITLE with no text, so correct the operation named by index; TODO_UPDATE_OPERATION_UNSUPPORTED means op was outside COMPLETE, REOPEN, ADD, REMOVE and RETITLE, so pick one of those five; TODO_UPDATE_MATCH_MODE_UNSUPPORTED means match.by was outside ID, ORDINAL and TITLE_EXACT, and there is deliberately no fuzzy mode to fall back to; TODO_UPDATE_MATCH_VALUE_INVALID means the value did not suit the mode, such as a title where a position belongs, so send the right shape; TODO_UPDATE_TARGET_NOT_FOUND means an operation matched nothing under the default policy, so refresh the list or set missingTargetPolicy to RECORD; TODO_UPDATE_TARGET_AMBIGUOUS means a title matched more than one item, and the count comes back so you can switch that operation to match by identity; TODO_UPDATE_DUPLICATE_TEXT means an addition repeats text already in the list, so drop it or set allowDuplicateText to true; TODO_UPDATE_LIMIT_EXCEEDED means the list or the batch went past 20,000 items or 5,000 operations, so split the work; TODO_UPDATE_WORK_REFUSED means list size and batch size together project past our work budget, and both numbers come back so you know how far to trim; TODO_UPDATE_OUTPUT_TOO_LARGE means the resulting list would not fit in one inline response, so split the list and edit each part.

Context footprint

Returns the whole edited list plus one receipt line per operation, so a 500-item list comes back at 500 items. Item text is echoed because a list without its wording cannot be stored back. A successful call costs 2 execution credits.

When to use it

When you hold a task list as data and want a set of edits applied to it under exact matching, with a receipt saying what each edit actually did.

When you want the change written somewhere, or when you can only describe the target approximately.

Scope

Note
Apply an ordered batch of exact-match edits to a task list value and return the resulting list together with a per-operation receipt.

Non-goals

  • Does not connect to any tracker, calendar or note store
  • Does not match targets by pattern, prefix or similarity score
  • Does not reorder, sort or reparent items beyond the edits requested
  • Does not merge two lists or resolve a conflict between them

Properties

IdempotentRetry safeStreaming supportedFile input supportedRequires external service

Capabilities

data-transformation

Cost & billing

Flat rate per invocation

MetercallsBillable onsuccessCost per call2 credits

File handling

Accepts file_refProduces file_refMax input2 MB

How we handle your data

Sensitive output possible
What this means

This skill may receive sensitive content and may return submitted, transformed, extracted, or reformatted content.

Squillify guarantees
  • Runs inside Squillify
  • This skill runs inside Squillify.
  • Payloads are not sent to an external service by this skill.
  • Squillify does not permanently store submitted payloads.
  • Telemetry records metadata only, not submitted content.
  • Submitted payloads are not used for training.
  • Submitted payloads are not reviewed by humans.
  • This skill does not target sensitive data.
  • The response may contain submitted or transformed content.
Your responsibility

Squillify does not determine whether submitted content is sensitive. Your application is responsible for deciding what data it is allowed to submit. Your application is responsible for securing the response.

Read the Microskill Data Handling Policy

Input schema

FieldTypeRequiredDescription
todoListarrayYesList to edit, 0 through 20000 closed items each with unique id, state and text, plus optional extract extras.
operationsarrayYesEdits to apply in order, 0 through 5000 closed operations each with op and, except for ADD, a match.
documentIdstringNoDocument prefix for derived identities, 1 to 64 letters, digits, dots, underscores, colons or hyphens; omit it so identities start with a bare colon.
missingTargetPolicystringNoFAIL abandons the batch when a match hits nothing; RECORD keeps going. Omit it for FAIL.
allowDuplicateTextbooleanNoWhether ADD may repeat wording already in the list; omit it for false.

Output schema

FieldTypeRequiredDescription
itemsarrayYesList after every operation, 0 through 20000 closed items renumbered from zero without source offsets.
changesarrayYesOne closed receipt per operation in send order, 0 through 5000 lines with sequence, code and involved identities.
summaryobjectYesClosed batch counts: input and output sizes, applied, no-change and absent operations, plus checked and unchecked totals.

API contract

POST /v1/execute
curl
curl -sS -X POST "$BASE/v1/execute" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"skillKey":"productivity.todo_update","input":{"todoList":[{"id":"release-notes:b7cde273a37783e2:0","state":"UNCHECKED","text":"Draft the changelog"}],"operations":[{"op":"COMPLETE","match":{"by":"ORDINAL","value":0}}]}}'
Integrations
TypeScript SDK
import { Squillify } from "@squillify/sdk";

const sq = new Squillify({ apiKey: process.env.SQUILLIFY_API_KEY });

const { output } = await sq.execute("productivity.todo_update", {"todoList":[{"id":"release-notes:b7cde273a37783e2:0","ordinal":0,"depth":0,"state":"UNCHECKED","text":"Draft the changelog"}],"operations":[{"match":{"by":"ID","value":"release-notes:b7cde273a37783e2:0"},"op":"COMPLETE"}]});

Errors

CodeHTTPRetryableDescription
VALIDATION_ERROR400NoThe request payload failed schema validation.
UNAUTHORIZED401NoMissing or invalid API key.
SKILL_NOT_ACCESSIBLE403NoThe API key is not granted access to this skill.
SKILL_NOT_AVAILABLE_FOR_PLAN403NoThis skill is not included in your current plan.
PLAN_ELIGIBILITY_UNAVAILABLE503YesPlan eligibility could not be decided. Retry after backoff.
SKILL_NOT_FOUND404NoThe requested skill or version does not exist.
TENANT_RATE_LIMITED429YesRequest rate limit exceeded. Retry after backoff.
QUOTA_EXCEEDED429YesPlan quota exhausted. Retryable once the quota period resets.
EXECUTION_TIMEOUT504YesExecution exceeded the allowed time budget.
TODO_UPDATE_LIST_INVALID400NoThe request payload failed this skill's input validation.
TODO_UPDATE_ITEM_ID_DUPLICATE400NoThe request payload failed this skill's input validation.
TODO_UPDATE_OPERATIONS_INVALID400NoThe request payload failed this skill's input validation.
TODO_UPDATE_OPERATION_UNSUPPORTED400NoThe skill does not support the requested variant.
TODO_UPDATE_MATCH_MODE_UNSUPPORTED400NoThe skill does not support the requested variant.
TODO_UPDATE_MATCH_VALUE_INVALID400NoThe request payload failed this skill's input validation.
TODO_UPDATE_TARGET_NOT_FOUND412NoThe input is valid but cannot be processed as-is.
TODO_UPDATE_TARGET_AMBIGUOUS412NoThe input is valid but cannot be processed as-is.
TODO_UPDATE_DUPLICATE_TEXT412NoThe input is valid but cannot be processed as-is.
TODO_UPDATE_LIMIT_EXCEEDED429NoA size, quota, rate, or time limit was exceeded.
TODO_UPDATE_WORK_REFUSED429NoA size, quota, rate, or time limit was exceeded.
TODO_UPDATE_OUTPUT_TOO_LARGE429NoA size, quota, rate, or time limit was exceeded.

Other limits

LimitValue
Recommended inline bytes32 KiB

Limitations

  • Does not connect to any tracker, calendar or note store
  • Does not match targets by pattern, prefix or similarity score
  • Does not reorder, sort or reparent items beyond the edits requested
  • Does not merge two lists or resolve a conflict between them
  • Editing a Markdown document in place, which this never touches
  • Finding the item you meant by rough description rather than exact identity

How to call

POST /v1/execute (requires authentication)

Request bodyjson
{
  "skillKey": "productivity.todo_update",
  "input": {
    "todoList": [
      {
        "id": "release-notes:b7cde273a37783e2:0",
        "ordinal": 0,
        "depth": 0,
        "state": "UNCHECKED",
        "text": "Draft the changelog"
      }
    ],
    "operations": [
      {
        "match": {
          "by": "ID",
          "value": "release-notes:b7cde273a37783e2:0"
        },
        "op": "COMPLETE"
      }
    ]
  }
}

Examples

Check off one item named by its identity

Inputjson
{
  "todoList": [
    {
      "id": "release-notes:b7cde273a37783e2:0",
      "ordinal": 0,
      "depth": 0,
      "state": "UNCHECKED",
      "text": "Draft the changelog"
    }
  ],
  "operations": [
    {
      "match": {
        "by": "ID",
        "value": "release-notes:b7cde273a37783e2:0"
      },
      "op": "COMPLETE"
    }
  ]
}
Expected outputjson
{
  "changes": [
    {
      "sequence": 0,
      "operation": "COMPLETE",
      "code": "COMPLETED",
      "itemId": "release-notes:b7cde273a37783e2:0",
      "ordinalBefore": 0,
      "ordinalAfter": 0,
      "stateBefore": "UNCHECKED",
      "stateAfter": "CHECKED"
    }
  ],
  "summary": {
    "inputCount": 1,
    "outputCount": 1,
    "appliedCount": 1,
    "noChangeCount": 0,
    "absentCount": 0,
    "checkedCount": 1,
    "uncheckedCount": 0
  },
  "items": [
    {
      "id": "release-notes:b7cde273a37783e2:0",
      "ordinal": 0,
      "depth": 0,
      "state": "CHECKED",
      "text": "Draft the changelog"
    }
  ]
}
Tip
The identity survives the edit, so a caller can apply the same operation again and read a no-change receipt.

Replayed completion plus a new item

Inputjson
{
  "documentId": "plan",
  "operations": [
    {
      "match": {
        "by": "ORDINAL",
        "value": 0
      },
      "op": "COMPLETE"
    },
    {
      "text": "Send the recap email",
      "op": "ADD"
    }
  ],
  "todoList": [
    {
      "id": "plan:f96f4c1f3127dd9e:0",
      "ordinal": 0,
      "depth": 0,
      "state": "CHECKED",
      "text": "Review the budget"
    }
  ]
}
Expected outputjson
{
  "changes": [
    {
      "sequence": 0,
      "operation": "COMPLETE",
      "code": "ALREADY_IN_STATE",
      "itemId": "plan:f96f4c1f3127dd9e:0",
      "ordinalBefore": 0,
      "ordinalAfter": 0,
      "stateBefore": "CHECKED",
      "stateAfter": "CHECKED"
    },
    {
      "sequence": 1,
      "operation": "ADD",
      "code": "ADDED",
      "itemId": "plan:6dabcc65079b9626:1",
      "ordinalAfter": 1,
      "stateAfter": "UNCHECKED"
    }
  ],
  "summary": {
    "inputCount": 1,
    "outputCount": 2,
    "appliedCount": 1,
    "noChangeCount": 1,
    "absentCount": 0,
    "checkedCount": 1,
    "uncheckedCount": 1
  },
  "items": [
    {
      "id": "plan:f96f4c1f3127dd9e:0",
      "ordinal": 0,
      "depth": 0,
      "state": "CHECKED",
      "text": "Review the budget"
    },
    {
      "id": "plan:6dabcc65079b9626:1",
      "ordinal": 1,
      "depth": 0,
      "state": "UNCHECKED",
      "text": "Send the recap email"
    }
  ]
}
Tip
The already-completed item reports ALREADY_IN_STATE rather than failing, and the added item takes an identity derived from its own text.
  • Check off the items an agent just finished and get the list back to store
  • Replay an edit batch safely, where a completion already applied reports no change

Avoid for

  • Editing a Markdown document in place, which this never touches
  • Finding the item you meant by rough description rather than exact identity

Composable with

Safety & privacy

  • Runs without calling any external service.
  • Your payloads are never stored permanently.
  • Telemetry captures metadata only — never your payload contents.
  • We never train models on your payloads.
  • No human reviews your payloads.

Tags

checklisttransformationvalidationproductivity