{"id":"586407fe-78e4-4227-b4b4-8a22a6dd78a3","shortId":"ZTy5uF","kind":"skill","title":"manage-freeze-windows","tagline":">-","description":"# Manage Freeze Windows\n\nCreate and toggle Harness deployment freeze windows via MCP. A freeze window blocks pipeline executions within a time window so you can enforce change freezes for releases, holidays, or maintenance.\n\n## MCP Tools Used\n\n| Tool | Resource Type | Purpose |\n|------|---------------|---------|\n| `harness_list` | `freeze_window` | List project freeze windows, filter by status / time / keyword |\n| `harness_get` | `freeze_window` | Get a single freeze window by identifier |\n| `harness_create` | `freeze_window` | Create a freeze window from YAML |\n| `harness_update` | `freeze_window` | Replace an existing freeze window's YAML definition |\n| `harness_delete` | `freeze_window` | Delete a freeze window |\n| `harness_execute` (action: `toggle_status`) | `freeze_window` | Enable / disable one or more freeze windows in bulk |\n| `harness_get` | `global_freeze` | Get the current project-level global freeze state |\n| `harness_execute` (action: `manage`) | `global_freeze` | Enable or disable the project global freeze from YAML |\n| `harness_schema` | `freeze_window` | Exact JSON Schema for the `create` / `update` body |\n\nBoth resources are **project-scoped** — every call needs `org_id` and `project_id`.\n\n## Freeze Window YAML\n\nCreate/update bodies take a **raw freeze YAML string** passed as `body: { yaml: \"<yaml string>\" }`. The MCP server forwards it to the Harness API with `Content-Type: application/yaml`.\n\n```yaml\nfreeze:\n  name: Q4 Release Freeze\n  identifier: q4_release_freeze\n  entityConfigs:\n    - name: All Services\n      entities:\n        - type: Service\n          filterType: All\n        - type: Environment\n          filterType: All\n        - type: EnvType\n          filterType: All\n        - type: Org\n          filterType: All\n        - type: Project\n          filterType: All\n  status: Enabled                     # Enabled | Disabled\n  description: \"Change freeze for Q4 GA release\"\n  windows:\n    - timeZone: America/Los_Angeles\n      startTime: 2026-12-20 00:00 AM\n      duration: 14d                   # e.g. 2h, 3d, 14d, 4w\n      recurrence:\n        type: Yearly                  # Daily | Weekly | Monthly | Yearly (optional)\n  notificationRules: []\n```\n\nUse `harness_schema(resource_type=\"freeze_window\")` if you want the authoritative field list. Key rules:\n- `identifier` matches `^[a-zA-Z_][0-9a-zA-Z_]{0,127}$`.\n- `entityConfigs` is required and must match at least one deployment scope.\n- `windows[].duration` accepts `h`, `d`, `w` suffixes (no seconds).\n- `windows[].startTime` format: `YYYY-MM-DD HH:mm AM|PM` in the given `timeZone`.\n\n## Instructions\n\n### Step 1: List existing freeze windows\n\n```\nCall MCP tool: harness_list\nParameters:\n  resource_type: \"freeze_window\"\n  org_id: \"<organization>\"\n  project_id: \"<project>\"\n  freeze_status: \"Enabled\"     # optional: Enabled | Disabled\n  search_term: \"release\"       # optional: keyword filter\n  start_time: 1735689600000    # optional: epoch ms lower bound\n  end_time: 1738368000000      # optional: epoch ms upper bound\n```\n\n### Step 2: Get a freeze window by identifier\n\n```\nCall MCP tool: harness_get\nParameters:\n  resource_type: \"freeze_window\"\n  resource_id: \"<freeze_identifier>\"\n  org_id: \"<organization>\"\n  project_id: \"<project>\"\n```\n\n### Step 3: Create a freeze window\n\n```\nCall MCP tool: harness_create\nParameters:\n  resource_type: \"freeze_window\"\n  org_id: \"<organization>\"\n  project_id: \"<project>\"\n  body:\n    yaml: |\n      freeze:\n        name: Holiday Freeze\n        identifier: holiday_freeze\n        entityConfigs:\n          - name: All Services\n            entities:\n              - type: Service\n                filterType: All\n              - type: Environment\n                filterType: All\n              - type: EnvType\n                filterType: All\n        status: Enabled\n        windows:\n          - timeZone: America/Los_Angeles\n            startTime: 2026-12-22 06:00 PM\n            duration: 10d\n```\n\n### Step 4: Update a freeze window\n\n`harness_update` performs a **full replace** of the YAML — include every field you want to keep.\n\n```\nCall MCP tool: harness_update\nParameters:\n  resource_type: \"freeze_window\"\n  resource_id: \"<freeze_identifier>\"\n  org_id: \"<organization>\"\n  project_id: \"<project>\"\n  body:\n    yaml: \"<full updated freeze YAML>\"\n```\n\n### Step 5: Toggle status for one or many freeze windows\n\n```\nCall MCP tool: harness_execute\nParameters:\n  resource_type: \"freeze_window\"\n  action: \"toggle_status\"\n  org_id: \"<organization>\"\n  project_id: \"<project>\"\n  status: \"Enabled\"                    # Enabled | Disabled\n  body:\n    freeze_ids: [\"holiday_freeze\", \"q4_release_freeze\"]\n```\n\nPass an array of identifiers — toggle works in bulk. Use this instead of editing the YAML when you just need to flip enabled/disabled.\n\n### Step 6: Delete a freeze window\n\n```\nCall MCP tool: harness_delete\nParameters:\n  resource_type: \"freeze_window\"\n  resource_id: \"<freeze_identifier>\"\n  org_id: \"<organization>\"\n  project_id: \"<project>\"\n```\n\n### Step 7: Read the project global freeze\n\n```\nCall MCP tool: harness_get\nParameters:\n  resource_type: \"global_freeze\"\n  org_id: \"<organization>\"\n  project_id: \"<project>\"\n```\n\nReturns `{ status: \"Enabled\" | \"Disabled\", ... }`. The global freeze is a **singleton** — there is exactly one per project scope, no `resource_id` needed.\n\n### Step 8: Enable or disable the global freeze\n\n```\nCall MCP tool: harness_execute\nParameters:\n  resource_type: \"global_freeze\"\n  action: \"manage\"\n  org_id: \"<organization>\"\n  project_id: \"<project>\"\n  body:\n    yaml: |\n      freeze:\n        name: Project Global Freeze\n        identifier: _global_\n        status: Enabled              # Enabled | Disabled\n        entityConfigs:\n          - name: All\n            entities:\n              - type: Service\n                filterType: All\n              - type: Environment\n                filterType: All\n              - type: EnvType\n                filterType: All\n        windows:\n          - timeZone: UTC\n            startTime: 2026-12-22 00:00 AM\n            duration: 14d\n```\n\nThe global freeze takes effect immediately when `status: Enabled` — pipelines at the project scope will start being blocked.\n\n## Examples\n\n### Create a two-week holiday freeze\n\n```\n/manage-freeze-windows\nCreate a holiday freeze window called \"Winter 2026 Shutdown\" in org default, project payments,\ncovering all services and environments, from 2026-12-22 6pm PT for 14 days.\n```\n\n### Check what's currently blocking deployments\n\n```\n/manage-freeze-windows\nList every Enabled freeze window in project \"payments\" and also show me whether the project global\nfreeze is on.\n```\n\n### Bulk-disable all freezes for a hotfix\n\n```\n/manage-freeze-windows\nDisable all Enabled freeze windows in project \"payments\" temporarily so I can ship a hotfix.\n```\n\n### Turn on the project global freeze\n\n```\n/manage-freeze-windows\nEnable the global freeze for project \"payments\" right now with a 4-hour duration in UTC —\nwe're running incident response.\n```\n\n### Audit scheduled freezes for a release\n\n```\n/manage-freeze-windows\nShow me every freeze window in project \"release-ops\" whose start_time is in the next 30 days.\n```\n\n## Performance Notes\n\n- **Use `harness_schema(resource_type=\"freeze_window\")`** to get the authoritative body schema before drafting new YAML — field names are case-sensitive and several fields (`entityConfigs`, `windows`, `notificationRules`) are required.\n- **Prefer `toggle_status` over `update`** when you only want to flip enabled/disabled — it avoids re-sending the full YAML and works in bulk.\n- **Freeze windows are project-scoped** — a window in project A does not affect project B. To freeze the whole org, create a freeze window in every project (or use `global_freeze` per project).\n- **`global_freeze` is a singleton per project** — there is no list/create/delete. `harness_get` reads it, `harness_execute(action=\"manage\")` flips it on or off via YAML.\n- **Time zones matter** — `timeZone` is an IANA name (e.g. `America/Los_Angeles`, `Europe/Berlin`), not an offset. The server interprets `startTime` in that zone.\n- **Overlapping windows compound** — Harness evaluates every Enabled freeze window; if any match, the deployment is blocked. Disable rather than delete if you may re-enable later.\n\n## Troubleshooting\n\n### `body must include yaml (freeze YAML string with 'freeze:' root)`\n\nYou passed the body as a plain YAML string or JSON object — the `bodyBuilder` expects the outer shape `body: { yaml: \"<yaml string>\" }`. Wrap your YAML string in a `yaml` key.\n\n### `INVALID_REQUEST` on create\n\n- Check that `entityConfigs` is present and non-empty. `entityConfigs[].entities` must include at least `Service` and `Environment` (or `EnvType`) filters.\n- Verify `identifier` matches `^[a-zA-Z_][0-9a-zA-Z_]{0,127}$` — hyphens and dots are not allowed in identifiers.\n- `duration` values use suffixes (`2h`, `3d`, `14d`, `4w`) — raw numbers without a suffix are rejected.\n\n### `DUPLICATE_IDENTIFIER`\n\nA freeze window with that identifier already exists at the same project scope. Either `harness_update` the existing one or pick a new identifier.\n\n### Toggle fails with \"body must include freeze_ids\"\n\n`toggle_status` expects `body.freeze_ids` as an array of strings, even for a single window. Pass `body: { freeze_ids: [\"my_freeze\"] }`, not `body: \"my_freeze\"` or `resource_id: \"my_freeze\"`.\n\n### Deployments still run during an Enabled freeze\n\n- Confirm the freeze `status` is `Enabled` and not `Disabled` — `harness_get` will show the current status.\n- Check the `windows[].startTime` and `duration` — if the current time is outside the window, the freeze is scheduled but not active.\n- Verify `entityConfigs` actually cover the service/environment you're deploying to — a freeze with `Service: filterType: NotEquals / entityRefs: [payments]` will not block `payments`.\n- Global project freeze and named freeze windows are independent — either one being `Disabled` is enough to let a deployment through if that's the only one matching.\n\n### Can't delete a freeze window\n\nActive (currently firing) freeze windows cannot be deleted in some account tiers — `Disabled` them first via `toggle_status` then `harness_delete`.","tags":["manage","freeze","windows","harness","skills","agent-skills","agents"],"capabilities":["skill","source-harness","skill-manage-freeze-windows","topic-agent-skills","topic-agents"],"categories":["harness-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/harness/harness-skills/manage-freeze-windows","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add harness/harness-skills","source_repo":"https://github.com/harness/harness-skills","install_from":"skills.sh"}},"qualityScore":"0.457","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 15 github stars · SKILL.md body (10,193 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:06:30.486Z","embedding":null,"createdAt":"2026-05-09T01:05:29.169Z","updatedAt":"2026-05-18T19:06:30.486Z","lastSeenAt":"2026-05-18T19:06:30.486Z","tsv":"'-12':249,461,692,747 '-20':250 '-22':462,693,748 '-9':293,1095 '/manage-freeze-windows':725,760,788,810,838 '0':292,298,1094,1100 '00':251,252,464,694,695 '06':463 '1':337 '10d':467 '127':299,1101 '14':752 '14d':255,259,698,1116 '1735689600000':370 '1738368000000':378 '2':385 '2026':248,460,691,733,746 '2h':257,1114 '3':409 '30':856 '3d':258,1115 '4':469,822 '4w':260,1117 '5':509 '6':571 '6pm':749 '7':593 '8':635 'a-za-z':288,294,1090,1096 'accept':313 'account':1298 'action':101,130,528,652,966 'activ':1232,1288 'actual':1235 'affect':928 'allow':1107 'alreadi':1133 'also':770 'america/los_angeles':246,458,984 'api':192 'application/yaml':197 'array':549,1166 'audit':832 'authorit':281,870 'avoid':904 'b':930 'block':20,716,758,1011,1253 'bodi':154,173,182,428,506,539,658,871,1024,1037,1052,1154,1175,1181 'body.freeze':1162 'bodybuild':1047 'bound':375,383 'bulk':114,555,781,914 'bulk-dis':780 'call':162,342,392,414,490,518,576,599,642,731 'cannot':1293 'case':881 'case-sensit':880 'chang':31,238 'check':754,1066,1212 'compound':998 'confirm':1196 'content':195 'content-typ':194 'cover':740,1236 'creat':8,70,73,152,410,418,718,726,936,1065 'create/update':172 'current':121,757,1210,1220,1289 'd':315 'daili':264 'day':753,857 'dd':326 'default':737 'definit':90 'delet':92,95,572,580,1015,1284,1295,1308 'deploy':12,309,759,1009,1189,1241,1273 'descript':237 'disabl':107,136,236,361,538,616,638,670,782,789,1012,1204,1267,1300 'dot':1104 'draft':874 'duplic':1125 'durat':254,312,466,697,824,1110,1217 'e.g':256,983 'edit':560 'effect':703 'either':1140,1264 'empti':1074 'enabl':106,134,234,235,358,360,455,536,537,615,636,668,669,707,763,791,811,1002,1021,1194,1201 'enabled/disabled':569,902 'end':376 'enforc':30 'enough':1269 'entiti':212,441,674,1076 'entityconfig':208,300,437,671,886,1068,1075,1234 'entityref':1249 'environ':218,447,680,744,1083 'envtyp':222,451,684,1085 'epoch':372,380 'europe/berlin':985 'evalu':1000 'even':1169 'everi':161,484,762,841,941,1001 'exact':147,625 'exampl':717 'execut':22,100,129,522,646,965 'exist':85,339,1134,1144 'expect':1048,1161 'fail':1152 'field':282,485,877,885 'filter':53,367,1086 'filtertyp':215,219,223,227,231,444,448,452,677,681,685,1247 'fire':1290 'first':1302 'flip':568,901,968 'format':322 'forward':187 'freez':3,6,13,18,32,47,51,60,65,71,75,81,86,93,97,104,111,118,126,133,140,145,169,177,199,203,207,239,275,340,350,356,388,400,412,422,430,433,436,472,498,516,526,540,543,546,574,584,598,608,619,641,651,660,664,701,724,729,764,777,784,792,809,814,834,842,865,915,932,938,946,950,1003,1028,1032,1128,1157,1176,1179,1183,1188,1195,1198,1227,1244,1257,1260,1286,1291 'full':478,909 'ga':242 'get':59,62,116,119,386,396,603,868,961,1206 'given':333 'global':117,125,132,139,597,607,618,640,650,663,666,700,776,808,813,945,949,1255 'h':314 'har':11,45,58,69,79,91,99,115,128,143,191,271,345,395,417,474,493,521,579,602,645,861,960,964,999,1141,1205,1307 'hh':327 'holiday':35,432,435,542,723,728 'hotfix':787,803 'hour':823 'hyphen':1102 'iana':981 'id':165,168,353,355,403,405,407,425,427,501,503,505,532,534,541,587,589,591,610,612,632,655,657,1158,1163,1177,1186 'identifi':68,204,286,391,434,551,665,1088,1109,1126,1132,1150 'immedi':704 'incid':830 'includ':483,1026,1078,1156 'independ':1263 'instead':558 'instruct':335 'interpret':991 'invalid':1062 'json':148,1044 'keep':489 'key':284,1061 'keyword':57,366 'later':1022 'least':307,1080 'let':1271 'level':124 'list':46,49,283,338,346,761 'list/create/delete':959 'lower':374 'mainten':37 'manag':2,5,131,653,967 'manage-freeze-window':1 'mani':515 'match':287,305,1007,1089,1281 'matter':977 'may':1018 'mcp':16,38,185,343,393,415,491,519,577,600,643 'mm':325,328 'month':266 'ms':373,381 'must':304,1025,1077,1155 'name':200,209,431,438,661,672,878,982,1259 'need':163,566,633 'new':875,1149 'next':855 'non':1073 'non-empti':1072 'note':859 'notequ':1248 'notificationrul':269,888 'number':1119 'object':1045 'offset':988 'one':108,308,513,626,1145,1265,1280 'op':848 'option':268,359,365,371,379 'org':164,226,352,404,424,502,531,588,609,654,736,935 'outer':1050 'outsid':1223 'overlap':996 'paramet':347,397,419,495,523,581,604,647 'pass':180,547,1035,1174 'payment':739,768,796,817,1250,1254 'per':627,947,954 'perform':476,858 'pick':1147 'pipelin':21,708 'plain':1040 'pm':330,465 'prefer':891 'present':1070 'project':50,123,138,159,167,230,354,406,426,504,533,590,596,611,628,656,662,711,738,767,775,795,807,816,845,919,924,929,942,948,955,1138,1256 'project-level':122 'project-scop':158,918 'pt':750 'purpos':44 'q4':201,205,241,544 'rather':1013 'raw':176,1118 're':828,906,1020,1240 're-en':1019 're-send':905 'read':594,962 'recurr':261 'reject':1124 'releas':34,202,206,243,364,545,837,847 'release-op':846 'replac':83,479 'request':1063 'requir':302,890 'resourc':42,156,273,348,398,402,420,496,500,524,582,586,605,631,648,863,1185 'respons':831 'return':613 'right':818 'root':1033 'rule':285 'run':829,1191 'schedul':833,1229 'schema':144,149,272,862,872 'scope':160,310,629,712,920,1139 'search':362 'second':319 'send':907 'sensit':882 'server':186,990 'servic':211,214,440,443,676,742,1081,1246 'service/environment':1238 'sever':884 'shape':1051 'ship':801 'show':771,839,1208 'shutdown':734 'singl':64,1172 'singleton':622,953 'skill' 'skill-manage-freeze-windows' 'source-harness' 'start':368,714,850 'starttim':247,321,459,690,992,1215 'state':127 'status':55,103,233,357,454,511,530,535,614,667,706,893,1160,1199,1211,1305 'step':336,384,408,468,508,570,592,634 'still':1190 'string':179,1030,1042,1057,1168 'suffix':317,1113,1122 'take':174,702 'temporarili':797 'term':363 'tier':1299 'time':25,56,369,377,851,975,1221 'timezon':245,334,457,688,978 'toggl':10,102,510,529,552,892,1151,1159,1304 'tool':39,41,344,394,416,492,520,578,601,644 'topic-agent-skills' 'topic-agents' 'troubleshoot':1023 'turn':804 'two':721 'two-week':720 'type':43,196,213,217,221,225,229,262,274,349,399,421,442,446,450,497,525,583,606,649,675,679,683,864 'updat':80,153,470,475,494,895,1142 'upper':382 'use':40,270,556,860,944,1112 'utc':689,826 'valu':1111 'verifi':1087,1233 'via':15,973,1303 'w':316 'want':279,487,899 'week':265,722 'whether':773 'whole':934 'whose':849 'window':4,7,14,19,26,48,52,61,66,72,76,82,87,94,98,105,112,146,170,244,276,311,320,341,351,389,401,413,423,456,473,499,517,527,575,585,687,730,765,793,843,866,887,916,922,939,997,1004,1129,1173,1214,1225,1261,1287,1292 'winter':732 'within':23 'without':1120 'work':553,912 'wrap':1054 'yaml':78,89,142,171,178,183,198,429,482,507,562,659,876,910,974,1027,1029,1041,1053,1056,1060 'year':263,267 'yyyi':324 'yyyy-mm-dd':323 'z':291,297,1093,1099 'za':290,296,1092,1098 'zone':976,995","prices":[{"id":"43b85e5d-b852-4f29-8b21-96e74cb25d31","listingId":"586407fe-78e4-4227-b4b4-8a22a6dd78a3","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"harness","category":"harness-skills","install_from":"skills.sh"},"createdAt":"2026-05-09T01:05:29.169Z"}],"sources":[{"listingId":"586407fe-78e4-4227-b4b4-8a22a6dd78a3","source":"github","sourceId":"harness/harness-skills/manage-freeze-windows","sourceUrl":"https://github.com/harness/harness-skills/tree/main/skills/manage-freeze-windows","isPrimary":false,"firstSeenAt":"2026-05-09T01:05:29.169Z","lastSeenAt":"2026-05-18T19:06:30.486Z"}],"details":{"listingId":"586407fe-78e4-4227-b4b4-8a22a6dd78a3","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"harness","slug":"manage-freeze-windows","github":{"repo":"harness/harness-skills","stars":15,"topics":["agent-skills","agents"],"license":"apache-2.0","html_url":"https://github.com/harness/harness-skills","pushed_at":"2026-05-13T01:28:28Z","description":"A collection of structured AI agent skills that   enable Claude Code, Cursor, GitHub Copilot, and   other AI coding assistants to create, operate,   debug, and govern Harness CI/CD workflows through   natural language.","skill_md_sha":"8a6d0d1f5f3373c19ccec3659110e4e39faab038","skill_md_path":"skills/manage-freeze-windows/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/harness/harness-skills/tree/main/skills/manage-freeze-windows"},"layout":"multi","source":"github","category":"harness-skills","frontmatter":{"name":"manage-freeze-windows","license":"Apache-2.0","description":">-","compatibility":"Requires Harness MCP server (harness-mcp-v2)"},"skills_sh_url":"https://skills.sh/harness/harness-skills/manage-freeze-windows"},"updatedAt":"2026-05-18T19:06:30.486Z"}}