Accepted signals at terminal boundaries
- Give an eligible declared signal an ordered delivery turn before a remote workflow task completes or continues as new.
- Carry eligible pending instance signals across continuation with accepted updates in original command order, preserving IDs, encoded arguments and receipt times. Run-targeted signals keep their selected run.
- Close unresolved accepted signals explicitly as rejected, with reason
run_closed_before_signal_applied, a closure time and a linkedSignalRejectedevent. Original acceptance receipts remain immutable. - Preserve missing legacy declarations as unknown. A receipt alone cannot establish a handler or authorize handoff.
Upgrade order
SignalRejected extends the persisted history enum. Stop and upgrade all embedded/direct-database readers, including Waterline when it shares the database, before enabling the writer. Older Core versions cannot decode this event. Mixed-version reading and rolling back old readers after it is stored are unqualified; repair forward or restore the complete pre-upgrade recovery point.
No database schema or SDK protocol-floor change is required. Service-mode SDKs retain their existing task-completion mechanics.
Verification
The exact source tree passed full MySQL/PostgreSQL/MariaDB features, unit coverage/ratchet, five Laravel upgrade configurations, replay-corpus counterfactuals, quality/security/boundary checks and Sonar (1.0% new duplication, zero open/confirmed issues under unchanged settings). Twelve real normally installed Python SDK cases cover complete/CAN, declared/missing declarations and default/named namespaces. Declared signals apply once; unresolved legacy signals close explicitly with no false application. Original deadlines and database bytes are preserved.
Implementation: #858. Follow-through: #857. Published-package verification and the affected PHP Server image/consumer are recorded there separately; publishing this Core package does not update a pinned image or managed deployment.