Changes
- Heartbeats no longer grow run history with every call (#870). Each heartbeat still renews the lease, moves the heartbeat deadline and stores the latest progress on the attempt. An
ActivityHeartbeatRecordedevent is written only when progress changed since the last recorded event and at least max(heartbeat timeout, 60 seconds) has passed. Heartbeats without progress write none, and progress not yet recorded is written once when the attempt closes. Run detail, Waterline and history export read the latest progress from the attempt. Liveness, timeouts and retries are unchanged, and older histories replay and export as before. Expect far fewer heartbeat events. - Schedules (#876). Re-applying an unchanged schedule records nothing and keeps the next fire time and its jitter.
changed_fieldslists only real changes, and only a spec or jitter change moves the next fire. Creating a schedule with a taken id, including a deleted ormax_runs_exhaustedone, raisesWorkflow\V2\Exceptions\ScheduleAlreadyExistsException, matching the Server's409 schedule_already_exists. - Operator metrics (#861).
runs.replay_blocked,oldest_replay_blocked_atandmax_replay_blocked_age_mscount open runs whose workflow task cannot replay, and a new advisoryreplay_blocked_runshealth check warns while any exist.
Upgrade
Run migrations. A new migration adds nullable last_heartbeat_progress, last_heartbeat_progress_at and last_heartbeat_recorded_at columns to activity_attempts. It is additive, with no backfill. Dependency floors are unchanged.