Skip to content

feat(automations): scheduled cycles, grouped runs, and run details UI#438

Merged
Soju06 merged 61 commits into
Soju06:mainfrom
Kazet111:feature/automations-cycle-scheduling-and-run-details
Jul 9, 2026
Merged

feat(automations): scheduled cycles, grouped runs, and run details UI#438
Soju06 merged 61 commits into
Soju06:mainfrom
Kazet111:feature/automations-cycle-scheduling-and-run-details

Conversation

@Kazet111

@Kazet111 Kazet111 commented Apr 19, 2026

Copy link
Copy Markdown
Contributor

Maintainer refresh (2026-06-04, migration merge)

  • Pushed 9fe67dc6bb1e6d072fbf9fd93103b0ff483d56ca after CI exposed two Alembic heads on the rebased branch.
  • Added 20260604_010000_merge_automations_and_reauth_status_heads to merge the automations head with 20260604_000000_add_reauth_required_account_status from current main.
  • Additional local validation:
    • uv run pytest tests/unit/test_db_migrate.py -q
    • uv run pytest tests/unit/test_automations_service.py tests/integration/test_automations_api.py -q
    • uv run ruff check app/db/alembic/versions/20260604_010000_merge_automations_and_reauth_status_heads.py tests/unit/test_db_migrate.py tests/unit/test_automations_service.py tests/integration/test_automations_api.py
    • uv run ty check app/db/alembic/versions/20260604_010000_merge_automations_and_reauth_status_heads.py tests/unit/test_db_migrate.py tests/unit/test_automations_service.py tests/integration/test_automations_api.py
    • git diff --check

Maintainer refresh (2026-06-04)

  • Rebased the PR onto current main and pushed the conflict repair to 5ed264e9f8fcce02eea7bb63f50960ab06a9e290.
  • Resolved the main conflicts by preserving current quota-planner/request-log/index behavior and keeping the automations scheduler, API, UI mocks, and migration tests.
  • Local validation after the rebase:
    • uv run ruff check app/core/config/settings.py app/db/models.py app/main.py app/modules/automations tests/unit/test_db_migrate.py tests/unit/test_automations_service.py tests/integration/test_automations_api.py
    • uv run pytest tests/unit/test_db_migrate.py::test_automation_run_cycle_snapshot_migration_normalizes_legacy_manual_keys tests/unit/test_db_migrate.py::test_quota_planner_migration_repairs_preexisting_request_kind_column tests/unit/test_automations_service.py -q
    • uv run pytest tests/integration/test_automations_api.py -q
    • uv run ty check app/core/config/settings.py app/db/models.py app/main.py app/modules/automations tests/unit/test_db_migrate.py tests/unit/test_automations_service.py tests/integration/test_automations_api.py
    • uv run openspec validate add-automations-scheduled-pings --strict
    • cd frontend && bun run typecheck
    • cd frontend && bun run lint
    • cd frontend && bun run test -- src/features/automations/hooks/use-automations.test.ts src/features/automations/schemas.test.ts src/features/automations/time-utils.test.ts src/features/automations/account-display.test.ts src/__integration__/automations-flow.test.tsx
    • git diff --check

Summary

  • add a new end-to-end Automations subsystem across backend, database, OpenSpec, and frontend
  • add scheduled and manual automation execution with grouped run-cycle tracking
  • add cycle snapshot persistence so one automation cycle keeps a stable account set and dispatch plan
  • add Jobs and Recent runs views with backend-driven search, filters, and pagination
  • add Run details diagnostics with per-account execution state and grouped cycle summaries
  • surface automation-generated traffic in Request Logs

Related issue

Problem

The project did not yet have a dedicated automations subsystem.

That meant there was no built-in way to:

  • define recurring automation jobs
  • execute one automation cycle across multiple accounts
  • track grouped run state for a cycle
  • inspect per-account outcomes within one run
  • manage automation jobs and runs from a dedicated UI
  • correlate automation traffic with Request Logs

Changes

