Repository navigation
feat(website): WebsiteEnvironment serves a site on the website/v1 contract, and a conformance check tests any server (FD-4683) - #428
Conversation
Brings in #428's review fixes beside this branch's: the clock's sync reads under the refresh lock and keeps the answered rate; conformance checks X-Universe-Now last, on every answer, at the recommended level, with the reserved-path probes counted; the handwritten test server stamps its 404s and 405s like every other answer. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
f5523cf to
7fc14cd
Compare
…tract, and a conformance check tests any server (FD-4683) This PR's change, rebased as one commit onto #427. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
7fc14cd to
b18049d
Compare
3579c2a to
76145d2
Compare
… keep older sites and shared names working (FD-4683) - The gateway answers 503 on a site's route while its card can't be read, rather than forwarding with nothing reserved. - A plugin's MultiEnv record looks each child up by its kind, so a website and an MCP server may share a name. - The state verifier reads a site its definition names but its card doesn't list at /svc/<name>/go, deprecated. - The clock script is put in streamed HTML holding only what comes before <head>. - Conformance fails a website/v1 ready that answers an HTTP error, whatever its body says. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ver HTTP client the test client uses (FD-4683) After a sign-out the client's jar keeps the site's signed-out cookie under testserver.local, and setting the forged one adds a second cookie of the same name. httpx2, which Starlette's TestClient uses when it is installed (as on CodeBuild), sends the forged one first, so the site reads the valid signed-out cookie and the test fails; httpx sends them the other way round. Clearing the jar first sends the forged cookie alone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
This is a huge red flag: it leaks CUA-Gym into agentenv-framework.
|
|
Following up on my
Concretely:
|
|
Agreed, and done in this stack rather than deferred.
Each PR removes what it had added, so the stack never introduces any of this. Grading a website now belongs outside the framework: |
1ffec4c to
05da818
Compare
…op /go, the state op and website_state_verifier (FD-4683) - The SDK serves no `/go`, no `params.state.path` and no `website/v1` `state` op; `STATE_PATH`, `WebsiteState`, `website_state`, `website_sites` and `website/state.py` are gone, and the default store keeps no initial state or diff. - Conformance runs the data plane's round trip on every server, with no skip for a state that shows changes. - The gateway reserves the card's `url` and every advertised endpoint, no longer a state path. - `website_state_verifier` is removed from the framework; grading against a site's state belongs outside it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
05da818 to
33ad3b8
Compare
… items in OpenAPI, and find the clock's sync_time by name (FD-4683) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
@greptile-apps all three remaining review comments are fixed in d4efdbb, each with a test that fails without its fix:
The full unit suite passes on this commit (12,908) and lint is clean. All three threads are replied to and resolved. |
|
Confirmed: all three findings are fixed in
These comments can remain resolved. I verified the code and tests in the commit; I did not independently run the suite. |
…ses the conformance check (FD-4683) This PR's change, rebased as one commit onto #428. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Stacked on #427.
agentenv_protocol.website: the easy path to a synthetic website that follows website/v1 (urn:agentenv:website/v1).@api.get/post/put/patch/delete(path, name=, roles=, status=): path, query and body are bound from type hints, errors are exceptions mapped to statuses, and an OpenAPI 3.1 document is generated.ApiContext: the signed-in user (else the acting user, so the agent starts signed in), the caller's role, and the public URL fromX-Forwarded-Host/-Proto.AgentEnv-Rolea browser sends, so a site believes a non-defaultrole only when the request also carriesAgentEnv-Role-Keyequal to the site'sWEBSITE_ROLE_KEY(compared in constant time). Every other caller, and every caller of a site with no key set, isdefault, soroles=routes are closed until a key is set.index.htmlfallback, the health path with@ready_check, the data plane and a card declaring website/v1 with its routes andopenapi/sessionoperations./agentenv…routes are matched before the site's own.self.now()reads the universe clock (clock/v1sync_time); every response carriesX-Universe-Now;clock_patch=Truepatches the page'sDate.sync_timealso takes main's optionaltimezone(feat(sync_env_clock): an optional timezone reads virtual_time in the zone and tells every synced server (FD-5003) #442), which the site reads asself.timezone;now()stays UTC.Collectionsstore: load, export and reset with no data hooks written. A site's data is read and written only through the data plane (data/get,data/add,data/reset). The SDK serves no/goand nowebsite/v1stateop.website_state_verifier, which feat(website): a website env is one server image, checked at its health path (FD-4683) #390 merged and which read a site's/go?sid=, is removed. Grading a website fromdata/getagainst the task's initial state moves to agentenvhub-sdk'scua_gym_verifier, a separate PR in scaleapi2.python -m agentenv_protocol.website.conformance URLchecks any server over HTTP: card, any host name, health, universe time, data plane, clock, forwarded headers, cookies.Known gaps
Each is fixed later in the stack, as noted.
WEBSITE_ROLE_KEYon a deployed site yet, and the gateway still trustsAgentEnv-Roleon MCP calls, non-SDK sites and website trigger attribution. A per-deploy key in the gateway is the full fix (feat(gateway): a keyed deploy's role key, forwarded headers, and triggers by route (FD-4683) #443, opt-in withkeyed_roles).X-Forwarded-*, so behind it sites must use relative URLs (feat(gateway): a keyed deploy's role key, forwarded headers, and triggers by route (FD-4683) #443).X-Universe-Nowand a filled-in card, stricter than a non-SDK server may be (feat(website): a session cookie per site, the clock's rate, conformance levels and models= (FD-4683) #444 splits required from recommended).Test
Unit suite and protocol tests: 12,659 passed, lint clean.
packages/agentenv-protocol/tests: 946 passed; the website tests (59, with the Notes ones) pass after the role-key fix. Deployed locally behind the gateway, a spoofedAgentEnv-Role: adminnow gets 403 on both/website/and/svc/(200 before).🤖 Generated with Claude Code


Confidence Score: 5/5
The reviewed changes appear safe to merge, with all three numbered findings addressed and no new blocking issue found.Summary
This PR adds
WebsiteEnvironment, typed HTTP routes, sessions, a collections store, shared readiness checks, and an HTTP conformance checker. It also removeswebsite_state_verifier.Reviews (14) · Last reviewed commit: "fix(website): leave a partial HTML answe..." · Reviewed by Greptile