# AEG-V15-035 — Due operation contract

## Scope

- **WBS ID:** `AEG-V15-035`; **Slice:** VS-18 / Scheduler
- **Requirement / API / DB / Job / UI / Test:** `REQ-V15-SCH-03` / `V15-SCH-API` / `MIG-0020` / `J31~J40` / `Cross` / `T-V15-SCH-03`
- **Dependency / Gate:** `AEG-V15-034` (completed, commit `dd35259`) / `G3`
- **Acceptance:** persist and trace `scheduledFor`, catch-up policy, and `maxCatchUp` for each model-operation request.

## Source / Assumption / Unknown / Decision Required

- **Source:** `db/migrations/0020_v15_execution_and_ui_contract_hardening.sql` adds nullable `evaluation.model_operation_request.scheduled_for`; `DueModelOperation` already receives `ScheduledFor`, `CatchUpPolicy`, and `MaxCatchUp`; the dispatcher and request repository currently drop this provenance before insert.
- **Assumption:** an individual request must preserve the selected occurrence's UTC scheduled time and the policy/configuration that selected it. These are immutable request provenance, not mutable schedule state.
- **Unknown:** `scheduled_for` is nullable in the approved migration. This Slice will populate it for scheduler-created requests but will not change historical rows or alter the immutable migration.
- **Decision Required:** a full per-occurrence dispatch ledger and enqueue/mark transactional outbox remain `DEC-083` / later scheduler work; this Slice only closes the currently missing request-level provenance.

## Actual evidence

- `dotnet test tests/KArtSell.ModelOperations.UnitTests/KArtSell.ModelOperations.UnitTests.csproj -c Release --filter "FullyQualifiedName~ScheduleOccurrencePlannerTests|FullyQualifiedName~ModelOperationRequestServiceTests" --logger "trx;LogFileName=DueModelOperationContractTests_20260809.trx" --results-directory evidence/AEG-V15-035`
- Result: passed `5/5`; artifact: `evidence/AEG-V15-035/DueModelOperationContractTests_20260809.trx`; SHA-256: `C1BF3EF274702305A29673D5B6A1C3A98D08B1716DA3CD8CB0EE710B5E6C12E6`.
- The targeted build compiles Hangfire serialization, application validation, the append-only request insert, transactional outbox payload, and the scheduler policy tests. No schedule was enabled and no database migration or PostgreSQL test is claimed.