New backend automations module

  • add a dedicated automations API with endpoints for:
    • jobs listing
    • job filter options
    • runs listing
    • run filter options
    • run details
    • create job
    • update job
    • delete job
    • run now (202 Accepted)
  • add automations service / repository / scheduler implementation
  • add timezone-aware daily scheduling
  • add threshold-based dispatch spreading across accounts
  • add grouped cycle execution semantics for scheduled and manual runs
  • add cycle status resolution for:
    • running
    • partial
    • success
    • failed

Database and run-cycle snapshot model

  • add automations schema and base migrations
  • add grouped run-cycle snapshot tables:
    • automation_run_cycles
    • automation_run_cycle_accounts
  • freeze cycle membership at cycle creation time so later account-state changes do not mutate an already started cycle
  • freeze per-account dispatch timestamps for the cycle so threshold edits do not rewrite an in-flight dispatch plan
  • backfill legacy manual-cycle history into grouped cycle snapshots
  • add model and query support for grouped cycle listing, stable run details, and per-cycle diagnostics

New Automations UI

  • add Automations page and route integration
  • add Jobs view with backend-driven:
    • search
    • filters
    • pagination
    • rows per page
    • reset
  • add Recent runs view with backend-driven:
    • search
    • filters
    • pagination
    • rows per page
    • reset
  • add Add automation dialog with:
    • structured form layout
    • validation
    • timezone selection
    • threshold configuration
    • reasoning effort selection
  • add Run details modal with:
    • grouped cycle summary metrics
    • per-account execution table
    • mixed-result visibility
    • scalable rendering for larger runs
    • stable grouped diagnostics for scheduled and manual cycles

Request Logs visibility

  • wire automation-triggered executions into Request Logs visibility
  • make it possible to correlate automation runs with actual downstream requests

OpenSpec

  • add and complete the OpenSpec change under openspec/changes/add-automations-scheduled-pings/:
    • proposal
    • design
    • tasks
    • automations delta spec
    • frontend-architecture delta spec
    • context

Screenshots

image image image image

Testing

Added or updated coverage for:

  • backend automations integration flows
  • backend automations service logic
  • schedule computation and grouped cycle behavior
  • cycle snapshot persistence and legacy backfill behavior
  • run listing and run-details responses
  • frontend automations integration flow
  • frontend hooks, schemas, and time/account display utilities

Validation

  • openspec validate --specs
  • uvx ruff check .
  • uvx ruff format --check .
  • uv run ty check
  • uv run pytest
  • cd frontend && bun run lint
  • cd frontend && bun run typecheck
  • cd frontend && bun run test:coverage
  • migration smoke test:
    • upgrade -> downgrade -> upgrade

Latest local backend result:

  • 1824 passed, 7 skipped, 4 warnings

Frontend coverage result:

  • global coverage passes configured thresholds
  • src/features/automations coverage:
    • 91.89% statements
    • 79.51% branches
    • 91.78% lines

Result

This PR introduces a new Automations subsystem with scheduling, grouped run cycles, stable cycle snapshots, per-account execution diagnostics, and dedicated UI management flows,
while partially delivering the functionality described in #433.

@Kazet111 Kazet111 marked this pull request as draft April 19, 2026 10:32
@Kazet111 Kazet111 marked this pull request as ready for review April 19, 2026 12:26
@DaKheera47

Copy link
Copy Markdown

@Soju06 i don't envy your position... having to review a 27k line PR

great feature though. i can't wait :)

@Kazet111 Kazet111 force-pushed the feature/automations-cycle-scheduling-and-run-details branch from 8c2b071 to 625d067 Compare April 22, 2026 07:25
@Kazet111 Kazet111 marked this pull request as draft April 22, 2026 10:40
@Kazet111 Kazet111 marked this pull request as ready for review April 22, 2026 11:37
@chickensote

Copy link
Copy Markdown

What's the status on this PR?

@Kazet111

Copy link
Copy Markdown
Contributor Author

We’re waiting for a review from @Soju06

@huzky-v huzky-v mentioned this pull request Apr 27, 2026
@chickensote

Copy link
Copy Markdown

Hey @Soju06, sorry for the ping but would you be willing to review this PR?

@Komzpa

Komzpa commented May 16, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@Komzpa Komzpa added the 🤖 codex: ok [@codex review] says no issues found. label May 16, 2026
@Komzpa Komzpa removed the 🤖 codex: ok [@codex review] says no issues found. label May 19, 2026
@Kazet111

