Build in Public · LF-13

How Live Capability Catalogs Reduce Documentation Drift: Separating Declarations, Runtime, and Delivery Checks

Starting from real-world discrepancies in platform identifiers, parameter declarations, and MCP discovery, we design catalog snapshots, contract diffs, and example checks, clarifying caching, missing fields, and release gates to avoid treating catalog alignment as full service availability.

When writing API documentation, the most dangerous errors often look entirely reasonable. Naming a review platform google_maps can feel more memorable than google_maps_reviews; adding a since parameter to every review endpoint matches the intuition of incremental ingestion. But plausibility does not equal actual support, and readers who copy such examples get stuck on step one.

During this content review in EveryInfra, we cross-referenced the capabilities cited in the article with the public catalog while performing a read-only implementation check. This process highlights once again that live catalogs are useful, but they are not universal proof of correctness. Documentation maintenance must answer what the service declares, what happened in the request, and what the business received, rather than relying on a single green status.

Value of the Catalog Seen Through Three Specific Discrepancies

The first is platform identity. At 2026-09-04 20:46 (Beijing time), querying the public catalog for google_maps returned HTTP 400 unknown_capability, with a hint suggesting google_maps_reviews. The catalog identifies the incorrect name, but editors must still verify that the target is indeed place reviews; it cannot automatically adopt any similar candidate.

The second is Amazon review parameters. The public entry from the same day lists only url and domain, omitting specific values for default_limit and max_limit. Parameter notes in the local implementation are more detailed, but they cannot be cited as deployed capabilities. The text must use strictly verifiable bounds; when no upper limit is declared, it can only be recorded as unknown rather than infinite.

The third is MCP discovery. The probe at 20:43 reads six tools, yet the initialization complete notification includes an unexpected response body. Matching tool names and counts does not prove full protocol compliance, let alone that every client has completed authentication and actual invocation. This discrepancy requires its own acceptance item rather than remaining hidden behind a normal catalog status.

A re-verification of 2026-09-08 along the same path preserves this history while confirming that the public catalog has grown to eight tools, and the initialization complete notification returns HTTP 202 with a 0-byte response body. The previous discrepancy did not recur, but no business tools were executed, and host authentication, actual results, or long-term compatibility are still not marked as verified.

These three cases involve identifiers, declaration scopes, and protocol behaviors. All of them affect integration, but they require different handling: correcting erroneous names, narrowing documentation commitments, and preserving protocol re-verification criteria. Treating all discrepancies uniformly as documentation obsolescence discards information on ownership and verification methods.

Splitting Structure, Runtime, and Delivery into Three Layers

  • Structural evidence: The current catalog specifies actions, required parameters, allowed values, and return fields used to construct requests and parsing strategies.
  • Runtime evidence: A specific GET request, HTTP request, or protocol discovery successfully completes, recording inputs, response types, status, and observation timestamps.
  • Delivery evidence: An authorized business goal yields contract-compliant content, verifying empty results, partial completion, failures, and billing; requires separate business acceptance.

Finding owner_response in the catalog does not prove every review has a merchant reply. Receiving 200 does not prove all pagination has finished. A single successful business sample does not prove every catalog item is operational. Articles must keep corresponding evidence tiers next to assertions rather than letting a weaker check back a stronger commitment.

Reusing Machine-Readable Contracts Instead of Duplicating Explanations

The same capability may appear in HTTP documentation, capability catalogs, field descriptions, MCP schemas, and article examples. During maintenance, identifiers, inputs, and field definitions can originate from a single reusable contract, leaving different outputs with distinct responsibilities: catalogs aid discovery, field pages explain semantics, examples illustrate reader tasks, and tests check runtime behavior.

Capability contract rendering and parameter validation in current code at EveryInfra support this reuse; however, the presence of shared functions does not prove that all online pages and deployment instances are synchronized. Human-authored text does not automatically gain correct use cases, authorization boundaries, and failure explanations simply by reading the same catalog.

OpenAPI describes HTTP interfaces and their structures, forming part of this maintenance approach. Action semantics, missing fields, sample scopes, and usage limits still need explicit documentation in real business contexts. Automatic generation reduces copy-paste field errors, but it cannot replace human editorial judgment on whether a statement broadens capabilities.

Structural comparisons must also distinguish between properties, required fields, and null values. The official JSON Schema guide explicitly states that fields listed in properties are not required by default. Comparing only field name sets can miss integration changes where an optional field becomes required; conversely, allowing missing fields does not imply explicit null values are permitted.

Querying Only Required Contracts for Each Tutorial

When integrating, first identify the platform and object, then narrow down to the action. The steps below read the public catalog without fetching reviews or using an API key. Since jq displays unreturned selected properties as null, it is necessary to distinguish between an original response missing a field and a response explicitly containing a null value; neither should be interpreted arbitrarily as zero.

Read the contract projection of a single action
curl -fsS --max-time 30 \
  'https://api.everyinfra.com/api/v1/social/catalog?platform=amazon' \
  | jq -e '.capabilities[] | select(.action == "reviews") | {
      platform, action, required_params, optional_params, param_meanings,
      mode, returns_list, default_limit, max_limit, response_fields
    }'

