skein_close_many
Close many issues in one round-trip. Each item is processed independently in its own SERIALIZABLE transaction; on row-level failure (version_conflict, locked_by_other, pinned_no_force, ...) the rest of the batch still runs. Inspect results[i].ok per row to find the failures and results[i].error.code to branch on the cause. Result rows preserve input order. A row returning serialization_retry rolled back its close without a version change; resend that row unchanged.
Caps at 100 items per call (matches the REST bulk endpoint). For >100 issues, split client-side. force=true needs force_unlock on each row's project and bypasses lock + version + pinned predicates uniformly across all rows. Per-row reason is required (non-empty after trim) — agents typically pass the same string in every item. Each item may carry an optional commits[] (max 10). Re-close is NOT idempotent — it overwrites closed_reason / closed_at per item; to add commits to already-closed issues use skein_commits_attach per issue. closeOutcome / closeTarget are per item, as on skein_close. closeOutcome is required when transitioning to closed; repeating a close without it preserves the previous outcome. Each row answers closeOutcome, plus closeLink when it named a target.
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_close_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 close requests. Min 1, max 100. Order is preserved in results[]. |