molecule-core/platform/migrations
Molecule AI Backend Engineer b021f85af9 feat(channels): per-channel message budget with 429 enforcement (#368)
Add an optional channel_budget (INTEGER, nullable) to workspace_channels
via migration 024. When channel_budget IS NOT NULL and message_count has
reached the budget, the Send handler returns 429 {"error":"channel budget
exceeded"} and aborts before calling SendOutbound.

Implementation details:
- Single SELECT query reads both message_count and channel_budget in one
  round-trip (avoids TOCTOU window between read and write)
- Fail-open on DB error: transient failures log but don't block sends
- Early-return on budget hit is before SendOutbound so message_count
  cannot be incremented past the limit by a concurrent send that slips
  through the window (best-effort; atomic enforcement requires DB-level CAS)
- NULL channel_budget = unlimited (default, backward-compatible)

Migration is idempotent (ADD COLUMN IF NOT EXISTS). Down migration drops
the column cleanly.

Four sqlmock tests cover: at-limit → 429, above-limit → 429, NULL budget
passes through, under-limit passes through.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 11:17:14 +00:00
..
001_workspaces.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
002_agents.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
003_events.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
004_secrets.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
005_canvas_layouts.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
006_workspace_config_memory.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
007_approvals.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
008_agent_memories.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
009_activity_logs.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
010_workspace_awareness.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
011_workspace_runtime.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
012_global_secrets.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
013_workspace_dir.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
014_indexes.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
015_workspace_schedules.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
016_workspace_channels.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
017_memories_fts_namespace.down.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
017_memories_fts_namespace.up.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
018_secrets_encryption_version.down.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
018_secrets_encryption_version.up.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
019_workspace_access.down.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
019_workspace_access.up.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
020_workspace_auth_tokens.down.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
020_workspace_auth_tokens.up.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
021_delegation_idempotency.down.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
021_delegation_idempotency.up.sql initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
022_workspace_schedules_source.down.sql fix(schedules): backfill legacy rows to 'template' + extract import SQL const 2026-04-14 14:30:22 -07:00
022_workspace_schedules_source.up.sql fix(schedules): backfill legacy rows to 'template' + extract import SQL const 2026-04-14 14:30:22 -07:00
023_workspace_memory_version.down.sql feat(memory): optimistic-locking via if_match_version on workspace_memory writes 2026-04-16 02:32:46 -07:00
023_workspace_memory_version.up.sql feat(memory): optimistic-locking via if_match_version on workspace_memory writes 2026-04-16 02:32:46 -07:00
024_channel_budget.down.sql feat(channels): per-channel message budget with 429 enforcement (#368) 2026-04-16 11:17:14 +00:00
024_channel_budget.up.sql feat(channels): per-channel message budget with 429 enforcement (#368) 2026-04-16 11:17:14 +00:00