"""central prose on a design system, and rationale on a token Revision ID: 0074 Revises: 0073 Create Date: 2026-07-31 Prose doesn't live as one-offs; it lives centrally on the system. Two fields rather than one per category: design_systems.guidance the narrative a token table cannot hold — aesthetic, voice and tone, what is deliberately out of scope. Markdown, free-form. design_tokens.rationale WHY this token is this value, which is a different question from `purpose` (what it is FOR). "Success equals Moss, aligned by design" is a rationale; "page bg, deepest surface" is a purpose. Free-form rather than a column per category on purpose. A schema with `voice`, `aesthetic` and `scope` columns would bake one rulebook's table of contents into every install, and the next install's design system would have three empty columns and nowhere to put what it actually cares about. Both nullable: a design system with no prose at all is complete, not a draft. Downgrade drops both columns and the prose with them. """ from alembic import op import sqlalchemy as sa revision = "0074" down_revision = "0073" branch_labels = None depends_on = None def upgrade() -> None: op.add_column("design_systems", sa.Column("guidance", sa.Text(), nullable=True)) op.add_column("design_tokens", sa.Column("rationale", sa.Text(), nullable=True)) def downgrade() -> None: op.drop_column("design_tokens", "rationale") op.drop_column("design_systems", "guidance")