☰ MenuJob board spec

Job board — editor self-claim ("swipe to accept")

Status: normative spec, operator-approved 2026-07-08. Pulls the dispatch half of Phase 10 forward: editors browse an open queue of ready jobs and claim them; the operator keeps manual assignment as an override. Decisions locked:

Hybrid dispatch (operator-approved 2026-07-08): both models coexist

Not every job goes to the pool — high-value work stays white-glove:

Who sees a job in the board

All of: job status = NEW · editor_id is null · footage-ready (getFootageReadiness) · editor is vetting_status = approved + available

The card (each available job)

Per the editor-flow UX research ("everything you need is here" completeness signal; pay before work starts):

Interactions

Where it lives

/workspace gains a second tab/section: "Available" alongside the existing assigned-jobs list ("Yours"). Engine-dark surface, existing tokens and components. Empty state: "Nothing available right now — new jobs appear here the moment footage lands."

State-machine change (the one rules edit)

NEW→ASSIGNED permission widens from admin-only to admin OR self-claiming eligible editor (editorId must equal the actor for the editor path; all eligibility guards enforced in transitionJob). Unit gate (tests/transitions.test.ts) extends accordingly — new arms for: editor self-claim allowed, editor claiming FOR ANOTHER editor rejected, claim on non-ready/assigned job rejected, over-cap claim rejected.

Ops console impact (minimal, this slice)

/ops unchanged except: jobs claimable by the pool show a small "in pool" indicator; manual assignment keeps working exactly as today and simply beats the pool. Reassignment flow unchanged.

Explicitly out of scope (this slice)

Auto-match/ranking (rest of Phase 10); push notifications for new jobs (Phase 7 email machinery); dismissal analytics; client-side of anything; editor payout changes (display only, placeholder values); duration/codec probing (Phase 9).