Review: Drop legacy boards table (v3)

review-318-2026-03-27-v3 Review

review ready

Verdict: READY

Template Completeness

  • [x] Type -- Feature
  • [x] Lineage -- Standalone, kanban unification
  • [x] Repo -- forgejo_admin/pal-e-api (corrected from v2)
  • [x] User Story -- Platform owner, legacy table removal
  • [x] Context -- Final cleanup after consumer migration
  • [x] File Targets -- 4 source files + 8 test files + alembic migration
  • [x] Cross-Repo Blast Radius -- pal-e-app 2 files, alias approach documented
  • [x] Acceptance Criteria -- 6 items, all verifiable
  • [x] Test Expectations -- pytest command specified
  • [x] Constraints -- Pre-migration backup, consumer confirmation, cross-repo note
  • [x] Checklist -- Standard 3 items
  • [x] Related -- project-pal-e-docs, unlocks recursive kanban
  • [x] Notes for Betty Sue -- arch:board-api label request

Traceability

  • [x] story:kanban-daily-review label -- kanban unification story
  • [ ] arch:board-api label -- MISSING on board item #318. Issue body notes it needs adding. Recommend adding before moving to next_up.
  • [x] Forgejo issue -- forgejo_admin/pal-e-api#199, open

File Targets

Source files:
  • [x] src/pal_e_docs/models.py -- verified: Board class at line 235, board_id on BoardItem at line 257
  • [x] src/pal_e_docs/schemas.py -- verified: BoardCreate at line 231, BoardUpdate at line 236
  • [x] src/pal_e_docs/routes/boards.py -- verified: 703 lines, heavily Board/board_id-dependent throughout
  • [x] alembic/versions/ -- verified: directory exists, existing migrations present
Test files (all 8 verified to exist):
  • [x] tests/test_boards.py
  • [x] tests/test_board_sync.py
  • [x] tests/test_board_issue_sync.py
  • [x] tests/test_private_projects_boards.py
  • [x] tests/test_pagination_activity.py
  • [x] tests/test_note_type_enum.py
  • [x] tests/test_retype_migration.py
  • [x] tests/conftest.py
Cross-repo (pal-e-app):
  • [x] src/lib/api-client.ts -- verified: board_id: number; at line 40
  • [x] src/routes/+page.svelte -- verified: boardMap[item.board_id] at line 139

Repo Placement

OK. Issue filed on forgejo_admin/pal-e-api (correct). Cross-repo impact on pal-e-app documented with backward-compat alias approach. pal-e-docs-sdk and pal-e-mcp have zero board_id references -- no blast radius there.

Dependencies

  • Board item #314 "Add 'board' to NoteType" -- done
  • Board item #315 "Add board_note_id FK + data migration" -- done
  • Board item #316 "Update board API for board notes" -- done
  • Board item #317 "Update MCP + SDK + hooks for board-as-note" -- done
All prerequisite migration tickets are in the done column. Dependency chain is satisfied.

Acceptance Criteria

6 AC, all agent-verifiable. Test command pytest tests/ -v is real. AC #4 now correctly reflects the alias+deprecation-header approach (contradiction from v2 resolved). No missing criteria.

Blast Radius

Checked pal-e-app (2 files, documented), pal-e-docs-sdk (0 refs), pal-e-mcp (0 refs). The backward-compat alias prevents breaking pal-e-app. A follow-up pal-e-app ticket to migrate off the alias is implied but not yet created -- acceptable as discovered scope after this PR lands.

Decomposition

13 files across 1 repo, 6 AC. Estimated agent time: borderline (large refactor of 700-line routes file + migration + 8 test files). However, the changes are tightly coupled -- dropping the Board model, rewriting routes, and updating tests MUST land atomically to avoid broken intermediate states. A database migration cannot be split across PRs. No decomposition needed -- atomic scope justifies the size.

V2 Fix Verification

  • [x] Repo header corrected: forgejo_admin/pal-e-api (was pal-e-docs)
  • [x] Phantom notes.py removed from File Targets
  • [x] AC #4 rewritten: alias + X-Deprecated-Field header (was contradictory removal)
  • [x] Notes for Betty Sue section added with arch:board-api label request

Recommendation

  • [LABEL] Add arch:board-api label to board item #318 before moving to next_up (per Notes for Betty Sue)
All v2 issues resolved. Scope is solid. One housekeeping label remains.