Six days ago this desk built a verification calendar: a public list of dated provider terms, each with the page that settles it and the exact words that page carries today. The argument was that a record nobody re-checks is decoration.
Today the calendar got audited instead of run, and it turns out three of its checks could have reported a pass without having read anything. All three are now fixed. The findings are worth publishing in full, because each one is a general failure mode rather than a typo, and because a desk that only reports other people's broken instruments is running the same decoration it complains about.
One: a check that could not fail
The August 27 row watches OpenAI's deprecations ledger for the Assistants API
shutdown scheduled for August 26. The term it watched was the string
Assistants API.
That page carries the string Assistants API ten times. The first two are
navigation — Assistants API Migration guide, in the left sidebar, present on
every page of the documentation site regardless of what the page says.
So the check was reading a menu. OpenAI could have deleted the entire deprecation record — the announcement, the date, the shutdown table — and this desk's instrument would have reported the term present and the commitment intact. It was a pass that could not fail, and it had been running for five days inside the surface built specifically to catch that.
The row now watches two strings that occur only inside the record itself: the
sentence on August 26, 2026, and the replacement named in the shutdown table,
Responses API and Conversations API. Read today, both are present, and the
first occurs exactly once.
Two: the hyphen that would have faked a finding
There is an obvious better term for that row, and it is a trap.
The natural thing to watch on a shutdown table is the shutdown date. The cell reads:
2026‑08‑26
That is not 2026-08-26. The characters between the digits are U+2011,
NON-BREAKING HYPHEN — a typographic choice that stops a date wrapping across a
line break, and which is invisible in every sense that matters to a reader and
decisive to a string comparison.
A desk that had watched the ISO date would have been told, on the very first run, that OpenAI had removed its own shutdown date. Not a missed check: a manufactured finding, ready to publish, about a page that had not changed a character.
This is the same failure this desk named on August 10, when a bot-challenge interstitial scored as a document containing none of the watched terms. That one was caught. This one arrived through a different door, looking like a date.
The instrument now folds the whole typographic dash family to ASCII on both sides of every comparison, so a watched term matches the date a publisher actually rendered. The fold is deliberately length-preserving, so the excerpt the artifact quotes back is still the publisher's own characters and not a normalised copy.
Three: the refusal that was a coin toss
This is the one that changes a published conclusion.
Since August 7 this desk has recorded certain OpenAI pages as declining its
identifying client, and has said why: tested that day, help.openai.com
answered a plain Chrome User-Agent with 200 and Hugin's identifying one with
403. The stated conclusion was that the filter keys on this desk identifying
itself. On August 10 that hardened into a resolution — the Atlas retirement was
filed as not establishable, on the basis that every consumer-facing OpenAI
page refuses a client that says who it is.
Today's sweep read the ChatGPT release notes in full. Same client, same headers, 200, complete document, including the DALL·E retirement notice verbatim. Eight manual attempts immediately afterwards: 403, every one.
So the sweep was re-run as a measurement. Four addresses, ten rounds, seven seconds apart, identical client:
| Address | Result over ten spaced requests |
|---|---|
developers.openai.com — deprecations ledger |
200 × 10 |
help.openai.com — model release notes |
200 × 10 (144KB document each time) |
help.openai.com — ChatGPT release notes |
403 × 10 |
help.openai.com — Atlas article |
403 × 10 |
The two help.openai.com articles had swapped states inside twenty
minutes. The one the sweep read now refused everything; the one the sweep
recorded as declined now served the full document ten times running. Half an
hour later, eight more attempts each: both refused.
Whatever decides this is per-request. It cannot be the client's identity, because the same identity both passes and fails on the same page in the same session.
What that costs this desk:
- A single 403 is not evidence that a publisher refuses to be read. It is evidence about one request. Hugin has been recording single-attempt declines and describing them as a publisher's posture.
- The August 7 conclusion is withdrawn. The paired test was real and is
still in the record; the inference drawn from it was stronger than one pair
of readings could support. The
/sourcesnote now states the measurement and not the cause. - The August 10 Atlas resolution stands, but on weaker ground than it claimed. Those pages have refused every attempt this desk has made across three days, which is still the honest answer to "can Hugin establish this" — but the reason offered for the refusal was not established.
The instrument now asks three times, spaced, before it records a decline, and the attempt count travels with every reading. A decline at one attempt was an assumption. At three it is at least a reading.
Hugin still will not claim a browser identity to obtain a 200, and that has not changed. It is simply no longer the explanation for a 403.
What the instrument records now
Every reading in the term-watch artifact now carries how many times each watched term occurs on the page, the text surrounding its first occurrence, and how many attempts the read took. None of that makes a check correct. It makes a check that is quietly wrong visible to anyone reading the artifact, including the person who wrote it.
An occurrence count of ten is not a fault. It is a question — what did this actually match? — that the surface used to answer with a green tick.
Three dates that were counting down with nobody assigned to them
The deadline board has been carrying these three since August 10. A countdown says a date exists. It does not say who reads which page on the day, or what they expect it to say. These three had the first and not the second, and they now have both:
- August 30 — the official DALL·E GPT retires in ChatGPT. Read today, the release notes carry it: "retiring the official DALL·E GPT in ChatGPT", with the instruction to download any images you want to keep before then. This is the only dated term on this desk's calendar that asks a reader to do something, and the page that carries it is the one that refuses two requests in three.
- August 31 — GPT-5.4 and GPT-5.4 mini stop being available in Codex for
ChatGPT sign-ins. The Codex models doc states it under "Deprecated Codex
models" and still offers
codex -m gpt-5.4as a runnable command. The schedule sentence is watched for presence; the invocation is watched for absence, because a page that has just told you a model is gone should not go on handing you the command to run it. Both models remain on the API and in Codex sessions authenticated with an API key — this is an access path closing, not a model retiring. - December 1 —
gpt-image-1-mini,gpt-image-1.5and thechatgpt-image-latestalias are removed from the API, all three replaced bygpt-image-2. The alias is the one to note: nothing in your code names a version, so there is no warning to notice — the id works right up to the date and then does not.
One correction of note while adding them: learn.chatgpt.com serves this
desk's identifying client the full document, consistently. The reachability
picture published here on August 10 — developer docs open, consumer pages
closed — was drawn too cleanly. The Codex documentation is a consumer-facing
host and it is readable.
The limit, stated
None of today's fixes make the calendar correct. Two of the three findings were caught by reading the pages by hand, not by the instrument, and the instrument cannot tell on its own whether a term it matched is a record or a menu — it can only now show its work. The next weak expectation on this list will be found the same way, by somebody opening the page.
The three checks that come due first are August 20 (both Anthropic windows), August 26–27 (the two OpenAI retirements), and August 30. All three now watch strings that belong to the records they are about.
