[fix] MegaTask verification: migration 052 enum + async cell-map read

Two real bugs surfaced running the full gate against a containerized
Postgres (and the orchestrator boot log):

1. Migration 052 crashed a real orchestrator boot with
   'type "team" already exists'. The generic sa.Enum(create_type=False)
   does NOT set the postgres enum's create_type attribute, so op.create_table
   (checkfirst=False) emitted a redundant CREATE TYPE against the pre-existing
   team enum. Switched to postgresql.ENUM(create_type=False) — the postgres-
   native enum whose create_type _check_for_name_in_memos actually reads, so
   the CREATE TYPE is suppressed. Verified: 051->052 upgrade against a DB where
   the team enum pre-existed (the exact path that crashed) now succeeds;
   downgrade 052->051 drops the table and preserves the shared enum; fresh
   upgrade head clean. (Migration 016 has the same latent sa.Enum pattern but
   never re-runs in prod, so it's noted, not touched here.)

2. _ensure_branch_for_task read task.cell_projects (lazy=selectin to-many)
   directly, tripping MissingGreenlet on a freshly-created/unqueried task —
   which then poisoned the async session (PendingRollbackError). Replaced with
   _task_has_cell_map: peeks InstanceState.unloaded (no IO) and reads the
   already-loaded map, falling back to an awaited count query only when the
   relationship is genuinely unloaded. Non-ORM stubs route to the plain
   attribute. Fixes 2 integration tests; the 6 cell-map unit tests still pass.

Also: typed the self stub as Any in test_choreographer_subtask_project
(mypy tests/ wants Choreographer, not SimpleNamespace) — the codebase idiom.

Gate: ruff format/check clean; mypy roboco/ + tests/ clean; full pytest
10371 passed / 388 skipped against containerized pgvector:pg16; vulture clean.
Pre-existing xenon C-rank on reassign (from prior commit 19a474d3, not this
feature) still blocks make quality — surfaced separately.
This commit is contained in:
Renn F
2026-06-27 00:54:43 +02:00
parent cb5365a490
commit 164ce46e66
3 changed files with 46 additions and 8 deletions
+7 -3
View File
@@ -25,9 +25,13 @@ branch_labels = None
depends_on = None
# Reuse the existing Postgres "team" enum in place (created in 001_initial_schema,
# widened since by later migrations); create_type=False so this migration never
# tries to (re)create it.
_TEAM_ENUM = sa.Enum(
# widened since by later migrations). ``create_type=False`` MUST be set on the
# postgres-native ``postgresql.ENUM``: it's that class's ``create_type`` attribute
# that ``_check_for_name_in_memos`` reads to suppress the redundant ``CREATE TYPE``
# on ``op.create_table`` (checkfirst=False, so the has_type probe is skipped). On
# the generic ``sa.Enum`` the kwarg is silently dropped, so the CREATE TYPE fires
# and crashes a real orchestrator boot ("type 'team' already exists").
_TEAM_ENUM = postgresql.ENUM(
"backend",
"frontend",
"ux_ui",