@@ -253,3 +253,27 @@ change durable sandbox protobufs. Reads revalidate owner, configuration,
253253generation, and expiry. Cleanup scans bounded pages and uses conditional deletes
254254so concurrent renewals are preserved. Discovery consumers must not treat these
255255records as application health or external ingress readiness.
256+
257+ ## Workspace service discovery
258+
259+ ` GetServiceRouteSnapshot ` and ` WatchServiceRoutes ` expose accepted installations
260+ for one explicit active workspace. They require ` sandbox:read ` and workspace
261+ user access; omitted/all-workspaces selectors and sandbox principals are rejected.
262+ Dedicated discovery machine grants are separate work.
263+
264+ Each successful response replaces the complete view. Consumers preserve the
265+ returned hostname as TLS SNI and HTTP authority when dialing the supervisor
266+ endpoint, remove absent routes, and expire cached entries at ` expires_at ` even
267+ when discovery is unavailable. An error is not an empty replacement. The opaque
268+ snapshot revision includes lease renewals; ` installation_version ` remains stable
269+ across those renewals and changes when installation identity changes. These
270+ records establish neither application health nor ingress readiness.
271+
272+ Collection checks installation resource versions across two scans, retrying once
273+ if changed. This is a verified view, not a transaction across configuration and
274+ owner resources. Reads are bounded to 1,000 installation records, 4,096 routes,
275+ 4 MiB, and ten seconds. Overflow, corruption, or storage failure returns an error.
276+ Watches refresh and reauthorize each second, use a one-message buffer, and end
277+ after one minute or a five-second blocked send. Each gateway process accepts at
278+ most 32 watches. Reconnect and relist on stream termination; revisions are opaque
279+ equality tokens, not resumable cursors or an ordering across gateway replicas.
0 commit comments