• v0.10.2 — Application State Machine (REQ-11-002)
    CI / node (push) Successful in 40s
    Release / release (push) Successful in 2m46s
    CI / python (push) Successful in 3m28s
    Stable

    coreci-bot released this 2026-10-01 13:12:26 +00:00 | 42 commits to main since this release

    Phase 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) + an employer_audit_events row (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 with to as a closed pydantic Literal (G-327: unknown → 422, matrix-illegal → 409), revoke (D-102), and the R-80 re-hire — a fresh placement + placement.rehired ledger 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