-
released this
2026-10-01 13:12:26 +00:00 | 42 commits to main since this releasePhase 2: Employer-Side Application State Machine
The v0.6
submitted-only application status extends to the full hiring lifecycle (D-099:submitted → in_review → interview → offer → hired / rejected / withdrawn— forward-only with skip-forward, three terminals), driven by three principal classes with the G-311 gate order everywhere: 401 session → 403 claim → 403 cross-entity → 409 matrix — never a 409 before a 403.What shipped
- Employer per-target transition routes (
/v1/employers/applications/{id}/in-review|/interview|/offer|/reject|/hire): the matrix stays out of request bodies; hire carries employer-attested{role_title, start_date}(G-324 bounds; D-103 date-only); every transition appends the ledger in the same transaction (D-100) + anemployer_audit_eventsrow (the D-089 lane). - The employer pipeline list with learner_id visible per the G-319 supersession (application-scoped reads only; the own-postings list stays counts-only — both arms pinned).
- Learner withdraw (
/v1/marketplace/applications/{id}/withdraw): the unchanged D-043 stack (G-5 allowlist → verified 18+ → the existing apply-rate window — no new knobs); employers can never withdraw (D-099). - G-323 apply-terminal guard: re-applying to a withdrawn/rejected/hired application → 409
application_terminal, never a 200 "applied" lie; idempotent 200 on live applications unchanged (A-408). - The operator lane (
/v1/placements/admin/*, fail-closed): the generic transition route withtoas a closed pydantic Literal (G-327: unknown → 422, matrix-illegal → 409), revoke (D-102), and the R-80 re-hire — a fresh placement +placement.rehiredledger event without touching the terminal application (G-326:decided_at= the re-hire event's stamp); the partial-unique IntegrityError surfaces as an honest 409.
Verification
- 1089 ai-service tests (fast lane, +36), 101 web, 87 CLI — all green, zero warnings; mypy clean (235 files); ruff clean.
- P2 security review verdict SHIP (zero P0s; the gate orders scratch-probed including the foreign-terminal arm); verify four layers PASS; the v0.10 G-319 counts-only pin green unmodified.
Downloads
- Employer per-target transition routes (