Skip to content

fix(cloud_validation): match rehearsals by completion time, not a skewed created_at - #322

Merged
Jammy2211 merged 1 commit into
mainfrom
feature/heart-rehearsal-clock-skew
Nov 1, 2026
Merged

Jammy2211 merged 1 commit into
mainfrom
feature/heart-rehearsal-clock-skew

Conversation

@Jammy2211

Copy link
Copy Markdown
Contributor

Summary

Closes #321. On 2026-11-01, GitHub reported PyAutoHands rehearsal run 41290559836 as created 09:50:55Z but updated 09:09:27Z: every start stamp was an hour late (US DST-end day). cloud_validation.collect() skipped candidates whose created_at was later than the integrate start, so the valid rehearsal for v2026.11.1.1.dev85301 was discarded. The board went STALE ("release validation incomplete: no rehearsal for current source") even though integrate 41291876649 passed.

The producer's start is now the earlier of created_at and updated_at, because a run cannot finish before it was created. This applies to both the candidate prefilter and the report timestamp.

API Changes

None public. Adds the private helper cloud_validation._effective_created(run). The collect() signature and output schema are unchanged. Every identity check, and matching_rehearsal()'s produced <= integrate start guard, is unchanged: a rehearsal that really finished after the integrate started is still rejected.

Test Plan

  • test_skewed_start_stamp_does_not_hide_a_finished_rehearsal uses run 41290559836's timestamp shape. It fails on main (ea6c1b4) and passes with the fix: matched, pass, and the report is not dated after the integrate start.
  • test_skewed_start_stamp_cannot_admit_a_later_rehearsal: a rehearsal with a skewed stamp that finished after the integrate stays incomplete.
  • Full Heart suite: 1313 passed.
  • After the merge, the next Heart Health cloud tick re-judges the live rehearsal/integrate chain.

Heart: STALE (release), with only the reason this PR addresses. The human acknowledged it live at ship time.

Generated by the PyAutoLabs agent workflow.


Generated by Claude Code

…wed created_at

On 2026-11-01 GitHub reported PyAutoHands rehearsal run 41290559836 as
created 09:50:55Z yet updated 09:09:27Z (every start stamp an hour late).
collect() prefiltered candidates on `created > integrate start`, so the
valid rehearsal for v2026.11.1.1.dev85301 was discarded and the board went
STALE ("no rehearsal for current source") although integrate 41291876649
passed.

Use the earlier of created_at and updated_at as the producer's start (a run
cannot finish before it was created), both for the prefilter and for the
report timestamp. Identity checks and matching_rehearsal's
`produced <= integrate start` guard are unchanged, so a rehearsal that
genuinely finished after the integrate started is still rejected.

Closes #321

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016nhQ8QAki1rcqoS951ubcu
@Jammy2211
Jammy2211 merged commit 9f3cbfe into main Nov 1, 2026
2 checks passed
@Jammy2211
Jammy2211 deleted the feature/heart-rehearsal-clock-skew branch November 1, 2026 17:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(cloud_validation): match rehearsals by completion time, not a skewed created_at

2 participants