feat(crewing): Phase 5a — verification queue (flagged) #73

Merged
shad0w merged 2 commits from feat/crewing-verification into feat/crewing-signoff 2026-06-22 18:53:25 +00:00
Owner

Crewing — Phase 5a (Verification queue)

First slice of Phase 5 (5a verification → 5b appraisal). The office queue for verifying site-entered records, per §8.11/R11. Stacks on #72 (sign-off); base feat/crewing-signoff. Behind NEXT_PUBLIC_CREWING_ENABLED.

What's in

  • Schema: CrewActionType += RECORD_VERIFIED / RECORD_REJECTED. No model changesSeafarerDocument / BankDetail / EpfDetail already carry verificationStatus + verifiedById (3b/4a).
  • Actions: verifyDocument (verify_site_records — MPO/Manager) and verifyBankEpf (verify_bank_epf — Accounts) set verificationStatus VERIFIED/REJECTED + verifiedById; rejection requires remarks; each writes a CrewAction; already-decided records are guarded.
  • Screen: /crewing/verification — role-aware (MPO: pending documents with expiry flags; Accounts: pending bank/EPF), Verify / Reject-with-remarks. Leave is not here (Manager approval, R11). Added to nav (MPO + Accounts + SuperUser, §7).

Tests & docs

  • Integration: verification.test.ts (6) — doc verify/reject + already-decided guard, bank/EPF verify, permission gating (Accounts can't verify docs; MPO can't verify bank/EPF).
  • type-check clean; full unit (241) + integration (201) green (verified with RESEND_API_KEY unset, mimicking CI).
  • CLAUDE.md updated; wiki §12 bumped.

Deferred (per decision)

PPE / next-of-kin verification gates (low-risk; no verificationStatus on those models).

Next: 5b — Appraisal (Epic H): the DRAFT → SUBMITTED → MPO_VERIFIED → MANAGER_APPROVED lifecycle.

🤖 Generated with Claude Code


Closes Epic I — Office verification (#83).

## Crewing — Phase 5a (Verification queue) First slice of **Phase 5** (5a verification → 5b appraisal). The office queue for verifying site-entered records, per §8.11/R11. Stacks on **#72** (sign-off); base `feat/crewing-signoff`. Behind `NEXT_PUBLIC_CREWING_ENABLED`. ### What's in - **Schema:** `CrewActionType += RECORD_VERIFIED / RECORD_REJECTED`. **No model changes** — `SeafarerDocument` / `BankDetail` / `EpfDetail` already carry `verificationStatus` + `verifiedById` (3b/4a). - **Actions:** `verifyDocument` (`verify_site_records` — MPO/Manager) and `verifyBankEpf` (`verify_bank_epf` — Accounts) set `verificationStatus` `VERIFIED`/`REJECTED` + `verifiedById`; rejection requires remarks; each writes a `CrewAction`; already-decided records are guarded. - **Screen:** `/crewing/verification` — role-aware (MPO: pending documents with expiry flags; Accounts: pending bank/EPF), Verify / Reject-with-remarks. **Leave is not here** (Manager approval, R11). Added to nav (MPO + Accounts + SuperUser, §7). ### Tests & docs - Integration: `verification.test.ts` (6) — doc verify/reject + already-decided guard, bank/EPF verify, permission gating (Accounts can't verify docs; MPO can't verify bank/EPF). - `type-check` clean; full unit (241) + integration (201) green (verified with `RESEND_API_KEY` unset, mimicking CI). - `CLAUDE.md` updated; wiki §12 bumped. ### Deferred (per decision) PPE / next-of-kin verification gates (low-risk; no `verificationStatus` on those models). Next: **5b — Appraisal** (Epic H): the `DRAFT → SUBMITTED → MPO_VERIFIED → MANAGER_APPROVED` lifecycle. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- Closes **Epic I — Office verification** (#83).
shad0w added 1 commit 2026-06-22 16:29:59 +00:00
feat(crewing): Phase 5a — verification queue (flagged)
All checks were successful
PR checks / checks (pull_request) Successful in 41s
PR checks / integration (pull_request) Successful in 29s
8982118eee
First slice of Phase 5 (verification + appraisal). The office queue for verifying
site-entered records, per Crewing-Implementation-Spec §8.11/R11. Stacks on 4c.
Behind NEXT_PUBLIC_CREWING_ENABLED.

What's in
- Schema: CrewActionType += RECORD_VERIFIED/RECORD_REJECTED (migration
  crewing_verification_actions). No model changes — SeafarerDocument/BankDetail/
  EpfDetail already carry verificationStatus + verifiedById (3b/4a).
- Actions (crewing/verification/actions.ts): verifyDocument (verify_site_records —
  MPO/Manager) and verifyBankEpf (verify_bank_epf — Accounts) set
  verificationStatus VERIFIED/REJECTED + verifiedById; rejection requires remarks;
  each writes a CrewAction. Already-decided records are guarded.
- Screen: /crewing/verification — role-aware (MPO: pending documents with expiry
  flags; Accounts: pending bank/EPF), Verify / Reject-with-remarks. Leave is not
  here (Manager approval, R11). Verification added to nav (MPO + Accounts + SU, §7).

Tests & docs
- Integration: verification.test.ts (6) — doc verify/reject + already-decided
  guard, bank/EPF verify, permission gating (Accounts can't verify docs, MPO can't
  verify bank/EPF). type-check clean; full unit (241) + integration (201) green
  (verified with RESEND_API_KEY unset, mimicking CI).
- CLAUDE.md updated.

Deferred (per decision): PPE / next-of-kin verification gates.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
shad0w added 1 commit 2026-06-22 18:53:07 +00:00
Merge branch 'feat/crewing-signoff' into feat/crewing-verification
All checks were successful
PR checks / checks (pull_request) Successful in 39s
PR checks / integration (pull_request) Successful in 29s
bc4fcc6e35
shad0w force-pushed feat/crewing-verification from bc4fcc6e35 to 8982118eee 2026-06-22 18:53:17 +00:00 Compare
shad0w merged commit 7f35667fca into feat/crewing-signoff 2026-06-22 18:53:25 +00:00
Sign in to join this conversation.
No description provided.