Skip to content

feat(canvas): build and securely deliver cloud artifacts - #73874

Merged
trunk-io[bot] merged 60 commits into
masterfrom
posthog-code/canvas-build-pipeline-phase-6
Aug 3, 2026
Merged

feat(canvas): build and securely deliver cloud artifacts#73874
trunk-io[bot] merged 60 commits into
masterfrom
posthog-code/canvas-build-pipeline-phase-6

fix(canvas): harden artifact delivery boundaries

f7e0e03
Select commit
Loading
Failed to load commit list.
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)

See the migration safety guide