provident-storeroom 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -6,21 +6,31 @@
6
6
  // banner, no build-time code generator produces it, and it is the file the package's own `types` field
7
7
  // reaches and the package's own `files` allowlist ships.
8
8
  //
9
- // **IT DECLARES THREE THINGS AND NOTHING ELSE** (`distribution.md §5.2`): (1) the EIGHT VERBS of the
10
- // claimed ESM entry, exactly as the sibling directory enumerates them and with NO ninth name; (2) the
11
- // instance's own member set, `{ register, on, off, settle }` — FOUR own members and nothing else
12
- // (`distribution.md §5.2` item 2 read with `surface.md §2.1`'s dated clause (a) and `§2.4` item 9 (f)):
13
- // `register(handle, listener) -> undefined` · `on(address, listener) -> handle` · `off(handle) ->
14
- // undefined` · `settle(record) -> undefined`, each with its argument types and its return, the FOURTH
15
- // being THE ORDERING SEAM the kernel calls and the entry implements, and with NO fifth member and NO
16
- // ninth named export for it; and (3) the failure surface, a thrown plain object with exactly
9
+ // **IT DECLARES THREE THINGS AND NOTHING ELSE** (`distribution.md §5.2`): (1) the claimed entry's OWN
10
+ // NAMED EXPORT SET — **ONE NAME, `storeCreate`, AND NOTHING ELSE** (`surface.md §2.9` item 1's `A127`
11
+ // clause; `docs/decisions.md` · `A127`/`A128`, 2026-10-16: the module-level count is `11 → 1` ✓, the
12
+ // deprecation window of `A128`'s fiat being declared away at that clause); (2) the instance's own member
13
+ // set, **TWELVE OWN MEMBERS AND NOTHING ELSE — `10 + 1 + 1 = 12` ✓** (`distribution.md §5.2` item 2 read
14
+ // with `surface.md §2.4` item 9 (f)'s `A127` clause): **THE TEN METHODS** `read(address, tier?)` ·
15
+ // `readLiteral(address, tier?)` · `write(address, tier, value, commit?)` · `delete(address, tier?)` ·
16
+ // `rollback(opId)` · `listen(address)` · `unlisten(handle)` · `addConstraint(pair, constraint)` ·
17
+ // `constraintOn(pair, constraint)` · `constraintOff(pair, constraint)`, **PLUS `register(handle, listener)
18
+ // -> undefined` and `settle(record) -> undefined`** — the last being THE ORDERING SEAM the kernel calls and
19
+ // the entry implements; and (3) the failure surface, a thrown plain object with exactly
17
20
  // `{status, message}`.
18
21
  //
19
- // **AND THE RECORDS THOSE VERBS ANSWER WITH ARE DECLARED BESIDE THEM, WHICH IS STILL PART (1) AND NOT A
22
+ // **THE TEN METHODS TAKE THE RECEIVER'S OWN POSITION AWAY: `8 → 1` ✓ AND `4 → 12` ✓** (`surface.md §2.9`
23
+ // item 1's and `§2.4` item 9 (f)'s `A127` clauses). The seven verbs that reach the store are METHODS of the
24
+ // object `storeCreate` returned, so **NO DECLARED SIGNATURE CARRIES A LEADING `instance` POSITION** — the
25
+ // receiver is not a position — and the module namespace's own spelling, not a second name at any layer,
26
+ // is what a consumer reaches them through. **`on` AND `off` ARE MERGED AWAY BY `A127` AND ARE NOT
27
+ // MEMBERS**: the listener registration route is `listen` + `register` and its withdrawal is `unlisten`.
28
+ //
29
+ // **AND THE RECORDS THOSE METHODS ANSWER WITH ARE DECLARED BESIDE THEM, WHICH IS STILL PART (1) AND NOT A
20
30
  // FOURTH THING**: `Address` · `Tier` · `TierSet` · `StoreConfig` · `BaseState` · `JournalOp` ·
