---
id: ADR-PFM-ELG-010
title: Bulk and scheduled work runs as durable jobs per workspace
product_area: platform
module: eligibility
revision: 1
status: proposed
design_intent: confirmed
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
decision: >-
  Run population, simulation, responsibility reconciliation and computed
  attention through durable jobs keyed to their unit of work.
constrains:
  - DOM-PFM-ELG-003
  - DOM-PFM-ELG-004
  - DOM-PFM-ELG-005
  - WF-PFM-ELG-006
  - WF-PFM-ELG-011
  - WF-PFM-ELG-019
  - SVC-PFM-ELG-eligibility
  - SVC-PFM-ELG-responsibilities
  - SVC-PFM-ELG-attention
origin: >-
  Platform job standard (services-platform docs/jobs.md); responsibilities and
  attention architecture D-13, approved 2026-10-18
alternatives:
  - option: Loop through all workspaces in one long function
    why_not: >-
      A timeout can interrupt many workspaces without individual progress
      records.
  - option: Perform bulk work in the interactive request
    why_not: Large populations exceed interactive request limits.
consequences:
  - The shared job engine tracks and settles executions.
  - >-
    Repeating a submission identity avoids duplicate scheduled jobs; a new
    manual population request creates a new run.
  - >-
    Small sweeps and reminder sends remain scheduled functions with
    per-workspace failure isolation.
supersedes: []
evidence:
  - >-
    services-platform at ad3f6a6: docs/jobs.md;
    modules/eligibility/services/population/population-workflow.ts;
    modules/responsibilities/services/reconcile/nightly-reconcile-workflow.ts;
    modules/attention/services/evaluate/evaluation-workflow.ts
---
# Bulk and scheduled work runs as durable jobs per workspace

## Context

Large evaluations and overnight reconciliation need progress that outlives an interactive request.

## Decision

Run population, simulation, responsibility reconciliation and computed attention through durable jobs keyed to their unit of work.

## Alternatives Considered

Loop through all workspaces in one long function: A timeout can interrupt many workspaces without individual progress records.

Perform bulk work in the interactive request: Large populations exceed interactive request limits.

## Consequences

The shared job engine tracks and settles executions. Repeating a submission identity avoids duplicate scheduled jobs; a new manual population request creates a new run. Small sweeps and reminder sends remain scheduled functions with per-workspace failure isolation.
