huskies: merge 538_bug_done_archived_sweep_never_fires_because_stage_done_projection_uses_utc_now_instead_of_real_merged_at_timestamp

This commit is contained in:
dave
2026-04-11 13:25:51 +00:00
parent 5d193bb568
commit 4ab723f40b
5 changed files with 130 additions and 4 deletions
+18 -4
View File
@@ -585,11 +585,19 @@ fn project_stage(view: &PipelineItemView) -> Result<Stage, ProjectionError> {
})
}
"5_done" => {
// Existing CRDT data doesn't carry merge metadata. For projection
// from legacy data, we use epoch/placeholder values. New items
// entering Done via the transition function will carry real data.
// Use the stored merged_at timestamp if present. Legacy items
// that pre-date this field have merged_at = None, so we fall back
// to UNIX_EPOCH, which makes them older than any retention window
// and therefore eligible for immediate sweep to 6_archived.
let merged_at = view
.merged_at
.map(|ts| {
DateTime::from_timestamp(ts as i64, 0)
.unwrap_or(DateTime::<Utc>::UNIX_EPOCH)
})
.unwrap_or(DateTime::<Utc>::UNIX_EPOCH);
Ok(Stage::Done {
merged_at: Utc::now(),
merged_at,
merge_commit: GitSha("legacy".to_string()),
})
}
@@ -1147,6 +1155,7 @@ mod tests {
depends_on: Some(vec![10, 20]),
claimed_by: None,
claimed_at: None,
merged_at: None,
};
let item = PipelineItem::try_from(&view).unwrap();
assert_eq!(item.story_id, StoryId("42_story_test".to_string()));
@@ -1168,6 +1177,7 @@ mod tests {
depends_on: None,
claimed_by: None,
claimed_at: None,
merged_at: None,
};
let item = PipelineItem::try_from(&view).unwrap();
assert!(matches!(item.stage, Stage::Coding));
@@ -1186,6 +1196,7 @@ mod tests {
depends_on: None,
claimed_by: None,
claimed_at: None,
merged_at: None,
};
let item = PipelineItem::try_from(&view).unwrap();
assert!(matches!(item.stage, Stage::Merge { .. }));
@@ -1211,6 +1222,7 @@ mod tests {
depends_on: None,
claimed_by: None,
claimed_at: None,
merged_at: None,
};
let item = PipelineItem::try_from(&view).unwrap();
assert!(matches!(
@@ -1234,6 +1246,7 @@ mod tests {
depends_on: None,
claimed_by: None,
claimed_at: None,
merged_at: None,
};
let item = PipelineItem::try_from(&view).unwrap();
assert!(matches!(
@@ -1257,6 +1270,7 @@ mod tests {
depends_on: None,
claimed_by: None,
claimed_at: None,
merged_at: None,
};
let result = PipelineItem::try_from(&view);
assert!(matches!(