Task List Batch Editor
productivity.todo_update
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
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
Capabilities
Cost & billing
Flat rate per invocation
File handling
How we handle your data
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.
Input schema
| Field | Type | Required | Description |
|---|---|---|---|
| todoList | array | Yes | List to edit, 0 through 20000 closed items each with unique id, state and text, plus optional extract extras. |
| operations | array | Yes | Edits to apply in order, 0 through 5000 closed operations each with op and, except for ADD, a match. |
| documentId | string | No | Document prefix for derived identities, 1 to 64 letters, digits, dots, underscores, colons or hyphens; omit it so identities start with a bare colon. |
| missingTargetPolicy | string | No | FAIL abandons the batch when a match hits nothing; RECORD keeps going. Omit it for FAIL. |
| allowDuplicateText | boolean | No | Whether ADD may repeat wording already in the list; omit it for false. |
Output schema
| Field | Type | Required | Description |
|---|---|---|---|
| items | array | Yes | List after every operation, 0 through 20000 closed items renumbered from zero without source offsets. |
| changes | array | Yes | One closed receipt per operation in send order, 0 through 5000 lines with sequence, code and involved identities. |
| summary | object | Yes | Closed batch counts: input and output sizes, applied, no-change and absent operations, plus checked and unchecked totals. |
API contract
POST /v1/executecurl -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}}]}}'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
| Code | HTTP | Retryable | Description |
|---|---|---|---|
| VALIDATION_ERROR | 400 | No | The request payload failed schema validation. |
| UNAUTHORIZED | 401 | No | Missing or invalid API key. |
| SKILL_NOT_ACCESSIBLE | 403 | No | The API key is not granted access to this skill. |
| SKILL_NOT_AVAILABLE_FOR_PLAN | 403 | No | This skill is not included in your current plan. |
| PLAN_ELIGIBILITY_UNAVAILABLE | 503 | Yes | Plan eligibility could not be decided. Retry after backoff. |
| SKILL_NOT_FOUND | 404 | No | The requested skill or version does not exist. |
| TENANT_RATE_LIMITED | 429 | Yes | Request rate limit exceeded. Retry after backoff. |
| QUOTA_EXCEEDED | 429 | Yes | Plan quota exhausted. Retryable once the quota period resets. |
| EXECUTION_TIMEOUT | 504 | Yes | Execution exceeded the allowed time budget. |
| TODO_UPDATE_LIST_INVALID | 400 | No | The request payload failed this skill's input validation. |
| TODO_UPDATE_ITEM_ID_DUPLICATE | 400 | No | The request payload failed this skill's input validation. |
| TODO_UPDATE_OPERATIONS_INVALID | 400 | No | The request payload failed this skill's input validation. |
| TODO_UPDATE_OPERATION_UNSUPPORTED | 400 | No | The skill does not support the requested variant. |
| TODO_UPDATE_MATCH_MODE_UNSUPPORTED | 400 | No | The skill does not support the requested variant. |
| TODO_UPDATE_MATCH_VALUE_INVALID | 400 | No | The request payload failed this skill's input validation. |
| TODO_UPDATE_TARGET_NOT_FOUND | 412 | No | The input is valid but cannot be processed as-is. |
| TODO_UPDATE_TARGET_AMBIGUOUS | 412 | No | The input is valid but cannot be processed as-is. |
| TODO_UPDATE_DUPLICATE_TEXT | 412 | No | The input is valid but cannot be processed as-is. |
| TODO_UPDATE_LIMIT_EXCEEDED | 429 | No | A size, quota, rate, or time limit was exceeded. |
| TODO_UPDATE_WORK_REFUSED | 429 | No | A size, quota, rate, or time limit was exceeded. |
| TODO_UPDATE_OUTPUT_TOO_LARGE | 429 | No | A size, quota, rate, or time limit was exceeded. |
Other limits
| Limit | Value |
|---|---|
| Recommended inline bytes | 32 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)
{
"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
{
"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"
}
]
}{
"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"
}
]
}Replayed completion plus a new item
{
"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"
}
]
}{
"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"
}
]
}Recommended use cases
- 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
Related skills
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.