21
31
  // `WriteRecord` · `DeleteRecord` · `RollbackRecord` · `Handle` · `Listener` are the SHAPES OF THE
22
32
  // ARGUMENTS AND OF THE ANSWERS, in `DD-39`'s own member spellings (the sibling directory's `contract.md
23
- // §0.2`), and a declaration that did not carry them would declare eight names and no surface. **None of
33
+ // §0.2`), and a declaration that did not carry them would declare one name and no surface. **None of
24
34
  // them is a STORE type**: no register, no anchor, no tier tree, no journal and no store verb is declared
25
35
  // here (`§5.2` item 4).
26
36
  //
@@ -39,6 +49,28 @@
39
49
  // (`distribution.md §5.2` item 4): **it declares NO store type, NO store verb, NO `findAddress`, NO
40
50
  // release verb and NO constraint or repair seam** — each of those is a declaration the sibling directory
41
51
  // refuses, and a declaration file carrying one would declare a surface the package does not publish.
52
+ //
53
+ // **⟶ AND THE LIMITS OF THIS FILE ARE STATED RATHER THAN IMPLIED, ADDED 2026-10-17** (`DEF-2026-10-16-Q`:
54
+ // *"`bindings/js/index.d.ts` IS TYPE-CHECKED NOWHERE, AND THE TYPES SHIP TO CONSUMERS"*). **NOTHING IN THIS
55
+ // REPOSITORY TYPE-CHECKS THIS FILE — no `tsc`, no `tsd`, no `checkJs` and no type-test file anywhere in the
56
+ // tree — so EVERY CHANGE MADE HERE IS TEXTUAL: it is a claim read by a HUMAN and by a consumer's own
57
+ // compiler, never a claim this repository's own suite can fail on.** **THE THREE CLAIMS A `TypeScript`
58
+ // DECLARATION CANNOT ENFORCE, EACH NAMED SO NO READER READS THEM AS ENFORCED:**
59
+ // 1. **`tier?: TierSet` CANNOT EXPRESS SUPPLIED-VERSUS-OMITTED `undefined`** (`PAR-JS-6`: a SUPPLIED
60
+ // `undefined` at the tier position is PRESENT and takes the store's `AddressMalformed`, while the call
61
+ // that supplied NOTHING there folds to the ABSENT row). An optional parameter admits both spellings
62
+ // identically and no type can separate them; the distinction is a RUNTIME one, driven at
63
+ // `a127-surface.test.mjs`.
64
+ // 2. **`Address = readonly (string | number)[]` CANNOT EXPRESS NON-NEGATIVE INTEGER** (`PAR-JS-5`). The
65
+ // domain is a string key or a non-negative integer a `u64` can carry exactly; `number` admits `-1`,
66
+ // `1.5`, `NaN` and `Infinity`, each of which the boundary REFUSES with the store's own
67
+ // `AddressMalformed`. The narrowest lawful widening a declaration can make is `number`, and this file
68
+ // makes it.
69
+ // 3. **THE INSTANCE'S *"TWELVE OWN MEMBERS AND NOTHING ELSE"* IS NOT STRUCTURALLY ENFORCEABLE HERE**
70
+ // (`§2.4` item 9 (f)'s `A127` clause; `§2.9` item 1's). An interface declares the members a value HAS
71
+ // and constrains no excess member, so a product carrying a thirteenth own member still satisfies
72
+ // `StoreInstance`. The count is driven at the boundary instead (`a127-surface.test.mjs`'s
73
+ // `Object.getOwnPropertyNames` cell, which exists precisely because this declaration cannot fail on it).
42
74
 
