[Story-1050] Remove system forums

Story 1050Epic None15 files · +631/−262

PR #261 · pramaan-io/pramaan-functions · merged 2026-06-06

How it flows

sequenceDiagram
  autonumber
  participant db as Database
  participant mig as Migration 0073
  mig->>mig: scan references
  mig->>db: delete system forum rows
  mig->>db: drop source column
  mig->>db: firm_id NOT NULL
  mig->>mig: drop source-aware RLS
  mig->>db: create firm-only RLS
  mig->>mig: drop old ref trigger
  mig->>db: create firm-only ref trigger

8c2f1a9d0b3e_0073_remove_system_forums.py · +438 — new methods

Methodin → outwhat it does
_drop_forum_rls() → None
_create_firm_only_rls() → None
_create_source_aware_rls() → None

What changed, file by file

Alembic migration that removes system forum rows, drops the source discriminator, makes firm_id NOT NULL, and rebuilds RLS plus the reference trigger to firm-only.

new methodsignature
_drop_forum_rls() → None
_create_firm_only_rls() → None
_create_source_aware_rls() → None
_reject_referenced_system_forums() → None
_create_firm_only_reference_trigger() → None
_create_source_aware_reference_trigger() → None
_seed_downgrade_system_forums() → None
upgrade() → None
downgrade() → None
New fields: revision : strdown_revision : str | Sequence[str] | Nonebranch_labels : str | Sequence[str] | Nonedepends_on : str | Sequence[str] | None

Forum SQLAlchemy entity where firm_id is now a required UUID, removing the optionality that supported system forums.

New fields: firm_id : UUID

Forum DTO where firm_id is required and ForumSource is gone from the public contract.

New fields: firm_id : UUID

What can no longer happen

573 tests pass
ruff clean on touched files
scratch-DB upgrade-downgrade-upgrade clean
OpenAPI regenerated
repo-wide ruff debt is pre-existing
mypy invocation issue is pre-existing

Files changed (15)

File±
alembic/versions/1f8a2c3d4e5b_0071_forums_source_discriminated_catalog.py+1 −91
alembic/versions/8c2f1a9d0b3e_0073_remove_system_forums.py ★+438
docs/walkthroughs/story-1050-walkthrough.html+89
openapi/app-api.json ★+5 −25
src/domains/forum/dtos/__init__.py+0 −2
src/domains/forum/dtos/forum.py+1 −9
src/domains/forum/entity.py ★+10 −30
src/domains/forum/service.py+3 −22
src/domains/matter/service.py+1 −7
src/domains/proceeding/service.py+2 −8
tests/contract/generate_fixtures.py+18 −5
tests/contract/seed.py+1
tests/contract/test_app_forums_openapi.py+2 −2
tests/integration/test_app_forums.py+16 −53
tests/integration/test_app_matters.py+44 −8