The dependabot PR that bumped solid_queue and importmap-rails accidentally
dropped the platform variants for thruster 0.1.18 from Gemfile.saas.lock,
causing "Unsupported platform: x86_64-linux" boot failures on production.
* mobile/search-scrolling:
Mobile: improve search screen (#2636)
Document has_attachments in API card responses (#2523)
Change exceeding and nearing limits to account for the 1000th card (#2345)
Include concrete example motivating this module file
Simplify comment in skip-detached override
Extract detached-blob guard into its own file
Skip AnalyzeJob when blob has no attachments
Allow notice to take more inline space
Fix small documentation typos
Display the save form button on Board Settings page as a bridge button
billing.rb: destroy -> destroy!
Strip whitespace from webhook URLs
Add test for webhook URL with trailing whitespace
* main:
Mobile: improve search screen (#2636)
Document has_attachments in API card responses (#2523)
Change exceeding and nearing limits to account for the 1000th card (#2345)
Include concrete example motivating this module file
Simplify comment in skip-detached override
Extract detached-blob guard into its own file
Skip AnalyzeJob when blob has no attachments
Allow notice to take more inline space
Fix small documentation typos
Display the save form button on Board Settings page as a bridge button
billing.rb: destroy -> destroy!
Strip whitespace from webhook URLs
Add test for webhook URL with trailing whitespace
* Change exceeding and nearing limits to account for the 1000th card (instead of 1001)
* Add boundary condition tests for card limit checks
Tests now verify behavior at exactly the limit (1000 cards) and at the
nearing threshold (remaining = 100), covering the off-by-one fix.
---------
Co-authored-by: Jorge Manrubia <jorge@37signals.com>
Separate the attachment existence check from the broadcast suppression
override so each file has a single responsibility. The guard now lives
in ActiveStorageAnalyzeJobSkipDetached with its own documentation
explaining the upload-then-delete race condition.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Upload-then-delete races cause AnalyzeJob to hit S3 after PurgeJob has
already removed the object, producing Aws::S3::Errors::NoSuchKey noise
in solid_queue_failed_executions. Since PurgeOnLastAttachment destroys
the attachment row before enqueueing PurgeJob, checking
blob.attachments.exists? catches this — a fast DB query that avoids the
S3 round-trip entirely.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>