Skip to content

Fix Garmin dump import fan-out - #1599

Merged
Asherlc merged 12 commits into
mainfrom
Asherlc/garmin-dump-stall-rca
Jul 14, 2026
Merged

Asherlc merged 12 commits into
mainfrom
Asherlc/garmin-dump-stall-rca

Conversation

@Asherlc

@Asherlc Asherlc commented Jul 13, 2026 •

Copy link
Copy Markdown
Owner

Summary

  • Rework Garmin dump import to scan ZIPs from the filesystem and fan out selected FIT entries through BullMQ Flows.
  • Add generic ZIP-entry extraction and FIT import batch aggregation workers, keeping FIT imports ZIP-agnostic.
  • Document the production RCA and add regression coverage for parsing, flow fan-out, extraction, batch aggregation, queue resources, and worker registration.

Validation

  • pnpm lint with repo ClickHouse env
  • pnpm tsc --noEmit
  • packages/server: pnpm tsc --noEmit
  • packages/web: pnpm tsc --noEmit
  • Focused Vitest run for Garmin dump, FIT import, ZIP extraction, queues, and worker registration
  • Focused Vitest run for Cubic follow-ups: Garmin dump, ZIP extraction, FIT batch aggregation, and queues
  • Local Stryker provider run: pnpm exec stryker run stryker.ci.config.json --mutate src/providers/garmin-dump.ts passed with 82.87 mutation score
  • Local Stryker ZIP extractor run: pnpm exec stryker run stryker.ci.config.json --mutate src/jobs/process-zip-entry-extract-job.ts passed with 78.16 mutation score
  • pnpm test failed locally in unrelated packages/server/src/routers/predictions.integration.test.ts because the ClickHouse test container hit its 3 GiB memory limit while rebuilding v_sleep; 771 files passed before the failure.

Summary by CodeRabbit

  • Bug Fixes
    • Prevented Garmin dump import failures caused by large/nested ZIP processing, including safer handling of malformed/oversized entries and reliable temporary-file cleanup.
    • Improved error handling so imports continue when non-critical progress updates fail, and errors are reported more clearly.
  • Improvements / New Features
    • Reworked Garmin dump ingestion to use flow-based, batch FIT importing with dedicated ZIP-entry extraction for nested archives, plus periodic lock renewal during long runs.
  • Tests
    • Added/expanded coverage for batch FIT aggregation, ZIP-entry extraction, and end-to-end Garmin dump flow orchestration.
  • Documentation
    • Recorded an incident baseline describing the original failure and mitigation approach.

Copilot AI review requested due to automatic review settings July 13, 2026 23:28
@codereviewbot-ai

Copy link
Copy Markdown

🤖 Review skipped: Rate limit exceeded. Free accounts are limited to 2 reviews per 4 hours. Upgrade to a paid plan for unlimited reviews.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Sorry @Asherlc, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Jul 13, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Asherlc, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 24 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 8da977bb-5b74-4ab2-a473-72f28f5cb459

📥 Commits

Reviewing files that changed from the base of the PR and between b5c2769 and 2ef9482.

📒 Files selected for processing (4)
  • docs/production-incident-baseline.md
  • src/jobs/process-fit-file-import-job.test.ts
  • src/jobs/process-fit-file-import-job.ts
  • src/jobs/process-zip-entry-extract-job.test.ts
📝 Walkthrough

Walkthrough

Garmin dump processing now streams selected ZIP content to temporary files, supports nested archive extraction, and orchestrates FIT imports through BullMQ flows with batch aggregation, lock renewal, progress handling, and cleanup. Queue infrastructure, workers, tests, and incident documentation are updated.

Changes

Garmin dump import pipeline

