org.webgcp/site-embed v0.1¶⚠ This document specifies a test suite. It is not a passing result, and the suite is not yet built. Twenty-two assertions are defined below; zero fixtures exist; no implementation has been evaluated. The anchor spec's own §16 is the bar being held to — a standard without runnable conformance tests is aspirational — and this profile is aspirational until the fixtures ship. Saying so is the point: a conformance page that reads as though it passes is worse than none.
Twenty-two assertions across two suites, mapping the extension's normative section one-to-one. The split is by who can run it, which for this extension is not a detail: a participant is audited from outside, a network host is audited from inside.
| Suite | Run against | Runnable by | Assertions |
|---|---|---|---|
| SE-L0-P — participant-side | the participant's own domain | anyone — descriptor fetch, page fetch, DNS query | 15 |
| SE-L0-N — network-side | the serving network host's receipts | the operator only | 7 |
Everything here is observable by fetching two documents and asking DNS one question. That is deliberate: a participant claim that only its own operator can check is not a claim, and the whole value of a domain-bound identity is that a stranger can audit it.
| ID | Assertion |
|---|---|
SE1-01 |
/.well-known/webgcp is reachable over HTTPS and served Content-Type: application/json |
SE1-02 |
role is exactly "participant" |
SE1-03 |
conformance_level is absent (a participant serves no knowledge surface and claims no level) |
SE1-04 |
consumes is present, non-empty, and every element is an absolute https:// origin |
SE1-05 |
the response is cacheable within the anchor's 1–24 h bound |
| ID | Assertion |
|---|---|
SE2-01 |
identity is a did:web: DID whose method-specific identifier equals the host the descriptor was fetched from |
SE2-02 |
no second field asserts a competing identifier for the same party |
SE2-01 is the whole trust primitive in one line: identity is proven by the fetch itself. A
descriptor at example.com claiming did:web:someone-else.com fails, and that failure is the
mechanism — not a policy layered on top of it.
| ID | Assertion |
|---|---|
SE3-01 |
the served browser bundle contains no value that, presented alone, authorizes a metered call |
SE3-02 |
(architecture review — not wire-observable) metered calls originate from the server half |
⚠ SE3-01 is the assertion most likely to be implemented as a checker that cannot fail, and it
is also the only one whose failure costs real money. A scanner that greps for api_key= against a
bundle that never contained that string reports a pass it never earned — the failure mode this
estate has hit repeatedly and the reason the control below is mandatory, not optional. The runner
MUST refuse to report SE3-01 as passing unless the negative control tripped it in the same run.
The test is capability, not secrecy. A project id, a public origin, or the site's own
did:web authorizes nothing alone and is expected in the bundle. The question is only ever: does
presenting this value, by itself, make a metered call succeed?
| ID | Assertion |
|---|---|
SE5-01 |
every materialized entry in the site's WebMCP card carries authority: "derived" and a source |
SE5-02 |
the card remains valid WebMCP when every materialized entry is stripped |
SE5-03 |
no materialized entry is presented as a tool the site itself implements |
SE5-04 |
every materialized entry sets WebMCP's own untrustedContentHint annotation |
SE5-04 is not redundant with SE5-01. The two labels answer different questions — origin versus
output trust — and a suite that checked only ours would pass a card that tells an agent where a
tool came from while telling it nothing about whether the tool's output can be trusted.
| ID | Assertion |
|---|---|
SE7-01 |
svcb_status is present and is either "live <date>" or "unavailable" |
SE7-02 |
if "live", an SVCB query for _webgcp.<host> returns a record whose TargetName resolves to a host serving the descriptor |
SE7-03 |
if "unavailable", svcb_unavailable_reason is present and non-empty |
SE-7 was ruled SHOULD by the specification authority on 2026-08-23, so all three assertions
stand as written and none retires. They were drafted to survive either ruling — under a MUST,
SE7-01 would have narrowed to requiring "live" and SE7-03 would have retired — which is why
the unsettled question never blocked the tests around it.
Note what SE7-02 actually catches: a descriptor claiming svcb_status: "live" with no record
behind it. That is the only failure here that is a false claim rather than a missing capability,
and it is the reason the status field is worth requiring at all. Run it over DNS-over-HTTPS against
any compliant public resolver — no local dig needed, per the anchor's own verification note.
Seven assertions that a third party structurally cannot check, because they concern what the network host recorded, not what the participant published. Listing them separately is the honest move: folding them into the participant suite would imply an outside auditor had verified them.
| ID | Assertion |
|---|---|
SE4-01 |
installing the embed produces no charge; no browser-half call path can incur one |
SE4-02 |
metered lanes are reachable only after an explicit server-side opt-in |
SE4-03 |
a metered lane requiring payment refuses with 402 carrying payment requirements — never 429 — and accepts the retry's X-PAYMENT header |
SE4-04 |
verification without settlement unlocks a call but mints no spendable balance |
SE6-01 |
every served event records the participant identity |
SE6-02 |
every metered event produces a receipt naming identity, lane, and amount |
SE6-03 |
free-lane calls are rate-limited and the limit's enforcement scope is documented |
SE6-03 reads oddly as a conformance assertion until you notice what it prevents: the extension's
Known Limitations already admit the free-lane limit is per-instance, so a horizontally scaled
host enforces N times the nominal rate. Requiring the scope to be documented means a future
operator cannot quietly present a per-instance limit as a global one.
The suite is not shippable until it satisfies the discipline that made the sibling Attested Context suite trustworthy:
role; a conformance_level present;
empty consumes; a did:web naming a different host than the one served; a bundle carrying a
live metered credential; a materialized entry missing its source or its
untrustedContentHint; a metered lane answering 429 where it owes a 402; a verification that
mints balance without settling; a card that stops parsing
once materialized entries are stripped; svcb_status: "live" with no DNS record behind it;
"unavailable" with no reason.--self-test MUST fail rather than report a clean run. An untrippable check is indistinguishable
from a passing one, and this project has paid for that confusion more than once.A passing participant suite will mean: this domain publishes a well-formed participant descriptor, its identity is provably its own, and it is not shipping a spendable credential to browsers.
It will not mean the network host behaves, that the site's materialized skills are accurate, or that anything was audited beyond the four captured artifacts. Conformance is claimed only when a real participant's captured artifacts pass, and the claim names the artifacts, the date, and the extension version.
Implementations passing: none. The first will be author-operated, which advances the use-alone step and is explicitly not a second-implementer signal.