webGCP v0.2 candidate — Context Layer hardening + Commerce Layer surface

Status. Candidate — NOT yet v0.2 final. This document sketches the v0.2 shape against the four critical (C) and five significant (S) review items raised in internal review notes and the Commerce-Layer formalization deferred from v0.1 per the reference architecture. v0.2 publication itself is gated on three conditions (frontmatter).

v0.1 stays frozen. webgcp-v01-final.md is the published Context-Layer specification; nothing in this candidate modifies it. v0.2 will publish at a new permanent URL (webgcp.org/spec/v0.2/) per webgcp-v01-final.md §10.4's URL-stability rule.

Authority hierarchy. This candidate defers to: the Context/Commerce boundary ruling, the standards-track playbook (6-step playbook; v0.2 cannot publish before Step 4), the project governance decree §6.1 + §6.3, a reference-architecture ruling (hard-shard topology — affects v0.2's distribution architecture).


1. Resolved C-items

1.5 — Substrate / Network framing

Authoritative. webGCP is a network-layer protocol. It runs on top of a substrate that provides six properties:

  1. Content-addressed artifacts — every bundle response is identifiable by hash; identical inputs produce identical outputs.
  2. Typed URN nodes — every queryable entity has a stable typed identifier (the URN form is substrate-defined; urn:webgcp:<substrate>:<type>:<id> is the canonical convention).
  3. MCP-callable surfaces — every node exposes a callable contract per MCP / WebMCP (the L1/L2/L3 federation layers).
  4. Payable invocation contracts — every invocation has a settlement primitive (in v0.2: x402 V2 payment URI embedding in the receipt — see §5.14).
  5. Explicit coordination/data plane separation. A compliant substrate names where coordination lives (scheduling, queues, HITL approval, MCP server hosting, sub-agent orchestration, observability emission, per-tenant runtime) separately from where data lives (manifest stores, receipt ledgers, reputation rollups, bundle artifact storage). The two planes MAY run on the same operator/cloud or different operators/clouds; the substrate MUST name which surfaces are which. (Property added in v0.2 per the reference architecture.)

  6. Declared space identity. A substrate MUST declare the space identity (model, dim, distance) of every embedding space it serves and MUST NOT compare vectors across spaces; where multiple spaces exist they are isolated lanes, and exactly one canonical space feeds any trained matcher. Neutral to which model; strict about space identity. A cross-space comparison does not error — it returns confidently ranked noise, which is why the guard must be declarative, not empirical. (Property promoted in v0.2 on 2026-07-30 from the §7 sync-item-3 resolution shape.)

Any substrate satisfying these six properties is webGCP-substrate-compliant.

Reference substrate. The reference substrate — per-tenant, GCP-native — is the first publicly-deployed one. The six-property mapping under the hybrid architecture per the reference architecture:

  1. Signed-content-addressed-bundles (KMS) — data plane (per-tenant BQ + KMS)
  2. The webgcp_network.* schemas (typed URN nodes) — data plane (per-tenant BQ)
  3. The substrate's MCP-callable surfaces (backend MCP + network MCP + the per-tenant agent MCP server) — coordination plane (Cloudflare Durable Object) + data-plane handshake to BQ
  4. x402 V2 settlement URIs in receipts (payable invocations) — data plane (per-tenant BQ receipt ledger) + coordination-plane orchestrator (CF Agent runFiber("settle:..."))
  5. Explicit coordination/data split — coordination on Cloudflare Agents (Durable Objects + embedded SQLite + scheduling + queues + fibers + HITL + observability), data on per-tenant GCP BigQuery per the reference architecture. Authentication across the split uses GCP Workload Identity Federation per the reference WIF auth path.

  6. Declared space identity — the canonical space pin gemini-embedding-2 / 3072 / COSINE, tiered lanes isolated per space — data plane (per-tenant BQ embedding columns). The one known deployed divergence and its convergence path are disclosed in §7 item 6.

The six-property contract is substrate-neutral: a substrate could host both planes on one operator (pure-GCP — feasible per an earlier reference design); or split them across operators (the hybrid per the reference architecture); or split further (e.g., separate identity provider for the bilateral handshake). Property 5 makes the split-or-not choice an explicit substrate property, addressable by buyers in conformance / procurement / governance review.

Property 5 — Corollary (coordination-plane behavioral invariants). A substrate whose coordination plane performs selective forwarding of work between participants MUST honor two invariants:

The substrate is not required to be BigQuery, GCP, Cloudflare, or anything specific. §13 documents the reference substrate because it ships first; a second-implementer satisfying the six-property contract is what graduates webGCP from "our protocol" to "a standard." See the standards-track playbook Step 4. Reasonable alternative substrate compositions include: pure-Cloudflare (D1 data plane + DO coordination plane; violates a reference-architecture ruling sovereignty for The Network reference instance but acceptable for hypothetical implementers); pure-AWS (Aurora data plane + Step Functions/EventBridge coordination); pure-Azure (Cosmos data plane + Durable Functions coordination); split-operator hybrids with explicit auth federation.

§1.5 — Context vs Commerce Layer

Context Layer. Knowledge retrieval, provenance, applicability gating, bundle contracts. All §5.1-§5.11 normative requirements are Context-Layer. v0.1 specified this layer in full.

Commerce Layer. Settlement (x402 V2), receipts, reputation rollup, marketplace routing. v0.1 explicitly excluded these per §0.7 + a reference-architecture ruling. v0.2 formalizes the Commerce Layer surface in §5.12-§5.15. Commerce is optional at L0/L1, MUST at L2-Governed and above (where audit + reputation are buyer-required).

Where Commerce is specified. Within this same webGCP document — not in "neighbor standards" (that v0.1 framing was misleading and is dropped). Commerce composes with x402 V2 (settlement wire format), AP2 (mandate registry), and MCP (callable surfaces), but the receipt schema, reputation rollup, and right-to-delete fanout are webGCP's own normative surfaces in v0.2.

Reference implementation status. Context Layer is live on webgcp.org + news.energypager.com (the non-author second implementer, re-identified per the reference architecture) + catalog.myparallel.dev (L0 instances; SVCB-live since 2026-05-17). The Commerce-Layer reference implementation runs as the reference substrate's judge + auctioneer services writing tenant-local receipt ledgers (per-tenant isolation per the reference architecture), never a single shared receipts table.

§5.4 — Applicability operationalized

Expression language. webGCP v0.2 MUST use Common Expression Language (CEL) for in_scope_when and out_of_scope_when predicates.

Rationale: well-defined; widely implemented (Kubernetes admission, GCP IAM, Envoy); language-neutral; bounded evaluation time; safe to evaluate untrusted predicates.

Composition rules. - Within a list (in_scope_when: [P1, P2, P3]): implicit AND. A KB is in-scope when ALL predicates evaluate true. - For explicit OR: callers compose a single CEL expression with || operator. Lists are not OR. - Across in_scope_when and out_of_scope_when: out_of_scope_when overrides in_scope_when. A KB is in-scope IFF in_scope_when evaluates true AND out_of_scope_when evaluates false (or is absent).

Worked example.

kb_id: urn:webgcp:example:skill:refund-triage-v3
in_scope_when:
  - 'request.purchase_channel == "retail"'
  - 'request.amount_usd <= 5000'
  - 'request.policy_version >= "2024-q3"'
out_of_scope_when:
  - 'request.region == "EU"'  # EU has separate policy; route to refund-triage-EU
  - 'request.disputed == true'

Semantics: this KB applies to retail refunds ≤$5k under policy 2024-q3+, except when the request is in the EU (different KB) or disputed (different KB).

Failure modes. - CEL evaluation error → the predicate is treated as false (KB not in-scope). Server logs the evaluation failure; ACL-equivalent error envelope returned only if no other KB matched. - Missing referenced field (e.g., request.policy_version absent) → evaluation is strict: missing required field = false (out of scope).

§9 — L0/L1 conformance fixture mapping

v0.2 conformance suite structure.

For each conformance level (L0 / L1 / L2 / L3 / L4), the v0.2 spec publishes: 1. The set of normative requirements satisfied at that level (e.g., L0 = §5.1-§5.11 from v0.1). 2. The set of fixture files (WGCP-LN-NNN.yaml). 3. A requirement-to-fixture map showing which fixtures cover which requirements.

L0 fixture map (v0.2; explicit).

Normative Fixture Assertions
§5.1 (server descriptor) WGCP-L0-001 4 assertions: name, kbs[], endpoints.query, version
§5.2 (manifest schema) WGCP-L0-001 3 assertions: hash, primitives[], version
§5.3 (bundle contract) WGCP-L0-002 3 assertions: typed fields, _meta presence, contract identifier
§5.4 (applicability via CEL) WGCP-L0-002 2 assertions: in_scope_when match, out_of_scope_when override
§5.5 (provenance mandatory _meta) WGCP-L0-002 2 assertions: source URI present, freshness present
§5.7 (retrieval primitive declared) WGCP-L0-001 1 assertion: at least one primitive
§5.8 (idempotency key honored) WGCP-L0-003 2 assertions: identical key → identical response, hash stable
§5.9 (ACL = absent, not masked) WGCP-L0-003 2 assertions: denied field absent in response, no mask token
§5.11 (untrusted-content handling) WGCP-L0-003 2 assertions: content-origin tag, sanitization marker
Cross-fixture mitigations WGCP-L0-003 X01/X02/M01/M02 4 assertions: SVCB cross-namespace + multi-resolver consistency (added 2026-05-16)

Total: 13 fixture-level assertions across 3 fixtures, mapping 11 normative requirements (§5.1-§5.5, §5.7-§5.9, §5.11) + the 4 mitigation assertions. §5.6 (HTTP wire format), §5.10 (forbidden practices) verified by inspection rather than fixture; documented in v0.2 §9.

v0.1 was honest but unmapped. This explicit table closes the credibility-test gap.

L1 fixture map (authored 2026-07-31 — publication gate 3). Four fixtures, one per L1 pillar (§4: + multiple KBs, multiple primitives, versioned artifacts, refresh SLAs), 18 positive + 5 negative assertions, staged at /conformance/v0.2-candidate/:

Normative Fixture Assertions
§4 L1 multiple KBs · §5.1 descriptor enumeration · §5.2 unique kb.id · §5.5 unblended attribution WGCP-L1-001 4 (+1 negative)
§5.7 ≥3 primitives incl. direct_lookup · §4 vector + one structured · §9a(b) retrieval_mode declared WGCP-L1-002 5 (+2 negative)
§5.2 semver + content-addressing + hash-pin refusal · §5.3 contract pinning · immutability WGCP-L1-003 5 (+1 negative)
§5.2 authority.freshness_sla · §5.3 per-field override + on_failure · staleness surfaced never silent WGCP-L1-004 4 (+1 negative)

Honesty flag, load-bearing: the fixtures are authored, not runnable — no L1-or-above instance is deployed anywhere, no party has ever passed them, and each fixture's own $status stamp says so (the same posture WGCP-L0-001 shipped with before the query endpoint existed). An L1 claim before a passing run is a conformance failure. Runner extension follows the first L1 deployment, per the phase-2 gate discipline.

L2-L4 mapping remains to be authored alongside the second-implementer engagement (Step 4 of the standards-track playbook) — normative prose without a fixture is not a conformance level.

§9a — Entity-generic conformance + declared degraded posture (graduated from §0a E-1/E-2, 2026-07-08)

Both changes are evidence-earned, not theoretical: they come from graph-wiki, a complete self-contained v0.1 implementation over SQLite whose entities are wiki_page, not skills — the standard's first non-skill registry. What it hit is what any non-skill catalog will hit.

(a) Conformance is entity-generic; skills are the worked example, not the requirement. v0.1's payload and edge conformance were phrased in skill vocabulary. A conformant catalog of a different entity type satisfies the substance without matching that vocabulary, so v0.2 re-phrases the two skill-centric checks against entity_type while keeping skills as the normative worked example:

v0.1 check (skill-worded) v0.2 entity-generic phrasing Substance preserved
WGCP-1 — skill payload carries the required skill fields Every registry row of a declared entity_type carries that type's required payload fields, per the type's published schema (skills remain the reference schema). A typed, schema-validated payload per row.
WGCP-6 — property graph has ≥ skill↔skill / skill↔tool / skill↔role edges The property graph declares ≥3 typed edge labels over registry rows (the label vocabulary is entity-type-defined; skill↔{skill,tool,role} is the reference vocabulary). ≥3 distinct typed relationships, GQL-traversable.

graph-wiki's mapping (documented in the reference graph-wiki implementation §4/§7) is the first worked non-skill instance: wiki_page rows carry the type's payload (WGCP-1), and links_to / parent_of / documents are the three typed edge labels (WGCP-6). WGCP-2/3/4 were already entity-neutral and unchanged. The frozen v0.1 fixture corpus is untouched; v0.2 adds an entity_type-parameterized fixture alongside the skill fixtures.

(b) A conformant server MAY serve a query in a declared degraded posture. WGCP-4 (vector-ranked local_search + graph expansion) is all-or-nothing in v0.1 — but real deployments lose the embedding provider (outage, absence, cost gate). graph-wiki, without an embedding provider, falls back to lexical full-text ranking: functional and honest, but v0.1 gave it no way to say so, forcing a self-declared non-conformance.

v0.2 defines the honest middle: a server MAY answer local_search in a labeled degraded mode, and the label rides the typed response envelope rather than the quality loss going silent.

This preserves the guarantee (a vector claim means true vector search) while admitting the operational reality the frozen core couldn't express. Reference behavior: graph-wiki reports mode: fts today; v0.2 standardizes the envelope field name.


2. Commerce Layer surface (new in v0.2)

§5.12 — Receipts Protocol (MUST at L2+)

A receipt is a signed, content-addressed record of one invocation. Receipts are the audit substrate for the Commerce Layer.

Wire shape.

{
  "receipt_id": "urn:webgcp:receipt:<sha256>",
  "schema_version": "1",
  "issuer": "urn:webgcp:server:<server-id>",
  "issuer_sig": "<EdDSA signature>",
  "issued_at": "2026-05-20T14:23:00Z",
  "request": {
    "kb_id": "urn:webgcp:<substrate>:<type>:<id>",
    "kb_version": "v3.2.1",
    "idempotency_key": "<opaque>",
    "manifest_hash": "<sha256>",
    "invoker": {
      "principal_id": "<urn>",
      "mandate_ref": "urn:ap2:mandate:<id>",
      "ap2_signature": "<EdDSA>"
    }
  },
  "response": {
    "bundle_hash": "<sha256>",
    "outcome": "ok | error | denied",
    "freshness": "..."
  },
  "settlement": {
    "x402_uri": "x402:base:usdc:0x<addr>?amount=<nano>",
    "amount_nano_usdc": 100,
    "facilitator": "circle | self-hosted"
  },
  "chain": {
    "upstream_receipt_ref": "urn:webgcp:receipt:<sha256> | null",
    "depth": 1
  }
}

Normative. - L0 — MAY emit receipts (informational). - L1 — SHOULD emit receipts for any invocation with a non-zero settlement.amount_nano_usdc. - L2 Governed — MUST emit receipts for every invocation; receipts MUST be hash-chained where the bundle is composed from upstream bundles (upstream bundle_hash is the upstream receipt.response.bundle_hash); receipts MUST be retained per the substrate's data-retention contract (≥1 year is RECOMMENDED). - L3+ — receipts MUST be cross-server-verifiable: a receipt from server A invoked from server B carries B's chain.upstream_receipt_ref, and either party can independently verify the chain.

Storage. Receipts are tenant-local per the hard-shard topology ruling. Cross-tenant access is via signed content-addressed artifacts or Analytics Hub linked datasets, never via direct read of another tenant's receipt table.

§5.13 — Reputation Rollup (MUST at L2+)

Per-skill (per-kb_id) reputation is derived from receipts. The rollup is deterministic: given a set of receipts + a fixed rollup function, anyone can recompute reputation independently (anti-collusion).

Wire shape.

{
  "rollup_id": "urn:webgcp:rollup:<sha256>",
  "kb_id": "urn:webgcp:<substrate>:<type>:<id>",
  "version": "v3.2.1",
  "window": {
    "start": "2026-05-13T00:00:00Z",
    "end": "2026-05-20T00:00:00Z"
  },
  "stats": {
    "invocation_count": 1247,
    "success_rate": 0.94,
    "p95_latency_ms": 320,
    "quality_tier": "T2"
  },
  "feedback": {
    "aggregate_id": "urn:webgcp:feedback-aggregate:<sha256>",
    "feedback_count": 42,
    "weighted_score": 0.82
  },
  "last_invoked_at": "2026-05-19T22:01:33Z",
  "rollup_signature": "<EdDSA>"
}

Fidelity tiers (read-side simulcast). A reputation consumer MAY request a rollup at one of three fidelities; the server MUST serve at most the requested fidelity:

Fidelity Returns Use
score_only {kb_id, version, weighted_score, rollup_id, rollup_signature} routing pre-filter; cheapest
summary the stats block + feedback block + rollup_id + signature bid composition
full the entire signed rollup (the §5.13 wire shape) audit / dispute (N6)

Lower tiers are projections of the full rollup, not independently recomputed; each tier carries the full rollup's rollup_id + rollup_signature so a consumer MAY fetch-and-verify full when the projection is insufficient. The privacy invariant (no per-invoker identifiers) holds at every tier.

Normative. - Determinism precondition (no-mix). Reputation is recomputable from receipts (the §5.13 anti-collusion guarantee) only if each receipt attributes its outcome to exactly one kb_id. An implementation MUST NOT emit a receipt whose request.kb_id is a composite of multiple invoked KBs, and a coordination plane that selects among competing bids MUST NOT blend them (Property 5 corollary, no-mix). Multi-KB composition is expressed via chain.upstream_receipt_ref (§5.12); a blended single receipt is non-conformant because it makes the rollup non-recomputable. - L2 Governed — MUST publish rollups at a stable URI per kb_id; rollup signature MUST be verifiable against the publisher's known key; window size MUST be ≥7 days. - L3 Federated — rollups MAY be federated; cross-server reputation requires HMAC-signed attestations per the reference network spec. - Privacy invariant. Rollups MUST NOT carry per-invoker identifiers; only aggregate stats. Anti-Sybil + invoker-PII protection.

Reference-implementation status (sync 2026-07-01). The recomputable reputation function is live in the reference substrate as the agents_current derived view: deterministic over truth-class-clean (canonical/derived) outcome edges, absent-means-no-proof, advisory-never-gating in discovery. Two deliberate deltas from the §5.13 wire shape: (a) the reference function exposes raw score + n and does not emit stats.quality_tier — tier bucketing is a tuned-threshold choice deferred until demand data exists; treat quality_tier as OPTIONAL in the v0.2 wire shape. (b) today it recomputes from eval-record edges, not receipts — the receipts-based recompute is the L2+ Commerce shape and stays gated with the rest of §5.12/§5.14.

Field-normalization input rules (graduated from §0a E-6, 2026-07-08 — AtCoder Heuristic Contest evaluation infrastructure). The rollup's stats are absolute per-kb_id. When a consumer compares KBs on the same task_class, the rollup that derives a field-relative view MUST obey two contest-hardened rules — the same discipline that has kept a gaming-motivated leaderboard un-Goodharted for ~15 years:

  1. Degenerate-run exclusion from best-known. A degenerate outcome (crash / timeout / illegal output — receipt.response.outcome == "error") counts as a zero for its own kb_id's success_rate, but MUST be excluded from the best-known-performance baseline used to normalize the field. One broken invocation must never distort every other KB's relative standing. (AtCoder's "excluded from the MIN calculation" rule.)
  2. Relative rank is derived, never stored. Where ≥2 KBs carry rollups on the same (task_class, prompt_set_hash), a relative_rank MAY be derived by normalizing a KB's metric against the best-known on that pair (AtCoder's MIN/YOUR per case), recomputed whenever a new rollup lands. It MUST NOT be written onto the rollup record — the record stays absolute and content-addressed; relativity is a query-time projection over the current field, consistent with the determinism precondition above (the field changes; the recompute is deterministic given the field).

These are rollup input constraints, not a new wire field; they bind at L2+ alongside the determinism precondition. Origin: the reference eval profile §3.4 (the eval-lane statement of the same rules) + the reference eval study.

§5.14 — Settlement Integration (SHOULD at L1+; MUST at L2+)

webGCP servers integrate x402 V2 settlement; webGCP does not re-specify x402.

§5.15 — Right-to-Delete Fanout (MUST at L2+)

When a principal exercises right-to-delete (GDPR Art. 17, CCPA, similar), the deletion request fans out across all federated servers that hold receipts referencing the principal.

Normative. - A right-to-delete request is itself a signed receipt of type "deletion-request", addressed to the principal's federated server set. - Receiving servers MUST honor the request within 30 days; MUST emit a "deletion-completed" receipt back to the requester; MUST hash-chain to the original deletion request. - Deletion is destructive for the principal's PII fields; the receipt's structural metadata (hash chain, version, kb_id) is retained (audit substrate). - L3 Federated servers MUST relay deletion requests to upstream-chained receipts (closes the federation loop).

§5.16 — Vocabulary Registry & Extension Mechanism

Custom retrieval primitives + bundle field types declared via URI scheme.


3. Coordination Layer surface (proposed for §5.17; PROMOTION DEFERRED per 2026-05-26)

Status flag: DESIGN-TARGET — the proposed §5.17 normative text below is drafted but explicitly NOT promoted to v0.2-candidate-normative status until reference-impl maturity gates (3) below close. This is the protocol-side companion to substrate property #5 in §1.5 (the named coordination/data plane separation per the reference architecture).

Why this section exists. webGCP v0.1 §0.5 + §1.3 named "coordination" as a substrate concern but left the wire-format / table-shape unstandardized. The 2026-05-26 standards-consolidation brainstorm + the 2026-05-27 team-graph-as-dogfood brainstorm surfaced that (a) the Coordination Layer machinery is already designed in the reference architecture; (b) a local team-graph dogfood is the first reference instance at small N (12 nodes; 13 edges); (c) the reference implementation's distributed coordinator services (routing, auction, and proposed scope-promotion) are the implementation layer. Pulling the proposed §5.17 text forward into this v0.2 candidate makes the layer's eventual shape explicit for external readers and second implementers, without promoting it normatively.

3.1 — Proposed §5.17 normative tables (DESIGN-TARGET; not yet binding)

The §5.17 amendment would standardize three tables + one extension to §5.7's retrieval-primitives table. Full schema authority lives at the reference Coordination architecture [read-only archive] §4; reproduced here in proposed-normative form:

Table A — task_coordination (claim + heartbeat + scope per the reference Coordination architecture §4.1): - task_id STRING NOT NULL - tenant_id STRING NOT NULL (per the reference architecture hard-shard scope) - claim_owner STRING (which agent / role / team owns this work; NULL = open) - status STRING (open | claimed | in_progress | done | blocked | cancelled) - heartbeat_at TIMESTAMP (last observable activity) - k_hop_scope STRING (the retrieval-scope this work touches — graph_traversal anchor) - created_at, updated_at

Table B — edge_attention (GAT-style attention coefficients per the reference Coordination architecture §4.2): - src STRING, dst STRING (the edge endpoints — typed URN nodes) - kind STRING (existing enum: depends_on | reviews | delegates | supersedes | invokes; proposed v0.2 additions for local-team coordination: paired_with | parent_of | co_steward_with per the reference team-graph dogfood §4.1) - tenant_scope STRING (* for global Graph; specific tenant_id for tenant-scoped attention) - weight FLOAT64 (0..1 attention coefficient; updates via the GAT-style rule below) - n_observations INT64 - last_outcome_at TIMESTAMP - recompute_at TIMESTAMP - PRIMARY KEY (src, dst, kind, tenant_scope)

Edge attention update rule (proposed normative; from the reference graph-retrieval architecture §3.3):

weight_new = (1 - α)·weight_old + α·outcome_score
   where α = 0.5  if n_observations < 10   (warm-up)
         α = 0.1  otherwise                (steady-state)

outcome_score is conventionally 1.0 for clean handoff completion / 0.5 for partial / 0.0 for failure. Implementers MAY refine the outcome enumeration; the GAT-style structure is normative.

Table C — promotion_queue (scope-promotion state machine per the reference Coordination architecture §4.3 + the reference stewardship overlay §4.3): - promotion_id STRING NOT NULL - tenant_id STRING NOT NULL - promotion_kind STRING (version | scope | tier) - from_state STRING, to_state STRING, from_scope STRING, to_scope STRING - state STRING (the 7-state machine: BuiltSubmittedCanaryAwaitingSignoffConfirmedFinalized OR RolledBack) - steward_approvals ARRAY<STRUCT<role STRING, principal_id STRING, approved_at TIMESTAMP>> - created_at, updated_at

Table D — coordination_subscription (who-receives-which-forward; the SFU subscription declaration): - subscriber_id STRING NOT NULL (agent / role / team / scout URN) - tenant_id STRING NOT NULL - scope_selector STRING NOT NULL (glob/URN over what the subscriber receives — task-class, skill-class, ticket-class) - edge_kinds ARRAY<STRING> (which coordination edges to receive: depends_on|reviews|delegates|invokes|paired_with|parent_of|co_steward_with) - fidelity STRING (score_only|summary|full — the simulcast tier requested; see §5.13 fidelity tiers + §5.7) - min_weight FLOAT64 DEFAULT 0.0 (relevance floor; forwards below this edge_attention.weight are deferred/batched, never dropped) - created_at, updated_at - PRIMARY KEY (subscriber_id, scope_selector, tenant_id)

A subscriber MAY subscribe only to scopes its tenant/role is authorized for; publish authority is governed separately (a participant publishes only artifacts it owns, per the task-state-ownership map). The coordination plane forwards a published artifact to subscribers whose scope_selector matches and whose edge_kinds intersect, ranked by edge_attention.weight, at each subscriber's declared fidelity.

§5.7 extension — graph_traversal primitive (proposed normative addition to the v0.1 retrieval-primitives table): - Bounded k-hop traversal: k_hop_radius (default 1; max 3); top_k_per_hop (default 20) - Sampling weight = edge_attention.weight (importance-weighted top-K by default; implementer MAY add ε stochastic exploration) - Tier-aware retrieval architecture per the reference graph-retrieval architecture §3.4 — free=Graph Transformer global attention / small-paying=tenant-masked GT / dedicated=GraphSAGE+GAT/GIN - Fidelity (simulcast). A traversal/forward MAY carry a fidelity ∈ {score_only, summary, full}; the server returns candidate nodes at the requested fidelity (consistent with the §5.13 rollup tiers for credibility nodes). Default summary. This bounds per-consumer payload independently of top_k_per_hop. - Returns candidate set [(node_id, composite_score, score_breakdown), …] with full provenance

Forwarding provenance. A coordination plane that forwards artifacts SHOULD record each forward (from, to, fidelity_sent, weight_at_send) for audit. At L3 Federated, cross-server forwards MUST be provenance-verifiable: a forwarded artifact retains its origin envelope's signature so the receiving server can verify it without trusting the forwarder. Within a single server, forwarding provenance is an internal concern.

3.2 — Where the coordinator concept lives in this proposed surface

The §5.17 amendment makes explicit that no single "coordinator" service exists in webGCP-compliant implementations. Coordination is distributed across:

Concern Where it lives in a webGCP substrate
Coordination plane infrastructure Per a reference-architecture ruling reference: Cloudflare Agents Durable Objects (per-tenant; $0 idle hibernation). MAY be replaced by other per-tenant runtime fabrics; the §1.5 substrate property #5 names the SEPARATION, not the technology.
Coordination state Tables A/B/C above (task_coordination / edge_attention / promotion_queue)
Routing coordination Implementation-layer service (a routing service in our reference implementation). NOT standardized — implementers ship their own routing service against the §5.7 + §5.17 primitives.
Marketplace coordination Implementation-layer service (an auction/marketplace service in our reference implementation). NOT standardized.
Scope-promotion coordination Implementation-layer service (a proposed scope-promotion service in our reference implementation). NOT standardized.

Anti-pattern (explicit): an implementation that consolidates routing + auction + promotion + scheduling + HITL into a single "coordinator" service violates the distributed-coordination intent. This is the MCU failure in coordination terms: a single consolidating coordinator mixes every participant's work into one synthesized view, which is lossy (provenance lost), a single point of failure, and — for negotiation — destroys the outcome→bidder attribution §5.13 depends on. The distributed router/auctioneer/promoter fleet is the SFU: each forwards selectively and composes nothing centrally. The protocol distributes coordination by design for the same reason an SFU beats an MCU at scale — selective forwarding without central mixing.

3.3 — Conformance to proposed §5.17 (when promoted)

When the §5.17 amendment promotes from DEFERRED → NORMATIVE, conformance would require:

  1. Substrate provides the three tables (or schema-equivalent surfaces) and the graph_traversal primitive
  2. edge_attention.weight update rule is observable (an implementation MAY use a different algorithm; the GAT-style behavior must be reproducible per the rule above)
  3. promotion_queue state machine transitions are observable + idempotent
  4. graph_traversal primitive returns candidate sets with the declared composite_score breakdown
  5. Tier-aware architecture declaration — implementation declares which tier(s) it supports + which retrieval architecture maps to each (per the reference graph-retrieval architecture §3.4)
  6. Select-don't-mix is observable. For a selection event (e.g., bid award), the resulting receipt references exactly one selected artifact by hash, and non-selected artifacts are retained in agent_control.audit_chain. No receipt carries a request.kb_id composed of multiple invoked KBs. (Tests Property 5 corollary + §5.13 determinism precondition.)
  7. Fidelity tiers are honored. A request at score_only returns the score_only projection (not full); a request at summary returns summary; each projection carries the full artifact's id + signature. (Tests §5.13 fidelity tiers + §5.7 fidelity param.)

Three reference instances would close Step 4 of the standards-track playbook for this proposed surface: - webgcp.org (existing L0 self-conformant) - news.energypager.com (the non-author L0 second implementer; re-identified from the-ai-news.web.app per the reference architecture) - the reference substrate's team_records + edge_attention team-graph dogfood (proposed; pending Option E deploy per the reference team-graph dogfood §10)

3.4 — Promotion gates from DEFERRED → NORMATIVE (when this section becomes part of v0.2-final)

Gate Description Status 2026-05-27
G-CL.1 Coordination Layer reference impl observable in production for ≥1 tenant ⏳ Not yet — Option E thin slice authored at the reference team-graph dogfood; deploy pending
G-CL.2 task_coordination table populated by ≥1 implementation ⏳ Deferred to Option D per the brainstorm
G-CL.3 edge_attention.weight update rule observable + monotonic on real outcome data ⏳ Deferred to event-driven recompute (Option D)
G-CL.4 promotion_queue 7-state machine exercised end-to-end on a real scope-promotion ⏳ Requires the reference scope-promotion service (Durable Object)
G-CL.5 At least one second implementer expresses interest in the Coordination Layer surface ⏳ Standards-track Step 4 for THIS section specifically; closed Step 4 for the parent webGCP standard 2026-05-21 doesn't transfer automatically — the Coordination Layer is sufficiently distinct that the Step-4 closure must be re-earned for §5.17

Anti-pattern lock applies. Per project-decree-v0 v0.4 §7 decision principle #9, this proposed surface stays at DESIGN-TARGET status until ≥3/4 (probably ≥G-CL.1, G-CL.2, G-CL.3, G-CL.5) gates close. Promotion to NORMATIVE = a separate revision of v0.2-candidate; doesn't trigger automatically when gates close.

SFU coverage note. The SFU surfaces (subscription Table D, fidelity tiers, select-don't-mix, no-forward) are exercised under the existing gates — Table D + fidelity under G-CL.2 (fixtures) and G-CL.4 (promotion_queue/selection end-to-end); no-mix + no-forward under G-CL.1 (reference impl observable). They add no new promotion gate. The gate count stays 5; the SFU edits sharpen what those gates test.

3.5 — Reference impl pointers

3.6 — Open questions for §5.17 (separate from the v0.2 candidate's other open items)

  1. Sample rate per tier for decision-events — at production scale, every routing decision could emit an event. Free tier 10% / small-paying 50% / dedicated 100% sample rates proposed; not yet validated.
  2. Cross-tenant aggregation privacy model — how do tenant T1's edge_attention weights relate to public-Graph attention weights? (Per the reference graph-retrieval architecture §3.4 small-paying tier discussion.)
  3. promotion_queue mid-flight cancellation — what happens to in-flight promotions when a tenant cancels or a steward revokes signoff?
  4. graph_traversal cost budget — should the primitive include a cost_budget_ms cap per query? (Affects free-tier protection.)
  5. Reconciliation between task_coordination.k_hop_scope and graph_traversal retrieval anchor — same field? Different fields? Implementation choice?
  6. Low-fidelity verifiability. score_only/summary projections are not independently signed (§5.13 fidelity tiers). Per-tier signing (Merkle proof over the full rollup) vs fetch-full-to-verify — deferred until a consumer needs verifiable low-fidelity.
  7. Subscription cold-start. No edge_attention history at launch; warm-up from the static ownership/skill-class map (weight 0.5, α=0.5 for first 10 observations per §8) until forwarding observations accrue.

These 7 open questions DO NOT block the §5.17 amendment from publishing as proposed-but-deferred text. They DO need resolution before promotion to NORMATIVE.


4. Hardening passes

§13 — Reference substrate (rename / honesty surgery, resolves S3)

v0.1 §13.2 used internal milestone jargon for the backend MCP server. v0.2 §13:

Substrate notes (graduated from §0a E-5/E-7, 2026-07-08). Two reference-substrate facts join §13 — both are honest description of the reference substrate, neither is protocol-normative (the core stays substrate-agnostic):

§0.5 — GCP acronym disambiguation

v0.1's "at least one prior usage in adjacent literature" sounds evasive. v0.2:

"GCP previously appeared in adjacent literature as Graph Commerce Protocol. This v0.1+ specification formally narrows the acronym to Graph Context Protocol to disambiguate from Google Cloud Platform and to scope v0.1 to the Context Layer. Commerce concerns are formalized in v0.2 §5.12-§5.15 but the protocol acronym remains 'Graph Context Protocol' regardless of layer."

§10.4 — v0.1 URL stability

v0.1 said /spec/v0.1/ is immutable, then described v0.1 as a working draft. v0.2 reconciles:

§3.3 discovery — citation refresh (graduated from §0a E-3/E-4, 2026-07-08)

v0.1 §3.3's discovery MUSTs (/.well-known/mcp.json per SEP-1649, /.well-known/webmcp.json) stay valid and frozen — but the upstream standards they cite moved between v0.1's authoring and now. v0.2 refreshes the citations and the prose that surrounds them (a hardening pass, not a normative change to what must be served). Full delta table + reference implementation in the reference WebMCP manifest pattern §0a.

(a) MCP Server Card: SEP-1649 ratified (2025-11-25), superseded by SEP-2127. v0.1-era prose implied the card carries tool listings at a single path. The ratified reality:

(b) WebMCP 2026-06-24 draft. v0.1-era prose says navigator.modelContext; the entry point moved to document.modelContext (partial interface Document, secure-context). registerTool(tool, {signal, exposedTo})signal unregisters via AbortSignal (no separate unregisterTool), exposedTo scopes visibility by origin. ToolDescriptor gained title + annotations {readOnlyHint, untrustedContentHint}; a toolchange event fires on register/unregister; Chrome 149 is in public origin trial. Still no W3C pre-visit discovery manifest, so /.well-known/webmcp.json remains an MP convention (bumped mp/webmcp/1.1 for the annotations vocabulary; 1.2 candidates maskedFields + usageRules parked). This refreshes the substrate-property #3 citation (§1.5: "MCP-callable surfaces per MCP / WebMCP") and Q10's "browser-side surfaces are WebMCP's domain" (§4 open-question closure) — both remain correct, now with current API names.

Neither (a) nor (b) changes what a v0.1 server must serve; both correct how v0.2 describes the upstream surfaces it composes with, keeping the "great citizen of adjacent standards" posture honest against ratified reality.

§12 — Pruning + closure

Of v0.1's 10 open questions: - Q4 (graph as first-class) — CLOSED by §0.5's Context/Commerce split; graphs are one primitive in §5.7 / §5.16. - Q7 (receipt protocol) — RESOLVED in §5.12. - Q8 / Q9 (vocabulary / conformance governance) — RESOLVED in §5.16 + §9. - Q10 (browser-side webGCP) — CLOSED: Context Layer is server-side; Commerce Layer is server-side. Browser-side surfaces are WebMCP's domain. - Q1/Q2/Q3/Q5/Q6 — carried forward to v0.2 §12; pruned for staleness.


5. Out of scope for v0.2

Items the v0.2 candidate does not cover; defer to v0.3+: