@@ -347,7 +347,14 @@ search request contains only copied, recursively frozen plain data:
347347The ` AbortSignal ` is passed separately. Providers never receive a session,
348348revision, ` EditorState ` , DOM object, credential object, or arbitrary live host
349349context. Connection identity belongs in the catalog scope; live resources stay
350- inside the provider closure.
350+ inside the provider closure. The provider object is caller-owned. The service
351+ captures its own-data callbacks once and owns searches, subscriptions, and
352+ their cleanup, but does not imply provider-wide disposal. Provider callbacks
353+ are closure functions with a declared ` this: void ` contract and are invoked
354+ with ` this === undefined ` ; mutable receiver state is not part of the provider
355+ API. Unrelated own configuration fields are ignored, while inherited callbacks
356+ and accessors are rejected. An own optional subscription value of ` undefined `
357+ is normalized as omitted.
351358
352359A returned relation contains:
353360
@@ -363,7 +370,10 @@ A returned relation contains:
363370
364371The initial closed component roles are ` catalog ` , ` schema ` , ` project ` ,
365372` dataset ` , and ` relation ` . Each dialect accepts only its documented role
366- sequences, and the final component is always ` relation ` .
373+ sequences, and the final component is always ` relation ` . The provider's
374+ ` quoted ` bit is positive catalog evidence that the canonical decoded spelling
375+ is quoted; it is never insertion SQL. The dialect still owns delimiters,
376+ escaping, reserved-word quoting, and rendering.
367377
368378The service never invents an unqualified candidate from an absolute path. The
369379provider proves matching and addressability through ` matchQuality ` and
@@ -397,7 +407,25 @@ as an unknown-object diagnostic.
397407Provider responses are decoded from ` unknown ` using bounded own enumerable
398408data properties and copied into fresh frozen current-realm objects. Accessors,
399409throwing proxies, unexpected keys, oversized strings or arrays, and malformed
400- closed values fail without exposing raw errors.
410+ closed values fail without exposing raw errors. One malformed relation rejects
411+ the whole page: silently retaining other entities while preserving the
412+ provider's coverage claim would create false authority. Entity IDs must be
413+ unique within a page. Their stability across searches and epochs is a provider
414+ promise used for provenance, not authority the service can infer by generic
415+ deduplication. Shared input identities are allowed, but each occurrence is
416+ decoded, budgeted, and copied independently, so aliasing cannot retain mutable
417+ provider state or bypass aggregate limits.
418+
419+ Both the complete canonical role sequence and the suffix selected by
420+ ` completionPathStart ` must be legal for the registered dialect. The boundary
421+ pre-renders the selected suffix from fresh decoded data so later scheduling and
422+ composition never touch raw provider objects or provider-supplied SQL.
423+
424+ The initial vertical slice validates one bounded page and reports paginated
425+ coverage as incomplete; it does not automatically follow or merge continuation
426+ tokens. Continuation tokens are opaque provider state. They are bounded,
427+ retained only with their page/work state, and never included in completion
428+ items, logs, errors, or revision events.
401429
402430The core also provides a provisional ` createInMemoryRelationCatalog ` helper for
403431bounded readonly relation data. It indexes stable IDs, kinds, role-bearing
@@ -439,8 +467,20 @@ A search that discovers a higher epoch supersedes itself instead of publishing
439467against its older captured revision. Pages and cache entries from different
440468epochs are never merged.
441469
470+ Any successfully decoded response status (` ready ` , ` loading ` , or ` failed ` ) may
471+ establish the first epoch baseline. Equal-epoch responses for different exact
472+ searches remain usable; only the epoch observation is a duplicate. A terminal
473+ ` loading ` response requires a higher epoch before that exact search can become
474+ ready. Providers without subscriptions may return ` loading ` , but they cannot
475+ cause automatic refresh; a later explicit request must observe the higher
476+ epoch. Failed responses are attempt evidence: ` next-request ` may recover at
477+ the same epoch, while ` after-invalidation ` and ` never ` create bounded retry
478+ gates rather than cached search results.
479+
442480The service reference-counts one provider subscription per provider
443481configuration and scope, then fans invalidation out to subscribed sessions.
482+ The installed callback closure supplies authenticated provider and scope
483+ identity; the untrusted invalidation payload therefore contains only an epoch.
444484Subscription membership is installed atomically before a provider can call
445485back synchronously. A newly joining session captures an already-observed epoch
446486without a synthetic revision bump. Disposal removes membership before
@@ -639,7 +679,7 @@ The initial checked limits are:
639679| Plain-text detail | 1,024 UTF-16 units |
640680| Continuation token | 2,048 UTF-16 units |
641681| Decoded response aggregate | 65,536 UTF-16 units |
642- | Decoded response own keys | 1,024 |
682+ | Decoded response own keys | 16,384 aggregate traversal occurrences |
643683| Decoded response nesting depth | 8 |
644684| Service catalog cache | 256 entries and 2 MiB estimated retained bytes |
645685| Service-wide active catalog searches | 8 |
0 commit comments