docs: dire partout que la lecture par lot n'existe plus

Le contrat publie et l'api-contract etaient traites avec le retrait lui-meme ;
restaient les documents qui decrivaient readUnion comme la primitive de
lecture du paquet, ou qui nommaient le module disparu.

Ce que les lecteurs apprennent maintenant : lire un document, c'est
docs.sparqlQuery ancre dessus, et lire plusieurs documents, c'est cet appel
une fois par document -- avec la decision sur une lecture qui echoue ecrite
au point d'appel. Deux consequences sont dites plutot que decouvertes : une
lecture refusee leve au lieu de rendre une liste vide, et les sujets sous le
prefixe reserve urn:ng-eventually: reviennent dans le resultat, a l'appelant
de les ignorer -- sans aucun gain de droits, les deux registres qu'un
document ordinaire porte etant l'adresse de sa boite et, pour un document
public, la cle que son magasin sert deja a qui la demande.

Les briefs dates ne sont pas touches : ils decrivent un etat de juillet, et
le reecrire falsifierait ce qui avait ete decide alors.
This commit is contained in:
Sylvain Duchesne
2026-09-21 14:11:35 +02:00
parent 0c21adebf2
commit 0a2b8b1fbf
29 changed files with 90 additions and 77 deletions
@@ -82,7 +82,7 @@ function unescapeLiteral(s: string): string {
}
/** A stateful fake `ng`: the shim SPARQL, the inbox SPARQL, and the anchored
* per-doc `?s ?p ?o` read the read-model uses. */
* per-doc `?s ?p ?o` read the anchored document read uses. */
function makeFakeNg() {
const quads: Quad[] = [];
let docCounter = 0;
@@ -537,10 +537,11 @@ test("a broker that cannot read the referenced objects costs ONE deposit, not th
fake.quads.filter((q) => q.p === `${INBOX}:payload` && q.o.includes("did:ng:o:")).length;
expect(queued()).toBe(3);
// The broker goes quiet on the referenced objects. `read-model.readDoc` SWALLOWS a failed
// read and answers `[]` — so the arm is TOLD, through the `onUnreadable` reporter, rather
// than left to guess from an empty answer. Until 2026-08-26 this was classed as an
// ordinary refusal: the drain reported it and carried on, popping and destroying all three
// The broker goes quiet on the referenced objects. The read THROWS, so the arm is told a
// failure happened rather than left to guess it from an empty answer — a distinction the
// batch read of the day made with an `onUnreadable` reporter, because it swallowed the
// failure into `[]`, and `1.0.0-dev.8` makes with the language. Until 2026-08-26 this was
// classed as an ordinary refusal: the drain reported it and carried on, popping and destroying all three
// while printing "will not be retried" for each.
const realQuery = fake.sparql_query;
fake.sparql_query = (async (...a: unknown[]) => {
@@ -208,7 +208,7 @@ function makeWallet(quads: Quad[] = []) {
const g = wrapped ? wrapped[1]! : anchor;
const inGraph = quads.filter((q) => q.g === g);
// The whole-document read (`read-model.readDoc`).
// The whole-document read (`read-document.readDocumentSubjects`).
if (/SELECT\s+\?s\s+\?p\s+\?o/.test(query)) {
return {
results: {
+1 -1
View File
@@ -305,7 +305,7 @@ export function makeWallet(quads: Quad[], options: WalletOptions = {}): FakeWall
if (cold && target !== undefined && !synced.has(target)) return { results: { bindings: [] } };
const inGraph = quads.filter((q) => q.g === g);
// The whole-document read (`read-model.readDoc`).
// The whole-document read (`read-document.readDocumentSubjects`).
if (/SELECT\s+\?s\s+\?p\s+\?o/.test(query)) {
return {
results: {