Skip to content

fix(submit): make replayed history deterministic#444

Open
ShivamB25 wants to merge 6 commits intojunhoyeo:mainfrom
ShivamB25:split/replay-history-hardening
Open

fix(submit): make replayed history deterministic#444
ShivamB25 wants to merge 6 commits intojunhoyeo:mainfrom
ShivamB25:split/replay-history-hardening

Conversation

@ShivamB25
Copy link
Copy Markdown

@ShivamB25 ShivamB25 commented Apr 18, 2026

Summary

  • make replayed submission history deterministic instead of additive
  • remove stale replayed days and recompute timestamp metadata correctly
  • preserve untouched out-of-scope history while fixing in-scope replacements

Changes

  • replace overlapping in-scope replay slices instead of stacking them
  • remove omitted in-scope days from replay windows
  • recompute or clear stale day-level earliest timestamps after replay changes
  • lock the behavior with focused replay regression tests

Testing

  • replay-focused Vitest coverage
  • frontend typecheck
  • frontend build
  • local runtime replay validation against the app and Postgres

Depends on #443
Refs #441

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Apr 18, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
tokscale Ready Ready Preview, Comment Apr 18, 2026 9:18pm

Request Review

@ShivamB25
Copy link
Copy Markdown
Author

This PR is intentionally stacked.

If it were marked as a standalone ready-to-merge change, reviewers would be looking at a diff that conceptually depends on code still under review in the earlier PR(s). Reviewing it in order keeps the trust-boundary changes, replay semantics, and public-surface changes easier to reason about.

@ShivamB25 ShivamB25 marked this pull request as ready for review April 18, 2026 21:36
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 16 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/src/lib/db/helpers.ts">

<violation number="1" location="packages/frontend/src/lib/db/helpers.ts:192">
P1: Incoming replay dates are not filtered by `replayWindow`, so out-of-scope days can still be inserted/updated if upstream input includes them.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

}: PlanSubmittedReplayArgs): PlannedReplayMutations {
const existingByDate = new Map(existingDays.map((day) => [day.date, day]));
const incomingByDate = new Map(incomingDays.map((day) => [day.date, day]));
const replayDates = new Set(incomingDays.map((day) => day.date));
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai Bot Apr 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Incoming replay dates are not filtered by replayWindow, so out-of-scope days can still be inserted/updated if upstream input includes them.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/frontend/src/lib/db/helpers.ts, line 192:

<comment>Incoming replay dates are not filtered by `replayWindow`, so out-of-scope days can still be inserted/updated if upstream input includes them.</comment>

<file context>
@@ -87,6 +148,132 @@ export function mergeClientBreakdowns(
+}: PlanSubmittedReplayArgs): PlannedReplayMutations {
+  const existingByDate = new Map(existingDays.map((day) => [day.date, day]));
+  const incomingByDate = new Map(incomingDays.map((day) => [day.date, day]));
+  const replayDates = new Set(incomingDays.map((day) => day.date));
+
+  for (const existingDay of existingDays) {
</file context>
Suggested change
const replayDates = new Set(incomingDays.map((day) => day.date));
const replayDates = new Set(
incomingDays
.filter((day) => isDateWithinReplayWindow(day.date, replayWindow))
.map((day) => day.date)
);
Fix with Cubic

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.

1 participant