# Scheduling track v0.2

Released 2026-10-19. Identifier: nnai-scheduling-0.2. This track has its own
leaderboard, manifest, prediction schema and review path. Core v0.1 files and
scores are frozen; no blended score is computed between the two benchmarks.

## Task and data

300 public synthetic scheduling problems: 120 train, 60 validation, 120 test.
Each split is balanced across three tiers. Tier 1 uses 5 workers, 3 days, 6 shifts;
tier 2 uses 7 workers, 5 days, 10 shifts; tier 3 uses 10 workers, 7 days, 21 shifts.
Shifts last 8 hours and require 1–2 workers. Times are integer hours from day 0,
with half-open intervals [start, end). Rest is 8 hours in tier 1 and 12 in tiers
2–3. Workers have explicit skills, unavailable shifts, minimum/maximum shift
counts and maximum hours. Pairs of incompatible workers cannot share a shift.
Schedules are independent examples; do not carry assignments across cases.

Cases are generated by first planting a feasible assignment and then deriving
availability and workload constraints compatible with it. Feasible witnesses,
generator, seed 20261019 and file hashes are public. The scorer accepts any valid
solution, not just that witness. All cases are satisfiable; v0.2 does not test
proofs of infeasibility, soft preferences, optimal cost, or unseen task templates.
This is a bounded synthetic CSP suite, not a general-planning benchmark. The
planted-feasible distribution and its clues should be considered when interpreting
results. Benchmark code was authored with coding-assistant help; generation,
scoring and the included baseline programs use no neural inference.

## Predictions

Read scheduling_v02/test.jsonl. Return a JSON array with all 120 case IDs:

```json
[{"id":"scheduling-v02-test-0000","assignments":[
  {"shift_id":"d0_s0","worker_ids":["WORKER_ID_FROM_THIS_CASE"]}
]}]
```

The shortened example illustrates structure only. Every case must list every
shift exactly once. Empty worker_ids lists represent unfilled shifts. Unknown
case/shift/worker IDs, duplicate case/shift IDs, duplicate workers within a shift,
missing shifts and extra prediction keys are rejected as malformed submissions.
Empty shifts, wrong staffing, unavailable workers, wrong skills and other real
constraint violations are valid *submission syntax* and receive diagnostics.
Use the downloadable full empty template to obtain all case/shift IDs.

```bash
python scheduling.py solve --output scheduling_predictions.json --max-nodes 20000
python scheduling.py score scheduling_predictions.json --output scheduling_report.json
```

The solver command is an optional reference implementation, not your model.
Your inference process should receive only the problem JSON, not public witnesses
or evaluation reports. Test exposure and template-specific code must be disclosed.

## Scoring

Primary rank: fraction of cases with **zero violated constraints**. Break ties
with coverage-adjusted partial score. A high partial score is not full feasibility.
Both metrics are percentages on [0,100]. No score is combined with core v0.1.

The seven families instantiate these checks:

| Family | Instantiated constraint |
| --- | --- |
| Staffing | Each shift has exactly the required number of distinct workers |
| Availability | Each assigned worker is available for that shift |
| Skills | Each assigned worker has the shift's required skill |
| No overlap | Every pair of shifts assigned to a worker has nonnegative gap |
| Rest | Every pair of shifts assigned to a worker has gap at least minimum rest |
| Workload | Per worker: min shifts, max shifts, max total hours (three checks) |
| Incompatibility | Each forbidden worker pair, checked for every shift |

Within a case, family satisfaction = passed / applicable checks. Families with
zero applicable checks are vacuously satisfied (100%) and displayed as N/A. Raw
constraint satisfaction is the equal-weight mean of the seven family percentages.
Coverage = sum over shifts of min(assigned workers, required workers) / total
required worker slots. Per-case partial = raw satisfaction × coverage (coverage
as a fraction). Aggregate metrics are means over cases, not means over pooled
constraint instances, to avoid letting a large case dominate the score. Family
reports include both per-case-mean satisfaction and pooled passed/total counts.

An empty schedule has zero coverage and zero partial score, regardless of vacuous
constraints. Assigning excess workers cannot raise coverage above 100% and breaks
staffing. Wrong-skill or unavailable assignments may still fill a nominal staffing
slot but fail their own constraints and cannot count as fully feasible. Overlap
also violates rest; both families deliberately record it. Partial credit is a
diagnostic convention and can reward some invalid solutions highly; feasibility
therefore remains the primary rank. No optimality or fairness claim is made.

Each violation records a stable constraint ID, family, expected and actual value.
The browser shows a breakdown and offers a full downloadable report for every
case. The Python scorer produces the same report structure and values.

## Baselines and review

Greedy assigns compatible workers chronologically, preferring low workloads; it
does not backtrack or guarantee minimum workloads. Bounded backtracking uses
minimum-remaining-values and minimum-workload forward checking with 20,000 search
nodes per case. Exhausting this budget produces an empty schedule; it does not
declare the task unsatisfiable. Neither program reads witnesses. These are
maintainer-created, template-informed controls, not community submissions or
evidence of general intelligence. Their source, predictions and full reports are
public. The witness only proves feasibility of the generated distribution.

Use the existing form, selecting Scheduling v0.2. Submit at most 2 MB of predictions
as a file or pasted JSON. Preview and downloadable diagnostics run in the browser.
Publication is a public review PR with schema_version 2 and the scheduling test
file's SHA-256. The maintainer recomputes scores and reviews source and resource
declarations before adding an entry to scheduling-leaderboard.json. Core v0.1
continues using schema_version 1 and its original test checksum. Non-neural
inference, offline-resource and reproduction rules from PROTOCOL.md still apply.
