feat(alembic): B2 drop unused pm_approvals Task column

Smoke run analysis initially flagged three Task fields as unused
(pm_approvals, quick_context, proactive_context). A follow-up audit
found quick_context (stores original_developer marker + doc notes +
PR creator + escalation notes) and proactive_context (RAG injection)
are actively used. Only pm_approvals is truly orphaned.

Migration 014 drops pm_approvals; downgrade() recreates it if ever
needed. The two false-positive fields stay untouched.

Spec ref: docs/superpowers/specs/2026-05-12-post-smoke-3-fixes-design.md
section B2 (re-scoped 2026-05-12).
This commit is contained in:
Renn F
2026-05-12 04:03:21 +02:00
parent 7254ceee50
commit eed4551497
8 changed files with 75 additions and 17 deletions
-1
View File
@@ -346,7 +346,6 @@ async def smoke_test_batch(db_session: AsyncSession) -> AsyncIterator[list[UUID]
pr_url="https://github.com/example/smoke/pull/1",
docs_complete=True,
pr_created=True,
pm_approvals={"cell_pm": str(pm_agent.id)},
created_by=system_agent.id,
assigned_to=dev_agent.id,
team=Team.BACKEND,
@@ -0,0 +1,41 @@
"""Wave B2 (2026-05-12, re-scoped): migration 014 drops pm_approvals.
Original spec proposed dropping three Task columns; investigation found
quick_context and proactive_context are actively used (original_developer
tracking, RAG context). Only pm_approvals is truly orphaned.
"""
from __future__ import annotations
import pytest
from sqlalchemy import text
@pytest.mark.asyncio
async def test_pm_approvals_dropped(db_session) -> None: # type: ignore[no-untyped-def]
"""pm_approvals column is gone from the tasks table."""
result = await db_session.execute(
text(
"SELECT column_name FROM information_schema.columns "
"WHERE table_name = 'tasks' AND column_name = 'pm_approvals'"
)
)
rows = list(result)
assert rows == [], "pm_approvals column should have been dropped"
@pytest.mark.asyncio
async def test_quick_context_and_proactive_context_remain(db_session) -> None: # type: ignore[no-untyped-def]
"""quick_context and proactive_context MUST remain — they're actively used."""
result = await db_session.execute(
text(
"SELECT column_name FROM information_schema.columns "
"WHERE table_name = 'tasks' "
"AND column_name IN ('quick_context', 'proactive_context')"
)
)
rows = {r[0] for r in result}
assert "quick_context" in rows, (
"quick_context must remain (original_developer + audit)"
)
assert "proactive_context" in rows, "proactive_context must remain (RAG injection)"
-1
View File
@@ -276,7 +276,6 @@ def _stub_task(*, with_project: bool = False) -> SimpleNamespace:
project=(SimpleNamespace(slug="proj-1") if with_project else None),
docs_complete=False,
pr_created=False,
pm_approvals={},
team=Team.BACKEND,
created_by=uuid4(),
assigned_to=None,
@@ -259,7 +259,6 @@ async def test_submit_for_qa_writes_audit_with_dev_agent_id(
pr_url="https://github.com/example/audit-test/pull/99",
docs_complete=False,
pr_created=True,
pm_approvals={},
created_by=system_uuid,
assigned_to=dev_uuid,
claimed_by=dev_uuid,