Layer / File(s) Summary
Queue and worker infrastructure
src/jobs/queues.ts, src/jobs/worker.ts, src/jobs/process-fit-file-import-batch-job.ts, src/jobs/*test.ts
Adds batch and ZIP-extraction queues, FlowProducer lifecycle management, workers, and validated aggregation of child FIT import results.
Filesystem-backed ZIP extraction
src/jobs/process-zip-entry-extract-job.ts, src/providers/garmin-dump.ts, src/jobs/process-zip-entry-extract-job.test.ts, src/providers/garmin-dump.test.ts
Streams selected entries and nested ZIPs to bounded temporary files, records provenance, and cleans up failed extraction artifacts.
FIT child resolution and batch aggregation
src/jobs/process-fit-file-import-job.ts, src/jobs/process-fit-file-import-batch-job.ts, src/jobs/*test.ts
Resolves FIT paths from extraction children, validates child results, and combines records and errors from FIT imports.
Garmin parsing and import orchestration
src/providers/garmin-dump.ts, src/providers/garmin-dump.test.ts, docs/production-incident-baseline.md
Creates deterministic FIT import flows, renews locks, handles progress and failures, removes temporary directories, and documents the 2026-07-13 incident and mitigation.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant importGarminDumpFile
  participant FlowProducer
  participant processZipEntryExtractJob
  participant processFitFileImportJob
  participant processFitFileImportBatchJob
  importGarminDumpFile->>FlowProducer: create FIT import flow
  FlowProducer->>processZipEntryExtractJob: extract nested FIT entry
  processZipEntryExtractJob-->>processFitFileImportJob: provide extracted filePath
  FlowProducer->>processFitFileImportJob: run FIT import child
  processFitFileImportJob-->>processFitFileImportBatchJob: return import result
  processFitFileImportBatchJob-->>importGarminDumpFile: aggregate child results
Loading

Possibly related issues

  • Asherlc/dofek issue 1582 — Covers the Garmin dump streaming, nested ZIP handling, memory reduction, cleanup, size limits, and regression testing implemented here.

Possibly related PRs

  • Asherlc/dofek#1594 — Changes the related Garmin dump and FIT import job orchestration flow.

Suggested labels: area/providers, type/bug, type/refactor

Suggested reviewers: dependabot[bot]

🚥 Pre-merge checks | ✅ 1 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Title check ⚠️ Warning The title is imperative and concise, but it omits the required area prefix for a server-side change. Rewrite it as something like "[server] Fix Garmin dump import fan-out".
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 13 files

Confidence score: 5/5

  • Safe to merge after the addressed issues were fixed.

You’re at about 98% of the monthly reviewed-line limit. You may want to disable incremental reviews to conserve quota. Reviews will continue until that limit is exceeded. If you need help avoiding interruptions, please contact contact@cubic.dev.

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread src/jobs/process-zip-entry-extract-job.ts Outdated
Comment thread src/providers/garmin-dump.ts Outdated
Comment thread src/providers/garmin-dump.ts Outdated
Comment thread src/providers/garmin-dump.ts Outdated
Comment thread src/jobs/process-fit-file-import-batch-job.test.ts
@codereviewbot-ai

Copy link
Copy Markdown

🤖 Review skipped: Rate limit exceeded. Free accounts are limited to 2 reviews per 4 hours. Upgrade to a paid plan for unlimited reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@Asherlc

Asherlc commented Jul 13, 2026

Copy link
Copy Markdown
Owner Author

Addressed the Cubic review summary from #1599 (review).

  • Fixed nested ZIP extraction limits, upload-scoped flow job IDs, lock-renewal failure handling, parse-failure temp cleanup, and empty batch aggregation coverage.
  • Replied to and resolved each inline thread.
  • Commit: f67820b

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@codereviewbot-ai

Copy link
Copy Markdown

🤖 Review skipped: Rate limit exceeded. Free accounts are limited to 2 reviews per 4 hours. Upgrade to a paid plan for unlimited reviews.

…tall-rca

# Conflicts:
#	src/jobs/process-fit-file-import-job.ts
#	src/providers/garmin-dump.test.ts
#	src/providers/garmin-dump.ts

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@codereviewbot-ai

codereviewbot-ai Bot commented Jul 14, 2026 •

Copy link
Copy Markdown

Pull Request Review Summary

This is an exceptionally well-designed and high-quality Pull Request! It introduces a highly scalable, distributed architecture for importing Garmin dumps using BullMQ flows. By offloading ZIP extraction to a dedicated zip-entry-extract queue and processing FIT imports in parallel, it significantly reduces the memory and disk footprint of the main worker.

Key Findings & Recommendations:

  1. failParentOnFailure: true Error Handling Issue (Actionable Bug):
    We identified a logic inconsistency where setting failParentOnFailure: true on child jobs causes the entire batch to fail and report 0 records synced if even a single FIT file is corrupted. This also makes the test "aggregates child FIT errors from the batch parent result" mock an impossible scenario in production. We've left a detailed inline comment with recommended solutions (either catching errors in the child job or setting failParentOnFailure: false and aggregating results).
  2. Performance & Disk Space Optimization:
    We suggested immediately deleting intermediate nested ZIP files after they are parsed in collectZipEntries. Since the background extraction jobs recursively extract them from the root archive on demand, keeping them on disk during the rest of the import process is unnecessary and can consume up to several gigabytes of disk space.
  3. Security & Robustness:
    The implementation is highly secure against Zip Slip (by using SHA256 hashes of paths as filenames instead of extracting to original paths) and Zip Bomb attacks (by strictly enforcing uncompressed size limits and cumulative extraction limits).

Excellent work on this PR! Once the error handling behavior is addressed, this is ready to merge.


🤖 Reviewed by codereviewbot.ai - Catch bugs before your team does.

Comment thread src/providers/garmin-dump.ts
Comment thread src/providers/garmin-dump.ts
@Asherlc

Asherlc commented Jul 14, 2026

Copy link
Copy Markdown
Owner Author

@CodeRabbit full rereview

@coderabbitai

coderabbitai Bot commented Jul 14, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@codereviewbot-ai

codereviewbot-ai Bot commented Jul 14, 2026 •

Copy link
Copy Markdown

Pull Request Review Summary

The changes in this PR are exceptionally well-designed, robust, and highly optimized.

Key Highlights:

  1. Performance & Disk Space Optimization:

    • Deferring the extraction of .fit files to the background zip-entry-extract jobs on demand completely avoids buffering or writing thousands of files during the initial parsing phase.
    • Deleting intermediate nested .zip files immediately after collecting their entries prevents disk space bloat.
    • Using fitExternalIdFromPath to extract IDs from filenames during parsing avoids reading file contents entirely until the background job runs.
  2. Robust Error Handling:

    • Wrapping processFitFileImportJob in a try...catch block to return a FitFileImportJobResult with errors instead of throwing ensures that individual FIT file failures do not fail the entire parent batch job (Option A from the previous feedback).
    • Temporary directories and files are safely cleaned up in finally blocks, even if errors occur during extraction or parsing.
  3. Excellent Test Coverage:

    • The tests have been updated to match the new error-returning behavior and cover edge cases like multiple extraction results and invalid payloads.

No issues or bugs were found. LGTM!


🤖 Reviewed by codereviewbot.ai - Catch bugs before your team does.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/production-incident-baseline.md`:
- Around line 12884-12929: The incident report’s RCA uses present tense for the
pre-fix behavior and lacks primary-source citations for its operational claims.
Update the Garmin root-cause wording to say it “previously read,” and add
citations linking the referenced Redis stream and Docker inspection artifacts
plus official BullMQ documentation supporting lock renewal, stalled jobs, and
flow behavior. Keep the documented timeline and mitigation details unchanged.

In `@src/jobs/process-fit-file-import-job.ts`:
- Around line 277-288: Update the cleanup flow in processFitFileImportJob so
validation failures from resolveFitFileImportJobData do not leave child
extraction files behind. In the finally block, safely discover all relevant
child extraction paths when cleanupFilePath was not set, then remove them using
the existing cleanup behavior while preserving normal cleanup for resolved
filePath values.

In `@src/jobs/process-zip-entry-extract-job.ts`:
- Around line 172-190: The extraction flow around extractEntryChain currently
writes directly to the deterministic outputPath, making BullMQ replays fail when
that file already exists. First add a regression test that reproduces replaying
an existing output, then extract into a unique temporary file and atomically
move or replace it at the final publish step only after successful extraction;
ensure cleanup and existing success/failure behavior remain intact.

In `@src/providers/garmin-dump.test.ts`:
- Around line 813-851: Update the test around importGarminDumpFile and
flowMock.waitUntilFinished to defer the third extendLock rejection until after
the FIT flow resolves, using a controllable promise or deferred signal. Have the
test release that rejection after waitUntilFinished returns, then assert the
final result still reports the “lost lock” processing error and clears the
renewal interval.

In `@src/providers/garmin-dump.ts`:
- Around line 617-630: Update src/providers/garmin-dump.ts lines 617-630 to
track the active renewal promise, serialize interval-triggered renewals, and
make throwIfFailed() and stop() await that promise before completing while
preserving renewal errors. In src/providers/garmin-dump.test.ts lines 813-851,
add coverage using a deferred renewal that rejects after the FIT flow resolves,
verifying the rejection is awaited and reported.
- Around line 366-374: The summarized-activity extraction path in the Garmin
dump handler must avoid buffering the entire entry. Replace streamToBuffer usage
with direct streaming from openReadStream to the hashed JSON file, while
enforcing an appropriate JSON-specific size limit or incremental parsing and
preserving byte-count accounting via countExtractedBytes.
- Around line 751-758: Update the unexpected-error catch block in the Garmin FIT
import job processing flow to call Sentry.captureException(error) before
converting the failure into the queued SyncError. Preserve the existing
errors.push behavior and error details.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 704bcc11-a736-4636-915b-6ad68b0336c7

📥 Commits

Reviewing files that changed from the base of the PR and between c1f3080 and 3a9f4cd.

📒 Files selected for processing (13)
  • docs/production-incident-baseline.md
  • src/jobs/process-fit-file-import-batch-job.test.ts
  • src/jobs/process-fit-file-import-batch-job.ts
  • src/jobs/process-fit-file-import-job.test.ts
  • src/jobs/process-fit-file-import-job.ts
  • src/jobs/process-zip-entry-extract-job.test.ts
  • src/jobs/process-zip-entry-extract-job.ts
  • src/jobs/queues.test.ts
  • src/jobs/queues.ts
  • src/jobs/worker.test.ts
  • src/jobs/worker.ts
  • src/providers/garmin-dump.test.ts
  • src/providers/garmin-dump.ts

Comment thread docs/production-incident-baseline.md
Comment thread src/jobs/process-fit-file-import-job.ts Outdated
Comment thread src/jobs/process-zip-entry-extract-job.ts
Comment thread src/providers/garmin-dump.test.ts
Comment thread src/providers/garmin-dump.ts Outdated
Comment thread src/providers/garmin-dump.ts
Comment thread src/providers/garmin-dump.ts
@codereviewbot-ai

Copy link
Copy Markdown

🤖 Review skipped: Rate limit exceeded. Free accounts are limited to 2 reviews per 4 hours. Upgrade to a paid plan for unlimited reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@Asherlc
Asherlc enabled auto-merge (squash) July 14, 2026 00:52
@codereviewbot-ai

Copy link
Copy Markdown

🤖 Review skipped: Rate limit exceeded. Free accounts are limited to 2 reviews per 4 hours. Upgrade to a paid plan for unlimited reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@codereviewbot-ai

Copy link
Copy Markdown

🤖 Review skipped: Rate limit exceeded. Free accounts are limited to 2 reviews per 4 hours. Upgrade to a paid plan for unlimited reviews.

@codereviewbot-ai

Copy link
Copy Markdown

🤖 Review skipped: Rate limit exceeded. Free accounts are limited to 2 reviews per 4 hours. Upgrade to a paid plan for unlimited reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@codereviewbot-ai

Copy link
Copy Markdown

🤖 Review skipped: Rate limit exceeded. Free accounts are limited to 2 reviews per 4 hours. Upgrade to a paid plan for unlimited reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/production-incident-baseline.md (1)

12883-12937: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Root Cause paragraph mixes past and present tense describing already-fixed behavior.

"previously read the full uploaded ZIP into memory, recursively buffers every extracted entry into arrays, ... and only extends the BullMQ import-job lock" — buffers/extends should also be past tense (buffered/extended) since the Fix/mitigation bullet confirms this behavior is no longer current. This file already applies the "previously read" convention correctly elsewhere for RCA sections describing fixed code; keep it consistent here.

✏️ Proposed fix
-  into memory, recursively buffers every extracted entry into arrays, including
-  unrelated Garmin account-export payloads and both large nested uploaded-file
-  ZIPs, and only extends the BullMQ import-job lock with a one-shot 10-minute
+  into memory, recursively buffered every extracted entry into arrays, including
+  unrelated Garmin account-export payloads and both large nested uploaded-file
+  ZIPs, and only extended the BullMQ import-job lock with a one-shot 10-minute
   extension.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/production-incident-baseline.md` around lines 12883 - 12937, Update the
Root cause paragraph in the Garmin Dump Import incident entry so the historical
behavior uses past tense consistently: change the descriptions associated with
full ZIP processing to say it “buffered” extracted entries and “extended” the
BullMQ import-job lock only once, while preserving the existing explanation and
Fix / mitigation content.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/jobs/process-fit-file-import-job.ts`:
- Around line 376-380: Update the unlink failure handler in the cleanup loop of
processFitFileImportJob to call Sentry.captureException(error) in addition to
the existing logger.warn, matching the sibling cleanup-discovery catch and
ensuring the caught error is reported without changing the cleanup flow.
- Around line 84-89: Replace the deprecated .passthrough() call in
fitFileImportErrorPathSchema with Zod 4’s non-deprecated loose-object API,
preserving the optional originalPath field and acceptance of unknown properties.

---

Outside diff comments:
In `@docs/production-incident-baseline.md`:
- Around line 12883-12937: Update the Root cause paragraph in the Garmin Dump
Import incident entry so the historical behavior uses past tense consistently:
change the descriptions associated with full ZIP processing to say it “buffered”
extracted entries and “extended” the BullMQ import-job lock only once, while
preserving the existing explanation and Fix / mitigation content.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5c0be368-8a61-4df5-84ec-e15dda7c16f1

📥 Commits

Reviewing files that changed from the base of the PR and between 3a9f4cd and b5c2769.

📒 Files selected for processing (8)
  • docs/production-incident-baseline.md
  • src/jobs/process-fit-file-import-job.test.ts
  • src/jobs/process-fit-file-import-job.ts
  • src/jobs/process-zip-entry-extract-job.test.ts
  • src/jobs/process-zip-entry-extract-job.ts
  • src/jobs/queues.test.ts
  • src/providers/garmin-dump.test.ts
  • src/providers/garmin-dump.ts

Comment thread src/jobs/process-fit-file-import-job.ts Outdated
Comment thread src/jobs/process-fit-file-import-job.ts
@codereviewbot-ai

Copy link
Copy Markdown

🤖 Review skipped: Rate limit exceeded. Free accounts are limited to 2 reviews per 4 hours. Upgrade to a paid plan for unlimited reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@codereviewbot-ai

Copy link
Copy Markdown

🤖 Review skipped: Rate limit exceeded. Free accounts are limited to 2 reviews per 4 hours. Upgrade to a paid plan for unlimited reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Asherlc has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@Asherlc

Asherlc commented Jul 14, 2026

Copy link
Copy Markdown
Owner Author

Addressed CodeRabbit outside-diff review #1599 (review).

Fixed.

  • Updated the Garmin dump incident root-cause paragraph so the historical behavior consistently uses past tense: buffered and extended.
  • Commit: 2ef9482

@Asherlc
Asherlc merged commit 228c775 into main Jul 14, 2026
106 checks passed
@Asherlc
Asherlc deleted the Asherlc/garmin-dump-stall-rca branch July 14, 2026 02:27
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.

2 participants