fix: ShapeObservable rejoint la liste de suppression et le contrat dit le trou de refetch

ShapeObservable portait l'annotation honnete kind=invention level=none ref=none
mais siegeait sous l'entete SDK-SHAPED qui promet un equivalent cible pour chaque
symbole. Il passe sous la barriere POLYFILL-ERA, toujours exporte (des
applications l'ecrivent : examples/notebook, e2e/polyfill-entry.ts). ShapeQuery
reste SDK-SHAPED, son enregistrement existe.

Ce n'est pas un adaptateur de framework : il porte le filtre de capacites et la
republication a l'arrivee d'une capacite, deux emulations du portefeuille
partage. Il disparait donc avec lui, migration couplee et non suppression
independante.

Le contrat enonce aussi que refetch() n'a aucun equivalent enregistre : les cinq
champs annonces ne le comptent pas. C'est un fait sur l'enregistrement, pas sur
TanStack ni sur les intentions de NextGraph.

PATCH, par le precedent du 2026-09-28 : aucune signature ne change. Version
1.0.0-dev.13 -> 1.0.0-dev.14, entree dans le contrat concept et dans
docs/api-contract.md section 14, dans le meme commit.
This commit is contained in:
Sylvain Duchesne
2026-10-01 12:10:28 +02:00
parent acdaf8b246
commit 0cebf6e29a
4 changed files with 41 additions and 5 deletions
+2
View File
@@ -794,6 +794,8 @@ Each one's warrant: `Nuri` is what every reference-returning call returns and `N
**These five moved out of this list in `1.0.0-dev.13` (2026-09-28), into the entry's POLYFILL-ERA block beside `EventuallyConfig` - a PATCH, not a removal: same five names, same five shapes, still exported from this one entry.** Each was already annotated `kind=invention level=none ref=none` (honestly - none has a target counterpart at any level), which had always sat oddly under the entry's SDK-SHAPED heading ("a target counterpart for every symbol"). All five exist only to describe what `configure` receives, and `configure` / `EventuallyConfig` were already on the deletion list (§ 1: "NO COUNTERPART, by design... `configure` / `configureStoreRegistry` are deleted"). The move corrects which list tells a consumer their fate at migration; it changes nothing under `## Surface` or `## Guarantees` in the concept contract, so it is a patch by that leaf's own `## Change policy`.
**`ShapeObservable` moved the same way in `1.0.0-dev.14` (2026-10-01) - a PATCH again: same name, same shape, still exported.** It is annotated `kind=invention level=none ref=none` (no upstream observable exists; the record behind `ShapeQuery` describes a snapshot shape, not an observable), so it sat wrongly under the SDK-SHAPED heading. `ShapeQuery` stays there: its record exists and states `{ data, isPending, isSuccess, isError, error }` field for field. The type stays exported because applications write it down (`examples/notebook/app.ts`, `e2e/polyfill-entry.ts`). It is not a framework adapter: it carries the capability filter (`getSnapshot()` returns a filtered view) and the capability-arrival re-publish (a `getCaps().onChange` subscription owned by the observable's own lifecycle). A capability arrives mid-session only because the wallet is shared; in the target an identity holds its own wallet and capabilities from the start, so there is nothing to filter and no arrival to re-publish on. It therefore dies exactly when the shared wallet dies - a COUPLED migration, not an independent symbol removal - and a TanStack-shaped hook returning a snapshot has nowhere to hang such a subscription, because the target does not need one. `refetch()` lives on it and is the only published way out of a read stuck pending; the recorded announcement lists five fields and `refetch` is not among them, so it goes with NO RECORDED COUNTERPART. That is a statement about the record, not about TanStack Query (whose `useQuery` does return a `refetch`) nor about NextGraph's intentions.
Two types the blanket export published are now internal, each because **nothing published names it**:
- **`ReadCap`** — no published signature takes or returns one. Its users are two private helpers of `surface/inbox.ts` (`capsSeenIn`, `capOfPayload`) and the emulated registers. Publishing it advertised a value a consumer has no published call to obtain, and deliberately so: `linkTo` was removed precisely for handing one out (§ 0 of `readcap-and-nuri-model.md`), and `mintCap` is unreachable from outside (§ 11). The only use a consumer could make of it is a cast — which is what the surface's permissive-in / precise-out design exists to make unnecessary.