TI-2026-100J โ The Quiet Transit, Part J: The Phantom Finding
Classification: TLP:WHITE ยท Confidence: HIGH ยท Series: The Quiet Transit, Part J Subject: a published finding that was never true
1. The claim
Part H, section 9:
"And one previously documented handle has gone quiet.
lir-bg-telco-1-MNTโ recorded in this corpus as part of the same substrate, identified via a shared telephone number to Telco power Ltd of Sofia โ now returns zero objects, while four sibling handles returned between 187 and 3,445 in the same batch. Renamed, deleted, or migrated. Unexplained, and asserted as nothing."
It was published with a scale-table row reading 0 | 0 | 0, and logged to the operations roadmap as an open discrepancy worth re-checking.
It was never true. There was no zero. There was no measurement at all.
2. The controlled experiment
VIA-REGISTRY-MNT was measured at 514 objects earlier the same day. That measurement underpins the whole of Part H โ 46 autonomous systems, 60 organisations, the entire brokerage argument.
Re-queried later, through the identical code path:
$ curl .../search.json?query-string=VIA-REGISTRY-MNT&inverse-attribute=mnt-by
HTTP 429
Zero objects. The same value Part H recorded for lir-bg-telco-1-MNT.
The handle did not change. The response did.
3. What the response actually contained
{
"link": { ... },
"errormessages": {
"errormessage": [{
"severity": "Error",
"text": "ERROR:201: access denied\n\nQueries from your IP address have passed
the daily limit of controlled objects.\nAccess from your host has
been temporarily denied.",
"args": [{ "value": "<querying IP>" }]
}]
},
"terms-and-conditions": { ... }
}
There is no objects key.
And the parsing expression used in every RIPE query across this series:
json.load(...).get('objects', {}).get('object', [])
Against that body it evaluates to []. Silently. Without raising.
An error was consumed as data, and an empty list was published as a measurement.
4. Why that handle, specifically
The Part H batch ran four handles in order:
| # | Handle | Result |
|---|---|---|
| 1 | mnt-bg-eurocrypt-1 | 389 |
| 2 | MNT-ZEXOTEK | 187 |
| 3 | netutils-MNT | 3,445 |
| 4 | lir-bg-telco-1-MNT | 0 |
That 3,445-object response is the largest single result taken anywhere in this series, and it contained 1,183 role objects โ precisely the controlled object class the daily limit governs.
The handle that "vanished" was simply the next one in the loop.
A different loop order would have produced a different phantom. The finding was an artefact of execution, not of the registry.
5. And a second, independent error
Even with no rate limit, the query was wrong for that handle.
This corpus documents lir-bg-telco-1-MNT as one of four handles forming an identical mnt-ref cluster on ORG-TI147-RIPE (TechTies) and ORG-DSL56-RIPE (DEDIK).
The Part H query used inverse-attribute=mnt-by.
| Attribute | Means |
|---|---|
mnt-by | who may modify this object |
mnt-ref | who may reference this organisation in objects of their own |
Different relationships, different semantics. A handle whose documented role is mnt-ref would legitimately return few or no results under an inverse mnt-by search with no rate limiting whatsoever.
So the six-handle comparison in Part H ยง6 was never valid for that member โ and the word mnt-ref appears explicitly in the source note this series was working from.
6. Why this one got through
The other defects this series documented produced wrong numbers from real data:
- Part B โ a score without its denominator
- Part E โ a record without its provenance
- Part I โ a population defined by the filter meant to assess it
This one is categorically different. It converts a failure into a measurement.
When the query does not run, the code does not report an error, a gap, or a null. It reports zero โ a legitimate value in the same domain as every real answer. A reader cannot distinguish "the registry holds nothing" from "the request was refused."
Neither could the author. That is why it reached publication when the others were caught first.
Every signal was there
HTTP status 429. An errormessages array. A severity field reading Error. A human-readable ERROR:201 text naming the daily limit. The querying IP. A documentation link.
Nothing ambiguous. Nothing hidden. The consuming code read one nested key and moved on.
The rate limit itself exists to protect personal data in person and role objects from bulk harvesting, and it functioned exactly as designed. The failure was entirely on this side of the connection.
7. Who it touched
lir-bg-telco-1-MNT resolves, in prior corpus work, to Telco power Ltd of Sofia, Bulgaria via a shared telephone number.
Part H implied that one of that company's registry handles had been removed or migrated โ a statement carrying obvious adverse connotation for a hosting business โ on the basis of an unread error message.
That implication is withdrawn.
After correction, nothing is established here about the handle's current status. Not renamed. Not deleted. Not migrated. Not intact. The mntner object could not be fetched at the time of writing because the same limit applies to it. The prior characterisation โ a member of a four-handle mnt-ref cluster resolving to Telco power Ltd โ stands on its own original evidence and is untouched by this dossier.
Resolving the handle's present state requires an inverse mnt-ref query from an unthrottled source on a later day.
8. The same failure, four times
| Part | What was consumed | What was not checked |
|---|---|---|
| B | a threat average | its denominator |
| E | a database record | its provenance |
| I | a candidate population | its selection criterion |
| J | an HTTP response | its status code |
Four different data sources. Four different layers. One failure:
A value was used without checking what it meant.
Part B scored a consumer ISP as a bulletproof host on three infected customer routers. Part E could not tell a third party's assertion from a first-party observation. Part I hid seven Spamhaus-listed networks behind four characters of SQL. Part J turned a refusal into an absence, and an absence into a finding.
9. The objection
Four of ten dossiers in this series correct the series. That could be read as a corpus more interested in its own process than in threats โ or as manufacturing content out of routine engineering mistakes.
Two answers.
First, this error was not internal. It produced a published statement that a named Bulgarian company's registry handle had been removed, on the basis of an unread error message. A wrong public claim about a real company is corrected in public, or it is not corrected at all.
Second, the failure mode generalises. Any tool consuming a paginated or rate-limited API with a permissive parser can silently convert refusal into absence โ and in threat intelligence, absence is frequently the finding. "The infrastructure is gone." "The operator has no other assets." "Nothing was found." Every one of those sentences can be manufactured by an unchecked status code.
That is worth one page.
What would not be worth publishing is a further dossier in this series with no subject. This is the last one.
10. The fixes, in order of value
- Check the status code. Treat any non-2xx as an exception, never as data. This alone would have prevented the finding.
- Assert the shape. Require the expected key to be present rather than defaulting it โ a missing
objectskey should raise, not yield[]. - Distinguish zero from unknown. A measurement that could not be taken is
nullor not measured โ never0โ in both data and prose. Part H's corrected table now reads not measured for exactly this reason. - Match the relationship to the entity. Before comparing handles across an inverse attribute, confirm each one actually uses that attribute.
mnt-byandmnt-refare not interchangeable. - Re-run any batch whose members disagree wildly. A set returning 3,445, 389, 187 and 0 should have prompted a re-query of the outlier before publication.
[INFERRED โ proposals, not implemented.]
11. Metadata
| Field | Value |
|---|---|
| Investigation | TI-2026-100J |
| Series | The Quiet Transit (Part J โ final) |
| Finding withdrawn | TI-2026-100H ยง9, lir-bg-telco-1-MNT |
| Cause 1 | HTTP 429 body parsed as empty result |
| Cause 2 | mnt-by queried where mnt-ref documented |
| Part H status | Corrected in place โ other measurements unaffected |
| Claim about the handle | None |
| Confidence | HIGH |
Sources
- RIPE NCC REST DB โ reproduced 429 response, 2026-07-26
- RIPE ERROR:201 documentation
- LSN
dossier_intel+ operations roadmap โ the originalmnt-refcharacterisation - Part B ยท Part E ยท Part H ยท Part I
This dossier withdraws a claim previously published by this corpus about lir-bg-telco-1-MNT and, by extension, about Telco power Ltd. No adverse finding against that handle or that company is made or maintained here. RIPE NCC is named for accuracy: its API signalled the error condition correctly and completely, and the failure was entirely on the consuming side.