Labor Day 2026 is Monday, September 7. This week freeze mails go out: no deploys after Thursday, skeleton on-call, GitHub quiet through the long weekend.
The other calendar is not yours. OpenAI, Azure OpenAI, Google, and Anthropic have a long habit of landing catalog, routing, safety-stack, and price changes on month boundaries. September 1 is a Monday. Labor Day is the following Monday. The vendor control plane ships into an empty office.
If your mental model of "did production change" is git log --since=2026-08-28, you will conclude nothing happened. That conclusion is wrong.
The pin is a name, not a product
The comfort blanket this industry bought in 2024 and 2025 is a model ID in an env var. gpt-4o-2024-11-20. claude-sonnet-4-20250514. gemini-2.5-pro. Pin the string. Freeze it. Sleep.
A model ID is a routing key. It is not the binary. Behind that string sit objects you do not own:
- Safety routers that rewrite or drop completions before they reach you
- Tool-call parsers that decide whether a JSON blob is a function call or prose
- Content filters with versioned blocklists you will not see in a changelog
- Rate-limit backoff and silent fallbacks to a cheaper or older snapshot when the pinned ID is hot
- Gateway defaults for temperature, max output, and regional capacity
None of those objects live in your Git tree. None of them bump the SHA. Month-start is when they move.
Azure OpenAI has shipped content-filter updates independently of the deployment name. Anthropic has adjusted output classifiers without renaming the model. OpenAI has changed tool-calling strictness on the same ID. Google has shifted Gemini safety thresholds while the model string stayed put. You do not get a pull request.
The chatbot customers talk to on September 1 can refuse a refund it granted on August 28, emit a different function-call shape, or send a slice of traffic to a fallback you never configured. Your commit SHA is identical. The observed product is not.
Path filters go dark at the exact wrong time
Look at the GitHub Actions workflow most teams copied into .github/workflows:
on:
pull_request:
paths:
- 'prompts/**'
- 'src/chatbot/**'
- '.env.example'
That YAML encodes a belief: quality evidence is a function of our diffs. If nobody touches prompts or chatbot source, the gate does not run. During a holiday freeze, nobody touches those paths on purpose. The workflow is not passing. It is untriggered.
Green main on September 4 means no prompt-file PR landed. It does not mean the September 1 product still scores 84.
A path filter is merge control. It is a blindfold when the change arrives from outside the repo.
The customer-facing argument is older than this calendar collision. We said in Why Your Chatbot Needs a Secret Shopper that you cannot treat a conversational system like a login form. The September 1 version is narrower: you also cannot treat a green check from August as a certificate for a control plane that moved while Git slept.
What most people get wrong
Most vendor-changelog coverage stops at "update your API string when they deprecate." Deprecation is the loud event. The quiet event is more common: the pin still resolves, the HTTP 200 still returns, and the behavior moved.
People also treat latest versus pinned as the whole debate. Pinning is necessary. It is not sufficient. Pinning stops named model swaps. It does not freeze the control plane in front of the name.
A third error: treating the last PR comment as a certificate of current production. That comment is evidence about the product at merge time. Merge time is git time. Vendor time kept moving.
We walked through customer-visible failure modes in 5 Reasons Why AI Agents Fail (And How to Prevent Them). Those write-ups assume you noticed a change. A path-filtered gate over Labor Day week does not notice. The change is not in prompts/**.
Control-plane time is the clock
Three clocks, three objects:
- Git time. Commit SHA, prompt files, application code. You own this. It will be frozen from late August through September 7.
- Model ID. The string you send in the request body. You think you own this. You own the name, not the implementation behind it.
- Control-plane time. Routers, filters, parsers, quotas, fallbacks, regional capacity. The vendor owns this. It does not consult your freeze calendar.
Your last passing score is dated in git time. The product in production is dated in control-plane time. Those clocks diverge every month-start. They diverge hardest when your repo is intentionally quiet.
If you need a number for the VP conversation: a 10-day freeze around Labor Day is 10 days of control-plane drift with zero new evidence. September 1 sits inside that window. The score from the last prompt-file PR is an August product.
What to do before Thursday
Do not wait for a prompt PR that will not exist.
- Fire the quality gate on a calendar, not a path. Add
on: schedulewith a cron at 06:00 UTC on September 1, 2, and 8. Path filters belong on merge control. They are the wrong trigger for vendor-side change. - Keep the pin. Stop treating it as a freeze. Write the pin down as a routing key. Add one line to the runbook: "Month-start: assume the control plane moved. Re-score production. Do not re-read git log."
- Compare September 1 to August 28 on the same scenarios, same target, same threshold. You are not looking for a new feature. You are looking for a different product with the same SHA. Score deltas, warning counts, and tool-call shape changes are the signal.
- Give security, legal, and finance the sentence they need. Green main on September 4 is not evidence the production chatbot still behaves. The last proof is dated to the last prompt-file PR. That is an August artifact.
If you already wired UndercoverAgent as a PR check with paths: prompts/**, that check will not fire this week. Point the same action at a scheduled workflow against production on September 1. The report is the evidence; the merge comment is not.
Labor Day coverage this week is about staffing and frozen deploys. That is the internal calendar. The external calendar still has a ship on September 1.
If the only proof you have is the last prompt-file PR, you have no proof of the September 1 product. Pull the score yourself before the long weekend, then pull it again on the 1st. If those two numbers disagree, git was never the source of truth.