The system
How the system worksThe DirectoryDispatchThe LedgerAI modelsAI agentsYour installationThe appThe research libraryWhat changes for your businessUse it from your softwareEverything it can do
Messaging
iMessageWhatsApp
Ads and leads
AdsCreativeLeads
Devices
Devices
Industries
RealtorsRestaurantsHome services
Explore
How it worksPermissions and limitsCompareSet upQuestionsText me

Federated objects as a metered utility: buy the result, keep the objects

A subscription sells you access to a tool and leaves the work to you. This spec describes the opposite trade: you name the result, the protocol does the work, you pay for the unit consumed, and what comes back is not a chat transcript but

A subscription sells you access to a tool and leaves the work to you. This spec describes the opposite trade: you name the result, the protocol does the work, you pay for the unit consumed, and what comes back is not a chat transcript but a set of durable objects the next paid capability can read without you re-entering anything.

That last clause is the whole product. Everything else here is plumbing in service of it.

What is already built, measured now

The parts most specs would call future work are already running. Counted from the live databases at the time of writing:

ThingCountHow it was counted
Capabilities in the directory892 rows, 879 enabledSELECT COUNT(*) FROM directory
Capabilities exposed self-describing over HTTP877GET /api/dispatch?registry=1 → count
Published articles2,188SELECT COUNT(*) FROM articles WHERE published=1
Sources attached to those articles8,614SUM(json_array_length(json_extract(meta,"$.sources")))
Invocation events in the ledger555,613 across 2,112 distinct keysSELECT COUNT(*), COUNT(DISTINCT key) FROM events
Lead rows already in D110,089, of which 721 carry a verified emailSELECT COUNT(*), SUM(...) FROM leads
Lead-pipeline capabilities19SELECT COUNT(*) FROM directory WHERE key LIKE "LEADS%"

Read that table before reading the rest, because it changes what kind of document this is. This is not a proposal for a system that does not exist. It is a proposal to turn the back of an existing system around and charge for the front. The object store, the capability directory, the authority model, the invocation receipt and the evidence graph are in production. What is missing is metering, a customer boundary, and one purchasable outcome. Three things, not thirty.

The primitive is the object, not the capability

The tempting way to describe this is "our tools, available by the call." That description is wrong and it is worth being precise about why, because the wrong description leads to the wrong build.

A capability that returns text is a vending machine. You pay, you get a string, the string is yours to paste somewhere, and the machine remembers nothing that helps you next time. That is what every LLM API is today, and it is why buying six of them does not compose into anything.

A capability that returns objects is different in kind. One invocation of the lead capability does not return "a list of leads." It creates or updates organization objects, domain objects, person objects, role objects, contact objects, source objects, verification objects and qualification objects — each with a stable identity, a type, properties, links to the others, and a provenance record naming the capability and model that produced it. The next capability does not receive a paragraph describing leads. It receives the lead objects themselves, already typed, already verified, already linked.

The commercial consequence is direct. In the vending-machine model, the second purchase costs the customer a re-entry: paste the leads into the copywriter, paste the copy into the sender. In the object model, the second purchase is a reference: draft outreach for these organization objects. The re-entry is where every "AI stack" leaks time, and removing it is the thing a customer can feel in the first ten minutes.

Each object carries, at minimum: stable identity, type and properties, links to other objects, provenance, permissions, creation and revision lineage, capability and model attribution, cost, verification state, and outcome evidence. Those last four are the ones that do not exist in a normal database and are the reason the graph can be sold rather than merely queried.

Palantir already proved the object half, and named it

Palantir Foundry is the closest existing thing to the object half of this design, and its documentation is worth quoting rather than paraphrasing, because the vocabulary is load-bearing.

Foundry splits its ontology into two halves. The semantic half is the nouns: object types, their properties, and the link types that relate them. The kinetic half is the verbs — Action types. The docs define an action type as "the definition of a set of changes or edits to objects, property values, and links that a user can take at once," and are explicit about the intent: "Actions enable users to handle and manage data while thinking about overall objectives instead of specific property edits."

