Validation: Sprint schema -- migrations + models for sprint tracking (re-validation)

validation-50-2026-06-23-reval Doc

validation pass

Verdict: PASS

Ticket

ldraney/paldocs#50 — Sprint schema: migrations + models for sprint tracking. Merged via PR #71.
Re-validation: First attempt failed because CI pipeline #146 broke at bundle-install (Bundler 4.x mismatch). Fixed by base-images PR #7 (Bundler 4.x upgrade) and paldocs PR #73/#74 (lockfile fixes). Pipeline #153 passes all steps. The sprint schema code was already deployed to production via the image built from commit 5075e35 (PR #73), which includes commit 25dcc57 (PR #71).

Environment

Production cluster, namespace paldocs. Pod: paldocs-6795474677-q6kgx (1/1 Running, 1 restart). Image: harbor.tail5b443a.ts.net/paldocs/app:5075e35. URL: https://paldocs.tail5b443a.ts.net.

Checks

# Criterion How Verified Result Evidence
1 sprints table exists with name, status, timestamps, check constraint rails runner: Sprint.count, Sprint.column_names, attempted invalid status insert PASS Sprint.count=0, columns=[id, name, status, created_at, updated_at]. Invalid status rejected by model validation ("is not included in the list").
2 sprint_projects join table with FK + unique index rails runner: SprintProject.count, attempted duplicate insert, attempted invalid FK PASS SprintProject.count=0, columns=[id, sprint_id, project_id, created_at, updated_at]. Duplicate (sprint_id, project_id) rejected by ActiveRecord::RecordInvalid. Invalid sprint_id rejected by ActiveRecord::RecordInvalid.
3 board_items.sprint_id FK column added rails runner: BoardItem.column_names.include?('sprint_id'), attempted invalid FK PASS sprint_id present in BoardItem columns. Invalid sprint_id=999999 rejected by ActiveRecord::InvalidForeignKey.
4 Sprint model with STATUSES, validations, scopes, associations rails runner: Sprint::STATUSES, Sprint.table_name, model associations PASS STATUSES=["planning", "active", "complete"]. table_name="sprints". has_many :sprint_projects, has_many :projects through, has_many :board_items.
5 SprintProject model with belongs_to + uniqueness validation rails runner: SprintProject.table_name, uniqueness validation test PASS table_name="sprint_projects". Duplicate rejected.
6 CI schema updated (db/ci_schema.sql) git show HEAD:db/ci_schema.sql grep sprint PASS ci_schema.sql contains CREATE TABLE IF NOT EXISTS for sprints, sprint_projects, and board_items with sprint_id column.
7 RSpec tests pass Woodpecker pipeline #153 test step PASS 119 examples, 0 failures. Sprint-specific tests visible: "BoardItem sprint association" (4 examples).
8 CI pipeline green Woodpecker pipeline #153 (main push) PASS All CI steps passed: clone, bundle-install, lint, test, audit. build-and-push completing at time of validation.
9 Production deployment live kubectl get pods -n paldocs; image tag verification PASS Pod Running 1/1. Image tag 5075e35 includes sprint schema commit 25dcc57 (verified via git merge-base --is-ancestor).
10 All routes healthy (frontend SOP) curl HTTP status for /, /up, /projects, /projects/paldocs, /boards/board-paldocs, /api/notes/search PASS All 6 routes returned HTTP 200.

Regression Check

Existing data verified intact: 63 projects, 1987 notes, 1406 board items, 146 tags, 36781 blocks, 43 repos. All route-level smoke tests pass. Board view renders correctly. Projects index page renders correctly with 63 projects. No new errors observed.

Discovered Issues

None.