Recipe catalog / change-window-fit
Check a change against a change-window policy
Does the described change fall within the written change-window or freeze policy?
A deploy or infrastructure change is proposed in free text and you want a first read on whether it is permitted under a written change-window or freeze policy before a human approver looks at it.
Explore this recipe interactively ยท Source and implementation guide
Use change-window-fit in TypeScript
Install with npm install jev-recipes. Requires Node.js 22.9 or newer and ES modules. Set TYPESAFE_API_KEY in your server environment for live calls, which send input to TypeSafe and use API quota. See the installation guide.
import { changeWindowFit } from 'jev-recipes/change-window-fit';
const result = await changeWindowFit({
"change": "Deploy payments-service 4.12.1 to production on Friday 2026-09-25 at 16:30 UTC. It patches a rounding bug in refund amounts. Standard rolling deploy, no schema change. Not an emergency; the bug affects about 0.1% of refunds.",
"policy": "Production change windows are Monday to Thursday, 09:00 to 17:00 UTC. No production deploys on Fridays, weekends, or during the quarter-end freeze covering the last five business days of each quarter. Emergency fixes may proceed outside windows only with written approval from the incident commander.",
"minConfidence": 0.8
});
console.log(result);
Input contract
| Field | Type | Needed |
|---|---|---|
| change | string | Required |
| policy | string | Required |
| minConfidence | number | Optional |
Full input and result schemas
{
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"change": {
"type": "string"
},
"policy": {
"type": "string"
},
"minConfidence": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"change",
"policy"
]
},
"result": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"model": {
"type": "string"
},
"usage": {
"type": "object",
"properties": {
"input_tokens": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"output_tokens": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"input_tokens",
"output_tokens"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"ready",
"review"
]
},
"probability": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"verdict": {
"type": "string",
"enum": [
"allowed",
"blocked"
]
}
},
"required": [
"model",
"usage",
"status",
"probability",
"confidence",
"verdict"
],
"additionalProperties": false
}
}Saved example result
This hand-authored response demonstrates the contract. It is not a model accuracy measurement. Run it without an API key: npx jev-recipes demo change-window-fit.
{
"model": "demo-fixture",
"usage": {
"input_tokens": 0,
"output_tokens": 0
},
"status": "ready",
"probability": 0.07,
"confidence": 0.9299999999999999,
"verdict": "blocked"
}
Evaluation evidence
No verified live accuracy measurement is available. Evaluate representative cases before using this decision in your workflow.
Use the evaluation guide to measure this decision on your own labeled cases.
Limitations
- Dates, times, time zones, and business-day arithmetic must be compared in application code. The recipe reads the texts as written and does not compute calendar facts.
- Judges the change as described against the policy as written. It does not know about approvals, exceptions, or freeze calendars that are not in policy.
- A blocked verdict is a flag for an approver, not an enforcement decision.
Related recipes
- slot-fit: Use slot-fit to check whether a proposed time matches a stated availability window in scheduling contexts, rather than a deployment policy.
- action-scope: Use action-scope to check whether an action stays within what was requested, rather than whether its timing is allowed.