Attach source URLs, retrieval timestamps, and actual response summaries to these observations. When a request or parse fails, do not overwrite the old snapshot with an empty catalog; preserve the previous content and failure state so maintainers know new declarations were not fetched, rather than assuming all capabilities were deleted by the service.

Applications should also register which parameters and return fields they consume. New fields added to an unrelated action do not necessarily require pausing current work, whereas changes to required parameters or output shapes in active use demand a designated owner. Discrepancy detection must target actual consumers rather than merely reporting total item count changes.

Comparing Semantic Differences Rather Than Raw JSON Text

Object key ordering, list presentation order, and explanatory text adjustments can make files look heavily modified without altering invocation methods. Conversely, changing returns_list from true to false by a single value is enough to break parsers. Select fields to inspect first, then categorize differences accordingly.

Offline JavaScript: compare only the four declared structures
function contractDiff(before, after) {
  if (before.platform !== after.platform || before.action !== after.action) {
    throw new Error("compare the same capability");
  }
  const normalize = row => {
    const names = key => {
      const values = row[key];
      if (!Array.isArray(values)
          || values.some(v => typeof v !== "string" || !v.trim())
          || new Set(values).size !== values.length) {
        throw new Error("explicit unique field list required");
      }
      return [...values].sort();
    };
    if (typeof row.mode !== "string" || !row.mode
        || typeof row.returns_list !== "boolean") {
      throw new Error("explicit mode and result shape required");
    }
    return {
      required_params: names("required_params"),
      response_fields: names("response_fields"),
      mode: row.mode, returns_list: row.returns_list
    };
  };
  const left = normalize(before), right = normalize(after);
  return Object.keys(left).filter(key =>
    JSON.stringify(left[key]) !== JSON.stringify(right[key]));
}

const baseline = {
  platform: "synthetic", action: "comments",
  required_params: ["url"], response_fields: ["id", "text"],
  mode: "sync", returns_list: true
};
console.log(contractDiff(baseline, {
  ...baseline, response_fields: ["text", "id"]
}));
console.log(contractDiff(baseline, {
  ...baseline, required_params: ["url", "region"]
}));

The two composite results correspond to zero differences and a change in required_params, respectively. This mechanism compares only four explicit structures without implementing full compatibility checks; optional parameters, enums, field types, quantity limits, availability, and billing declarations still require separate checks. Missing structures trigger errors rather than being quietly treated as empty lists.

Changes requiring close review include added required inputs, removed used fields, narrowed enums or quantity ranges, and modified execution modes. Even when return fields are added, downstream components must be checked for unexpected rejection of unknown fields. Detectors only flag changes, leaving maintainers to confirm impact with real consumers rather than automatically generating compatibility conclusions.

Caches Store Observations, Not Permanent Guarantees

Cache keys must at least differentiate service endpoints, platforms, and actions, while recording acquisition times and protocol or contract versions. Sharing cache keys across multiple environments can leak test declarations into production. Review cadences for availability, parameters, and article sources may also differ, meaning a single unified duration cannot cover all risks.

For example, an editor scheduling a review a day later reflects team workflow rather than a server-side guarantee that the catalog remains unchanged. Encounters with explicit unknown parameters, return shape variations, or deployment updates should trigger targeted refreshes rather than waiting for a fixed clock. Expired content remains viewable, but high-impact operations must not continue relying on unconfirmed legacy declarations.

Old snapshots must retain their own timestamps. Changing an old date to today upon a new request failure manufactures an illusion of verification. Saving historical observations alongside the latest check status explains precisely which service state a given tutorial relied upon.

When services provide corresponding response headers, conditional requests and revalidation mechanisms from RFC 9111 can determine cache reuse feasibility. This text does not verify catalog support for ETag or 304; lacking that contract, local summaries cannot be treated as server validators, nor can review cycles be called server caching commitments.

Treating Article Examples as a Client

Example checks should extract code directly from actual articles instead of writing separate, seemingly identical test requests. Free catalog commands can be verified directly; business POST requests lacking authorized samples should first check syntax, request assembly, and offline response branches, explicitly marking service results as unverified. Prevent test copies from being correct while reader-copied versions place limits in the wrong hierarchy.

Links must also be checked against their purpose. On-site capability pages help continue integration, while official documentation supports the original definitions of corresponding products and protocols; an official link for a platform does not endorse all uses of EveryInfra. Unpublished articles should not prematurely reference detail links that could result in 404.

Handling Order After Discovering Drift

  • Read failure: Preserve fault status without overwriting with new contracts; pause operations dependent on that declaration if necessary.
  • Contract changes: List affected parameters, fields, and consumers, deciding whether to update examples, adapt code, or maintain blocks.
  • Local versus public status differences: Record separately; local modifications do not equate to deployment completion.
  • Public declarations conflicting with delivery: Retain minimal authorized samples, escalate issues to service maintainers, and narrow related article commitments.
  • Full alignment: Report only that no discrepancies were found within the inspection scope, without automatically publishing articles or declaring all integrations successful.

Start with the most frequently used business action, establishing interrelated records for catalog observation, example checking, and delivery acceptance. This transforms documentation updates from swapping old screenshots for new ones into explaining what fact changed, who is affected, and what evidence justifies continued use.