<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>NoDataError on RockB</title><link>https://baeseokjae.github.io/tags/nodataerror/</link><description>Recent content in NoDataError on RockB</description><image><title>RockB</title><url>https://baeseokjae.github.io/images/og-default.png</url><link>https://baeseokjae.github.io/images/og-default.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 29 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://baeseokjae.github.io/tags/nodataerror/index.xml" rel="self" type="application/rss+xml"/><item><title>When Agent Memory Returns Nothing: Cognee's Silent Empty-Recall Failures, Measured From Its Own Telemetry</title><link>https://baeseokjae.github.io/posts/cognee-empty-memory-recall-2026/</link><pubDate>Thu, 29 Oct 2026 00:00:00 +0000</pubDate><guid>https://baeseokjae.github.io/posts/cognee-empty-memory-recall-2026/</guid><description>Vendor telemetry put 404 NoDataError on 25.8% of Cognee 1.6.1 POST /recall calls on 2026-10-08. A symptom-to-cause triage table, with the v1.6.4 code lines behind each silent failure.</description><content:encoded><![CDATA[<p>A memory layer fails quietly in one specific way that matters more than any benchmark score: the agent asks for context, receives nothing usable, and answers anyway. Nothing raises in the application. The model&rsquo;s confidence is unchanged, the user gets a plausible answer with no memory behind it, and no alert fires because from the client&rsquo;s point of view the call returned. Cognee is a graph-and-vector memory library for agents, and its maintainers publish dated fleet telemetry as public GitHub issues. That telemetry is unusual: it gives per-release, per-day denominators for exactly this failure, so the silence can be measured rather than described. This article maps each visible symptom to one cause, one probe, and one fix, and keeps every number tied to the release and date printed in the issue it came from.</p>
<p>The framing that makes the numbers usable: a graph that was never built and a graph that was built but matched nothing are different states, and so is a read path that died mid-session. Cognee reports all three to a careless client as some flavour of &ldquo;no results&rdquo;. They have separate causes and separate repairs, and the telemetry shows they have wildly different prevalence across releases.</p>
<p>Two limits up front, because they bound everything below. First, every percentage here is the vendor&rsquo;s own fleet aggregate over their installs and calls on a named date, not a rate your deployment should expect; the cohort effect in one of the issues proves how misleading a fleet rate can be. Second, the code mechanisms were checked by reading the source of tag <strong>v1.6.4</strong> at the line numbers cited, not by running a reproduction. No local probe result appears in this article, and none is implied.</p>
<h2 id="the-mechanics-an-empty-graph-a-poisoned-pipeline-a-dead-worker">The mechanics: an empty graph, a poisoned pipeline, a dead worker</h2>
<p>The first silence is an unbuilt graph. <a href="https://github.com/topoteretes/cognee/issues/5052">topoteretes/cognee#5052</a>, closed on 2026-09-17, replaced a phantom LLM answer with an explicit error: when the knowledge graph is empty but the dataset exists, recall raises <code>NoDataError</code>, which the API maps to HTTP 404 with the message &ldquo;The knowledge graph is empty. Add data and run cognify before searching.&rdquo; When the graph is populated and retrieval simply matched nothing, the same path returns an empty list — a quiet miss with no LLM call. That split is a deliberate contract, and it is also the exact place where naive clients lose information: code that treats any non-200 as &ldquo;no context available&rdquo; collapses 404 and 500 into the same branch, and code that treats an empty list as success never notices that the graph is empty.</p>
<p>The second silence is a pipeline whose state is poisoned. In <a href="https://github.com/topoteretes/cognee/issues/5943">topoteretes/cognee#5943</a> the maintainers trace what happens when a document&rsquo;s source file is deleted after ingest. The per-item status writer only runs on the success path, so an errored item is left without a terminal status; the next <code>cognify</code> sees an item that is not marked complete, re-reads the same vanished file, and raises again. One missing file therefore ends every later memory build for that collection, indefinitely, and the operator sees a generic failure rather than &ldquo;document 7&rsquo;s file is gone.&rdquo;</p>
<p>The third mechanism is about the worker process. Cognee delegates graph-database work to a subprocess harness, and <a href="https://github.com/topoteretes/cognee/issues/5969">topoteretes/cognee#5969</a> reports a release where recall calls began failing with <code>SubprocessTransportError</code> after the engine had been shut down, with the maintainers&rsquo; own diagnosis marked &ldquo;likely&rdquo;: the respawn path refuses to run once a shutdown was requested, so a deliberately closed worker stays closed for the life of the client process.</p>
<h2 id="symptom-triage-table">Symptom triage table</h2>
<p>Read this as the operational core. Each row is one symptom as a caller sees it, the cause that produces it, the single cheapest probe that distinguishes it, and the repair — with the source issue that documents the mechanism.</p>
<table>
	<thead>
			<tr>
					<th>Symptom at the caller</th>
					<th>Likely cause</th>
					<th>One probe</th>
					<th>One repair</th>
					<th>Documented in</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Every recall returns HTTP 404 <code>NoDataError</code></td>
					<td>Graph never built, or built into a different dataset</td>
					<td><code>GET</code> the dataset&rsquo;s item statuses, then call recall on a dataset known to have vertices</td>
					<td>Run <code>cognify</code> and assert vertex count is greater than zero before enabling recall</td>
					<td><a href="https://github.com/topoteretes/cognee/issues/5052">#5052</a>, <a href="https://github.com/topoteretes/cognee/issues/5585">#5585</a></td>
			</tr>
			<tr>
					<td>Recall returns <code>[]</code> for a query you know is answerable</td>
					<td>Read path alive, retrieval threshold or index empty for that query</td>
					<td>Call recall twice: once with the exact document&rsquo;s identifier, once with nonsense</td>
					<td>Fix retrieval, not ingest; a nonsense query returning <code>[]</code> is correct behaviour</td>
					<td><a href="https://github.com/topoteretes/cognee/issues/5052">#5052</a></td>
			</tr>
			<tr>
					<td><code>cognify</code> raises <code>FileNotFoundError</code> on every run</td>
					<td>An item with no terminal status is re-read each build</td>
					<td>Compare dataset item list against the files currently on disk</td>
					<td>Delete or replace the orphaned item, then re-run; retrying alone does not clear it</td>
					<td><a href="https://github.com/topoteretes/cognee/issues/5943">#5943</a></td>
			</tr>
			<tr>
					<td>Recall fails with <code>SubprocessTransportError</code> after idle time</td>
					<td>Worker was shut down and respawn is gated off</td>
					<td>Check the client process has not restarted since the first failure</td>
					<td>Restart the client process; treat worker death as fatal to the session</td>
					<td><a href="https://github.com/topoteretes/cognee/issues/5969">#5969</a></td>
			</tr>
			<tr>
					<td>Recall fails with HTTP 409 and no cause in the body</td>
					<td>Any non-Cognee exception collapsed by the router</td>
					<td>Read the server log line <code>Recall endpoint error</code>, not the response</td>
					<td>Fix the underlying exception; the 409 will never name it</td>
					<td><a href="https://github.com/topoteretes/cognee/issues/5991">#5991</a></td>
			</tr>
			<tr>
					<td><code>cognify</code> ran but the extractor you asked for did not</td>
					<td>Keyword arguments are accepted and discarded</td>
					<td><code>grep</code> the process for the extractor name in logs</td>
					<td>Construct explicit parameters and assert the pipeline config you got back</td>
					<td><a href="https://github.com/topoteretes/cognee/issues/5773">#5773</a></td>
			</tr>
			<tr>
					<td>Relevant passages never returned for noise prompts</td>
					<td>No relevance cutoff, so top-k always returns something</td>
					<td>Ask a question with no answer in the corpus</td>
					<td>Apply a score threshold before injecting context</td>
					<td><a href="https://github.com/topoteretes/cognee/issues/5222">#5222</a></td>
			</tr>
	</tbody>
</table>
<h2 id="case-1-an-empty-graph-is-a-404-an-unmatched-query-is-an-empty-list">Case 1: an empty graph is a 404, an unmatched query is an empty list</h2>
<p>The prevalence of the first symptom is the largest published number in this series. On 2026-10-08, <a href="https://github.com/topoteretes/cognee/issues/5585">topoteretes/cognee#5585</a> reports, 25.8% of <code>POST /recall</code> calls on release 1.6.1 — 4,895 of 18,945 — returned 404 <code>NoDataError</code>, across 214 of 298 deployments, and the same issue records 0.2% on 1.6.2. The issue also names the compounding factor: a set of claude-observer deployments whose builds were failing at a high rate, so their graphs stayed empty and their recalls kept hitting the empty-graph branch. That is why the rate collapsed between adjacent releases without a change to the 404 contract itself.</p>
<p>The operator lesson is not &ldquo;upgrade&rdquo; — it is that a 404 and a 500 must not share a branch. A 404 from recall is a fact about your data: there are no vertices. A 500 or a 409 is a fact about your system. Treating them alike turns a one-line diagnostic into an afternoon, because an empty graph and a broken server both look like &ldquo;memory unavailable&rdquo;.</p>
<p>The probe is cheap enough to run in a test suite, and it distinguishes the four states that matter. The route and payload are left as a placeholder on purpose: the HTTP surface is version-specific, and pinning a path here would be a fabricated API detail.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> httpx
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>RECALL_PATH <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;/replace/with/your/recall/route&#34;</span>   <span style="color:#75715e"># route and payload are version-specific</span>
</span></span><span style="display:flex;"><span>BODY <span style="color:#f92672">=</span> <span style="color:#66d9ef">lambda</span> ds, q: {<span style="color:#e6db74">&#34;query&#34;</span>: q, <span style="color:#e6db74">&#34;dataset&#34;</span>: ds}  <span style="color:#75715e"># adapt to your release&#39;s schema</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">classify</span>(status: int, body: str) <span style="color:#f92672">-&gt;</span> str:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> status <span style="color:#f92672">==</span> <span style="color:#ae81ff">404</span> <span style="color:#f92672">and</span> <span style="color:#e6db74">&#34;empty&#34;</span> <span style="color:#f92672">in</span> body<span style="color:#f92672">.</span>lower():
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#e6db74">&#34;no_data&#34;</span>               <span style="color:#75715e"># graph has no vertices: run cognify</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> status <span style="color:#f92672">==</span> <span style="color:#ae81ff">200</span> <span style="color:#f92672">and</span> body<span style="color:#f92672">.</span>strip() <span style="color:#f92672">in</span> (<span style="color:#e6db74">&#34;[]&#34;</span>, <span style="color:#e6db74">&#39;{&#34;results&#34;: []}&#39;</span>):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#e6db74">&#34;no_results&#34;</span>            <span style="color:#75715e"># graph populated, retrieval missed</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> status <span style="color:#f92672">==</span> <span style="color:#ae81ff">409</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#e6db74">&#34;opaque_server_error&#34;</span>   <span style="color:#75715e"># read the server log, not the body</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;other:</span><span style="color:#e6db74">{</span>status<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">probe</span>(base: str, datasets: dict[str, str]) <span style="color:#f92672">-&gt;</span> dict[str, str]:
</span></span><span style="display:flex;"><span>    out <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> httpx<span style="color:#f92672">.</span>Client(base_url<span style="color:#f92672">=</span>base, timeout<span style="color:#f92672">=</span><span style="color:#ae81ff">30</span>) <span style="color:#66d9ef">as</span> c:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> label, ds <span style="color:#f92672">in</span> datasets<span style="color:#f92672">.</span>items():
</span></span><span style="display:flex;"><span>            r <span style="color:#f92672">=</span> c<span style="color:#f92672">.</span>post(RECALL_PATH, json<span style="color:#f92672">=</span>BODY(ds, <span style="color:#e6db74">&#34;unrelated nonsense string&#34;</span>))
</span></span><span style="display:flex;"><span>            out[label] <span style="color:#f92672">=</span> classify(r<span style="color:#f92672">.</span>status_code, r<span style="color:#f92672">.</span>text)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> out
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(probe(<span style="color:#e6db74">&#34;http://127.0.0.1:8000&#34;</span>, {<span style="color:#e6db74">&#34;never_built&#34;</span>: <span style="color:#e6db74">&#34;ds_a&#34;</span>, <span style="color:#e6db74">&#34;built&#34;</span>: <span style="color:#e6db74">&#34;ds_b&#34;</span>}))
</span></span></code></pre></div><p>Run that against a dataset that was never cognified and one that was, and your client&rsquo;s classification function gets a written-down answer for each. The important assertion is not the status code — it is that your agent&rsquo;s code path can tell the two apart without a human reading a log.</p>
<h2 id="case-2-one-deleted-file-fails-every-later-cognify">Case 2: one deleted file fails every later cognify</h2>
<p>The mechanism is visible in the v1.6.4 source of <a href="https://raw.githubusercontent.com/topoteretes/cognee/v1.6.4/cognee/modules/pipelines/operations/run_tasks_data_item.py"><code>cognee/modules/pipelines/operations/run_tasks_data_item.py</code></a>. At line 254 the success path writes <code>status_for_pipeline[str(dataset.id)] = DataItemStatus.DATA_ITEM_PROCESSING_COMPLETED</code>. The exception handler begins at line 267, and on the default configuration its path ends in a re-raise at line 292 — the only per-item status written for that data item is written on success. Under the default <code>RAISE_INCREMENTAL_LOADING_ERRORS</code> value of <code>&quot;true&quot;</code>, the error branch logs and re-raises, which is what turns one unreadable file into a failing build rather than a skipped item.</p>
<p>The field rate makes this the second-largest measured contributor. Per <a href="https://github.com/topoteretes/cognee/issues/5943">topoteretes/cognee#5943</a>, <code>FileNotFoundError</code> ended 25.8% of failed runs on 2026-10-15 (680 of 2,639) against 1.8% over 2026-10-08 through 2026-10-12, and one 1.6.4 deployment failed 100% of its runs. Read that denominator carefully: it is the share of <em>failed runs</em> that ended on this error, not the share of all ingests. Quoting it as &ldquo;26% of cognify calls fail&rdquo; would be a category error, and the jump from 1.8% to 25.8% in a week is better explained by a handful of affected deployments than by a fleet-wide regression.</p>
<p>The repair is a dataset-mutation procedure, not a retry. Treat the ingestion of a document as a pair of events — add file, add item — and require the inverse pair on delete. When a build fails this way, reconcile the dataset&rsquo;s item list against the files that exist, remove the orphaned item, and re-run; the second <code>cognify</code> will succeed because the item that could not be read is no longer scheduled.</p>
<h2 id="case-3-the-worker-does-not-come-back">Case 3: the worker does not come back</h2>
<p><a href="https://raw.githubusercontent.com/topoteretes/cognee/v1.6.4/cognee_db_workers/harness.py"><code>cognee_db_workers/harness.py</code></a> at v1.6.4 defines <code>_can_respawn()</code> at line 1221, returning <code>self._respawn_factory is not None and not self._shutdown_requested</code> at line 1222. The respawn machinery exists — that is the part that reads as reassurance in a code review — but it is gated on the same flag that a deliberate shutdown sets, and <code>call_async</code> re-raises <code>SubprocessTransportError</code> when <code>attempts_left &lt;= 0</code> or <code>_can_respawn()</code> is false. Once a shutdown has been requested, the client has no path back to a live worker.</p>
<p>The measured consequence, from <a href="https://github.com/topoteretes/cognee/issues/5969">topoteretes/cognee#5969</a>: on 2026-10-16, 19.8% of 1.6.4 SDK recalls failed versus 2.0% on 2026-10-15, with 1,391 <code>SubprocessTransportError</code> events plus 273 failed runs from a single deployment; the maintainers&rsquo; headline figure for that window is that worker transport errors accounted for 51% of fleet recall errors. The same issue records 1.6.3&rsquo;s errored-run share rising to 16–21% from 8.4% on 2026-10-13, and notes that at most three deployments repeating one error accounted for 57–75% of the total.</p>
<p>Label this one honestly: the vendor writes &ldquo;likely&rdquo;, and the code line corroborates the shape of the mechanism without proving that it caused those specific failures. What the article can assert is narrower and still actionable — a transport error that survives one retry will not clear on its own, so the correct response to <code>SubprocessTransportError</code> is a process-level restart plus a health check, not a retry loop behind a cache that keeps the dead harness object.</p>
<h2 id="two-holes-that-hide-the-cause">Two holes that hide the cause</h2>
<p>The first is an opaque status code. <a href="https://raw.githubusercontent.com/topoteretes/cognee/v1.6.4/cognee/api/v1/recall/routers/get_recall_router.py"><code>cognee/api/v1/recall/routers/get_recall_router.py</code></a> at v1.6.4 handles <code>CogneeApiError</code> at line 340, then falls through to a bare <code>except Exception</code> at line 361 and logs <code>&quot;Recall endpoint error&quot;</code> at line 363 before returning status 409 at line 365. The message is rebuilt rather than echoed, so the HTTP response names no cause. <a href="https://github.com/topoteretes/cognee/issues/5991">topoteretes/cognee#5991</a> reports the rate for the 1.6.3 API lane: <code>RuntimeError</code> failures at 5.3–9.9% daily since 2026-10-12, against 0.8% on 2026-10-11, observed across only 2–6 deployments. The maintainers themselves flag that these errors carry no telemetry, which is the actual complaint: the rate is visible in aggregate while the cause is not visible at all.</p>
<p>The second hole is argument swallowing. <a href="https://github.com/topoteretes/cognee/issues/5773">topoteretes/cognee#5773</a> documents that <code>cognify()</code> ends its signature with <code>**kwargs</code> which is never validated, forwarded, or used, so a typo such as <code>extactor=&quot;gliner_demo&quot;</code> is accepted and discarded with no warning and no error — the call proceeds with the default extractor and the operator believes the requested one ran. This is reported by the issue&rsquo;s author, not by this article&rsquo;s own run, and it stays open at the time of reading.</p>
<p>Both holes share a defence: never assert on the mood of a response. Assert on the status code and the named error class, and assert separately that the configuration you requested is the configuration in effect.</p>
<h2 id="the-other-silence-confident-wrong-memory">The other silence: confident, wrong memory</h2>
<p>Empty recall is half the problem; the other half is recall that returns something unrelated and is believed. <a href="https://github.com/topoteretes/cognee/issues/5222">topoteretes/cognee#5222</a> is a request for an optional relevance cutoff, and it carries a reviewed 28-case benchmark against <code>cognee/cognee:1.6.1</code> with roughly 400 documents. The result worth quoting: all 7 prompts that had no relevant memory still received 4–5 unrelated passages, 34 in total, and 2 of the 21 cases with known relevant documents missed the top 5 — both exact-identifier lookups, a commit SHA and a ticket or PR number.</p>
<p>Seven noise prompts cannot produce a precise rate, and one lab&rsquo;s corpus is not yours. The transferable finding is the failure shape: with no threshold, top-k retrieval converts &ldquo;nothing relevant exists&rdquo; into &ldquo;here are k passages&rdquo;, which is indistinguishable to the model from genuine context. The fix is different from every fix above — a score cutoff or a lexical boost for identifier-shaped queries — and it deserves its own check, because an agent can pass an empty-recall smoke test and still be answering from noise. If you are choosing where the same symptom shows up on other memory layers, the write-side counterpart is covered in <a href="https://baeseokjae.github.io/posts/mem0-agent-memory-guide-2026/">the Mem0 write-path guide</a>, and <a href="https://baeseokjae.github.io/posts/agent-memory-comparison-2026/">the framework comparison</a> puts Cognee&rsquo;s position in context.</p>
<h2 id="what-the-numbers-do-and-do-not-say">What the numbers do and do not say</h2>
<p>Three cautions, each grounded in one of the issues above.</p>
<p>A fleet rate is a composition, not a property. <a href="https://github.com/topoteretes/cognee/issues/5353">topoteretes/cognee#5353</a> reports the 1.6.1 PyPI error rate going from 3.2% on 2026-09-30 to 32.4% on 2026-10-03 as 182 claude-observer deployments arrived from 1.6.0, and shows that errored deployments matched cohort size on both versions — 272 versus 273 on 2026-10-01 — concluding that upgrading did not fix them. A rise in a published rate can be new arrivals failing the same way, so never read one as a regression in code you run.</p>
<p>A rate does not survive re-dating. The 25.8% empty-graph share on 1.6.1 and the 0.2% on 1.6.2 are the same measurement over adjacent releases; quoting either as &ldquo;Cognee&rsquo;s failure rate&rdquo; erases the only thing that makes them evidence.</p>
<p>Concentration matters as much as the average. The 57–75% figure in #5969 comes from at most three deployments repeating one error, and the 100% failure in #5943 is one deployment. Fleet percentages are dominated by a few installs with a shared configuration, which is exactly the situation a reader is in — not an independent sample of many.</p>
<p>One more scope limit: the code was read at tag v1.6.4, but <a href="https://api.github.com/repos/topoteretes/cognee/releases">the release list</a> shows v1.6.5 published 2026-10-16 and v1.6.6rc1 on 2026-10-23, and neither was audited here. The issues cited were open at read time, which is not the same as unfixed in a shipped release. Before you conclude a mechanism is present in your install, check your version and read that version&rsquo;s source.</p>
<h2 id="a-short-operational-checklist">A short operational checklist</h2>
<ul>
<li>Log the HTTP status and the exception class of every memory read. A bare &ldquo;no results&rdquo; string is not telemetry, and it is the reason the 409 lane produced a rate with no cause.</li>
<li>After every <code>cognify</code>, assert that each document in the dataset has a terminal item status. The absence of a status is the poison that fails the next build, and it is invisible unless you list items explicitly.</li>
<li>Treat deleting a source file as a dataset mutation that must be reconciled before the next build. A retry on its own re-raises.</li>
<li>Distinguish 404 from 409 in client code, and route them to different operator messages: rebuild the graph versus read the server log.</li>
<li>Run two smoke recalls per upgrade — a known-answer query and a known-empty dataset — and assert the status codes, not the text. <a href="https://baeseokjae.github.io/posts/agent-doctor-local-observability/">The local observability walkthrough</a> covers how to capture that evidence without a hosted tracer, and <a href="https://baeseokjae.github.io/posts/zep-ai-agent-memory-review-2026/">the Zep review</a> is the place to compare this failure surface against a temporal-graph alternative.</li>
<li>For identifier-shaped questions (commit SHAs, ticket numbers), test recall separately from prose questions; both misses in the 28-case benchmark were of that kind.</li>
</ul>
<h2 id="what-this-article-did-and-did-not-verify">What this article did and did not verify</h2>
<p>The code claims above are a private author verification by reading v1.6.4 at the cited line numbers; the same three files are linked at their public raw URLs so any reader can repeat the reading, and the line numbers are stable for that tag. No reproduction of the four failure cases was executed for this article, so no pass/fail, timing, or process-table result is reported here — the triage table&rsquo;s probe column is a procedure to run in your own environment, not a result from this one. Every telemetry figure is transcribed as published in its own issue, with that issue&rsquo;s date, denominator, and release attached; the CSV aggregates those issues link were not re-downloaded, so they are cited as the vendor&rsquo;s published aggregate rather than as an independent audit. Where an issue&rsquo;s diagnosis is an inference — the respawn explanation in #5969 — it is labelled as one.</p>
]]></content:encoded></item></channel></rss>