"""D6 — entity_canon.metadata_json TEXT NOT NULL DEFAULT '{}'.

D6 prerequisite — `EntityCanon.stable_traits` 의 list 계약을 깨지 않으면서
location entity 의 `space_profile` (kind/allowed_space_keys/default_space_key) 을
저장하기 위한 별도 JSON column. master_plan post-processing 의 `normalize_space_key`
가 이 column 을 single source 로 read.

R2 B5 결정:
- sequential prefix `007_d6_entity_canon_metadata_json` (006 패턴 정합).
- 006 의 inspector idempotent 패턴 적용 — startup `_migrations` IF NOT EXISTS path
  가 이미 추가했을 가능성 (현재 미추가 결정이지만 safe-by-default) 회귀 가드.
- `_migrations` block (database.py:63-218) **미추가** — alembic-only ownership.
  CLAUDE.md "alembic upgrade head → backend startup" 시퀀스 정합.

spec: docs/superpowers/specs/2026-05-09-deterministic-bg-id-and-catalog-lineage.md §4.3
plan: docs/superpowers/plans/2026-05-09-d6-deterministic-bg-id-and-catalog-lineage-implementation.md T0

Revision ID: 007_d6_entity_metadata_json
Revises: 006_llm_call_log_metadata_json
Create Date: 2026-05-09

NOTE: revision id 는 alembic_version.version_num 의 32 char 제한 (default
psycopg2 mapping `VARCHAR(32)`) 안에 맞춰 `007_d6_entity_metadata_json` (27 char)
사용. 파일명은 sequential prefix 보존 위해 `007_d6_entity_canon_metadata_json.py`
로 둔다 (006 패턴 정합 — 파일명 필드는 길이 제한 무관).
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


revision: str = "007_d6_entity_metadata_json"
down_revision: Union[str, None] = "006_llm_call_log_metadata_json"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    bind = op.get_bind()
    inspector = sa.inspect(bind)
    existing = {col["name"] for col in inspector.get_columns("entity_canon")}
    if "metadata_json" not in existing:
        op.add_column(
            "entity_canon",
            sa.Column(
                "metadata_json",
                sa.Text(),
                nullable=False,
                server_default="{}",
            ),
        )


def downgrade() -> None:
    bind = op.get_bind()
    inspector = sa.inspect(bind)
    existing = {col["name"] for col in inspector.get_columns("entity_canon")}
    if "metadata_json" in existing:
        op.drop_column("entity_canon", "metadata_json")
