107f9d1633
La correction de nomenclature du 2026-07-30 — en amont un *wallet* n'est qu'un trousseau, ce qui possède des stores est un **user** (un *site*) — s'était faite à la main. `walletInbox` y a échappé et a vécu des semaines, en faisant des dégâts : le nom rendait « une inbox par wallet » évident, masquant qu'un user en a **deux** en amont (repos de store public et protected, les deux seuls `AddInboxCap` du moteur). Une discipline appliquée à la main en oublie un ; un test non. D'où `test/vocabulary.test.ts` : tout nom publié est bâti sur des mots que la CIBLE emploie — vérifiés dans `nextgraph-rs` — ou porte un marqueur disant POURQUOI il n'existe qu'ici (`virtual`, `physical`, `shim`, `emulated`, `polyfill`), ce qui dit aussi quand il disparaît. Un échec n'est pas « renommer pour faire passer le test », c'est une question : la cible a-t-elle un mot pour ça ? la chose n'existe-t-elle qu'ici ? le mot est-il vraiment de la glue ? Ce que le test a trouvé, et les réponses : - `walletInbox` → `userInbox`, avec l'écart de cardinalité écrit noir sur blanc plutôt que caché par le nom. - `accounts` / `AccountRecord` / `AccountStorage` → `virtualUsers` / `VirtualUserRecord` / `VirtualUserStorage`, module `accounts.ts` → `virtual-users.ts`. « account » n'est pas de la cible : c'est notre mot pour l'utilisateur virtuel, et le marqueur le dit désormais. - `readModel` → la fonction `readUnion`, exposée directement. « model » n'était ni de la cible ni de la glue, et le namespace ne tenait qu'une fonction. - Le reste était du vocabulaire légitime à déclarer (`subject`, `base`, `schema`, `connected`, le modèle réactif de l'ORM). Corrigé au passage, sur signalement du contrat interne : l'en-tête d'`open-repo` justifiait son correctif par un mécanisme que le source contredit. Un repo absent de `self.repos` lève bien `RepoNotFound` (`engine/verifier/src/request_processor.rs:264,269`). Les 0 lignes observées viennent d'ailleurs — `Verifier::load` repeuple `self.repos` depuis le stockage sur un profil persistant (`verifier.rs:535-560`), et notre propre `readDoc` attrape toute erreur et rend `[]`. Le correctif est bon, le diagnostic écrit à côté ne l'était pas. 159 tests unitaires, typecheck src/test/e2e vert, e2e 40/40 contre le broker.
38 lines
2.0 KiB
TypeScript
38 lines
2.0 KiB
TypeScript
/**
|
|
* The app-facing slice of `store-registry` — and the reason it exists as a file.
|
|
*
|
|
* `store-registry.ts` holds two things that must not be exported together: the
|
|
* placement/addressing calls a consumer application legitimately makes, and the
|
|
* shim machinery that makes virtual users work at all (account resolution, the
|
|
* durable cap registers, the inbox-ownership predicate, cache resets). Until now
|
|
* `index.ts` did `export * as storeRegistry from "../shared-wallet/account-registry"` and shipped
|
|
* both, so an application could reach `ensureAccount`, `addLink` or
|
|
* `resetRegistryCache` from the SDK-identical entry — machinery it must never call,
|
|
* on the entry whose whole promise is "this survives migration unchanged".
|
|
*
|
|
* What is re-exported here is only what an application needs to do its own work,
|
|
* and each has a target-SDK counterpart (see `docs/api-contract.md`). Everything
|
|
* else stays reachable at `./store-registry` for the library's own modules, the
|
|
* unit tests and the e2e harness — an internal path, not a published one.
|
|
*
|
|
* At migration this file disappears: placement becomes the user's real per-scope
|
|
* stores and the calls below become native SDK ones.
|
|
*/
|
|
|
|
export {
|
|
/** Create a document for ONE entity in `scope`, and record it in that scope's store. */
|
|
createEntityDoc,
|
|
/** The entity documents this user owns in `scope` — with their caps recovered. */
|
|
listMyEntityDocs,
|
|
/** The NURI to use as a READ scope for `scope` (what `useShape` is pointed at). */
|
|
resolveScopeGraph,
|
|
/** The NURI where GROUPED entities of `scope` are written (no per-entity document). */
|
|
resolveWriteGraph,
|
|
/** A user's own inbox — where caps and messages addressed to THEM arrive. */
|
|
userInbox,
|
|
/** Open an inbox on a document you OWN, so others can deposit into it. */
|
|
openDocumentInbox,
|
|
/** WHERE to deposit for a document — readable by any holder of it. `undefined` if none. */
|
|
} from "../shared-wallet/account-registry";
|
|
export { documentInboxAddress } from "../emulated-verifier/branch-registers";
|