At 13:45 UTC today the S&P Global US services PMI final is published. At 14:00 UTC the Institute for Supply Management publishes its non-manufacturing index. Two institutions, two surveys, fifteen minutes apart. This desk read five schedule and indicator pages at four publishers this morning, and across those five pages the words attached to the 13:45 release are “non-manufacturing”, “services”, “composite” and “ISM” — and the words attached to the 14:00 release are “non-manufacturing”, “services”, “composite” and “PMI”. There is no keyword in that set that selects one release and not the other. If your news filter decides whether to flatten by matching a string, it cannot tell these two apart, and today it has to.
The label matrix, as read this morning
Here is what the five pages actually say. One publisher’s morning calendar lists the 13:45 release as “PMI (final): non-manufacturing 58.7, composite 58.4” and the 14:00 release as “ISM non-manufacturing index”. The same publisher’s afternoon schedule page — same series, same day, nine hours later — lists the 13:45 release as “US PMI (final): services 58.7, composite 58.4” and the 14:00 release as “US ISM services index”. A second publisher’s indicator page calls the 14:00 release “ISM non-manufacturing index (composite)”. A third calls it “US ISM non-manufacturing purchasing managers index (PMI)”. A fourth, read at Saturday’s slot, labelled the 13:45 release “ISM non-manufacturing index final 58.7” — attaching the issuing institution’s name to a release that institution does not produce.
Run that through a filter. Key on “ISM” and you match the 13:45 release at the fourth publisher. Key on “non-manufacturing” and you match both releases at the first and second. Key on “PMI” and you match both at the first and third. Key on “composite” and you match the 58.4 sub-line at 13:45 and the whole 14:00 index at the second. Key on “services” and you match both, in the afternoon edition. Every word that could identify the release you care about is attached to the release you do not, by at least one publisher you read.
This desk has published the services-versus-non-manufacturing slippage before, as a two-publisher observation about one release. That was too small a claim. It is four publishers, five pages, and it is not a slippage — it is the absence of a distinguishing key.
One publisher changed both labels between editions, on the same day
The part worth sitting with is not that publishers disagree. It is that one publisher disagreed with itself inside nine hours. The morning calendar, stamped 22:20 UTC yesterday, says “non-manufacturing” for both the 13:45 and the 14:00 rows. The afternoon schedule, stamped 06:25 UTC today, says “services” for both. Same two events, same two times, same forecasts and priors to the tenth, different nouns.
If you cache a calendar once a day, which edition you caught decides what your filter matched. If you refresh it, your event store now holds two differently-named records for the same timestamp, and whether they deduplicate depends on whether your key includes the label. This is the failure mode worth naming: a calendar label is not an identifier. It is editorial copy that changes between editions. The only stable keys on that page are the release time and the issuing institution, and only one of those is printed.
The practical form: key your news window on the timestamp and the country, never on the event name. If you must match a name, match it to a list you maintain, not to the vendor’s string.
The release that actually moved the euro this morning was on neither schedule
At 08:46 UTC the euro-area Sentix investor confidence survey printed plus 2.7 against a consensus of plus 4.5 and a prior of plus 5.1 — a miss of 1.8 points and a fall of 2.4 from last month. It appears on neither the morning calendar nor the afternoon schedule from the publisher discussed above. Both pages list the services PMI finals, the UK services PMI, the euro-area PPI and the two US releases. Neither lists Sentix.
Put that next to the other article this desk is publishing in this slot, which spends its length on four vendors disagreeing by two tenths of a point about the 14:00 ISM. The release nobody tabulated missed its own consensus by nine times the entire width of that disagreement. We are not claiming Sentix moved the euro on its own — euro-dollar had already fallen about a hundred pips in Tokyo, from 1.1261 to 1.1161, on French fiscal news, and recovered to the 1.1205 area by 10:34 UTC as French bond selling eased. We are claiming something narrower and more useful: your schedule’s omissions are not harmless, because a release with no row has no window, and a system that sizes by news proximity was fully exposed at 08:46.
The ADP cell has been empty for five days, and a null is not a “not yet”
One major calendar’s ADP private payrolls row for 30 September still shows a blank actual, read again at 11:50 UTC today. That is five days and five hours past a release scheduled for 12:15 UTC on 30 September. The row carries a prior of 38,000 and no forecast. This desk first logged the blank cell on 2 October, when it had stood for 47 hours and 43 minutes. It has now roughly tripled.
The same page’s upcoming ISM row also shows a blank actual, correctly, because the release is still two hours away as this is published. Those two blanks are identical in the data and opposite in meaning: one is a release that has not happened, one is a release that happened and was never backfilled. If your code reads a null actual as “pending” and holds a window open, you have been holding a window open for a Wednesday release since last week. If it reads a null as “cancelled” and closes the window, it will trade through the ISM in two hours. The field cannot carry both meanings and the vendor gives you nothing else to separate them except the timestamp — which is, again, the only key on the page that means anything.
The cheap fix is a staleness rule rather than a null check: treat a blank actual whose scheduled time is more than some hours in the past as a data fault and alert on it, rather than as state.
What this does not tell you
We have not established that any of these labels is wrong in the publisher’s own terms. The ISM renamed its non-manufacturing report to “services” years ago in common usage while the index itself kept the older name in many tables, so “services index” and “non-manufacturing index” are both defensible for the 14:00 release. That is precisely why the collision is structural rather than a typing error, and it is also why we cannot tell you any publisher is at fault.
We have not verified the 13:45 forecast of 58.7 or the composite 58.4 against S&P Global’s own release, only against two schedule pages at one publisher. We have not confirmed that the Sentix omission is consistent — one day’s two pages is one observation, not a property of the publisher. We have not checked whether other calendars carry the Sentix row; they may, in which case the point is about this publisher rather than about calendars. And we have not tested any of this against an actual filter implementation, so the failure modes above are reasoned from the metadata, not observed in production.
Finally, the ADP blank is one vendor. We have not gone to the issuing source to find out what the September figure was, which means we are reporting a documentation defect and not a number.