torc 0.22.2

Workflow management system
# Prioritize Jobs

Use job `priority` when some ready jobs should run before others.

This is useful when:

- A small number of urgent jobs should be claimed first
- Expensive compute should be reserved for the most important ready work
- Background or cleanup jobs should run only after higher-value jobs have been claimed

## How Priority Works

- Every job has a `priority`
- Higher values are claimed first
- The default is `0`
- Priority affects both queue-depth claims and resource-based claims
- A high-priority job still must fit the requesting runner's resources to be claimed

If two ready jobs have the same priority, Torc uses a stable tie-breaker.

## YAML Example

```yaml
name: priority_example

resource_requirements:
  - name: cpu_small
    num_cpus: 2
    memory: 4g
    num_gpus: 0
    runtime: PT30M

jobs:
  - name: urgent_report
    command: python make_report.py
    resource_requirements: cpu_small
    priority: 100

  - name: normal_batch
    command: python run_batch.py
    resource_requirements: cpu_small
    priority: 10

  - name: cleanup
    command: ./cleanup.sh
    resource_requirements: cpu_small
    priority: 0
```

## JSON Example

```json
{
  "name": "priority_example",
  "jobs": [
    {
      "name": "urgent_report",
      "command": "python make_report.py",
      "priority": 100
    },
    {
      "name": "normal_batch",
      "command": "python run_batch.py",
      "priority": 10
    }
  ]
}
```

## KDL Example

```kdl
name "priority_example"

jobs {
  job {
    name "urgent_report"
    command "python make_report.py"
    priority 100
  }

  job {
    name "normal_batch"
    command "python run_batch.py"
    priority 10
  }
}
```

## Priority and Resources

Priority does not override resource limits.

Example:

- `train_large_model` has priority `100` but needs 8 GPUs
- `small_analysis` has priority `20` and needs 1 CPU
- A runner with 1 CPU and 0 GPUs requests work

In that case, Torc skips `train_large_model` because it does not fit and can still return
`small_analysis`.

## Priority and Scheduler Assignment

Priority decides which eligible jobs are considered first. It does not force a job onto a specific
scheduler or cluster.

If a job must run on a specific scheduler, set its `scheduler` field. Use `priority` to order jobs
within that eligible set.

## Recommendations

- Use larger gaps like `100`, `50`, `10`, `0` so future adjustments are easy
- Reserve very high priorities for urgent or user-facing work
- Keep most jobs at `0` unless you need explicit ordering
- Use `scheduler` for placement constraints and `priority` for ordering