skein_update_many
Patch many issues in one round-trip. Each items[i] carries its own id + expectedVersion + the same partialPatch shape that skein_update accepts (title / description / type / priority / assignee / componentIds / labelsAdd / labelsRemove / status / reason / dueAt / deferUntil / design / acceptanceCriteria / notes / externalRef / sourceContext / estimatedMinutes). The N patches are independent — passing the same value in every item gives mass-edit semantics. Text patches (description, design, acceptanceCriteria, notes, externalRef, sourceContext): omitted leaves unchanged; null or an empty string clears. Other non-string values are refused before any write with validation_error, code text_field_not_string and field naming the argument. Refusal applies only to the offending row. Each row runs the full skein_update chain in its own SERIALIZABLE sub-transactions per step; mid-chain failure on one row leaves THAT row in partial state (earlier sub-ops are NOT rolled back — this matches single-tool behaviour) but does not affect the rest of the batch. Inspect results[i].ok / results[i].error.code per row. A row stopped by batch_deadline_exceeded / request_cancelled while in progress may have committed earlier steps: re-read it and resend only what is missing, with the live version. A row may return serialization_retry after a sub-operation rolls back; earlier changes in that row may have committed. Re-read and resend only missing changes.
closeOutcome is required when transitioning to closed; repeating a close without it preserves the previous outcome. No per-row closeTarget: close an OPEN issue as duplicate / superseded with skein_close / skein_update. Caps at 100 items per call. force=true requires admin and applies uniformly to every row. reviewRequired is NOT accepted here: the review flag travels its own path (it moves neither version nor updated_at, so a batch row could not report it). A row carrying it is rejected with validation_error and writes nothing — use skein_update, one call per issue.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"items": "<items>"
},
"name": "skein_update_many"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Bypass lock + version + pinned predicates across the entire batch. Needs force_unlock on each row's project (project owner, space owner, instance admin); a row without it fails with `force_unlock_forbidden`. Default: false. | |
| items | Yes | Per-row partial patches. Min 1, max 100. Order is preserved in results[]. |