ticket_schedule_apply
Policy continuation:
Save the complete operation prepared by
ticket_schedules_get. Keep the exact channel, event,
hall and operation unchanged, copy its revision to expectedRevision, and supply
a stable requestId. dryRun:true previews without saving; false is the default.
This method requires a create/createBatch/edit/editMany/publication/policies operation and does not accept view or list
discovery. A list response from the getter has no revision and cannot prepare a
save. Call the getter again with the complete intended operation before applying.
Single-date creation sends one source CREATE_LOOP request with exactly one CUSTOM date. It creates one schedule from existing seats and price policies, including any initial parkedSeats. The returned schedule identity must be recorded before fresh reads. The saved title/time/purchase limit, seat capacity and policies must match; initial parking additionally checks every sheet identity/type and selected parking memo. Paid-price flags are preserved without treating an unpurchased seat as purchased.
Editing sends only requested fields and preserves other schedule metadata and counts. Noop edits write nothing. Publication/availability edits may affect customer access.
An absent, ambiguous or foreign creation identity stays pending even if a similarly named schedule is visible. Never retry with a new requestId or adopt by title. For pending create/edit work use task_resume with taskType commerce-ticket-schedule and the original taskId. Recovery reads known targets only; it does not resend. Prepared work requires the identical original apply. Task status and completed replays are historical; read current settings to verify today's state.
Partial effects, changed dependencies or buyer data appearing in newly created parked rows remain unconfirmed. No automatic rollback, deletion, buyer assignment, order, payment, refund, printing, issuance, redemption or notification is performed. Actual restoration must be separately authorized, prepared and verified when appropriate.
Fresh create plans open the original creation screen, without prefilling values. Verified saves and metadata edits return the surviving schedule list because the source editor is a modal. Adjust list filters and select the exact returned schedule. A link is not a completion receipt. Actual MCP changes and same-screen before/after verification remain separate from isolated fixture checks.
Exact apply contract
Supply channelCode, pAppCode:E00003, eventId, hallId and the unchanged create/createBatch/edit/editMany/publication/policies operation from preparation, expectedRevision and requestId. expectedRevision is 64 lowercase hexadecimal characters; requestId is 8–80 ASCII letters, digits, underscores or hyphens. Objects are strict. dryRun defaults to false. This writer never accepts view, list filters or a list response as preparation. A changed draft, selection or edit setting needs a new matching getter revision.
For single create/edit, a fresh dry run returns COMMERCE_OPERATION_PLAN with dryRun:true, request, noop, observed schedule/dependencies and writesPerformed:false; no saved job is created. Creation is never an equal-existing-title no-op. An existing task's dry run is a historical plan/replay, not a fresh preparation or permission to replace its input. Reusing its ID with different normalized input returns REQUEST_ID_CONFLICT.
One schedule creation
One CREATE_LOOP dispatch has frequency:CUSTOM, interval:1 and exactly one equal start/until/dateRanges date derived from the UTC draft, plus whole-minute startAtTime and duration. This describes operation.kind:create only; createBatch has the separate contract below. The body contains the exact event/hall/template/policy IDs and either an empty initial-parking transport array or the prepared parked rows. Do not send the raw recurrence/body yourself.
The response must identify exactly one valid schedule in its CREATE_LOOP result, with matching parents and consumer. Multiple, missing or foreign returned schedules are unconfirmed. The returned scheduleId must be saved durably before it can support recovery; a title match or inventory difference cannot replace that receipt.
Stable readback checks the known schedule's requested title/time/purchase limit, exact template and seat projection, selected policy identities/titles/prices, and unchanged event/hall/template/policy dependencies. Counts must match the complete seat capacity: parked count equals the selected initial seats, online/available count equals the remainder and purchasedOnlineTickets is zero. This is configuration verification, not proof of every generated ticket slot.
When initial parking was requested, readback additionally checks the entire created sheet (at most 500 rows): each template seat occurs once, sheet IDs are unique, selected rows are PARKING with exact memo/type and source title/tier, and other rows are ONLINE without parking metadata. Purchased/printed rows or populated buyer, reservation, deed, discount or overridden-price metadata fail verification. An isPaid flag or ordinary price alone is not a purchase. Partial parking or changed dependencies remains pending; it does not trigger another creation.
One schedule edit
One PATCH dispatch contains exactly one scheduleIds entry and only the requested fields. A time edit sends the complete UTC date/startAtTime/duration group with offset:0; null purchase limit becomes -1. The source record's other metadata and counts must remain unchanged. Generated timestamp normalization is not permission to ignore other drift. No policy selection, replacement/reorder, template change, buyer field or translation is accepted in edit settings.
A matching readback can resolve a lost acknowledgement for this known schedule without proving causality. A later reverse edit must be separately authorized and freshly prepared after resolving uncertainty; it is not automatic restoration of sales/history or deleted identities.
Inputs
| Field | Required here | Contract |
|---|---|---|
channelCode |
Yes | string; min length 1; max length 512; The exact channelCode selected through channel discovery. Do not supply a URL, channel numeric ID, account ID or credentials. |
pAppCode |
Yes | E00003 |
eventId |
Yes | string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
hallId |
Yes | string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
operation |
Yes | one of: edit, create, policies, createBatch, editMany, publication, availability, deleteMany (by kind) |
operation.scheduleId |
Yes | When operation.kind is edit: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
operation.settings |
Yes | When operation.kind is edit: object |
operation.settings.title |
No | When operation.kind is edit: string; min length 1; max length 80 |
operation.settings.time |
No | When operation.kind is edit: object |
operation.settings.time.startTime |
Yes | When operation.kind is edit: string; pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$; format date-time |
operation.settings.time.duration |
Yes | When operation.kind is edit: integer; minimum 1; maximum 300 |
operation.settings.limitPurchaseQuantity |
No | When operation.kind is edit: integer; minimum 1; maximum 300 or null |
operation.settings.isPublished |
No | When operation.kind is edit: boolean |
operation.settings.availabilityStatus |
No | When operation.kind is edit: NORMAL, FORBIDDEN, NOT_AVAILABLE |
operation.draft |
Yes | When operation.kind is create: object |
operation.draft.title |
Yes | When operation.kind is create: string; min length 1; max length 80 |
operation.draft.startTime |
Yes | When operation.kind is create: string; pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$; format date-time |
operation.draft.duration |
Yes | When operation.kind is create: integer; minimum 1; maximum 300 |
operation.draft.limitPurchaseQuantity |
Yes | When operation.kind is create: integer; minimum 1; maximum 300 or null |
operation.draft.seatTemplateId |
Yes | When operation.kind is create: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
operation.draft.eventPolicyIds |
Yes | When operation.kind is create: array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
operation.draft.parkedSeats |
No | When operation.kind is create: array; min items 1; max items 100 |
operation.draft.parkedSeats[].seatId |
Yes | When operation.kind is create: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
operation.draft.parkedSeats[].parking |
Yes | When operation.kind is create: object |
operation.draft.parkedSeats[].parking.type |
Yes | When operation.kind is create: LOCATION, EXTERNAL, DEACTIVATED, ETC |
operation.draft.parkedSeats[].parking.memo |
Yes | When operation.kind is create: string; max length 200 |
operation.draft.translation |
No | When operation.kind is create: object |
operation.draft.translation.title |
Yes | When operation.kind is create: object |
operation.draft.translation.title.ko |
No | When operation.kind is create: string |
operation.draft.translation.title.en |
No | When operation.kind is create: string |
operation.draft.translation.title.ja |
No | When operation.kind is create: string |
operation.draft.translation.title.zh |
No | When operation.kind is create: string |
operation.draft.translation.title.zh-Hant |
No | When operation.kind is create: string |
operation.draft.translation.title.fr |
No | When operation.kind is create: string |
operation.draft.translation.title.es |
No | When operation.kind is create: string |
operation.draft.translation.title.vi |
No | When operation.kind is create: string |
operation.draft.translation.title.ru |
No | When operation.kind is create: string |
operation.draft.translation.title.it |
No | When operation.kind is create: string |
operation.confirmation |
Yes | When operation.kind is create: CREATE_SCHEDULE |
operation.scheduleIds |
Yes | When operation.kind is policies: array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
operation.eventPolicyIds |
Yes | When operation.kind is policies: array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; max items 100 |
operation.patchOption |
Yes | When operation.kind is policies: OVERRIDE, CHANGE |
operation.confirmation |
Yes | When operation.kind is policies: PATCH_SCHEDULE_POLICIES |
operation.draft |
Yes | When operation.kind is createBatch: object |
operation.draft.title |
Yes | When operation.kind is createBatch: string; min length 1; max length 80 |
operation.draft.startAtTime |
Yes | When operation.kind is createBatch: string; pattern ^(?:[01]\d|2[0-3]):[0-5]\d:00$ |
operation.draft.duration |
Yes | When operation.kind is createBatch: integer; minimum 1; maximum 300 |
operation.draft.limitPurchaseQuantity |
Yes | When operation.kind is createBatch: integer; minimum 1; maximum 300 or null |
operation.draft.seatTemplateId |
Yes | When operation.kind is createBatch: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
operation.draft.eventPolicyIds |
Yes | When operation.kind is createBatch: array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
operation.draft.parkedSeats |
No | When operation.kind is createBatch: array; min items 1; max items 100 |
operation.draft.parkedSeats[].seatId |
Yes | When operation.kind is createBatch: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL. |
operation.draft.parkedSeats[].parking |
Yes | When operation.kind is createBatch: object |
operation.draft.parkedSeats[].parking.type |
Yes | When operation.kind is createBatch: LOCATION, EXTERNAL, DEACTIVATED, ETC |
operation.draft.parkedSeats[].parking.memo |
Yes | When operation.kind is createBatch: string; max length 200 |
operation.draft.translation |
No | When operation.kind is createBatch: object |
operation.draft.translation.title |
Yes | When operation.kind is createBatch: object |
operation.draft.translation.title.ko |
No | When operation.kind is createBatch: string |
operation.draft.translation.title.en |
No | When operation.kind is createBatch: string |
operation.draft.translation.title.ja |
No | When operation.kind is createBatch: string |
operation.draft.translation.title.zh |
No | When operation.kind is createBatch: string |
operation.draft.translation.title.zh-Hant |
No | When operation.kind is createBatch: string |
operation.draft.translation.title.fr |
No | When operation.kind is createBatch: string |
operation.draft.translation.title.es |
No | When operation.kind is createBatch: string |
operation.draft.translation.title.vi |
No | When operation.kind is createBatch: string |
operation.draft.translation.title.ru |
No | When operation.kind is createBatch: string |
operation.draft.translation.title.it |
No | When operation.kind is createBatch: string |
operation.draft.recurrence |
Yes | When operation.kind is createBatch: one of: CUSTOM, DAILY, WEEKLY (by frequency) |
operation.draft.recurrence.dateRanges |
Yes | When operation.kind is createBatch and operation.draft.recurrence.frequency is CUSTOM: array; items: string; pattern ^\d{4}-\d{2}-\d{2}$; min items 1; max items 31 |
operation.draft.recurrence.start |
Yes | When operation.kind is createBatch and operation.draft.recurrence.frequency is DAILY: string; pattern ^\d{4}-\d{2}-\d{2}$ |
operation.draft.recurrence.until |
Yes | When operation.kind is createBatch and operation.draft.recurrence.frequency is DAILY: string; pattern ^\d{4}-\d{2}-\d{2}$ |
operation.draft.recurrence.start |
Yes | When operation.kind is createBatch and operation.draft.recurrence.frequency is WEEKLY: string; pattern ^\d{4}-\d{2}-\d{2}$ |
operation.draft.recurrence.until |
Yes | When operation.kind is createBatch and operation.draft.recurrence.frequency is WEEKLY: string; pattern ^\d{4}-\d{2}-\d{2}$ |
operation.draft.recurrence.byDay |
Yes | When operation.kind is createBatch and operation.draft.recurrence.frequency is WEEKLY: array; items: Sun, Mon, Tue, Wed, Thu, Fri, Sat; min items 1; max items 7 |
operation.confirmation |
Yes | When operation.kind is createBatch: CREATE_SCHEDULES |
operation.scheduleIds |
Yes | When operation.kind is editMany: array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
operation.settings |
Yes | When operation.kind is editMany: object |
operation.settings.title |
No | When operation.kind is editMany: string; min length 1; max length 80 |
operation.settings.startAtTime |
No | When operation.kind is editMany: string; pattern ^(?:[01]\d|2[0-3]):[0-5]\d:00$ |
operation.settings.duration |
No | When operation.kind is editMany: integer; minimum 1; maximum 300 |
operation.settings.limitPurchaseQuantity |
No | When operation.kind is editMany: integer; minimum 1; maximum 300 or null |
operation.settings.translation |
No | When operation.kind is editMany: object |
operation.settings.translation.title |
Yes | When operation.kind is editMany: object |
operation.settings.translation.title.ko |
No | When operation.kind is editMany: string |
operation.settings.translation.title.en |
No | When operation.kind is editMany: string |
operation.settings.translation.title.ja |
No | When operation.kind is editMany: string |
operation.settings.translation.title.zh |
No | When operation.kind is editMany: string |
operation.settings.translation.title.zh-Hant |
No | When operation.kind is editMany: string |
operation.settings.translation.title.fr |
No | When operation.kind is editMany: string |
operation.settings.translation.title.es |
No | When operation.kind is editMany: string |
operation.settings.translation.title.vi |
No | When operation.kind is editMany: string |
operation.settings.translation.title.ru |
No | When operation.kind is editMany: string |
operation.settings.translation.title.it |
No | When operation.kind is editMany: string |
operation.confirmation |
Yes | When operation.kind is editMany: EDIT_SCHEDULES |
operation.scheduleIds |
Yes | When operation.kind is publication: array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
operation.isPublished |
Yes | When operation.kind is publication: boolean |
operation.confirmation |
Yes | When operation.kind is publication: CHANGE_SCHEDULE_PUBLICATION |
operation.scheduleIds |
Yes | When operation.kind is availability: array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
operation.availabilityStatus |
Yes | When operation.kind is availability: NORMAL, FORBIDDEN, NOT_AVAILABLE |
operation.confirmation |
Yes | When operation.kind is availability: CHANGE_SCHEDULE_AVAILABILITY |
operation.scheduleIds |
Yes | When operation.kind is deleteMany: array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 100 |
operation.confirmation |
Yes | When operation.kind is deleteMany: DELETE_SCHEDULES |
requestId |
Yes | string; pattern ^[A-Za-z0-9_-]{8,80}$; Reuse this requestId and the exact original input after interruption. Never change requestId to retry an uncertain write. |
expectedRevision |
Yes | string; pattern ^[a-f0-9]{64}$; Exact revision returned by the matching read for this channel, installed pApp and resource. |
dryRun |
No | boolean; default false |
Results and recovery
For create/edit use the returned taskType commerce-ticket-schedule and original taskId. Selected metadata edits use the editMany task and shared edit guard. Policies use the separate policy recovery task; createBatch uses batch recovery. The following result table describes single create/edit. The shared host stores one validated operation under this namespace. Its request is reconstructed from typed input and verified state rather than trusting arbitrary journal request data.
| Result/state | Meaning and next step |
|---|---|
| COMMERCE_OPERATION_PLAN | A fresh dry-run preview, or a historical plan for an existing task. Inspect dryRun/historical; it proves no save. |
| COMMERCE_OPERATION_COMPLETE | Stable requested/preserved configuration matches. phase:done, noop, saveAcknowledged, revision and verification distinguish the observed result. |
| COMMERCE_OPERATION_PENDING | Keep the original task. lastCode explains missing creation identity, readback mismatch or another unresolved effect. Never resend under a new ID. |
| COMMERCE_JOURNAL_PERSISTENCE_FAILED | Storage could not confirm the journal. Preserve the uncertain task and inspect; it is not permission to recreate. |
| COMMERCE_CONFLICT / COMMERCE_CHANGED | A stale revision or changing observation prevented a reliable new plan. Re-read before a new unsent operation. |
| TASK_STATE_UNVERIFIED / REQUEST_ID_CONFLICT | Saved context/input/plan is inconsistent, or the request ID belongs to different input. Do not edit the journal to bypass it. |
The phases are prepared, sent and done. Before sending prepared work, identical apply revalidates the same snapshot and reconstructed request, then saves sent before dispatch. Sent does not alone prove an effect. Creation without a durable receipt remains COMMERCE_CREATE_UNKNOWN and cannot be recovered by finding a similarly named schedule. With a saved receipt, recovery reads that exact identity; partial effects stay pending without replay.
Shared task resume is observation-only. Sent apply retries/resume read only and never dispatch again. Status and completed replays are historical, with current confirmation false and no fresh link. New inputs retain source text limits while old journal identity remains preserved; a malformed or no-longer-valid prepared record is not silently rewritten.
writesPerformed is false for no-op/prepared state, true for an acknowledged sent effect and null when sent acknowledgement is unknown. No automatic rollback, recreation or cleanup is provided.
Schedule console destinations
| Current result | Destination below the exact channel's p-apps/E00003/ | Human action |
|---|---|---|
| Bounded list | schedules?hallId=... with optional eventId | Reselect requested dates, publication filter and calendar/list mode. |
| Fresh create preparation or create dry run | schedules/create | Select the observed dependencies and draft in the source wizard; the URL does not prefill them. |
| Edit inspection/preparation/no-op or completed create/edit | schedules | Select the exact observed/returned schedule and open its metadata modal; current filters may hide it. |
| Fresh createBatch preparation/dry run or confirmed batch completion | schedules | Reselect event, hall, dates, publication and filters; inspect each exact returned ID after completion. No query or multi-ID route is supplied. |
| Pending, error, status or historical replay | No current verified link | Preserve the original task; a stored URL is not current-state confirmation. |
Follow the single validated returned URL rather than constructing routes or replacing the channel. The host checks creation dependencies or exact schedule identity/counts before choosing the destination. A parent list is not a detail route and does not prove a mutation. Multiple-date creation is connected by the createBatch continuation below. The policy continuation below adds bounded replacement/refresh; a list response still cannot prepare either mutation.
Complete dry-run examples
Use a revision from the getter with the identical complete operation. The all-zero revisions and IDs below are placeholders, not recorded calls.
Preview one schedule creation.
{
"channelCode": "selected-channel",
"pAppCode": "E00003",
"eventId": "event-example",
"hallId": "hall-example",
"operation": {
"kind": "create",
"confirmation": "CREATE_SCHEDULE",
"draft": {
"title": "Evening session",
"startTime": "2026-11-01T10:00:00Z",
"duration": 90,
"limitPurchaseQuantity": null,
"seatTemplateId": "template-example",
"eventPolicyIds": [
"policy-example"
]
}
},
"requestId": "ticket-schedule-example-001",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
Preview creation with the selected initial parked seat.
{
"channelCode": "selected-channel",
"pAppCode": "E00003",
"eventId": "event-example",
"hallId": "hall-example",
"operation": {
"kind": "create",
"confirmation": "CREATE_SCHEDULE",
"draft": {
"title": "Evening session",
"startTime": "2026-11-01T10:00:00Z",
"duration": 90,
"limitPurchaseQuantity": null,
"seatTemplateId": "template-example",
"eventPolicyIds": [
"policy-example"
],
"parkedSeats": [
{
"seatId": "seat-example",
"parking": {
"type": "DEACTIVATED",
"memo": "Maintenance"
}
}
]
}
},
"requestId": "ticket-schedule-example-002",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
Preview a prepared combined edit.
{
"channelCode": "selected-channel",
"pAppCode": "E00003",
"eventId": "event-example",
"hallId": "hall-example",
"operation": {
"kind": "edit",
"scheduleId": "schedule-example",
"settings": {
"title": "Evening session",
"time": {
"startTime": "2026-11-01T11:00:00Z",
"duration": 90
},
"limitPurchaseQuantity": null,
"isPublished": false,
"availabilityStatus": "FORBIDDEN"
}
},
"requestId": "ticket-schedule-example-003",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
Apply schedule policy changes
First use policy preparation on the same getter. Copy the complete policies operation unchanged, its revision into expectedRevision and one stable requestId. OVERRIDE replaces the full ordered list (including explicit empty clearing); CHANGE refreshes selected already-applied policies while retaining each schedule's order and unselected policies. Neither operation is a per-item override reset or price-overridden parking release.
Preview a replacement/reorder:
{
"channelCode": "selected-channel",
"pAppCode": "E00003",
"hallId": "observed-hall",
"eventId": "observed-event",
"operation": {
"kind": "policies",
"scheduleIds": [
"schedule-one",
"schedule-two"
],
"eventPolicyIds": [
"policy-two",
"policy-one"
],
"patchOption": "OVERRIDE",
"confirmation": "PATCH_SCHEDULE_POLICIES"
},
"requestId": "schedule-policy-override-001",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
Preview explicit clearing:
{
"channelCode": "selected-channel",
"pAppCode": "E00003",
"hallId": "observed-hall",
"eventId": "observed-event",
"operation": {
"kind": "policies",
"scheduleIds": [
"schedule-one"
],
"eventPolicyIds": [],
"patchOption": "OVERRIDE",
"confirmation": "PATCH_SCHEDULE_POLICIES"
},
"requestId": "schedule-policy-clear-001",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
Apply selected-policy refresh after its matching preparation:
{
"channelCode": "selected-channel",
"pAppCode": "E00003",
"hallId": "observed-hall",
"eventId": "observed-event",
"operation": {
"kind": "policies",
"scheduleIds": [
"schedule-one",
"schedule-two"
],
"eventPolicyIds": [
"policy-one"
],
"patchOption": "CHANGE",
"confirmation": "PATCH_SCHEDULE_POLICIES"
},
"requestId": "schedule-policy-refresh-001",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": false
}
Replace the illustrative IDs and all-zero revision with observed values. Dry-run false is an intentional configuration save; these examples are input shapes, not executed requests.
One dispatch and readback
The sole write is one BOOK_AND_TICKET_V3 POST /seller/api/v3/schedules/dispatch with action PATCH_EVENT_POLICY and the exact ordered scheduleIds/eventPolicyIds/patchOption. It uses the selected installation's verified consumer context and no query. The source UI's acknowledgement does not supply a consumed worker identity. This workflow does not require or trust the declared schedule-array receipt as completion: a resolved transport records saveAcknowledged, then fresh state must match.
Verification checks every selected schedule's applied policy order, names and explicit tier-price identity/currency/amount. Policy order is significant; price rows are canonicalized by identity. Retained policy/price identities keep unknown metadata already present in their projections. An unrecognized extra field in a newly applied projection or another unexpected change remains unconfirmed. Selected source policies and source event must remain stable. Other schedule configuration, seats/tiers, hall/event/template data and returned counts are preserved except permitted volatile timestamps. CHANGE preserves unselected policy projections completely.
Bulk status is checked before and after each observation. Any REQUESTED record keeps sent work pending. A newly observed failed/rejected record, identified relative to the prepared snapshot and referencing a selected schedule, also prevents completion. Global DONE or an empty requested group is not enough: bulkStatus.jobCorrelationVerified remains false, and exact stable schedule readback is required.
Partial application, unreadable state, dependency changes or preservation mismatches stay pending. This verifies schedule configuration only; it does not read every ticket sheet/slot, prove issued-price propagation, expand sparse inheritance or establish checkout/visitor behavior. It does not verify unselected schedules.
Policy journal and recovery
Use the returned taskType commerce-ticket-schedule-policies with the original taskId. This is a separate internal journal and workflow instance from commerce-ticket-schedule create/edit and commerce-ticket-operation seat actions. The same public getter/apply pair dispatches to this canonical policy instance, and shared status/resume uses the same store. Do not substitute an older task type or rewrite a create/edit journal.
A fresh dry run returns COMMERCE_OPERATION_PLAN with current schedules/selection, request or null, noop, dryRun:true and writesPerformed:false; it creates no saved task. A matching real operation persists a done no-op without POST. A changed operation saves prepared, rereads the same business snapshot, persists sent before the one dispatch and proceeds to readback. The same prepared snapshot is not permission to ignore another writer's changes.
Policy status is historical; shared policy resume only observes. Prepared work requires identical original apply after guards. Sent apply retries and resume never repeat PATCH_EVENT_POLICY, including after lost acknowledgement, partial effects, busy status or receipt uncertainty. Known schedule IDs support readback without inventing a worker receipt. Do not replace requestId or change selection to bypass an unresolved attempt.
COMMERCE_OPERATION_COMPLETE requires matching readback and phase done. COMMERCE_OPERATION_PENDING retains lastCode such as TICKET_SCHEDULE_POLICIES_BUSY or COMMERCE_READBACK_MISMATCH. COMMERCE_CHANGED/COMMERCE_CONFLICT block stale observations, and TICKET_SCHEDULE_POLICIES_UNVERIFIED rejects unsupported source state. TASK_STATE_UNVERIFIED/REQUEST_ID_CONFLICT protect saved identity; COMMERCE_JOURNAL_PERSISTENCE_FAILED leaves storage uncertainty explicit. Inspect status, phase, journalPersistence and verification together.
Normal task results use writesPerformed:false for no-op/prepared, true for acknowledged work and null when a sent acknowledgement is unknown. These values do not prove current success or a new write by this call. Historical status/completed replay has writesPerformedThisCall:false and current verification false; an existing task's dry run is a historical plan. Read the exact selection again for current state.
Destination and restoration limits
Current policy preparation, fresh plans, no-ops and verified saves use the surviving list /channels/{channelCode}/p-apps/E00003/schedules?hallId={hallId}&eventId={eventId}. The host checks selected channel/installation, schedule identities and same parents before returning one validated URL. The URL cannot restore dates, publication filter, view, schedule selection or the modal; choose them again. Pending/errors and historical results provide no current verified destination.
There is no automatic rollback. A reverse selection is a fresh operation using current source policies; if their definitions changed, it cannot promise to restore an earlier embedded price/name snapshot. Raw timestamps, issued prices, ticket history and visitor effects are not restored by configuration equality. Cross-event batches, sparse price inheritance and price-overridden parking release remain unsupported or unresolved.
Apply multiple-date schedule creation
This extends the existing get/apply pair; no public batch method is added.
Prepare createBatch, then repeat the exact channelCode, pAppCode:E00003, eventId, hallId and operation with a stable requestId and the getter revision as expectedRevision. operation contains kind:createBatch, confirmation:CREATE_SCHEDULES and draft. A list response cannot prepare creation. Changed dates, weekday order, parking, policies or other draft values need a new preparation rather than a substituted revision. dryRun defaults to false; inspect dryRun:true first.
A fresh dry run returns COMMERCE_OPERATION_PLAN with dryRun:true, ordered occurrences, request, timeBasis and writesPerformed:false, without creating a task. Creation is never a same-title no-op. The real operation persists prepared, rechecks the same dependencies/plan, then durably marks sent before one BOOK_AND_TICKET_V3 POST to /seller/api/v3/schedules/dispatch. Its action is CREATE_LOOP. CUSTOM generates sorted dateRanges and first/last start/until; DAILY/WEEKLY retain their validated inclusive bounds. interval:1, UTC time, duration and source initial-parking rows are generated internally. No arbitrary route, body, query or header override is accepted.
Complete receipts and occurrence verification
The source response must contain the complete CREATE_LOOP result array. Each requested occurrence needs exactly one unique authoritative scheduleId and its exact start time, with the correct consumer/event/hall/template. Response order may differ; the workflow maps it to requested chronological order. Missing, extra, duplicate, foreign or partial identities cannot complete the operation. Acknowledgement alone is insufficient, and no list difference, title match or caller-provided ID can replace the receipt set.
The complete receipt set is persisted before detail reads. The workflow reads every exact returned schedule twice and verifies all requested fields, template seats/capacity, selected policy prices and unchanged dependencies. When parkedSeats was supplied, it also reads the complete sheet for every occurrence (at most 500 rows per sheet), checking unique identities, selected PARKING type/memo/source metadata and remaining ONLINE rows. Buyer, purchased or printed state cannot be silently adopted as initial parking. An isPaid price flag alone is not evidence of a purchase.
If even one occurrence or preserved dependency differs, the whole task stays pending. This is all-or-pending verification, not an atomic creation guarantee: partial service effects may already exist. Never repeat the batch or create a supposedly missing subset. No automatic rollback or cleanup is provided.
Batch results and recovery
Use the returned taskType commerce-ticket-schedule-batch and original taskId. This canonical root store is separate from commerce-ticket-schedule for single create/edit and commerce-ticket-schedule-policies. Shared get/apply and recovery use the same injected batch instance. Public operation is unwrapped into the original flat journal input; draft and confirmation remain at that internal root. Existing fingerprints, revisions, request digests, before snapshots, receipt sets and prepared/sent/done records are preserved without migration. Do not wrap or manually rewrite an old journal.
| Result/state | Meaning and permitted action |
|---|---|
| COMMERCE_OPERATION_COMPLETE with phase:done | Every occurrence matched. occurrences includes each exact scheduleId and schedule in chronological order. Fresh verification.confirmed is true, while atomicSnapshot and causalityVerified remain false. No single scheduleId or edit revision represents the batch; prepare later edits separately. |
| COMMERCE_OPERATION_PENDING | Inspect lastCode and preserve the original task. Missing complete identity is COMMERCE_CREATE_UNKNOWN; malformed response handling may retain COMMERCE_OPERATION_FAILED. Changed or mismatched reads retain COMMERCE_CHANGED or COMMERCE_READBACK_MISMATCH. No recreation is authorized. |
| COMMERCE_JOURNAL_PERSISTENCE_FAILED | journalPersistence.saved:false leaves saved progress uncertain; preserve it for inspection. It is not permission to resend. |
| COMMERCE_CONFLICT / REQUEST_ID_CONFLICT / TASK_STATE_UNVERIFIED | The preparation is stale, the request ID has different input, or the saved identity/plan is inconsistent. Do not alter the journal or use a fresh ID to bypass uncertainty. |
Shared batch task resume is observation-only. Prepared resume returns stored progress with writesPerformedThisCall:false; only identical original apply may send after fresh checks. Sent resume and identical sent apply only inspect the durable complete receipt set and never dispatch another creation. Missing receipts require operator inspection rather than adoption or partial retry. Current channel/installation/context and authority must still match.
Status and completed replays are historical, with verification.confirmed:false and storedCompletion indicating prior completion. writesPerformed is false for prepared, true after acknowledgement and null for sent work without acknowledgement; it describes saved progress, not a new write or proof of completion. An existing task's dry run is also historical. Preserve the original request even if saveAcknowledged is true but receipts/readback are incomplete.
Fresh batch preparation, dry run and confirmed completion use only /channels/{channelCode}/p-apps/E00003/schedules. There is no hall/event/date query, multi-schedule detail URL or restored modal state. Follow the single returned link and reselect event, hall, dates, publication and filters; use every exact returned ID when inspecting completion. Pending/historical results have no fresh verified link.
Actual authenticated MCP, original-console before/after/readback and cleanup/retention remain unverified. Configuration matching does not prove generated ticket slots, public availability, member booking, payment, issuance, redemption or notification.
Complete batch dry-run examples
These match the three preparation selections. Replace each placeholder expectedRevision with that exact getter's revision and use observed IDs. The all-zero revision is not usable evidence of preparation. Changing dryRun to false requests the real write and requires authorization for the intended creation.
CUSTOM.
{
"channelCode": "channel98",
"pAppCode": "E00003",
"eventId": "event-example",
"hallId": "hall-example",
"operation": {
"kind": "createBatch",
"confirmation": "CREATE_SCHEDULES",
"draft": {
"title": "Evening performance",
"startAtTime": "15:30:00",
"duration": 90,
"limitPurchaseQuantity": null,
"seatTemplateId": "template-example",
"eventPolicyIds": [
"policy-example"
],
"recurrence": {
"frequency": "CUSTOM",
"dateRanges": [
"2026-11-08",
"2026-11-01"
]
}
}
},
"requestId": "schedule-batch-custom-example",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
DAILY.
{
"channelCode": "channel98",
"pAppCode": "E00003",
"eventId": "event-example",
"hallId": "hall-example",
"operation": {
"kind": "createBatch",
"confirmation": "CREATE_SCHEDULES",
"draft": {
"title": "Evening performance",
"startAtTime": "15:30:00",
"duration": 90,
"limitPurchaseQuantity": null,
"seatTemplateId": "template-example",
"eventPolicyIds": [
"policy-example"
],
"recurrence": {
"frequency": "DAILY",
"start": "2026-11-01",
"until": "2026-11-03"
}
}
},
"requestId": "schedule-batch-daily-example",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
WEEKLY with the same initial parking on both occurrences.
{
"channelCode": "channel98",
"pAppCode": "E00003",
"eventId": "event-example",
"hallId": "hall-example",
"operation": {
"kind": "createBatch",
"confirmation": "CREATE_SCHEDULES",
"draft": {
"title": "Evening performance",
"startAtTime": "15:30:00",
"duration": 90,
"limitPurchaseQuantity": null,
"seatTemplateId": "template-example",
"eventPolicyIds": [
"policy-example"
],
"recurrence": {
"frequency": "WEEKLY",
"start": "2026-11-01",
"until": "2026-11-08",
"byDay": [
"Sun"
]
},
"parkedSeats": [
{
"seatId": "seat-example",
"parking": {
"type": "EXTERNAL",
"memo": "Allocation"
}
}
]
}
},
"requestId": "schedule-batch-weekly-example",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
Edit selected schedule metadata
The existing tools, guarded transport, canonical task recovery and parent navigation are connected in source.
Prepare operation.kind:editMany, then preserve its exact channelCode, pAppCode:E00003, hallId, eventId, ordered scheduleIds, settings and confirmation:EDIT_SCHEDULES. Supply its revision as expectedRevision and a stable requestId; dryRun defaults to false. List, single-edit, batch-create and policy revisions are not substitutes. The existing request-ID and revision formats apply.
A fresh dry run returns COMMERCE_OPERATION_PLAN with request/null, noop, complete selection and per-target values, writesPerformed:false and no saved task. Fully matching real input produces a done no-op without dispatch only after the later guarded no-op checks. Otherwise one BOOK_AND_TICKET_V3 POST /seller/api/v3/schedules/dispatch sends action:PATCH, only changed scheduleIds, chosen fields and offset:0, without query. Clock and duration may be independent; no startTime/date or status field is allowed. Explicit null limit maps to -1; omitted fields are absent from PATCH and must preserve each target's original value.
This is one array PATCH, not a sequence of individual saves. A partial/empty response is not a per-target receipt. The connected transport recognizes only HTTP 200 with the expected data envelope as acknowledgement. An empty HTTP 204 remains uncertain; retain the original task and observe its effects without another PATCH. Actual service response status/body compatibility is unverified. The bridge observes every originally selected target, including no-op rows, and compares requested values and all returned unselected schedule metadata/counts to the immutable originals. A matching title with changed policies, template, seats or counts cannot complete. Unread ticket sheets, issued prices, other parent objects and customer behavior are outside that comparison.
Per-target observations and completion
Results preserve selection:{hallId,eventId,scheduleIds} in original order, including no-op targets. Each target includes scheduleId, before/requested/observed values when available, requestedValuesMatch, preservedValuesMatch, preservation and separate state/execution fields.
| state | Meaning |
|---|---|
| not_sent | The journal is prepared with originals retained; inspect durable guard uncertainty before inferring that a new send is safe. |
| unchanged | Excluded from PATCH and matched the desired/original state in its recorded comparison. |
| observed_complete | Two stable reads matched both requested and preserved values. The resolution may be historical. |
| uncertain | Reads are missing/unstable, requested fields differ or preservation cannot be verified. |
execution is separately not_sent, sent (acknowledged transport) or sent_or_unknown (durable marker with no acknowledgement). An unchanged visible value or missing acknowledgement does not prove non-execution. writesPerformed is false for no-op/prepared, true after acknowledgement and null for an unacknowledged sent attempt; it does not replace per-target readback.
COMMERCE_OPERATION_COMPLETE requires every selected target to match and completion evidence to persist. Partial outcomes retain COMMERCE_OPERATION_PENDING with COMMERCE_PARTIAL_OR_UNCERTAIN or another lastCode. Missing reads and changed observations do not trigger retries. Storage failure remains COMMERCE_JOURNAL_PERSISTENCE_FAILED; guard release failure remains TICKET_EDIT_GUARD_PERSISTENCE_FAILED with confirmation false.
observationScope:stored_resolution identifies a durably stored matching observation, which may come from an earlier attempt. Once resolved, it is retained rather than rereading later changes made by another task. current_attempt identifies the unresolved observation attempt. Overall completion can combine resolutions from different attempts, so atomicity remains not_guaranteed, atomicSnapshot:false and causalityVerified:false. The shared result sets currentStateVerified:false even for a completed operation; confirmation concerns the recorded requested/preserved comparisons, not a fresh snapshot of every target. Historical status/replays have confirmation false. Read current schedule state separately.
Shared single-edit and editMany target protection
The canonical task/store is commerce-ticket-schedule-edit-many; its schedule-edit-guard child is shared with single edit through the same injected instance. Single edit retains taskType:commerce-ticket-schedule. The durable guard identifies the environment, verified consumer and schedule, with the original task type/taskId/fingerprint as owner. A new requestId, refreshed credentials, fresh preparation or subset selection does not evade an unresolved claim.
Claims cover changed IDs and are saved before the sent marker and POST. New single/editMany requests selecting another task's unresolved target fail with TICKET_SCHEDULE_EDIT_PENDING before PATCH. The context lock also serializes disjoint selections while an execution is running. Invalid guard state yields TICKET_EDIT_GUARD_UNVERIFIED; guard-save failure prevents dispatch. Do not delete or expire these records to retry.
Release requires two stable requested-and-preserved observations, durable matching task evidence, then a successful guard update. ACK, elapsed time, a visible original value, new dry run or a fresh request cannot release a claim. Status never releases it; original-task recovery can finish an interrupted release. Released targets may be changed by later tasks while their older resolution remains historical. Never-sent no-op targets have no claim, but still require comparison for the old task; their mismatch does not block an independent edit.
A known sent-marker save failure before dispatch can release the claim when storage permits. If release fails or a crash occurs between claim and sent persistence, a prepared-looking original task must observe only and never infer permission to dispatch again. Preserve the task and guard through uncertainty. Shared task_resume returns historical status for prepared journals without schedule reads or mutation requests. Only an identical original apply can continue unattempted work; an existing durable claim converts that path to observation-only recovery. Sent recovery issues read requests only; it never resends the whole selection or a subset. No automatic rollback is provided.
Scope and pre-upgrade pending work
The later publication continuation also shares this guard. Protection covers single edit, editMany and publication in the same storage namespace. Hosted stores are scoped to one OAuth grant; another grant/client namespace is not coordinated. Policies, seats, parking, prices, availability and other lifecycle flows, external API clients and manual console changes are outside it.
Pre-upgrade pending journals have no claim until enrolled through their original recovery path. There is no automatic inventory or migration. Before enabling new edits in an existing runtime, inspect and settle or explicitly enroll old pending tasks; absence of a guard is not proof that an unresolved old edit is safe. Stale filesystem/database execution locks remain fail-closed for storage-owner inspection, without automatic expiry/deletion. Source integration alone does not authorize rollout.
Use task status and task recovery with the original task identity. The host reconstructs the parent URL from validated hallId/eventId and ordered scheduleIds, checks target count/order and requested/preserved comparisons, and checks it against the returned URL. The link is classified as parent and retains hall/event only; reselect dates, schedules and the metadata modal. Pending, historical, malformed or mismatched selections receive no current result link. A completed result link does not make stored observations current.
Complete editMany dry-run examples
Use the exact matching preparation revision and observed IDs. All-zero revisions below are placeholders. New dry runs do not authorize changes or clear guard claims.
Title only.
{
"channelCode": "channel98",
"pAppCode": "E00003",
"hallId": "hall-example",
"eventId": "event-example",
"operation": {
"kind": "editMany",
"scheduleIds": [
"schedule-example-1",
"schedule-example-2"
],
"settings": {
"title": "Evening show"
},
"confirmation": "EDIT_SCHEDULES"
},
"requestId": "schedule-edit-many-example-1",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
UTC clock only.
{
"channelCode": "channel98",
"pAppCode": "E00003",
"hallId": "hall-example",
"eventId": "event-example",
"operation": {
"kind": "editMany",
"scheduleIds": [
"schedule-example-1",
"schedule-example-2"
],
"settings": {
"startAtTime": "23:30:00"
},
"confirmation": "EDIT_SCHEDULES"
},
"requestId": "schedule-edit-many-example-2",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
Duration and unlimited purchase limit.
{
"channelCode": "channel98",
"pAppCode": "E00003",
"hallId": "hall-example",
"eventId": "event-example",
"operation": {
"kind": "editMany",
"scheduleIds": [
"schedule-example-1",
"schedule-example-2"
],
"settings": {
"duration": 90,
"limitPurchaseQuantity": null
},
"confirmation": "EDIT_SCHEDULES"
},
"requestId": "schedule-edit-many-example-3",
"expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
"dryRun": true
}
Change publication for selected schedules
The existing get/apply methods, transport, canonical task guard and publication-aware navigation are connected in source.
Prepare operation.kind:publication, then send the identical selected channel, E00003, hallId/eventId, ordered scheduleIds, explicit isPublished boolean and CHANGE_SCHEDULE_PUBLICATION. Copy that operation's revision into expectedRevision and use a stable requestId. Revision and request-ID formats remain unchanged. Start with dryRun:true; false is the default. There is no new task type: publication shares commerce-ticket-schedule-edit-many with metadata editMany, while single edit retains commerce-ticket-schedule.
A fresh dry run returns COMMERCE_OPERATION_PLAN with complete selection, before/requested values, request/null, noop and writesPerformed:false. It creates no journal and grants no future admission. Real apply sends at most one BOOK_AND_TICKET_V3 POST /seller/api/v3/schedules/dispatch with {action:"STATUS",request:{scheduleIds,isPublished}}. Only changed IDs are sent, in selection order; already-matching targets remain in results. No query, header override, offset, metadata settings or availabilityStatus is part of this request.
The current HTTP200/data rule is unchanged. An ACK, partial response array or empty response is not per-target proof or an atomic receipt. An empty204 or lost response remains uncertain until observation of the original task. Neither whole-set nor subset STATUS is repeated after the sent boundary.
Readback checks the requested boolean and all preserved returned business fields: title, times/duration, purchase limit, availability, parent/template, policies, prices, seating and counts, subject to existing timestamp normalization. Every original selected target is retained, including no-ops. A correct publication flag with changed unrelated fields cannot establish success. No ticket-sheet propagation, visitor exposure, cache invalidation, notification or purchase-access outcome follows from stored values alone.
Matching values still check pending work
It rereads the stable business snapshot inside that lock and requires the reconstructed request to remain null. An existing pending claim rejects the request even when the visible flag already equals the requested value. Rejected no-ops create no completed journal and neither alter the original task evidence nor write/release its claims.
This admission also applies to metadata editMany and protected single-edit no-ops. A new requestId, subset, inverse boolean, new revision or refreshed credential cannot bypass a claim in the same namespace. Get/dryRun and historical completed replays are not new admission or a way to clear pending work. Once the original task durably resolves and releases its claim, a fresh still-matching operation may complete without dispatch. Old completed records are not rewritten or retroactively approved.
Target results and original-task recovery
Results use operationKind:publication, the complete original selection and the same per-target comparisons as editMany. state (not_sent, unchanged, observed_complete, uncertain), execution (not_sent, sent, sent_or_unknown), requestedValuesMatch and preservedValuesMatch remain distinct. An unchanged row was omitted from STATUS; it still needs its recorded preservation comparison. COMMERCE_OPERATION_COMPLETE requires all requested/preserved comparisons and durable completion; partial or missing evidence remains pending.
observationScope:stored_resolution can retain a previously resolved target while current_attempt checks remaining uncertainty. Overall completion can combine different observation times; atomicity is not_guaranteed and causalityVerified:false. Historical status/completed replays have current confirmation false and no fresh result link. Read current business state separately.
Retain taskType:commerce-ticket-schedule-edit-many and the original taskId. Shared task_resume never dispatches prepared work; only identical original apply may continue an unattempted stage after checks. A durable claim beside a prepared-looking journal requires observation-only recovery. Sent work only observes unresolved targets; it never repeats STATUS. Claims release only after stable requested/preserved observations and durable evidence, not after ACK, elapsed time, dryRun or a new no-op. Preserve journals and guards after persistence failures.
The single/editMany/publication guard applies within the same backend/grant namespace. Other grants/clients, manual console changes, policies, prices, seats/parking, availability and other lifecycle operations are outside it.
Original screen and restoration
The shared host independently reconstructs /channels/{channelCode}/p-apps/E00003/schedules?hallId={hallId}&eventId={eventId} from validated parents and compares the incoming destination. It verifies publication-only requested changes, selection count/order, exact outgoing request and completed comparisons. Unknown operations, mismatches, pending/historical results and extra URL state receive no successful link. Follow the one returned parent URL and manually reselect dates, schedules and the publication dropdown.
There is no automatic rollback or mixed-selection inverse. After the original task resolves, use each target's before.isPublished to group exact IDs by their original boolean, prepare fresh explicit requests for those groups and verify again. Applying the opposite boolean to every member of a mixed original set is not restoration. Resetting the flag cannot undo past exposure, cached copies, bookings, notifications or other downstream effects. Actual restoration remains unverified.
Publication dry-run examples
These examples are plans only. Replace the all-zero revision with the matching publication preparation revision and use observed channel/parent/schedule identities. The same operation must be used for preparation and apply.
{"channelCode":"selected-channel","pAppCode":"E00003","hallId":"observed-hall","eventId":"observed-event","operation":{"kind":"publication","scheduleIds":["schedule-one","schedule-two"],"isPublished":true,"confirmation":"CHANGE_SCHEDULE_PUBLICATION"},"expectedRevision":"0000000000000000000000000000000000000000000000000000000000000000","requestId":"schedule-publish-001","dryRun":true}
{"channelCode":"selected-channel","pAppCode":"E00003","hallId":"observed-hall","eventId":"observed-event","operation":{"kind":"publication","scheduleIds":["schedule-one"],"isPublished":false,"confirmation":"CHANGE_SCHEDULE_PUBLICATION"},"expectedRevision":"0000000000000000000000000000000000000000000000000000000000000000","requestId":"schedule-private-001","dryRun":true}
Earlier failed candidates and rollout HOLD are not closed by these examples.