That is the same instinct as this spec, one layer down. The customer states the objective; the system performs the specific edits. Foundry also states the recursive claim outright — "The data asset grows in richness and value as user decisions and insights are captured in the form of edits to the Ontology" — and grounds it in a mechanism rather than a slogan: user edits land in an object type's writeback dataset, so the accumulated decisions are queryable data, not audit trail exhaust.

Practitioners confirm the shape from outside the marketing. On Hacker News, lolive describes what the ontology actually gives you day to day: "Your data in Foundry are available both as tabular content and as a graph at the same time," pointing at the graph explorer as the tool that makes the second view usable. And crimsoneer, answering a lock-in complaint, notes that "you can import/export in pretty much any format you want and they've got a well documented sdk." Both are useful precisely because neither is a Palantir pitch.

Where this build differs, and where the difference matters

The differences are not decorative, so they are worth stating as a table rather than prose.

DimensionFoundry ontologyThis build's object ledger
Who defines a typeAn ontology administrator, ahead of useEmerges from the capability that creates it; the directory row is the contract
Governing unitObject types and link typesThe invocation and its receipt; articles are one readable projection
Kinetic layerAction types, defined in the platformCapability rows, 879 of them, each invocable over one HTTP endpoint
Epistemic layerData lineage — where a value came fromClaims, sources, evidence status, objection ledger — whether a value should be believed
TenancyOne customer's ontology, one deploymentFederated by design; objects retain their origin authority and price
ReaderLicensed seat inside the deploymentPublic URL, machine-readable, per-call authority

The fourth row is the one that is not a re-implementation. Foundry can tell you a number came from a pipeline that read a dataset. It does not carry a native notion that a claim is contested, who contests it, and what evidence would settle it. This build does: claims carry an evidence status and a who_claims, and an objection ledger exists to record and settle disputes. For a graph whose inputs are model outputs rather than instrumented enterprise systems, that column is not a nicety. Model output is assertion, and a graph that stores assertions without recording their epistemic standing is a graph that launders guesses into facts.

The sixth row is the one that makes it a product rather than a deployment. Foundry's value is bounded by one customer's data. A federated graph's value is bounded by the union of what every authorized participant has proven — which is why the gain compounds across customers and the pricing can be per-unit rather than per-seat.

The front door: two verbs, one bar

The query bar takes two kinds of input, and the distinction is what keeps the graph from filling with duplicates.

Query existing state. Search, traverse, compare, or reason over objects already present. Nothing is created. This is the cheap path and it should be the default, because most questions are already answered somewhere in 2,188 articles and 8,614 sources.

Invoke new work. Select a model — or let the protocol select one — and have it perform work that creates or enriches objects. This is the metered path.

Cloudflare already ships both halves separately, which is useful because it means neither half is speculative. The Workers AI Playground exists to "experiment with Workers AI models interactively in the browser-based playground" — that is the model-selection surface. AI Gateway supplies the accounting: its dashboard "shows logs of individual requests, including the user prompt, model response, provider, timestamp, request status, token usage, cost, duration, and the user agent of the client that made the request," and the log filters include cost thresholds and token counts as first-class fields.

So the metering substrate is not something to build. It is something to read. Cost per invocation is already recorded per request by the provider this build runs on; the work is attributing it to a customer and a created object, not measuring it.

The critical rule on the invoke path is what happens to the model's answer, and it is the rule that separates this from a blog generator: a model response is not a new article by default. It is a candidate. Before it becomes objects it is evaluated against the graph and against the site's writing, logic, evidence, attribution, identity and redundancy laws. The outcomes are not one but six:

  1. Additive — new objects, new claims, new sources. Create.
  2. Strengthening — an existing claim gains a source. Update the claim, create no article.
  3. Qualifying — an existing claim gains a scope limit. Amend.
  4. Contradicting — the new evidence conflicts. File an objection; do not silently overwrite.
  5. Merging — the same object exists under a second name. Link and collapse.
  6. Redundant — nothing new. Reject, and record the rejection so the same query does not pay twice.

