feat(canvas): build and securely deliver cloud artifacts - #73874
Merged
trunk-io[bot] merged 60 commits intoAug 3, 2026
Tests (PostHog) / Migration risk
completed
Aug 3, 2026 in 0s
⚠️ Needs review
Summary: 4 Safe | 4 Needs Review | 0 Blocked
⚠️ Needs Review
May have performance impact
canvas.0002_source_version_required
└─ #1 ⚠️ AlterField
Field alteration may cause table locks or data loss (check if changing type or constraints)
model: canvasbuild, field: source_version, field_type: ForeignKey
canvas.0003_migrate_desktop_tree
└─ #1 ⚠️ RunPython: RunPython data migration needs review for performance
canvas.0005_backfill_build_enqueued_at
└─ #1 ⚠️ RunPython: RunPython data migration needs review for performance
canvas.0006_require_build_enqueued_at
└─ #1 ⚠️ AlterField
Field alteration may cause table locks or data loss (check if changing type or constraints)
model: canvasbuild, field: enqueued_at, field_type: DateTimeField
✅ Safe
Brief or no lock, backwards compatible
tasks.0081_channelcontextgeneration_channelinstructions_and_more
└─ #1 ✅ CreateModel
Creating new table is safe
model: ChannelContextGeneration
└─ #2 ✅ CreateModel
Creating new table is safe
model: ChannelInstructions
└─ #3 ✅ CreateModel
Creating new table is safe
model: ChannelStar
│
└──> ℹ️ INFO:
ℹ️ Skipped operations on newly created tables (empty tables
don't cause lock contention).
canvas.0001_initial
└─ #1 ✅ CreateModel
Creating new table is safe
model: Canvas
└─ #2 ✅ CreateModel
Creating new table is safe
model: CanvasBuild
└─ #3 ✅ AddField
Adding nullable field requires brief lock
model: canvas, field: published_build
└─ #4 ✅ CreateModel
Creating new table is safe
model: CanvasSourceVersion
└─ #5 ✅ AddField
Adding nullable field requires brief lock
model: canvasbuild, field: source_version
└─ #6 ✅ AddField
Adding nullable field requires brief lock
model: canvas, field: current_source_version
│
└──> ℹ️ INFO:
ℹ️ Skipped operations on newly created tables (empty tables
don't cause lock contention).
canvas.0004_build_enqueued_at
└─ #1 ✅ AddField
Adding nullable field requires brief lock
model: canvasbuild, field: enqueued_at
posthog.1285_drop_desktop_file_system
└─ #1 ✅ SeparateDatabaseAndState: Only state operations (no database changes)
📚 How to Deploy These Changes Safely
AddField:
This operation acquires a brief lock but doesn't rewrite the table.
Deployment uses lock timeouts with automatic retries, so lock contention will cause retries rather than connection pile-up.
RunPython:
Use batching for large data migrations:
- Use
.iterator()to avoid loading all rows into memory - Use
.bulk_update()instead of saving individual objects - Batch size: 1,000-10,000 rows per batch
- Add pauses between batches
- Consider background jobs for very large updates (millions of rows)
Loading