# Resolution utility graph

**Status:** domain-neutral structure, written 2026-10-23. Unicode on copypastecharacters.com is binding 1. Public copies: `https://copypastecharacters.com/agents/resolution-graph.md` and `https://copypastecharacters.com/agents/resolution-graph.json`. This document does not add an MCP server, a payment rail, or a second utility.

**Use it when** a utility must answer, for one exact object: what it is, what a pinned record says it does, what this operator measured, what a named destination has not been shown to accept, why a stated symptom happens, and which fallback is safest. The same answer has to be citable by a person and callable by an agent.

**Read with** `docs/unicode-capabilities-compatibility-agent-adoption.md` (the Unicode binding's evidence rules and incentive layers) and `docs/aeo-agent-surface.md` (the live Unicode contract). Those files stay authoritative for this site. This file is the pattern those rules are an instance of.

## The vision

An agent-readable internet is a set of resolvers, not a set of pages that hope to be summarized. Each resolver owns one kind of object. It publishes a small deterministic document for an exact id. A model may quote that document. A model does not become the record.

The thing that makes the resolver citable is the separation inside the document. Identity, official assignment, local measurement, and destination acceptance are different states. An unmeasured state stays `unknown`. The page title is the question. The first paragraph is the answer, and that same paragraph is the Markdown and the JSON. A fallback carries its tradeoff. A map file tells an agent that already fetched the site where the document lives. Crawl preferences for search, answer-time use, and training stay independent.

Incentives follow the same split. The free exact document is the reason to call the utility. After real use, reward the person who ships a verified integration or a re-runnable measurement. Extra capacity can be paid. Request volume does not buy rank, a different fact, or a crawler account.

Unicode is the worked example: `GET /reference/v1/exact/{id}.json` on copypastecharacters.com. The graph below is what another utility copies.

## Graph

```mermaid
flowchart LR
  query[Query plus optional profile and destination] --> resolver[Resolver]
  resolver --> identity[Identity]
  identity --> record[Official record at a pinned version]
  record --> behavior[Behavior under a named profile]
  behavior --> local[Local measurement]
  local --> destination[Named destination]
  destination --> gate{Evidence for this state?}
  gate -->|named test, still inside its expiry| observation[Observation]
  gate -->|no named test| unknown[Status unknown]
  observation --> failure[Failure rule for a stated symptom]
  unknown --> failure
  failure --> fallback[Fallback with reason and tradeoff]
  fallback --> answer[One answer]
  answer --> html[HTML]
  answer --> markdown[Markdown]
  answer --> json[JSON]
```

Seven states hang off every object. A later state is filled only by its own evidence. Skipping ahead is a closed edge.

```mermaid
flowchart LR
  encoded --> assigned --> wellFormed[well-formed] --> localPresence[local presence] --> transformed --> rendered --> accepted
```

Writers are separate from readers. A generative model and an anonymous crawler are readers.

```mermaid
flowchart TB
  publisher[Official publisher] --> record[Official record]
  operator[This operator] --> localMeasure[Local measurements]
  operator --> answers[Answers and fallbacks]
  contributor[Moderated contributor] --> observations[Destination observations]
  observations --> evidenceStore[Evidence store with expiry]
  people[People and coding agents] --> answers
  searchCrawler[Search crawler] --> answers
  answerCrawler[Answer-time crawler] --> answers
  trainingCrawler[Training crawler] --> policy[Training preference only]
  model[Generative model] -.-> record
  anon[Anonymous request volume] -.-> rank[Rank and rewards]
```

Dotted arrows are closed. They are drawn so a later binding does not add them by accident.

## Planes

Each plane has one writer class. A field belongs to one plane. Mixing two planes in one Boolean is the failure this graph exists to prevent.

| Plane | Holds | Writer | Reader |
|---|---|---|---|
| Identity | Canonical id, components, id grammar | Official record, checked by the operator | Everyone |
| Record | Pinned source, version, checksum, normative properties | Official publisher, ingested by a reviewed update | Everyone |
| Behavior | What the object does under a named profile | Spec plus the operator's versioned rules | Everyone |
| Evidence | What this operator measured, with method and artifact hash | Operator | Everyone |
| Destination | A named target, build, field, time, and expiry | Only a re-runnable test | Everyone |
| Failure | A symptom mapped to a conditional cause and a fix | Versioned rule id | Everyone |
| Fallback | A substitute, a reason, a tradeoff, and when to refuse it | Versioned rule id | Everyone |
| Publication | One answer on HTML, Markdown, and JSON | Generator fed by the planes above | People, agents, crawlers |
| Discovery | Sitemap, skill file, `llms.txt` map, crawl preferences | Operator | Agents that already have the URL |
| Interface | Optional wrapper around the same resolver | Operator, after the document is already fetched | Coding agents |
| Incentive | Who is rewarded, and for which act | Operator policy | Integrators and contributors |

The evidence store and the official record are different stores and different release clocks. An observation expires. A normative property changes when the publisher versions it.

## States

Copy these ids. A binding may define a narrower predicate for each one. A binding may mark a state `out-of-scope` for that utility. A binding may not collapse two states into one status.

| State | Question the field answers | Unicode binding |
|---|---|---|
| `encoded` | Does this input match the id grammar? | Valid scalar, or a sequence of at most eight scalars |
| `assigned` | Does the pinned official record contain it? | Assigned, reserved, private-use, noncharacter, surrogate, control |
| `well-formed` | Does it satisfy the structural rules for its kind? | Grapheme, emoji sequence, normalization form, under a named profile |
| `local-presence` | Does an artifact this operator hashed contain it? | Bundled preview font cmap. Membership is local presence |
| `transformed` | Did a named engine produce the expected structural result? | Shaping. Unmeasured on this site |
| `rendered` | Did a named destination draw it? | `visibility.destination = not-tested` |
| `accepted` | Did a named field, app, or policy allow it? | `targetCompatibility.status = unknown` |

Statuses, used per state:

| Status | Means |
|---|---|
| `verified-working` | A named test, inside its expiry, showed the expected result |
| `verified-fallback` | A named test showed a degraded or substitute result |
| `verified-broken` | A named test showed failure |
| `local-only` | Measured on this operator's artifact. Destination remains open |
| `predicted` | Follows from the pinned record. Says nothing about a destination |
| `not-tested` | This operator has no test for this state |
| `unknown` | The fact is not established. This is a status, and it is the status an unmeasured destination keeps |
| `expired` | A test exists and its expiry has passed |
| `out-of-scope` | This utility does not claim this state |

Evidence tiers, copied from the Unicode adoption doc and kept general:

| Tier | What it can support |
|---|---|
| `normative` | Identity, assignment, and spec behavior at a pinned version |
| `measured-local` | Local presence or a local transform of a named artifact |
| `verified-destination` | Rendered or accepted, for one recorded target, build, and time |
| `standards-informed-editorial` | A fallback or a failure explanation tied to a rule id and a source |
| `not-tested` | The absence of a test |

`unknown` is the published status when the tier is `not-tested`. It is a different word from `verified-broken`.

## Nodes

Required fields are the minimum a binding fills. Extra fields stay inside the plane that owns them.

| Node | Required fields |
|---|---|
| `Object` | `utility`, `id`, `idGrammar` |
| `Component` | `id`, `role` |
| `OfficialRecord` | `source`, `version`, `checksum`, `retrieved` |
| `Property` | `name`, `value`, `recordVersion` |
| `Profile` | `id` such as `general`, `terminal`, `web`, `identifier` |
| `Behavior` | `profile`, `statement`, `source` |
| `Limitation` | `statement`, `source` |
| `LocalMeasurement` | `method`, `artifact`, `digest`, `result` |
| `Destination` | `name`, `build`, `field`, `testedAt`, `expiresAt` |
| `Observation` | `destination`, `state`, `status`, `evidenceTier`, `evidenceUri` |
| `Symptom` | `id`, `question` |
| `Cause` | `ruleId`, `condition`, `fix`, `evidenceTier` |
| `Fallback` | `value`, `reason`, `tradeoff`, `refuseWhen` |
| `Answer` | `question`, `lead`, `evidenceTier` |
| `Surface` | `html`, `markdown`, `json` with the same `lead` |
| `Map` | `skill`, `llms`, `sitemap` |
| `CrawlSignal` | `search`, `aiInput`, `aiTrain` each `yes`, `no`, or `unset` |
| `Tool` | `name`, `resolver` (the same function the document uses) |
| `IncentiveLayer` | `layer`, `actor`, `act`, `reward` |

## Open edges

| From | Edge | To | Guard |
|---|---|---|---|
| Query | `resolves` | Object | Id matches `idGrammar`. Private free text stays out of the URL |
| Object | `composedOf` | Component | Order is part of the id |
| Object | `recordedIn` | OfficialRecord | Version is pinned and checksummed |
| OfficialRecord | `asserts` | Property | Property cites that version |
| Object | `behavesAs` | Behavior | Profile is named |
| Object | `limitedBy` | Limitation | Source is named |
| Object | `measuredBy` | LocalMeasurement | Method and digest are named |
| LocalMeasurement | `supports` | State | Only `local-presence` or `transformed` |
| Observation | `supports` | State | Only `rendered` or `accepted`, and `expiresAt` is still ahead |
| OfficialRecord | `supports` | State | Only `encoded`, `assigned`, `well-formed`, and predicted behavior |
| Symptom | `explainedBy` | Cause | The condition matches this object. The rule id is stable |
| Cause | `recommends` | Fallback | Tradeoff is present |
| Answer | `publishedAs` | Surface | HTML, Markdown, and JSON carry the same lead |
| Map | `pointsTo` | Surface | The map is a directory. It is not a citation claim |
| CrawlSignal | `appliesTo` | Actor class | One preference per class |
| Tool | `wraps` | Resolver | The wrapper adds no second record and no paraphrase |
| IncentiveLayer 1 | `pays` | Caller | The payment is the document itself |
| IncentiveLayer 2 | `pays` | Operator or integrator | The act is a verified integration |
| IncentiveLayer 3 | `pays` | Contributor | The act is a moderated, re-runnable measurement |
| IncentiveLayer 4 | `pays` | Operator | The act is capacity above the free read |

## Closed edges

These edges are part of the graph as explicit absences. A binding that adds one has left the structure.

| Closed edge | Why it stays closed |
|---|---|
| Generative model → `OfficialRecord` | A paraphrase can quote the resolver. The pinned source remains the record |
| `local-presence` → `rendered` or `accepted` | A hashed local artifact establishes local presence only |
| `predicted` → `verified-working` | The record predicts structure. A destination needs its own test |
| Missing record → `verified-broken` or "unassigned" | Absence of a row is `unknown` until the pinned record says otherwise |
| `unknown` → a support badge | The status and the badge would be two answers |
| Request volume → rank, reward, or the record | Volume is a load metric. The rewarded acts are listed under incentive layers |
| Anonymous crawler → loyalty account | A crawler is a fetch. It is not a persistent economic actor |
| Member status → a different fact | Layer 2 can add a dashboard. The document stays the same |
| Training preference `no` → blocking a search crawler | `search`, `aiInput`, and `aiTrain` are three fields |
| `CrawlSignal` omitted → deny or allow | `unset` means this operator published no preference for that class |
| Private input → URL, log, or analytics | Inspect either runs locally or drops the original text |
| Account wall → the exact read | Layer 1 is readable with no key |
| One HTML page per object, past the host file budget | Exact resolution is an id-keyed document. A function may compose it from a bucket index and small tables |
| Second record inside the wrapper | Tools call the resolver that already writes the document |
| Pay-to-rank, undisclosed citation payment, cloaking, crypto speculation, unsupervised agents earning on call count | Closed by the incentive plane |

## Exact document

Every utility publishes this shape. Names inside `states` stay as written. Binding-specific facts live under `extensions` and name their plane.

```json
{
  "schema": "resolution-exact-v1",
  "utility": "",
  "id": "",
  "identity": { "label": "", "components": [] },
  "record": { "source": "", "version": "", "checksum": "" },
  "profile": "general",
  "states": {
    "encoded": { "status": "", "evidenceTier": "" },
    "assigned": { "status": "", "evidenceTier": "" },
    "well-formed": { "status": "", "evidenceTier": "" },
    "local-presence": { "status": "", "evidenceTier": "", "method": "" },
    "transformed": { "status": "", "evidenceTier": "" },
    "rendered": { "status": "unknown", "evidenceTier": "not-tested" },
    "accepted": { "status": "unknown", "evidenceTier": "not-tested" }
  },
  "behavior": [],
  "limitations": [],
  "explanations": [
    {
      "id": "",
      "title": "",
      "behavior": "",
      "limitation": "",
      "fix": "",
      "source": "",
      "evidenceTier": "standards-informed-editorial",
      "alternatives": [{ "value": "", "reason": "", "tradeoff": "" }]
    }
  ],
  "fallbacks": [],
  "citation": { "question": "", "lead": "" },
  "mirrors": { "html": "", "markdown": "", "json": "" }
}
```

Rules the generator enforces:

- The same `lead` is the first paragraph of the HTML, the Markdown, and `citation.lead`.
- `rendered` and `accepted` ship as `unknown` / `not-tested` until an `Observation` with a future `expiresAt` is attached.
- A missing side table drops the field that needed it. Identity still resolves.
- The id grammar rejects empty ids, overlong ids, and ids that would smuggle free text.
- A static sample may exist for published ids. The function serves the rest. The host's file budget is a property of the binding, not of the graph. On Cloudflare Pages that budget is about 20,000 files, which is why this site does not mint one HTML page per scalar.

## Publication contract

| Piece | Rule |
|---|---|
| Question page | The title is the question a person or an agent would type. The first paragraph is the answer |
| Mirrors | HTML, Markdown, and JSON exist for that question and share the lead |
| Schema.org | A page may describe itself as a `WebPage`. FAQ schema is not part of this graph |
| Rates | A citation rate is publishable after it is measured. The graph has no invented rate |
| Skill file | Tells a coding agent when to call the exact URL, which fields stay `unknown`, and which wrapper does not exist yet |
| `llms.txt` | A map for an agent that already fetched the site. Publishing the map is the whole of its job |
| Sitemap | Lists question pages and other stable routes. It does not list every object when that would pass the file budget |
| Deep link | One permanent URL per exact id |

## Discovery and crawl signals

Three preferences, stored separately:

| Field | Actor | `yes` means | `no` means |
|---|---|---|---|
| `search` | Index and excerpt crawlers | Fetch and index | Disallow that class |
| `aiInput` | Answer-time retrieval, RAG, grounding | The document may be used as a source at answer time | Disallow that class |
| `aiTrain` | Training crawlers | Training fetch is allowed | Training fetch is disallowed |

`unset` is a third value. Cloudflare's managed robots, as documented on 2026-10-22, emit `search` and `ai-train` and omit `ai-input`. Their own definition says omission publishes no preference. Their definition of `search` is index and excerpt, and they say that search does not include an AI-generated summary. `ai-input` is the answer-time signal. `use=reference` means index, excerpt, and link back.

On this site the origin sets `search=yes, ai-input=yes, ai-train=no` on the files and on the exact-lookup response. The managed block still prepends its own line and still disallows named training crawlers. A deploy does not remove that block. A training disallow has to leave Googlebot and Bingbot able to fetch. Spoofing a crawler identity is a closed edge.

Sources: [Managed robots.txt](https://developers.cloudflare.com/bots/additional-configurations/managed-robots-txt/), [Content signals](https://blog.cloudflare.com/content-independence-day-ai-options/).

## Interface

The interface plane is optional. It appears after agents are already fetching the exact document.

| Tool | Job |
|---|---|
| `resolve` | Exact id, or a ranked identity when the query is a description. Returns the document |
| `inspect` | A bounded local analysis. The original text is not logged |
| `compare` | Two ids, field by field, including which states differ |
| `check` | A named destination. Returns the observation or `unknown` |
| `suggest_fallback` | Ordered fallbacks for a profile, each with reason and tradeoff |

The wrapper is stateless with respect to the protocol. If the operator needs application state, that state lives beside the protocol session, not inside it. Cloudflare's Agents SDK matches this split as of the 2026-07-27 changelog: `createMcpHandler` is the MCP path, `McpAgent` is deprecated and feature-frozen, and Durable Objects remain for application state.

A platform that builds agents is a caller. It sits on the reader side of the graph.

| Platform piece | Plane it may occupy | Plane it may not occupy |
|---|---|---|
| Agents SDK, channels, voice, browser, sandbox | Interface, as a caller | Record |
| Stateless MCP wrapper | Interface, after demand | Record, Incentive |
| Code Mode / Dynamic Workers | Interface, a caller writing code that calls the tools | Record |
| AI Search index | Discovery, a pointer at the documents | Record. Generation stays off when the utility's value is a deterministic document |
| x402, MPP, Pay Per Crawl, HTTP 402 | Incentive layer 4 | Layer 1, rank, the record |

Sources: [Agents](https://developers.cloudflare.com/agents/) (updated 2026-10-22), [cloudflare/agents](https://github.com/cloudflare/agents), [Payments](https://developers.cloudflare.com/agents/tools/payments/), [AI Search](https://developers.cloudflare.com/ai-search/), [AI Search MCP](https://developers.cloudflare.com/ai-search/api/search/mcp/).

## Incentive layers

| Layer | When | Actor | Act that is rewarded | Reward | Stays free and unchanged |
|---|---|---|---|---|---|
| 1 | First | Any caller | Fetching the exact document | The document: small, no key, no challenge, provenance attached, unmeasured states left `unknown` | The document |
| 2 | After real adoption | The developer or operator who ships an integration | A verified integration | A dashboard, a quota view, a public credit | The facts in the document |
| 3 | After there is something to measure | A contributor | A moderated, re-runnable test or a sourced correction | Capacity, early access, or an acknowledgment | The official record. Credits do not edit it |
| 4 | When a caller needs more than the free read | A paying operator | Batch, SLA, private destination profiles, bulk export | HTTP 402, card, or the platform's agent payment rail | The normative record |

Layer 1 is the flywheel. Layers 2 and 3 pay a person for an act the operator can check. Layer 4 sells capacity. The adoption doc's section 7 is the Unicode statement of this table, and it still governs this site.

## Binding procedure

Fill these in order. Stop at the first step that has no source.

1. Name the utility in one sentence: the object, the decision the caller has to make, and the fallback they need when the destination is untested.
2. Write the id grammar. Include the maximum size and the characters you reject.
3. Name the official publisher, the version pin, and the checksum. If there is no publisher, this graph does not fit. An editorial collection can still use the publication and fallback planes, and it labels the record plane `editorial`.
4. Define each of the seven states, or mark it `out-of-scope`.
5. List local measurements you can actually run, each with a method and a digest. Every other destination state ships as `unknown`.
6. Write failure rules as stable ids. Each rule has a condition, a fix, a source, and at least one fallback with a tradeoff.
7. Pick question pages from real caller questions. Title is the question. First paragraph is the answer. Generate HTML, Markdown, and JSON from the same lead.
8. Publish exact documents by id. Add a composing function when the catalog would pass the host file budget. Keep a static sample set so a function failure still has a public backup for those ids.
9. Publish the skill file and the map. Set the three crawl fields independently.
10. Add `resolve` / `inspect` / `compare` / `check` / `suggest_fallback` only after the document in step 8 is the thing callers fetch. Point the tools at that resolver.
11. Keep layer 1 open. Add layer 2 or 3 when there is an integration or a measurement to verify. Add layer 4 when a caller asks for capacity the free read does not cover.

## Binding 1 — Unicode

This is the live site. The generic schema name above is the graph's name. The site's wire schema remains `cpc-unicode-exact-v1`.

| Slot | Value |
|---|---|
| Utility | Copy Paste Characters resolves a Unicode character or a short sequence: what it is, what it does, and which fallback to use when a target was not tested |
| Id grammar | Hex scalar, or up to eight hyphen-separated scalars. Reject empty, length over 80, characters outside the id alphabet, surrogates |
| Record | Unicode 18.0.0, DerivedAge pinned, age token `18.0` |
| `encoded` | `parseExactId` |
| `assigned` | Bucket record. A missing bucket is `inReference: false`, which is not "unassigned" |
| `well-formed` | Sequence and property rules in `analyzeUnicode`. Runtime `Intl` versions stay `runtime-unknown` |
| `local-presence` | `previewFont` from the site's bundled cmap, or null. The note says the destination font was not tested |
| `transformed` | `not-tested` |
| `rendered` | `visibility.destination = not-tested` |
| `accepted` | `targetCompatibility.status = unknown`, tier `not-tested` |
| Failure rules | Curated explanations plus the supplementary rules for ZWJ sequences, U+200B, U+FE0F, and the C3 A9 mojibake pair |
| Fallback | `alternatives[]` with `value`, `reason`, `tradeoff` |
| Questions | Thirty-four pages under `/answers/{slug}/`. They cover boxes, U+FFFD versus a missing glyph, Unicode age, emoji sequences, a copied blank, text versus emoji style, mojibake, an untested-target fallback, canonical equivalence, a fullwidth digit, a byte order mark, a regional-indicator pair, an emoji modifier, and a no-break space in an identifier |
| Surfaces | The Astro page, the Markdown twin, and the answer JSON share the lead |
| Exact URL | `GET /reference/v1/exact/{id}.json`. Samples are static. Other ids are the Pages Function, which also fetches the age table and the preview-font table and still resolves if either table is missing |
| Maps | `/agents/resolution-graph.md`, `/agents/resolution-graph.json`, `/agents/unicode/SKILL.md`, `/llms.txt`, sitemap entries for answer pages |
| Crawl | Origin `search=yes, ai-input=yes, ai-train=no`. Managed robots omit `ai-input` and disallow training crawlers. The zone dashboard is a separate control from the origin header |
| Interface | No MCP server. Local `analyzeUnicode` and `compareUnicode` exist. A stateless wrapper is layer-interface work that waits on demand |
| Incentives | Layer 1 is live. Layers 2–4 are described in the adoption doc and are not built |
| File budget | Pages, about 20,000 files. The current library file count is the number recorded in `docs/agent-sync.md` after the latest library build |

The conditional missing-glyph sentence on every exact document is a failure-plane sentence with a condition ("if you see a box"). It is not a `rendered: verified-broken` claim, and it is not attached as a missing-glyph explanation to every scalar. U+0041 is the regression check for that distinction.

## Binding 2 — Civil time

A timezone utility can use the same card. Nothing here is a claim that this site serves time.

| Slot | Fill |
|---|---|
| Utility | Resolve a civil-time question: which IANA zone, what offset a pinned tzdb gives at a stated instant, and which fallback to use when a named platform's zone data was not tested |
| Id | IANA zone id, plus an instant. The instant is a parameter, not part of the zone's identity |
| Record | A pinned tzdata release and its checksum |
| `encoded` | The zone id matches the grammar |
| `assigned` | The id is a zone or a link in that release |
| `well-formed` | The release contains transitions that cover the instant |
| `local-presence` | The operator's hashed tzdata build contains the zone |
| `transformed` | An offset computed by a named library against that build |
| `rendered` | A named calendar UI showed that civil time. `unknown` until tested |
| `accepted` | A named app stored the zone. `unknown` until tested |
| Failure page | "Why is this meeting an hour off?" Lead names the tzdb version, the two transitions, and the fact that the phone's zone data was not tested |
| Fallback | Store the UTC instant and the zone id. Tradeoff: a later tzdb can change the civil time of a future instant; the instant itself stays put |
| Closed edge to avoid | "The zone exists in tzdb 2026b" published as "iOS shows the right wall clock" |

## Binding 3 — Media type

| Slot | Fill |
|---|---|
| Utility | Resolve a media type: what the IANA record says, what a byte sample matched, and which fallback to send when a named receiver was not tested |
| Id | A type/subtype from the registry. Parameters are a second field |
| Record | A pinned IANA media-type registry snapshot |
| `encoded` | The token matches the type grammar |
| `assigned` | The registry contains it, or marks it deprecated |
| `well-formed` | A stated byte sample matches the type's magic or grammar |
| `local-presence` | The operator hashed that sample and ran a named sniffer |
| `transformed` | A named parser accepted the sample |
| `rendered` | A named viewer displayed it. `unknown` until tested |
| `accepted` | A named upload field allowed it. `unknown` until tested |
| Failure page | "Why did this upload become a generic download?" Lead separates a declared type, a sniffed type, and an untested receiver |
| Fallback | A safer registered type, or an attachment disposition. Tradeoff: the receiver may store the bytes and still fail to display them |
| Closed edge to avoid | Magic-byte match published as "every browser accepts this upload" |

## Blank card

Copy this into the new utility's repository. Leave a row blank until you have the source. A blank row ships as `unknown`.

```text
utility:
sentence:
id grammar:
official record (source, version, checksum):
encoded:
assigned:
well-formed:
local-presence (method, artifact, digest):
transformed:
rendered:
accepted:
failure rule ids:
fallbacks (value, reason, tradeoff, refuseWhen):
question pages (title = question, first paragraph = lead):
mirrors (html, markdown, json):
exact URL:
skill:
map:
crawl (search, aiInput, aiTrain):
host file budget:
composing function:
interface (none, until the exact URL is in use):
incentive layer currently open:
closed edges you almost added:
```

## What stays outside this file

The graph is the structure. Building a stateless MCP wrapper, turning on generative AI Search, opening a payment rail, starting a contributor ledger, or migrating Pages to Workers are later decisions, each on the plane named above. This site's production remains the Unicode binding already deployed. Layer 1 is the part that is live.