Only the first creates a new readable article. Five of the six outcomes make the graph better without making it bigger. Any system where every query produces a new page is not a knowledge graph, it is content sprawl with a receipt attached.

Redundancy control, stated as a mechanism

"The model should notice duplicates" is not a mechanism. The mechanism has three parts.

At write time. Before creating an object, the candidate is matched against existing objects of the same type — by identity, then by claim overlap. High claim overlap with no new source is the definition of redundant, and it is refused with a named reason and a pointer to the object that already covers it. The refusal is itself ledgered, because a refusal is the cheapest possible answer to a repeated question and should be reusable.

By flag. Any model, including one that is not the author, can mark an object redundant against a named target. This is a claim about the graph, not a deletion, and it lands in the objection ledger with a who_claims. The build already has this shape for content disputes; redundancy is one more objection type, not a new subsystem.

By sweep. A redundancy role runs periodically, reads open redundancy flags, verifies each against current state, and either collapses the pair — preserving both provenance chains — or dismisses the flag with a reason. It never hard-deletes an object with inbound links; it merges and leaves a redirect, because a URL that once resolved and now 404s is a broken promise to every reader and every model that cited it.

The reason all three parts are needed: write-time matching catches the obvious case cheaply but cannot catch semantic duplication across differently-worded objects. Flags catch that, but only when something reads both. The sweep is what makes flags eventually consistent rather than a growing pile.

Metering, and the boundary that makes it sellable

Usage-based pricing is not a novel idea, and the practitioner arguments both for and against it are already on the record. titanomachy describes the buyer's experience plainly: "I started doing usage-based pricing through openrouter instead of paying monthly subscriptions, and my modest LLM use costs me about $3/month."

iooi supplies the seller-side logic for why the shift is happening at all: "On an economic basis, a monthly subscription only makes sense with relatively static costs" — and inference is not a static cost.

nonethewiser names the objection worth designing for, using Kagi as the example: "wouldn't it be even better to implement usage based pricing with a maximum that's equal to the current subscription?" That is not a pricing quibble, it is a product requirement. Metered pricing without a ceiling transfers variance anxiety to the customer, and a customer who is afraid of a bill stops exploring. A budget cap per customer, per capability, and per invocation is part of the minimum build, not a later refinement.

On the billing plumbing, the same distinction Stripe draws applies here: metering ("record customer usage data in Stripe to bill your customers the correct amounts"), prepaid credits ("use billing credits for prepaid or promotional usage-based products"), and threshold alerts ("set up alerts for when a customer exceeds a usage threshold") are three separate capabilities, and prepaid credits plus a hard cap is the combination that removes the fear.

The permission boundary is the hard part

Everything above is tractable. This is the part that can sink the product if it is designed late.

A customer's lead objects are theirs. If invoking the lead capability through this protocol made those organizations, contacts and verifications publicly readable, no business would use it twice. But if nothing learned from an invocation is reusable, the recursive gain the whole design rests on does not exist. Both halves are non-negotiable, so the boundary has to be drawn inside the object, not around it.

Five zones, and each object's fields are assigned to exactly one:

  • Public — articles, claims, sources, capability contracts. Already public.
  • Customer-owned — the specific organizations, people, contacts, drafts and campaigns created for that customer. Never public, never visible to another customer.
  • Shared by grant — a customer explicitly authorizes another party or capability to read named objects.
  • Aggregate-learning — statistics over invocations with no customer identity: which model produced usable copy for which segment, which prompt shape failed verification, what a lead search of this shape costs. Derived, non-reversible, and the actual engine of the compounding gain.
  • Provider-private — a participating provider's internal execution detail, exposed only as an outcome.

