@@ -347,7 +347,13 @@ 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.
351357
352358A returned relation contains:
353359
@@ -363,7 +369,10 @@ A returned relation contains:
363369
364370The initial closed component roles are ` catalog ` , ` schema ` , ` project ` ,
365371` dataset ` , and ` relation ` . Each dialect accepts only its documented role
366- sequences, and the final component is always ` relation ` .
372+ sequences, and the final component is always ` relation ` . The provider's
373+ ` quoted ` bit is positive catalog evidence that the canonical decoded spelling
374+ is quoted; it is never insertion SQL. The dialect still owns delimiters,
375+ escaping, reserved-word quoting, and rendering.
367376
368377The service never invents an unqualified candidate from an absolute path. The
369378provider proves matching and addressability through ` matchQuality ` and
@@ -397,7 +406,25 @@ as an unknown-object diagnostic.
397406Provider responses are decoded from ` unknown ` using bounded own enumerable
398407data properties and copied into fresh frozen current-realm objects. Accessors,
399408throwing proxies, unexpected keys, oversized strings or arrays, and malformed
400- closed values fail without exposing raw errors.
409+ closed values fail without exposing raw errors. One malformed relation rejects
410+ the whole page: silently retaining other entities while preserving the
411+ provider's coverage claim would create false authority. Entity IDs must be
412+ unique within a page. Their stability across searches and epochs is a provider
413+ promise used for provenance, not authority the service can infer by generic
414+ deduplication. Shared input identities are allowed, but each occurrence is
415+ decoded, budgeted, and copied independently, so aliasing cannot retain mutable
416+ provider state or bypass aggregate limits.
417+
418+ Both the complete canonical role sequence and the suffix selected by
419+ ` completionPathStart ` must be legal for the registered dialect. The boundary
420+ pre-renders the selected suffix from fresh decoded data so later scheduling and
421+ composition never touch raw provider objects or provider-supplied SQL.
422+
423+ The initial vertical slice validates one bounded page and reports paginated
424+ coverage as incomplete; it does not automatically follow or merge continuation
425+ tokens. Continuation tokens are opaque provider state. They are bounded,
426+ retained only with their page/work state, and never included in completion
427+ items, logs, errors, or revision events.
401428
402429The core also provides a provisional ` createInMemoryRelationCatalog ` helper for
403430bounded readonly relation data. It indexes stable IDs, kinds, role-bearing
@@ -439,8 +466,20 @@ A search that discovers a higher epoch supersedes itself instead of publishing
439466against its older captured revision. Pages and cache entries from different
440467epochs are never merged.
441468
469+ Any successfully decoded response status (` ready ` , ` loading ` , or ` failed ` ) may
470+ establish the first epoch baseline. Equal-epoch responses for different exact
471+ searches remain usable; only the epoch observation is a duplicate. A terminal
472+ ` loading ` response requires a higher epoch before that exact search can become
473+ ready. Providers without subscriptions may return ` loading ` , but they cannot
474+ cause automatic refresh; a later explicit request must observe the higher
475+ epoch. Failed responses are attempt evidence: ` next-request ` may recover at
476+ the same epoch, while ` after-invalidation ` and ` never ` create bounded retry
477+ gates rather than cached search results.
478+
442479The service reference-counts one provider subscription per provider
443480configuration and scope, then fans invalidation out to subscribed sessions.
481+ The installed callback closure supplies authenticated provider and scope
482+ identity; the untrusted invalidation payload therefore contains only an epoch.
444483Subscription membership is installed atomically before a provider can call
445484back synchronously. A newly joining session captures an already-observed epoch
446485without a synthetic revision bump. Disposal removes membership before
@@ -639,7 +678,7 @@ The initial checked limits are:
639678| Plain-text detail | 1,024 UTF-16 units |
640679| Continuation token | 2,048 UTF-16 units |
641680| Decoded response aggregate | 65,536 UTF-16 units |
642- | Decoded response own keys | 1,024 |
681+ | Decoded response own keys | 16,384 aggregate traversal occurrences |
643682| Decoded response nesting depth | 8 |
644683| Service catalog cache | 256 entries and 2 MiB estimated retained bytes |
645684| Service-wide active catalog searches | 8 |
0 commit comments