43
75
  /**
44
76
  * A position in the register: the address a verb is called at, as a sequence of path segments.
@@ -76,9 +108,9 @@ export type TierSet = Tier | readonly Tier[];
76
108
  * `contract.md` `DD-36` as amended 2026-10-15; `parameter-semantics.md §2.21` = `PAR-JS-21`): this cell as
77
109
  * filed read *"the store's THREE declared keys and no fourth"* and is re-spelled IN PLACE to the four-key,
78
110
  * no-FIFTH reading — the fourth declared key is `constraints`, whose own declaration stands below, and the
79
- * set's declared arity is `4`.** **NO OTHER CELL OF THIS FILE MOVES** (`distribution.md §5.2`; the entry's
80
- * `8` verbs, the addon's `5`, the instance's `4` own members, the kernel's `5` and the store's `8` register
81
- * rows all stand as printed).
111
+ * set's declared arity is `4`.** **NO OTHER CELL OF THIS FILE MOVES** (`distribution.md §5.2`), **READ AT
112
+ * THE FIGURES `A127` MOVED** — the entry's `1` named export (`11 → 1` ✓), the addon's `5`, the instance's
113
+ * `12` own members (`4 → 12` ✓), the kernel's `5` and the store's `8` register rows.
82
114
  */
83
115
  export interface StoreConfig {
84
116
  /** The journal's declared length: a positive integer (`PAR-JS-3`). */
@@ -294,18 +326,143 @@ export interface CommitRecord {
294
326
  }
295
327
 
296
328
  /**
297
- * **THE INSTANCE `storeCreate` RETURNS — `{ register, on, off, settle }`, FOUR OWN MEMBERS AND NOTHING
298
- * ELSE** (`distribution.md §5.2` item 2 read with `surface.md §2.1`'s dated clause (a) and `§2.4` item 9).
299
- * **The instance's own state is released with the instance and by nothing else: none of the four is a
300
- * release verb.**
329
+ * **THE INSTANCE `storeCreate` RETURNS — THE TWELVE OWN MEMBERS OF `surface.md §2.4` item 9 (f)'s `A127`
330
+ * clause, `10 + 1 + 1 = 12` ✓: THE TEN METHODS, `register` AND `settle`.** Each is reached through the
331
+ * factory's own product alone (`package.md §1.3` item 3) — **NO member below is a named export**, because
332
+ * the module namespace carries ONE name, `storeCreate` (`§2.9` item 1's `A127` clause; `11 → 1` ✓).
333
+ *
334
+ * **THE TEN METHODS ARE THE DECLARED POSITIONS OF `§2.2`, `§2.4`, `§2.10` AND `§2.12` WITH THE LEADING
335
+ * `instance` POSITION DROPPED** (`A127`): `a.read(address, tier?)` is the declared `read`, `a.write(address,
336
+ * tier, value, commit?)` the declared `write`, and so on — **the receiver IS the instance, so the position
337
+ * is not a position and the arity every one of them is judged by is the arity of the method's OWN call.**
338
+ * **`on` and `off` are merged away and are NOT members**: registration is `listen` + `register`, and
339
+ * withdrawal is `unlisten`.
340
+ *
341
+ * **THE STATE IS PRIVATE AND NONE OF THE TWELVE IS A RELEASE VERB** (`surface.md §2.1` (e) item 1; `A74`):
342
+ * the instance's own state is released with the instance and by nothing else — no `dispose()`, no `close()`
343
+ * and no finalizer is declared here.
301
344
  */
302
345
  export interface StoreInstance {
303
- /** Register `listener` under the opaque `handle`, and answer `undefined`. */
346
+ /**
347
+ * Read a leaf's literal, a branch's assembled value, or the empty address's whole register.
348
+ *
349
+ * **`tier` IS THE READER'S ARITY** (`PAR-JS-6`): absent, ONE token, or an ARRAY of tokens read as an
350
+ * ANY-MATCH set — **so the earlier `tier?: Tier` spelling refused, as a type error, a lawful call
351
+ * spelling a set**.
352
+ *
353
+ * **AND `undefined` AT THIS POSITION IS NOT THE SAME CALL AS NO POSITION AT ALL** (`parameter-semantics.md
354
+ * §2.6`, read with `acceptance.md §4.1` item 7): **a SUPPLIED `undefined` is PRESENT and the store answers
355
+ * `AddressMalformed` for it**, while ONLY the call that spells NO tier folds to absent. **THE DECLARATION
356
+ * CANNOT TELL THE TWO APART** — `tier?: TierSet` admits both spellings, which is why `TierSet` carries no
357
+ * `undefined` member — and the distinction is a RUNTIME one at this member (`a127`'s
358
+ * `read_the_absent_tier_position_is_in_domain`).
359
+ */
360
+ read(address: Address, tier?: TierSet): unknown;
361
+ /** The same read, narrowed to a leaf — a branch answers `ReadTargetIsBranch`; `tier` is `TierSet`, with the same SUPPLIED-`undefined` reading as `read`. */
362
+ readLiteral(address: Address, tier?: TierSet): unknown;
363
+ /**
364
+ * Write `value` at `address` on `tier` — EXACTLY ONE token, never an array (`PAR-JS-7`).
365
+ *
366
+ * **THE DECLARED ORDER IS `write(address, tier, value, commit?)`** (`surface.md §2.2`'s dated clause of
367
+ * 2026-10-15; `parameter-semantics.md §2.20`), read with `§2.4` item 9 (f)'s `A127` clause: **THREE
368
+ * REQUIRED ARGUMENTS AND THE OPTIONAL ONE LAST — the commit, at the FOURTH position of the METHOD**,
369
+ * which is the position the `instance`-leading spelling made FIVE (`A124`).
370
+ *
371
+ * **AN ABSENT `commit` IS IN DOMAIN** (§2.2 clause 3: *"the write opens or joins a commit all the
372
+ * same"*) and **NO DEFAULT RECORD IS FABRICATED FOR IT**; **the admitted form is the kernel's own
373
+ * `CommitRecord`** (`surface.md §2.4` item 9 (g) item 1: an object carrying a `pending` member present
374
+ * and not `undefined`), and **every other form at this position — absent, `undefined`, `null`, a
375
+ * primitive, a function, a `Proxy`, an object whose `pending` member is absent or `undefined` — throws
376
+ * THE CLASS TEST'S OWN `TypeError`, whose `status` member is ABSENT and whose STRING `message` member is
377
+ * REQUIRED** (`surface.md` §2.4 item 9 (g) item 1's discriminator, landed 2026-10-15 on `A116` (D1); the
378
+ * operative predicate is `file-tier-save.test.mjs`'s `positionRefusal`, which asserts exactly those two
379
+ * halves). **A REFUSED POSITION STOPS THE WRITE**: no verb is reached and no byte moves.
380
+ *
381
+ * **⟶ CORRECTED 2026-10-17 — THIS CELL ATTRIBUTED THAT `TypeError` TO *"the registration site's own"*
382
+ * FORM, AND THE ATTRIBUTION WAS FALSE** (`DEF-2026-10-16-Q`; `surface.md` §2.5 item 5 (g), THE OPERATIVE
383
+ * READING). **THE REGISTRATION SITE THROWS NO `TypeError` AT ALL**: its refusal *"IS a rejection under
384
+ * `A76` and travels in THIS section's single form, with its `status` drawn from the store's closed set —
385
+ * the store's own `AddressMalformed`"*, `message` generated as clause (d) declares, so `register`'s
386
+ * outside argument answers a plain `{status, message}` (driven at `register.test.mjs`'s
387
+ * `isRegistrationRefusal`, which counts a `TypeError` as a FAILURE). **A `TypeError` thrown by any
388
+ * STORE-REACHING VERB is itself a FINDING** (`a127-surface.test.mjs`'s
389
+ * `a127_no_store_reaching_verb_throws_the_class_test_form`). The two forms are DIFFERENT forms of
390
+ * DIFFERENT sites, and this position's is the class test's own, declared at `§2.4` item 9 (g) —
391
+ * beside, and not drawn from, the registration site's `§2.4` item 5.
392
+ *
393
+ * **AND A SUPPLIED `undefined` AT THE `tier` POSITION IS PRESENT HERE TOO** (`parameter-semantics.md
394
+ * §2.6`; `PAR-JS-6`): it is not the absent tier and the store answers `AddressMalformed` for it.
395
+ */
396
+ write(address: Address, tier: Tier, value: unknown, commit?: CommitRecord): WriteRecord;
397
+ /**
398
+ * Remove the versions the address names, and answer the operation's record.
399
+ *
400
+ * **THE NAME IS `delete` AND IT IS A METHOD NAME, WHICH IS WHY THIS DECLARATION PARSES**: `delete` is a
401
+ * RESERVED WORD, so under the superseded module-level spelling the function had to be declared as
402
+ * `deleteOp` and re-exported (`export { deleteOp as delete }`). **A METHOD NAME IS NOT AN IDENTIFIER
403
+ * BINDING, so the member is declared under the one name the surface publishes** (`A127`).
404
+ */
405
+ delete(address: Address, tier?: Tier): DeleteRecord;
406
+ /**
407
+ * Roll the journal back to `opId`, and answer what the rollback restored.
408
+ *
409
+ * **`opId` IS A NON-EMPTY `string` AND NOT A NUMBER** (`PAR-JS-9`'s own unit: *"the `JournalOp.opId`
410
+ * string"*): a number is an OUTSIDE value the store answers `AddressMalformed` for, and the ordinary
411
+ * call `a.rollback(w.op.opId)`, whose id is the string `write` returned, is a correct call.
412
+ */
413
+ rollback(opId: string): RollbackRecord;
414
+ /**
415
+ * Begin watching an address, and answer the fresh opaque handle it is keyed by.
416
+ *
417
+ * **AND IT IS AN ADDRESS SITE THAT DECLARES ITS ARGUMENT POSITION** (`parameter-semantics.md §2.17`'s
418
+ * dated clause; `surface.md §2.5` item 5 (b)'s position half): the address is `1` of `1`, so a CLASS
419
+ * refusal here — a `Proxy` over an array included — carries `a Proxy` AND `first argument` inside the one
420
+ * failure form's message, and NO trap is run (`NG-JS-I`).
421
+ *
422
+ * **A REPEATED CALL AT A HELD ADDRESS MINTS NOTHING AND ANSWERS THE ADDRESS'S EXISTING ENTRY'S HANDLE**
423
+ * (`write-and-read.md §6.5` item 12 (c); `§0.4` clause 2), so the two calls answer ONE opaque value.
424
+ */
425
+ listen(address: Address): Handle;
426
+ /**
427
+ * Withdraw a watching, and answer `undefined` — a no-op success for every value outside the domain.
428
+ *
429
+ * **AND THE WITHDRAWAL CARRIES THE PACKAGE'S OWN HALF TOO** (`surface.md §2.4` item 7 (b)'s
430
+ * VALIDATE · UNLISTEN · DEREGISTER step list, MERGED INTO THIS ONE MEMBER by `A127`'s receiver ruling;
431
+ * `contract.md §5.5`'s fourth added entry): **the store-side home entry named by this call is withdrawn,
432
+ * and the registry's entry for the identity is REMOVED where the identity no longer stands anywhere** — so
433
+ * the registered function is unreachable afterwards and a re-`listen` at the withdrawn address answers a
434
+ * DIFFERENT handle. **AT `DD-39`'s CONSTRUCTION DUPLICATE — ONE caller-spelled token naming MORE THAN ONE
435
+ * entry at ONE address — ONE entry is withdrawn per call while the address still holds the identity, and
436
+ * the registry's entry STANDS: a later trigger there STILL returns that identity and the function fires
437
+ * for it ONCE, never once per entry** (`contract.md §5.5`'s third added entry; `§2.4` rule 4's *"never the
438
+ * function"*).
439
+ */
440
+ unlisten(handle: Handle): void;
441
+ /**
442
+ * **THE POST-CREATION ADD ROUTE — `addConstraint(pair, constraint) -> constraint identity`**
443
+ * (`surface.md §2.12` item 2 (a) and item 3's ADD row; `parameter-semantics.md §2.25` = `PAR-JS-25`):
444
+ * **the pair's element IS the supplied `constraint` from this call on, whether the pair was HELD or
445
+ * NOT**, and at a pair already held the supplied constraint OVERWRITES the held one under **THE SAME
446
+ * IDENTITY** the pair was already added under, so the call throws nothing for the mere fact that the
447
+ * pair was held.
448
+ *
449
+ * **Every outside form of either position throws ONE `TypeError`, whose `status` member is ABSENT, and
450
+ * nothing is added, enabled, disabled or otherwise changed.**
451
+ */
452
+ addConstraint(pair: ConstraintPair, constraint: Constraint): ConstraintIdentity;
453
+ /** **THE ENABLE HALF** (`§2.12` item 2 (a) and item 3's `constraintOn` row): `undefined`. **The
454
+ * `constraint` position is REQUIRED and is a NO-OP on every success** — the caller supplies as a function
455
+ * the identity it holds at that pair, the entry never substitutes one, and it is the element the entry
456
+ * carried at that pair that is evaluated at the next write. **Idempotent success where the pair already
457
+ * stands ENABLED.** */
458
+ constraintOn(pair: ConstraintPair, constraint: Constraint): void;
459
+ /** **THE DISABLE HALF** (`§2.12` item 2 (a) and item 3's `constraintOff` row): `undefined`; the pair's
460
+ * element is NOT evaluated on a subsequent write, and **a write the disabled constraint would have
461
+ * refused is ACCEPTED**. The `constraint` position's rule is `constraintOn`'s, clause for clause.
462
+ * **Idempotent success where the pair already stands DISABLED.** */
463
+ constraintOff(pair: ConstraintPair, constraint: Constraint): void;
464
+ /** Register `listener` under the opaque `handle`, and answer `undefined` (`surface.md §2.4` item 5 (b)). */
304
465
  register(handle: Handle, listener: Listener): void;
305
- /** Register a listener at `address` and answer the fresh opaque handle it is keyed by. */
306
- on(address: Address, listener: Listener): Handle;
307
- /** Withdraw the store-side home entry the `handle` names, and answer `undefined`. */
308
- off(handle: Handle): void;
309
466
  /**
310
467
  * **THE ORDERING SEAM — `settle(record) -> undefined`** (`surface.md §2.4` item 9; `A116` (D1)–(D2);
311
468
  * `PAR-JS-19`): the one member THE KERNEL CALLS and the entry implements, at the two instants of a
@@ -315,7 +472,19 @@ export interface StoreInstance {
315
472
  * record's own `pending` member is delivered through this instance's own registry, one invocation per
316
473
  * handle, each with the triggering address as its single argument). **Every other form at the record
317
474
  * position — absent, `undefined`, `null`, a primitive, a function, a `Proxy`, an identity this instance
318
- * never adopted — throws the registration site's own `TypeError` and changes nothing.**
475
+ * never adopted — throws THE ORDERING SEAM'S OWN `TypeError`, whose `status` member is ABSENT and whose
476
+ * STRING `message` member is REQUIRED, and changes nothing.**
477
+ *
478
+ * **⟶ CORRECTED 2026-10-17 — THIS CELL ATTRIBUTED THAT `TypeError` TO *"the registration site's own"*
479
+ * FORM AND THAT ATTRIBUTION WAS FALSE** (`DEF-2026-10-16-Q`; `surface.md` §2.5 item 5 (g), the operative
480
+ * reading of the registration site; `§2.4` item 9 (b), landed 2026-10-15 on `A116` (D1), which re-spells
481
+ * the re-spelling this position takes). **THE REGISTRATION SITE ANSWERS A PLAIN `{status, message}` with
482
+ * `status` `AddressMalformed` — a `TypeError` there is a FAILURE** (`register.test.mjs`'s
483
+ * `isRegistrationRefusal`), and **the seam's own form is declared at `§2.4` item 9 (b) and not at item
484
+ * 5**: *"a `TypeError` with its `status` member ABSENT and a STRING `message` member REQUIRED AND NOT
485
+ * FORBIDDEN"* (`§2.5` item 5 (g)'s own record of that re-spelling, whose two dated readings of one
486
+ * phrase it reports and settles by no clause). **SO THE TWO SITES' FORMS ARE NOT ONE FORM, and this
487
+ * member's is the seam's.**
319
488
  *
320
489
  * **THE RECORD POSITION TAKES THE KERNEL'S OWN `CommitRecord` — `{ attempt, op, triggered, pending }`,
321
490
  * FOUR MEMBERS — AND NOT THE STORE'S `WriteRecord`** (`surface.md` `§2.4` item 9 (f)'s *"each with its
@@ -323,7 +492,7 @@ export interface StoreInstance {
323
492
  * *"the carrier `CommitRecord.pending` and its two removal rules unchanged"*). **THE INSTANTS' OWN TABLE
324
493
  * NAMES IT: the record is *"the `CommitRecord` `commit` is building"* at instant (a) and *"the SAME record
325
494
  * identity"* at instant (b)** (`surface.md` `§2.4` item 9 (a)–(b)). **AND THE STORE'S RECORD IS NOT ONE:
326
- * `WriteRecord` above is the three-member `{op, watched, triggered}` the `write` verb answers with and
495
+ * `WriteRecord` above is the three-member `{op, watched, triggered}` the `write` member answers with and
327
496
  * carries NO `pending` member, `PAR-JS-13` is that record's returned `op` field (`parameter-semantics.md
328
497
  * §2.13`) and not the record's own shape, and the kernel's record carries TWO of the store's members
329
498
  * VERBATIM beside its own `attempt` identity and its own `pending` member** (`kernel-surface.md §2.1` item
@@ -356,62 +525,32 @@ export interface StoreInstance {
356
525
  export function storeCreate(cfg: StoreConfig): StoreInstance;
357
526
 
358
527
  /**
359
- * Read a leaf's literal, a branch's assembled value, or the empty address's whole register.
360
- *
361
- * **`tier` IS THE READER'S ARITY** (`PAR-JS-6`): absent, ONE token, or an ARRAY of tokens read as an
362
- * ANY-MATCH set — **so the shipped `tier?: Tier` refused, as a type error, a lawful call spelling a set**.
363
- */
364
- export function read(instance: StoreInstance, address: Address, tier?: TierSet): unknown;
365
-
366
- /** The same read, narrowed to a leaf — a branch answers `ReadTargetIsBranch`; `tier` is `TierSet`. */
367
- export function readLiteral(instance: StoreInstance, address: Address, tier?: TierSet): unknown;
368
-
369
- /**
370
- * Write `value` at `address` on `tier` — EXACTLY ONE token, never an array (`PAR-JS-7`).
371
- *
372
- * **⟶ AMENDED 2026-10-15 (`surface.md §2.2`'s dated clause of 2026-10-15; `parameter-semantics.md §2.20`):
373
- * THE DECLARED ORDER IS `write(instance, address, tier, value, commit?)`** — **FOUR REQUIRED ARGUMENTS
374
- * AND THE OPTIONAL ONE AT POSITION FIVE** (`proposal-review.md §22.5` item 5) — and this is the published
375
- * declaration file `surface.md §2.4` item 9 (f) names.
376
- *
377
- * **AN ABSENT `commit` IS IN DOMAIN** (§2.2 clause 3: *"the write opens or joins a commit all the same"*)
378
- * and **NO DEFAULT RECORD IS FABRICATED FOR IT**; **the admitted form is the kernel's own `CommitRecord`**
379
- * (`surface.md §2.4` item 9 (g) item 1: an object carrying a `pending` member present and not `undefined`),
380
- * and **every other form at this position throws the registration site's own `TypeError`**, whose `status`
381
- * member is ABSENT. **A REFUSED POSITION STOPS THE WRITE**: no verb is reached and no byte moves.
528
+ * **THE POST-CREATION CONSTRAINT PAIR — `parameter-semantics.md §2.24` (`PAR-JS-24`)**: the key the three
529
+ * constraint methods name — **an `address` inside `§1.5`'s segment array, and an `id` that is a NON-EMPTY
530
+ * `string`** — **and NOT the whole of a batch element**, which is this pair PLUS its constraint function.
531
+ * **Every outside form of the pair throws the three methods' one `TypeError`**, and **a well-formed pair
532
+ * the entry does not carry is outside the two toggles' domain**: it is NOT a third population route.
382
533
  */
383
- export function write(
384
- instance: StoreInstance,
385
- address: Address,
386
- tier: Tier,
387
- value: unknown,
388
- commit?: CommitRecord,
389
- ): WriteRecord;
534
+ export interface ConstraintPair {
535
+ readonly address: Address;
536
+ readonly id: string;
537
+ }
390
538
 
391
539
  /**
392
- * Remove the versions the address names, and answer the operation's record.
393
- *
394
- * **AND THE NAME IS `delete`, WHICH THIS DECLARATION CANNOT BIND AS AN IDENTIFIER**: `delete` is a RESERVED
395
- * WORD, so the function is declared as `deleteOp` and EXPORTED under the name the entry publishes —
396
- * `export { deleteOp as delete }` — exactly as `bindings/js/index.mjs` does on its own side.
397
- * **`export function delete(…)`, WHICH THE SHIPPED FILE CARRIED, IS NOT A PARSEABLE DECLARATION AT ALL**, so
398
- * a consumer's compiler read no surface from this file rather than a mis-typed one (`P-PUB-7`; `Q3-4`).
540
+ * **THE CONSTRAINT FUNCTION — `parameter-semantics.md §2.22` (`PAR-JS-22`)**: a JS function, supplied by THE
541
+ * CALLER at whichever of the three methods it takes — **the ADD route's own argument** or the batch
542
+ * element's own — **invoked by the KERNEL with ONE argument, the attempt's own context** (`PAR-C-16`: *"the
543
+ * attempt context — the constraint's ONE argument"*), and read for its answer (`kernel-surface.md §2.3`
544
+ * item 1: `true` is the only pass value). **Every non-function is outside the position AT EVERY ONE OF THE
545
+ * THREE METHODS**, and a non-function at the toggle's position is refused on the ARGUMENT's ground and
546
+ * never on the pair's.
399
547
  */
400
- declare function deleteOp(instance: StoreInstance, address: Address, tier?: Tier): DeleteRecord;
401
- export { deleteOp as delete };
548
+ export type Constraint = (context: unknown) => unknown;
402
549
 
403
550
  /**
404
- * Roll the journal back to `opId`, and answer what the rollback restored.
405
- *
406
- * **`opId` IS A NON-EMPTY `string` AND NOT A NUMBER** (`PAR-JS-9`'s own unit: *"the `JournalOp.opId`
407
- * string"*): the shipped `opId: number` both mis-declared the domain — a number is an OUTSIDE value the
408
- * store answers `AddressMalformed` for — and made the ordinary call `rollback(i, w.op.opId)`, whose id is
409
- * the string `write` returned, a type error.
551
+ * **THE CONSTRAINT IDENTITY — `parameter-semantics.md §2.25` (`PAR-JS-25`)**: ONE OPAQUE VALUE THE PACKAGE
552
+ * OWNS, minted once per pair, **equal to itself on a second `addConstraint` at the SAME pair** (the
553
+ * overwrite arm) **and distinguishable from every other pair's**. **No spelling for it is declared, no
554
+ * accessor reaches a member of it, and a consumer compares identities and never contents.**
410
555
  */
411
- export function rollback(instance: StoreInstance, opId: string): RollbackRecord;
412
-
413
- /** Begin watching an address, and answer the fresh opaque handle it is keyed by. */
414
- export function listen(instance: StoreInstance, address: Address): Handle;
415
-
416
- /** Withdraw a watching, and answer `undefined` — a no-op success for every value outside the domain. */
417
- export function unlisten(instance: StoreInstance, handle: Handle): void;
556
+ export type ConstraintIdentity = object;