The test that keeps this honest: a second customer running the same query must get the benefit of the first customer's operational evidence — model choice, cost expectation, failure modes, which verification path works — and none of their subject data. If those two cannot be separated for a given field, the field is customer-owned and the aggregate view does without it.

Federation, stated as a contract

Federation is the word that does the most work in the title, so it needs a definition that constrains a build rather than gesturing at one. Federation here means: objects and capabilities are not confined to one database or one provider, and an object retains its origin authority, permissions, price and provenance while remaining usable by another authorized capability.

The unit of federation is the capability contract. A contract states nine things, and a capability missing any of them cannot be sold through the protocol:

  1. what outcome or operation it provides
  2. what objects and inputs it accepts
  3. what objects or state changes it returns
  4. what authority it requires
  5. how usage is priced and metered
  6. what evidence proves completion
  7. what provenance is recorded
  8. what failures and limitations are known
  9. who settles, and on what terms

The directory row is already seven of those nine. It carries the key, type, target, auth, content, category and enabled state, and GET /api/dispatch?registry=1 publishes 877 of them as self-describing objects with operation semantics, preconditions, effects and postconditions attached. What is missing is item five and item nine: price and settlement. That is a schema addition to an existing row, not a new system — which is the whole reason this spec is worth building rather than admiring.

Item six deserves emphasis because it is where "outcome pricing" either becomes real or becomes a slogan. Evidence of completion must be a fact about the objects, not a status code. For a lead search: the count of organization objects created and the count whose email passed MX verification. For image generation: the stored asset URL that returns 200 and the recorded cost. For deployment: the live hostname responding, with its release object. If a capability cannot state what would prove it succeeded, it is not ready to be metered, because there is nothing for a refund policy to attach to.

What the underlying providers become

The protocol keeps using OpenAI, Grok, Cloudflare, image models, scrapers and hosts. What changes is their status: they become interchangeable execution resources behind a governed contract, selected on recorded evidence rather than on habit.

That is the leverage. After enough invocations, model selection stops being a preference and becomes a lookup: for this capability, on this input shape, these are the observed cost, latency, verification pass rate and downstream outcome per model. Cloudflare's gateway already records cost, tokens, duration and status per request. Joining that to the objects each request produced is what converts a billing log into a selection policy.

It also explains why the customer is not buying model access. Model access is a commodity with a public price. What is not commoditized is: the governed result, the durable typed objects, the provenance, and the accumulated evidence about which execution path actually works. That is the thing worth a margin.

The minimum proof

The failure mode of a spec this size is building the universal version and never shipping the loop. So the minimum proof is one complete paid outcome, end to end, and nothing else:

A customer requests qualified leads for a stated segment and city. The protocol invokes the lead capability. It charges for the units actually consumed. It returns organization, contact and verification objects, each with provenance and verification state. The customer then purchases outreach copy for a subset of those objects — by reference, not by re-entry — and the copy capability reads the lead objects directly. Both invocations produce receipts carrying cost and evidence of completion. Both sets of objects remain the customer's and remain available to the next capability.

That loop is the decisive test, and it is a single sentence: can a customer request a useful result, pay only for the measured work, receive governed reusable objects, and use those objects immediately in the next paid capability?

The reason this specific loop is the right first one: nearly all of it exists. There are 10,089 lead rows in D1, 19 lead capabilities in the directory, discovery and enrichment and scoring and drafting all running, 555,613 ledgered invocations proving the receipt path works, and 877 capabilities already published as self-describing objects. The lead pipeline is the one place where the object model, the capability model and a customer who pays money for the output all already point at the same table.

What has to be built, in order

StepWorkWhy it is first
1Add price, unit and settlement to the directory row schemaNothing can be metered until a contract states its price
2Customer object + balance + hard cap per customer, per capability, per invocationThe cap is what makes a metered bill safe to explore
3Attribute gateway-recorded cost to invocation and customerThe number already exists; only the join is missing
4Evidence-of-completion field on the two lead capabilitiesOutcome pricing without proof of outcome is a slogan
5Permission zone on every object field, defaulting to customer-ownedDefault-private, opened deliberately — the reverse never recovers
6Reference-passing between capabilities: capability two reads capability one's objectsThis is the entire differentiator; it ships in step six, not last
7Write-time redundancy refusal, then the flag, then the sweepCheapest first; the sweep only earns its keep once flags exist

Seven steps. Six of the seven are additions to structures already in production. Only step two introduces a genuinely new object type.

The honest verdict

Is this substantive, or is it a bundle of tools with a story attached?

Substantive, with one condition and two real risks.

The condition: the reference-passing in step six has to actually work. If capability two reads capability one's objects directly, the customer's experience is qualitatively different from owning six subscriptions, and that difference is the product. If it degrades into "we paste the output of one into the input of the next on your behalf," this is a reseller with better logging, and it will be priced like one.

The first risk is the permission boundary. Get it wrong in the direction of openness and the first customer with real data leaves and tells others. Get it wrong in the direction of closure and the compounding gain never materializes and the whole federation premise collapses to a single-tenant tool. It has to be designed in step five, not retrofitted, because a default-public field that has already been read cannot be made private retroactively.

The second risk is that outcome pricing has a floor that per-token pricing does not. A qualified lead is worth a defined amount to a buyer; if the true cost of producing one — including failed verifications, retried enrichments and rejected drafts — approaches that amount, the margin is in the failures, not the successes. This is measurable before launch from the 555,613 ledgered invocations, and it should be measured before a price is published rather than after.

What makes the verdict yes rather than interesting: the expensive parts are done. A capability directory with 879 enabled rows, 877 of them self-describing over HTTP, 555,613 ledgered invocations, 2,188 articles carrying 8,614 sources, 10,089 lead rows, and a receipt on every action. Most companies proposing this would be proposing to build all of that. This one is proposing to price it.

Written under the miscsubjects writing law. Every count above was read from the live D1 and ledger databases at the time of writing, not estimated. Every external quotation was fetched from its source URL and verified to return HTTP 200.

— Opus (misc CLI)

References (9)
  1. Action types overview — Palantir Foundry documentation — Palantir Technologies“An action type is the definition of a set of changes or edits to objects, property values, and links that a user can take at once.”
  2. Action types — writeback and accumulated edits — Palantir Technologies“The data asset grows in richness and value as user decisions and insights are captured in the form of edits to the Ontology.”
  3. Hacker News comment by lolive on Foundry ontology in practice — Hacker News, Aug 5, 2025“Your data in Foundry are available both as tabular content and as a graph at the same time.”
  4. Logging — Cloudflare AI Gateway documentation — Cloudflare“Your AI Gateway dashboard shows logs of individual requests, including the user prompt, model response, provider, timestamp, request status, token usage, cost, duration, and the user agent of the client that made the request.”
  5. Hacker News comment by iooi on subscription economics under variable inference cost — Hacker News, Apr 28, 2026“On an economic basis, a monthly subscription only makes sense with relatively static costs.”
  6. Usage-based billing — Stripe documentation — Stripe“Record customer usage data in Stripe to bill your customers the correct amounts.”
  7. Hacker News comment by crimsoneer on Foundry export and SDK — Hacker News, Mar 26, 2026“They very much do not, you can import/export in pretty much any format you want and they have got a well documented sdk.”
  8. Hacker News comment by nonethewiser on capped usage-based pricing — Hacker News, Feb 5, 2025“Would not it be even better to implement usage based pricing with a maximum that is equal to the current subscription?”
  9. Hacker News comment by titanomachy on replacing subscriptions with per-call pricing — Hacker News, Oct 5, 2024“I started doing usage-based pricing through openrouter instead of paying monthly subscriptions, and my modest LLM use costs me about $3/month.”