think
16px
820px

Background-job owner identity — plan

Design: ../specs/2026-07-08-job-owner-identity-design.md. TDD; pnpm check
green before ship; deploy only on go-ahead.

  1. src/lib/jobs/types.ts (new) — EvalJob / ReingestJob with ownerId?.
  2. api/admin/jobs/route.ts — import shared types + opaqueStaffId; inject
    ownerId: opaqueStaffId(auth.user.email) into the job payload (override any
    client value).
  3. workers/eval-nightly.ts — import EvalJob; extract runEvalJob(data);
    send X-User-Id: data.ownerId ?? "system:nightly-eval" + unique
    X-Request-Id: ${sessionId}-t0-${randomUUID()} per question.
  4. workers/knowledge-reingest.ts — import ReingestJob; extract
    runReingestJob(data); forward X-User-Id (owner or
    system:knowledge-reingest) + X-Request-Id to /admin/ingest.
  5. Tests (tests/workers/*.test.ts, tests/api/jobs-owner.test.ts) — mock
    @ahu/queue so importing a worker module doesn't start Redis; assert the
    headers above and the enqueue capture/override.

Gate: corepack pnpm --filter internal-web test then full pnpm check.
Completion notes + upload. Deploy (internal-web image + workers stack) on
go-ahead.