Copy link
Copy Markdown
Contributor Author

@Soju06, could you please take a look at this PR when you have a moment?

A lot of people seem to be waiting for this automation-related change, and the PR has been ready for review for a while now.

@Komzpa

Komzpa commented May 20, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8436ea498d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread app/modules/automations/service.py Outdated
@Komzpa

Komzpa commented May 20, 2026

Copy link
Copy Markdown
Collaborator

It feels like an overkill to bring full cron GUI and force user to configure this manually when stats are available and lb already operates on weights. I am thinking about something like #737 which may be more automated / self-healing way of addressing #433

@Kazet111

Copy link
Copy Markdown
Contributor Author

It feels like an overkill to bring full cron GUI and force user to configure this manually when stats are available and lb already operates on weights. I am thinking about something like #737 which may be more automated / self-healing way of addressing #433

That’s fair if we frame this PR only as a generic cron UI, but I don’t think #737 fully replaces the use case here.

#433 explicitly asks for optional idle warmup: lightweight background requests that intentionally start rolling 5-hour windows earlier, with each account warmed at most once per cycle and multi-account warmups staggered across the 300-minute window. That is the behavior this PR targets: activating idle account windows in a controlled way so they are ready before real traffic arrives.

From my reading, #737 is mostly a quota-aware planner and routing layer with selective warmup decisions. It is conservative by default (shadow, dryRun, no synthetic traffic), and one of its goals is to keep cold accounts cold when starting a window would be bad. It also does not seem to provide deterministic “warm eligible idle accounts on a configured/staggered schedule” behavior. The warmup path looks gated and selective, not like a full staggered activation mechanism.

I see these as different layers:

#737: planner, routing, selective decision-making
#438: execution, observability, diagnostics foundation for controlled background jobs

Warmup is just the first job type on top of this infrastructure. Later, the same run-cycle, snapshot and diagnostics layer could support other operational jobs too, for example detecting unexpected quota resets before the expected 7-day boundary or surfacing account anomalies.

In the future, the planner could drive this execution layer, but I don’t think it replaces the need for the layer itself.

@Komzpa Komzpa added the db migration PR changes Alembic database migrations; maintainer must coordinate merge order label May 21, 2026
@Komzpa

Komzpa commented May 22, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c304540db8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread app/modules/automations/repository.py Outdated
@Soju06 Soju06 added 🤖 codex: needs work [@codex review] raised an issue and removed 🤖 codex: needs work [@codex review] raised an issue labels May 22, 2026
@Soju06

Soju06 commented May 22, 2026

Copy link
Copy Markdown
Owner

@codex review

@Komzpa

Komzpa commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Another round soon, please!

Reviewed commit: 05d2b7f1d0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chickensote

Copy link
Copy Markdown

Hello, what's the status on this PR?

Komzpa added 2 commits July 7, 2026 20:37
# Conflicts:
#	app/modules/dashboard/api.py
#	frontend/src/test/mocks/handlers.ts
@Komzpa

Komzpa commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

@codex review

1 similar comment
@Soju06

Soju06 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3efb906f8f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread app/modules/automations/service.py Outdated

async def _normalize_create_input(self, payload: AutomationJobCreateInput) -> AutomationJobCreateInput:
name = _normalize_non_empty(payload.name, field_label="name", code="invalid_name")
model = _normalize_non_empty(payload.model, field_label="model", code="invalid_model")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Reject source-only models for automation jobs

When model sources are configured, /api/dashboard/models includes enabled source-only slugs for API-key allowlists, but automation runs always call the ChatGPT compact endpoint with an account token and never look up ModelSource routing. Since creation only checks that model is non-empty here, the UI/API can persist a job with a source-only model; every manual/scheduled run for that job will then fail upstream instead of being rejected at save time. Please restrict automation models to ChatGPT-routable registry entries or add source routing before accepting them.

Useful? React with 👍 / 👎.

@Soju06

Soju06 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7d3a74831a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread app/modules/automations/repository.py Outdated
Comment on lines +1171 to +1174
case(
(cycle_agg.c.has_manual_trigger == 1, cycle_agg.c.visible_accounts),
else_=cycle_agg.c.snapshot_expected_accounts,
).label("expected_accounts"),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Apply eligibility when filtering scheduled cycle statuses

