// Deadline — Constraint block. // // The task must finish on or before `latestFinish` (a day index in the // resolved calendar frame). Hard form: a placement that would overrun the // deadline is rejected and the run fails with an attributed explanation. // // MiniZinc compile contract: harness supplies `finish_day[t]`. import { z } from "zod"; import type { DeadlineConstraint } from "../level-core/types.ts"; import type { ConstraintBlock, MiniZincFragment } from "./types.ts"; export const DeadlineInputSchema = z.object({ taskUniqueId: z.number().int(), latestFinish: z.number().int().nonnegative(), }); export type DeadlineInput = z.infer; const DeadlineOutputSchema: z.ZodType = z.object({ kind: z.literal("Deadline"), taskUniqueId: z.number().int(), latestFinish: z.number().int().nonnegative(), }); export const DeadlineBlock: ConstraintBlock = { id: "Deadline", schema: { input: DeadlineInputSchema, output: DeadlineOutputSchema }, apply: ({ taskUniqueId, latestFinish }): DeadlineConstraint => ({ kind: "Deadline", taskUniqueId, latestFinish, }), toMiniZinc: ({ taskUniqueId, latestFinish }): MiniZincFragment => ({ text: `constraint finish_day[${String(taskUniqueId)}] <= ${String(latestFinish)};`, }), doc: { nl: "The task must finish on or before the given day index; later placements are rejected.", pseudocode: "finish(task) <= latestFinish", }, };