Transmission #064: Alignment startup seed tests

StartupSeedTest now asserts the same things for alignment as for the other seeded tables: nine rows from the CSV, non-null id / align_morality / align_order, no duplicates when StartupSeed.run() is invoked again, and two spot rows (id 5 true neutral, id 9 evil + chaotic).

Alignment repository

New AlignmentRepository implements Repository<InternalAlignment> with jOOQ reads (findById, findAll ordered by id) via AlignmentModelMapper, and create / update throw UnsupportedOperationException("not implemented"). AlignmentRepositoryTest seeds three rows and covers reads, null id handling, and the unsupported mutators.

Alignments Jersey API

AlignmentsApiImpl now uses AlignmentRepository and AlignmentModelMapper for real GET /v1/alignments and GET /v1/alignments/{id} responses. Dagger builds the implementation and passes it into JerseyResourceConfig (same pattern as characters/items). AlignmentsApiImplTest covers the handler against Postgres; AlignmentsApiIntegrationTest exercises the OpenAPI client against the running stack, and ApiUtils exposes getAlignmentsApi().

Player alignment_id

player now has a required alignment_id → alignment(id). Flyway order creates alignment before player. InternalPlayer, PlayerRepository (create / findById / applyPatch), and PlayerModelMapper carry alignment through to OpenAPI Character.alignment. Creates default to alignment 5 (true neutral) when the client omits the field; patches can replace /alignment. Test helpers seed nine alignments before players; integration test covers default vs explicit alignment on create.