When a scheduled cycle has completed one account and a later snapshot account becomes rate-limited or deleted before its dispatch time, _build_scheduled_cycle_summary omits that account from totals, so the unfiltered runs page can display effectiveStatus: "success". The SQL status filter here still uses the stale cycle_expected_accounts for scheduled cycles, so /api/automations/runs?status=success excludes that same row until the dispatch-time cleanup runs, making filters disagree with the status shown to operators.

Useful? React with 👍 / 👎.

@Soju06

Soju06 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8cb607d391

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread app/modules/automations/service.py Outdated
Comment on lines +713 to +720
cycle = await self._repository.create_run_cycle(
cycle_key=cycle_key,
job_id=job.id,
trigger=AUTOMATION_RUN_TRIGGER_MANUAL,
cycle_expected_accounts=len(dispatch_plan),
cycle_window_end=cycle_window_end,
accounts=dispatch_plan,
include_paused_accounts=job.include_paused_accounts,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Make manual cycle placeholder creation recoverable

When a manual run is triggered with delayed or multi-account dispatch, this commits the cycle snapshot before the per-account automation_runs placeholders are all created. If the request is cancelled or the process exits after this commit but before the loop below finishes inserting placeholders, the scheduler cannot recover the missing manual accounts because _run_due_manual_runs only scans existing automation_runs rows, so those snapshot-only accounts remain pending forever (or the cycle remains invisible if no run row was created). Consider creating the manual placeholders atomically with the cycle or teaching the scheduler to materialize missing manual snapshot rows.

Useful? React with 👍 / 👎.

@Komzpa

Komzpa commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8cb607d391

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread app/db/models.py
@Soju06

Soju06 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@codex review

1 similar comment
@Komzpa

Komzpa commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

Reviewed commit: a28a9f35a1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@Soju06

Soju06 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@codex review

1 similar comment
@Komzpa

Komzpa commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 810e93264c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread app/modules/automations/repository.py Outdated
Comment on lines +1163 to +1164
AutomationRun.cycle_key == AutomationRunCycleAccount.cycle_key,
AutomationRun.account_id == AutomationRunCycleAccount.account_id,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Associate completed slots by slot key

When a scheduled cycle slot for account A fails over to account B before B's delayed slot is due, the completed run keeps A's slot_key but is stored with account_id=B. If A is later deleted or becomes ineligible, this join counts that completed A slot as B's snapshot account, so /api/automations/runs can report the cycle as terminal with no pending B slot while run details still show B pending. The grouped status query needs to associate runs to snapshot accounts using the same slot-key logic as _resolve_scheduled_cycle_run_account_id, not only the terminal account_id.

Useful? React with 👍 / 👎.

Comment thread app/modules/automations/api.py
@Soju06

Soju06 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@codex review

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d836a56938

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread frontend/src/features/automations/components/automations-page.tsx
Comment thread app/modules/automations/repository.py Outdated
def _cycle_account_slot_key(*, job_id: str, trigger: str, account_id: str, scheduled_for: datetime) -> str | None:
if trigger != "scheduled":
return None
return _scheduled_slot_key(job_id, account_id=account_id, due_slot=scheduled_for)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Store scheduled snapshot keys from the cycle due slot

When thresholdMinutes > 0, scheduled_for is the randomized per-account dispatch time, while scheduled run rows are claimed with a slot key derived from the cycle's original due slot. Persisting the snapshot slot_key from the offset time makes the grouped-history joins that match AutomationRun.slot_key to AutomationRunCycleAccount.slot_key miss completed runs after the account FK is nulled, such as when a completed account is deleted, so thresholded cycles can report wrong totals/pending/status.

Useful? React with 👍 / 👎.

@Soju06

Soju06 commented Jul 7, 2026

Copy link
Copy Markdown
Owner

@codex review

1 similar comment
@Komzpa

Komzpa commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. More of your lovely PRs please.

Reviewed commit: 65f0b81135

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🤖 codex: ok [@codex review] says no issues found. db migration PR changes Alembic database migrations; maintainer must coordinate merge order

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants