XIV · Anti-PatternsAnti-pattern

Silent External-Source Rot

also known as Silent Source Rot, Valid-But-Empty Upstream, Unwatched Source Decay

Anti-pattern: an agent keeps reporting success while a wrapped external source has silently changed structure, so its tool returns valid-but-empty or degraded output that nothing watches.

Context

An agent depends on an external source it does not control: a scraped web page, a third-party API, or a retrieval corpus refreshed by an upstream feed. A tool node fetches from that source on every run, and the agent treats whatever comes back as the ground truth its task is built on. The source can change its HTML layout, rename API fields, or quietly empty a feed at any time, on a schedule nobody on the agent's side knows.

Problem

When the source mutates, the fetch still succeeds at the transport layer: the page returns 200, the API returns a well-formed envelope, the corpus still has rows. The extraction underneath, a CSS selector or a field path or a relevance match, now pulls nothing useful, so the tool hands back a structurally-valid but empty or stale payload. The agent has no signal that the content rotted, runs its normal flow on near-empty input, and reports success. Because the failure is silent, it is discovered late, often only when a downstream human notices the output got thin.

Forces

  • External sources change on their own timetable, while the agent's extraction logic is written once against a snapshot and rarely revisited.
  • Transport-level health (HTTP status, response shape) is cheap to check and looks green even when the content behind it is empty.
  • Validating content quality against expected ranges costs an extra step and an upstream baseline that nobody owns until something breaks.
  • A loud failure would stop the run, but a quietly thin result keeps the pipeline green and the cost meter ticking on garbage.

Example

A daily-briefing agent scrapes three competitor sites and emails a summary. One site quietly redesigns its markup. The HTTP fetch keeps returning a full 200 page, but the CSS selector now matches nothing, so the agent writes a half-empty briefing and reports it sent. Nobody catches it for ten days, until the reader mentions the news has felt thin lately.

Diagram

Solution

Therefore:

This entry names the anti-pattern; the corrective is to put a source-health canary between the tool and the agent. After each fetch, assert content-level expectations the source should always meet: a non-empty extraction, a row or token count within a learned range, presence of marker fields, and a freshness timestamp newer than a threshold. When an assertion fails, the run halts or routes to a degraded-mode fallback and raises an alert instead of feeding the empty payload forward as if it were real data. The baseline is recorded once from a known-good run and re-checked on every fetch, so a layout or schema change surfaces on the next run rather than after a human notices thin output ten days later.

What this pattern forbids. The missing constraint is a content-level source-health canary: an extracted payload that falls outside its expected baseline must not flow to the agent as valid input, and a structurally-valid empty or stale fetch cannot be reported as success.

The patterns that counter or replace it —

  • complementsTool Output Trusted VerbatimAnti-pattern: trust whatever tools return without validation, schema enforcement, or trust labels.
  • complementsPhantom Action CompletionAnti-pattern: the agent reports a side-effecting action as complete from its own narration, when the tool call silently failed or never ran and nothing checked that the effect occurred.
  • alternative-toGraceful Degradation★★When a dependency fails, downgrade the user-facing experience to a working subset rather than failing entirely.
  • complementsCDC-Driven Vector Sync★★Treat the source-of-truth document store as the only writer; keep the vector index in sync by emitting change-data-capture events onto a queue that the feature pipeline consumes.

Neighbourhood

Click any neighbour to follow the language. Scroll to zoom, drag to pan.