provident-storeroom 0.5.0 → 1.0.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
@@ -10,29 +10,71 @@
10
10
  // NAMED EXPORT SET — **ONE NAME, `storeCreate`, AND NOTHING ELSE** (`surface.md §2.9` item 1's `A127`
11
11
  // clause; `docs/decisions.md` · `A127`/`A128`, 2026-10-16: the module-level count is `11 → 1` ✓, the
12
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
13
+ // set, **FOURTEEN OWN MEMBERS AND NOTHING ELSE — `10 + 1 + 1 + 2 = 14` ✓** (`distribution.md §5.2` item 2 read
14
14
  // with `surface.md §2.4` item 9 (f)'s `A127` clause): **THE TEN METHODS** `read(address, tier?)` ·
15
15
  // `readLiteral(address, tier?)` · `write(address, tier, value, commit?)` · `delete(address, tier?)` ·
16
- // `rollback(opId)` · `listen(address)` · `unlisten(handle)` · `addConstraint(pair, constraint)` ·
16
+ // `rollback(opId)` · `listen(handle, addresses)` · `unlisten(handle)` · `addConstraint(pair, constraint)` ·
17
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
18
+ // -> undefined`, `constraints() -> ConstraintPair[]`, `removeListener(handle) -> undefined` AND
19
+ // `removeConstraint(pair) -> undefined`** — the first two the singles the 2026-10-18 clause below names, the
20
+ // last two the members `contract.md §2.7` item 9 adds — the first being the
21
+ // listener registration, the second the registered-pair read; **`settle(record) -> undefined` STOOD HERE
22
+ // AS THE ORDERING SEAM AND IS REMOVED WHOLE** (the clause below carries the mark and the ruling); and (3) the
23
+ // failure surface, a thrown plain object with exactly
20
24
  // `{status, message, log}` — **THREE MEMBERS FROM 2026-10-16, `2 → 3`, on the architect's ruling *"Bubble
21
25
  // the message log to the client on failure, override any clauses that forbid this."*** (`surface.md §2.5`'s
22
26
  // clause of that date, the crossing form's ONE home; **the ONE figure that moves is the arity, and
23
27
  // `storeCreate` remains the namespace's one name and the product its twelve own members**).
24
28
  //
25
- // **⟶ AND THE MEMBER-SET FIGURE ABOVE IS SUPERSEDED AND IS READ THROUGH THIS CLAUSE, 2026-10-17: THE
26
- // OPERATIVE SET IS THIRTEEN OWN MEMBERS, `10 + 1 + 1 + 1 = 13` ✓, THE THIRTEENTH BEING `constraints()`** —
27
- // the registered-pair read, declared at `surface.md §2.4` item 9 (f)'s `constraints` clause of that date and
28
- // at `§2.12` item 2-bis, on the architect's ruling verbatim *"Add surface methods for reading registered
29
- // constraints."* **THE BYTES ABOVE STAND AS THE `A127` PASS'S READING (`DEF-2026-10-02`: no whole-file
30
- // rewrite) and every "twelve own members" figure in this file is read through this sentence as THIRTEEN.**
31
- // **SO A DECLARATION FILE THAT STILL READS TWELVE OWN MEMBERS AFTER THAT DATE IS A FINDING** (`surface.md
32
- // §2.4` item 9 (f)'s item 10, which names the declaration file among the cells that go red; item 13; its own
33
- // mark at `§2.9` item 1). **THE TWO ROUTES THAT WOULD HAVE MOVED THE SET EARLIER ARE STILL REFUSED BY NAME
34
- // AND THIS ONE IS NOT ONE OF THEM** (`§2.5`'s clause of 2026-10-16: a `constraintLog(commit)` reader and a
35
- // second module-namespace name) — and the second `1` above is `settle`, the third `1` being `constraints`.
29
+ // **⟶ AND THE METHOD LIST ABOVE CARRIES ONE STALE SPELLING AND ONE STALE ARITY, SUPERSEDED HERE, 2026-10-19:**
30
+ // **`listen` IS `listen(handle, addresses)` AND NOT `listen(address)` — arity `2`, position `1` the
31
+ // caller-spelled `handle` (a non-empty `string`) and position `2` `addresses`, a SET of addresses whose
32
+ // member is an address and whose EMPTY ARRAY is in the domain** (`docs/specs/storeroom-held-listener-identity/
33
+ // contract.md §2.2` item 1; `listen-verb.md §1` item 1 and `§2.2` items 1–2: the arity figure moves `1 → 2`
34
+ // at four declared sites, each needing its own dated clause). **THE BYTES LISTING `listen(address)` STAND AS
35
+ // THE PRE-2026-10-18 READING AND ARE READ THROUGH THIS CLAUSE** (`DEF-2026-10-02`: no whole-file rewrite).
36
+ //
37
+ // **⟶ AND THE MEMBER-SET FIGURE ABOVE IS SUPERSEDED AND IS READ THROUGH THIS CLAUSE, 2026-10-18: THE
38
+ // OPERATIVE SET IS TWELVE OWN MEMBERS, `10 + 1 + 1 = 12` ✓ — THE TEN METHODS, `register` AND `constraints`** —
39
+ // declared at `surface.md §2.4` item 9 (f)'s clause of that date, which moves the set `13 → 12` on the
40
+ // architect's rulings of 2026-10-18, VERBATIM: *"Settle is redundant because the kernel is always in the
41
+ // loop."* · *"Always route to the kernel, because the JS code does not decide whether constraints trigger."* ·
42
+ // *"The kernel is always supposed to be in the middle. Any occasion where the write path is not governed by
43
+ // the kernel is a hallucination."* **`settle` IS THE MEMBER THAT LEAVES AND NO OTHER MEMBER MOVES WITH IT**
44
+ // (`§2.4` item 9's `REMOVED-WHOLE` pointer of the same date, whose own words are *"NO DRIVE MAY ASSERT A CALL
45
+ // OF `settle` FROM THIS DATE, ON ANY INSTANCE, FOR ANY ARGUMENT"*). **THE TWO REMAINING SINGLES ARE `register`
46
+ // AND `constraints`, AND THEY ARE NAMED BECAUSE A LONE `+1` WOULD NOT COMPUTE.** **SO A DECLARATION FILE THAT
47
+ // STILL DECLARES A `settle(record) -> undefined` MEMBER AT ANY POSITION, OR THAT READS THIRTEEN OWN MEMBERS,
48
+ // AFTER THIS DATE IS A FINDING BY THAT CLAUSE'S OWN WORDS** (`surface.md §2.4` item 9 (f)'s clause of
49
+ // 2026-10-18, item 4: *"a declaration file that still reads THIRTEEN own members, or that declares a
50
+ // `settle(record) -> undefined` member at any position, after this date is a FINDING"*). **THE BYTES ABOVE
51
+ // STAND AS THE `A127` PASS'S READING (`DEF-2026-10-02`: no whole-file rewrite) and every "twelve own members"
52
+ // figure in this file is read through the 2026-10-17 thirteen-mark and through THIS clause as TWELVE AGAIN,
53
+ // with the thirteen being the 2026-10-17 reading and not the operative one.** **THE TWO ROUTES THAT WOULD
54
+ // HAVE MOVED THE SET EARLIER ARE STILL REFUSED BY NAME AND NEITHER IS ONE OF THESE** (`§2.5`'s clause of
55
+ // 2026-10-16: a `constraintLog(commit)` reader and a second module-namespace name).
56
+ //
57
+ // **⟶ AND THE MEMBER-SET FIGURE ABOVE IS SUPERSEDED AND IS READ THROUGH THIS CLAUSE, 2026-10-19: THE
58
+ // OPERATIVE SET IS FOURTEEN OWN MEMBERS, `10 + 1 + 1 + 2 = 14` ✓ — THE TEN METHODS, `register`, `constraints`
59
+ // AND THE TWO REMOVE MEMBERS `removeListener(handle)` AND `removeConstraint(pair)`** — **WHICH SUPERSEDES THE
60
+ // METHOD LIST'S OWN *"THE TWO REMAINING SINGLES ARE `register` AND `constraints`"* OF 2026-10-18: the singles
61
+ // that remain are still those two, and the fourteen-member set carries them PLUS the two remove members, so
62
+ // no reader counts the `+ 2` into the singles** — declared at
63
+ // `docs/specs/storeroom-held-listener-identity/contract.md §2.7` item 9, THE MEMBER SET `14`, whose own list
64
+ // is `{ read, readLiteral, write, delete, rollback, listen, unlisten, addConstraint, constraintOn,
65
+ // constraintOff, register, constraints, removeListener, removeConstraint }`. **THE FIGURE MOVES `12 → 14`
66
+ // and the two new members are reached through the factory's product ALONE — the module namespace keeps its
67
+ // ONE name (`11 → 1` ✓), because the two new members are NOT module exports** (`contract.md §2.7` item 9's
68
+ // `[CENSUS]` and its closing clause). **AND THE `12 → 13` FIGURE IS WITHDRAWN BY NAME: the thirteen-mark of
69
+ // 2026-10-17 is a SUPERSEDED READING and was never the operative one** (`P: docs/pending.md · (AA-5)`,
70
+ // verbatim: *"the member set is 14 and the `12 → 13` figure is withdrawn by name"*). **SO EVERY "twelve own
71
+ // members" FIGURE BELOW — the `A127` pass's reading at its own bytes, the 2026-10-18 clause's operative
72
+ // `TWELVE`, and `StoreInstance`'s `"THE TWELVE"` — IS READ THROUGH THIS CLAUSE AS FOURTEEN, and a
73
+ // declaration file that declares twelve while the product ships fourteen is the FINDING `contract.md §2.7`
74
+ // item 9 exists to prevent.** **THE TWO ROUTES THAT WOULD HAVE MOVED THE SET EARLIER ARE STILL REFUSED BY
75
+ // NAME AND NEITHER IS ONE OF THESE** (`§2.5`'s clause of 2026-10-16: a `constraintLog(commit)` reader and a
76
+ // second module-namespace name) — the 2026-10-18 paragraph's closing sentence above stands BYTE-FOR-BYTE and
77
+ // is read through this clause.
36
78
  //
37
79
  // **THE TEN METHODS TAKE THE RECEIVER'S OWN POSITION AWAY: `8 → 1` ✓ AND `4 → 12` ✓** (`surface.md §2.9`
38
80
  // item 1's and `§2.4` item 9 (f)'s `A127` clauses). The seven verbs that reach the store are METHODS of the
@@ -49,16 +91,22 @@
49
91
  // them is a STORE type**: no register, no anchor, no tier tree, no journal and no store verb is declared
50
92
  // here (`§5.2` item 4).
51
93
  //
52
- // **AND TWO MORE SHAPES STAND BESIDE THOSE ELEVEN WITHOUT A BYTE OF EITHER BEING MINTED HERE, BECAUSE
53
- // `settle`'s ONE ARGUMENT POSITION IS THE KERNEL'S OWN RECORD AND NOT THIS PACKAGE'S** (`§2.4` item 9
94
+ // **AND TWO MORE SHAPES STAND BESIDE THOSE ELEVEN WITHOUT A BYTE OF EITHER BEING MINTED HERE, BECAUSE THE
95
+ // WRITE'S COMMIT POSITION IS THE KERNEL'S OWN RECORD AND NOT THIS PACKAGE'S** (`§2.4` item 9
54
96
  // (f)'s *"each with its argument types"* read with its *"no `pending`-shaped record type this unit does
55
97
  // not declare"*): **`AttemptRef` (`1` member) and `CommitRecord` (`4` members — `attempt` · `op` ·
56
98
  // `triggered` · `pending`) are THE KERNEL'S OWN NAMED SHAPES, DECLARED BY THE KERNEL AND NOT BY THIS
57
99
  // UNIT** (`kernel-surface.md §1` item 4's closed record enumeration; its `§2.1` item 2 for the record's
58
- // four members; `attempt-lifecycle.md §2.4` item 1 for the one-member `AttemptRef`) — so the seam's
59
- // argument carries its own `pending` member and this file MINTS NO RECORD TYPE OF ITS OWN to carry it.
100
+ // four members; `attempt-lifecycle.md §2.4` item 1 for the one-member `AttemptRef`) — so the record position
101
+ // carries its own `pending` member and this file MINTS NO RECORD TYPE OF ITS OWN to carry it.
60
102
  // **`AttemptRef` and `CommitRecord` are therefore not STORE types either, and not store records**: they
61
- // are kernel-side shapes the instance's `settle` member takes, cited from their own unit's declaration.
103
+ // are kernel-side shapes, cited from their own unit's declaration.
104
+ // **⟶ AND THE POSITION THEY ARE CITED FOR MOVED WITH `settle`'s REMOVAL, 2026-10-18**: `settle`'s own
105
+ // argument is gone with the member, and these two shapes now stand here for the ONE position that still
106
+ // reads a `CommitRecord` — the `commit` argument of `write` (`§2.4` item 9 (g) item 1's class test, the
107
+ // record position `A120` (1) admits). **THE SHAPES THEMSELVES ARE UNMOVED AND `CommitRecord` KEEPS ITS
108
+ // `FOUR` MEMBERS, `pending` AMONG THEM** (`§2.4` item 9's adoption-machinery clause of that date, item
109
+ // `(vi)`: *"THE ADOPTION SYSTEM CONSUMED IT AND DID NOT OWN IT"*).
62
110
  //
63
111
  // **AND THE ONE THING THIS DECLARATION MUST NOT CARRY, STATED SO THE FINDING RULE IS CHECKABLE**
64
112
  // (`distribution.md §5.2` item 4): **it declares NO store type, NO store verb, NO `findAddress`, NO
@@ -82,7 +130,10 @@
82
130
  // `AddressMalformed`. The narrowest lawful widening a declaration can make is `number`, and this file
83
131
  // makes it.
84
132
  // 3. **THE INSTANCE'S *"TWELVE OWN MEMBERS AND NOTHING ELSE"* IS NOT STRUCTURALLY ENFORCEABLE HERE**
85
- // (`§2.4` item 9 (f)'s `A127` clause; `§2.9` item 1's). An interface declares the members a value HAS
133
+ // (`§2.4` item 9 (f)'s `A127` clause; `§2.9` item 1's) — **AND THE COUNT IT NAMES IS THE SUPERSEDED ONE:
134
+ // THE OPERATIVE FIGURE IS FOURTEEN, read through the member-set clause of 2026-10-19 above**
135
+ // (`docs/specs/storeroom-held-listener-identity/contract.md §2.7` item 9). An interface declares the
136
+ // members a value HAS
86
137
  // and constrains no excess member, so a product carrying a thirteenth own member still satisfies
87
138
  // `StoreInstance`. The count is driven at the boundary instead (`a127-surface.test.mjs`'s
88
139
  // `Object.getOwnPropertyNames` cell, which exists precisely because this declaration cannot fail on it).
@@ -152,8 +203,45 @@ export interface StoreConfig {
152
203
  * no-constraint store, and no default is declared for it"* — **and every element and every shape outside
153
204
  * the list is refused at the store's own construction with ITS OWN code and ITS OWN message**, which is
154
205
  * why the element type is the caller's own shape and not a narrowed record here.
206
+ *
207
+ * **⟶ AMENDED 2026-10-24 (`D-26`, verbatim: *"The batch in cfg.constraints must supply functions"*): THE
208
+ * ELEMENT IS THREE MEMBERS AND THE FUNCTION IS REQUIRED. The pair is the element's ADDRESSING and the
209
+ * function is its SUBSTANCE — the reading the use-case record has carried since 2026-10-16, now the
210
+ * declaration's own. THE STORE NEVER SEES THE FUNCTION**: a JavaScript function cannot cross into Rust at
211
+ * any depth, so the crossing carries the pair and **the PACKAGE arms the substance** at construction
212
+ * through the same act the add route performs (`D-26` items 3–4). The state this key's earlier prose named
213
+ * — *"a well-formed element that carried no function … is NOT a carried pair"* — therefore **HAS NO
214
+ * PRODUCER ON THIS ROUTE**: a batch element is always carried.
215
+ *
216
+ * **AND THE ELEMENT'S `id` IS THE PAIR'S HANDLE, A HANDLE IS INSTANCE-SCOPED AND UNIQUE, AND TWO RULES
217
+ * FOLLOW THAT ARE DIFFERENT RULES FOR DIFFERENT ACTS — a declaration that conflates them gets both wrong**
218
+ * (`D-23`, verbatim: *"Setting a constraint should expect a handle name to be used for handle and
219
+ * process/error logging purposes"*; `D-24`, verbatim: *"The handle becomes the id - the handle needs to be
220
+ * unique regardless, and setting a duplicate handle is an overwrite"*; `D-27`'s own table):
221
+ *
222
+ * | act | a repeated handle |
223
+ * |---|---|
224
+ * | **this key, `cfg.constraints`** | **REJECTED** — the list is ONE supplied act, so an internal ambiguity is malformed input and not a second write |
225
+ * | **`addConstraint(pair, constraint)`** | **OVERWRITE** — acts are separate in time, so a later one replaces the earlier |
226
+ *
227
+ * **SO, AT CONSTRUCTION, TWO REFUSALS THAT THE STORE CANNOT TAKE AND THE PACKAGE OWNS** (`D-27`): **no two
228
+ * elements of one `cfg.constraints` may name one `id`; and no element's `id` may equal a `handle` this
229
+ * construction's `listeners` adopts** — a cross-KIND collision, rejected regardless of kind (`D-27`:
230
+ * *"Reject duplicate handles in batch - regardless of listener/constraint type"*). **The second is not an
231
+ * overwrite and the first is not a second registration.** Both are refused **before any filesystem act**,
232
+ * in the surface's one thrown form `{status, message, log}`, under the store's existing
233
+ * `ConstraintListInvalid` — **the package mints no code**.
234
+ *
235
+ * **AND THE NAME'S OTHER TWO READERS NEED NOTHING** (`D-24` items 2–3, both recorded so no pass adds a
236
+ * member): `constraints()` already returns the bare `id`, so its four exclusions stand exactly as written;
237
+ * and `LogEntry` already carries `id`, so **the name's logging role moves no member-set** and no undeclared
238
+ * seventh member exists.
155
239
  */
156
- readonly constraints?: readonly { readonly address: Address; readonly id: string }[];
240
+ readonly constraints?: readonly {
241
+ readonly address: Address;
242
+ readonly id: string;
243
+ readonly constraint: Constraint;
244
+ }[];
157
245
  }
158
246
 
159
247
  /**
@@ -182,6 +270,24 @@ export interface StoreConfig {
182
270
  * construction/startup, or of the LOADED state against that list at load — **and the store writes no byte of
183
271
  * that list into the file and holds no register key for it** (`contract.md §7.1` step 4 and `§7.2` item 6 as
184
272
  * amended 2026-10-15; `seams-and-lifecycle.md §8.1`).
273
+ *
274
+ * **⟶ AMENDED 2026-10-24 (`docs/specs/storeroom-native/contract.md §8.1`'s 2026-10-23 amendment (`A148` Q3,
275
+ * folded into `U-STOREROOM-JSON-CROSSING`); `strata/decisions.md`'s `FINDING` of this date; `R-3`'s `Q4`;
276
+ * `REVIEW-2026-10-24.md`'s `Q4`) — THE SET IS SEVENTEEN AND THE DECLARATION WAS ONE BEHIND THE STORE.** The
277
+ * amendment widens the closed set `16 → 17` with **`ValueRefusedAtBoundary` at rank `17`**, and *"the
278
+ * operative set is `17` members ranked `1`…`17`"* with the spelling moved to `[&'static str; 17]`; the store
279
+ * implements seventeen (`src/error.rs`'s `CODES`). **So `ValueRefusedAtBoundary` is written among the
280
+ * literals at rank `17`, LAST of the seventeen and BEFORE the escape — the position `ConstraintListInvalid`
281
+ * held, because the amendment APPENDS and moves no rank of `1`…`16`.** **THE ALGEBRA NOW READS
282
+ * `11 + 2 + 1 + 1 + 1 + 1 = 17` ✓, and the four figures this paragraph carries are read through this clause:
283
+ * *"THE SIXTEEN MEMBERS BELOW"* reads SEVENTEEN; *"its set has already moved twice … and 2026-10-15 to
284
+ * SIXTEEN"* reads THREE times, the third being this amendment, **which is the escape arm's own evidence and
285
+ * therefore reinforces §the arm rather than weakening it**; *"THE SIXTEENTH MEMBER … LAST of the sixteen"*
286
+ * reads `ValueRefusedAtBoundary` as the SEVENTEENTH and last of the seventeen, with `ConstraintListInvalid`
287
+ * at rank `16`; and `constraints()`' *"the store's closed `16`-member set is not reached"* keeps its
288
+ * statement about THAT READ while its FIGURE moves to `17`. **`ValueNotAdmitted` STAYS AT RANK `14` AND IS
289
+ * NOT REMOVED** — it remains the store's own answer on the native route — **so a pass that reads rank `17`
290
+ * as a RENAME of rank `14` has destroyed a member** (`DEF-2026-10-02`: no whole-file rewrite).
185
291
  */
186
292
  export type StoreStatus =
187
293
  | 'AddressMalformed'
@@ -200,6 +306,7 @@ export type StoreStatus =
200
306
  | 'ValueNotAdmitted'
201
307
  | 'FileCommitFailed'
202
308
  | 'ConstraintListInvalid'
309
+ | 'ValueRefusedAtBoundary'
203
310
  | (string & {});
204
311
 
205
312
  /**
@@ -245,8 +352,17 @@ export interface StoreRefusal {
245
352
  readonly log: LogEntry[];
246
353
  }
247
354
 
248
- /** The opaque handle a listener registration is keyed by: the package's own value for one registration. */
249
- export type Handle = object;
355
+ /**
356
+ * **⟶ `U-STOREROOM-HELD-LISTENER-IDENTITY` (`D-GP-SHLI`): `Handle` MOVES `object → string`**
357
+ * (`contract.md §2.1` item 1; `P: docs/pending.md · P-6`, the type ruling, verbatim: *"Refuse handles that
358
+ * aren't strings."*). **THE CALLER SPELLS IT, HOLDS IT AND PASSES IT BACK; NOTHING MINTS IT.** The value the
359
+ * store reports in a trigger pair and the value the caller holds ARE ONE VALUE, and its domain is
360
+ * `{ s : s ∈ String ∧ s ≠ "" }` (`identity-and-domain.md §2` item 1).
361
+ *
362
+ * **THIS IS A CONSUMER-VISIBLE BREAK** (§7 item 2 of the contract): every signature below that names a
363
+ * handle is re-typed with it, and the release class is the release gate's (`P: docs/pending.md · (AA-4)`).
364
+ */
365
+ export type Handle = string;
250
366
 
251
367
  /** The caller's listener: any JS function, invoked with the triggering address as its ONE argument. */
252
368
  export type Listener = (address: Address) => void;
@@ -295,14 +411,33 @@ export interface JournalOp {
295
411
  export interface WriteRecord {
296
412
  readonly op: JournalOp;
297
413
  readonly watched: readonly Address[];
298
- readonly triggered: readonly Handle[];
414
+ /** **THE TRIGGER'S PAIRS** (`contract.md §2.4` item 1; `PAR-HL-38`): the pair REPLACES a bare handle list. */
415
+ readonly triggered: readonly TriggerPair[];
416
+ }
417
+
418
+ /**
419
+ * **⟶ `U-STOREROOM-HELD-LISTENER-IDENTITY`: THE TRIGGER'S PAIR, `{handle, address}`** (`contract.md §2.4`
420
+ * item 1; `trigger-and-pair.md §1`; `PAR-HL-19`, `PAR-HL-20`, `PAR-HL-21`).
421
+ *
422
+ * **`handle` IS THE CALLER'S OWN STRING** and **`address` IS THE BINDING'S OWN ADDRESS** — the address the
423
+ * listener was bound at, never the address the write targeted. **THE TWO ARE TOLD APART**: the write's own
424
+ * address crosses as the record's `triggeringAddress`, and the invocation's ONE argument is that write
425
+ * address (`contract.md §2.4` item 7).
426
+ *
427
+ * **NO PARALLEL `triggeredAddresses` ARRAY EXISTS AND NONE MAY BE ADDED** — the aligned form is an i-th
428
+ * correspondence, which reverses `DD-37` (`contract.md §2.4` item 1; `trigger-and-pair.md §2` item 4).
429
+ */
430
+ export interface TriggerPair {
431
+ readonly handle: Handle;
432
+ readonly address: Address;
299
433
  }
300
434
 
301
435
  /** The record a `delete` answers. */
302
436
  export interface DeleteRecord {
303
437
  readonly address: Address;
304
438
  readonly tiers: readonly Tier[];
305
- readonly triggered: readonly Handle[];
439
+ /** **THE TRIGGER'S PAIRS** (`contract.md §2.4` item 1; `PAR-HL-38`; `A43` — a delete fires its own set). */
440
+ readonly triggered: readonly TriggerPair[];
306
441
  }
307
442
 
308
443
  /**
@@ -327,8 +462,11 @@ export interface RollbackRecord {
327
462
  * it as a named kernel-side shape).
328
463
  *
329
464
  * **IT IS DECLARED HERE FOR ONE POSITION AND NO OTHER**: the `attempt` member of the `CommitRecord` the
330
- * instance's `settle` member takes (`§2.4` item 9 (f)'s *"each with its argument types"*). **No verb of
331
- * this entry answers with it and this package mints it nowhere.**
465
+ * `write` member's `commit` position takes (`§2.4` item 9 (f)'s *"each with its argument types"* read
466
+ * with item 9 (g) item 1's record-position class test). **⟶ THE POSITION IT IS CITED FOR MOVED WITH
467
+ * `settle`'s REMOVAL, 2026-10-18**: that member's argument is gone with the member, and the ONE position
468
+ * that still reads a `CommitRecord` is the `commit` argument above. **No verb of this entry answers with it
469
+ * and this package mints it nowhere.**
332
470
  */
333
471
  export interface AttemptRef {
334
472
  /** The attempt's identity: a non-empty, kernel-unique token. */
@@ -336,8 +474,11 @@ export interface AttemptRef {
336
474
  }
337
475
 
338
476
  /**
339
- * **THE ORDERING SEAM'S ONE ARGUMENT — THE KERNEL'S OWN `{ attempt, op, triggered, pending }` RECORD, AND
340
- * NOT THE STORE'S `WriteRecord`** (`kernel-surface.md §2.1` item 2's return-shape block: *"`CommitRecord`,
477
+ * **THE WRITE'S COMMIT POSITION IS THIS RECORD — THE KERNEL'S OWN `{ attempt, op, triggered, pending }`, AND
478
+ * NOT THE STORE'S `WriteRecord`** (**⟶ RE-SPELLED 2026-10-18: this block read *"THE ORDERING SEAM'S ONE
479
+ * ARGUMENT"*, and the seam `settle` is REMOVED WHOLE from the product — the BYTES stand and are read through
480
+ * this clause; THE SHAPE IS UNMOVED and takes the ONE position that still reads it, the `write` member's
481
+ * `commit` argument) (`kernel-surface.md §2.1` item 2's return-shape block: *"`CommitRecord`,
341
482
  * a record with exactly FOUR members, the FOURTH added at the `A108` landing pass of 2026-10-13"*; its
342
483
  * `§1` item 4 counts it among the kernel's own named shapes).
343
484
  *
@@ -366,18 +507,36 @@ export interface CommitRecord {
366
507
  readonly attempt: AttemptRef;
367
508
  /** The op the store's write returned, VERBATIM (`JournalOp` above; `§2.1` item 2). */
368
509
  readonly op: JournalOp;
369
- /** The store's own `triggered` member, VERBATIM, read as a SET (`§2.1` item 2). */
370
- readonly triggered: readonly Handle[];
371
- /** THE WHOLE RETURNED SET OF TRIGGERED CONSTRAINTS, each entry leaving it only by being checked off as it passes (`§2.1` item 2). */
372
- readonly pending: readonly Handle[];
510
+ /** The store's own `triggered` member, VERBATIM, read as a SET (`§2.1` item 2) — now a PAIR LIST. */
511
+ readonly triggered: readonly TriggerPair[];
512
+ /**
513
+ * **THE WHOLE RETURNED SET OF TRIGGERED CONSTRAINTS, each entry leaving it only by being checked off as it
514
+ * passes — and now a PAIR list, because `pending` is SEEDED AS A CLONE OF `triggered` and therefore
515
+ * INHERITS ITS SHAPE** (`P: docs/pending.md · P-7`'s `pending` ruling, verbatim: *"Push the pair into
516
+ * pending. Pending is seeded as a clone of triggered."*; `(AA-7)`: *"Pop from set to check off"*;
517
+ * `contract.md §2.4` items 3–4; `PAR-HL-22`, `PAR-HL-39`).
518
+ *
519
+ * **ITS ELEMENT TYPE IS TOTAL — NO BARE HANDLE STANDS IN IT** (`contract.md §2.5` item 2): the bare-handle
520
+ * union the check-off and the discard once carried has no subject under POP, because the checked-off entry
521
+ * is REMOVED rather than carried beside.
522
+ */
523
+ readonly pending: readonly TriggerPair[];
373
524
  }
374
525
 
375
526
  /**
376
- * **THE INSTANCE `storeCreate` RETURNS — THE TWELVE OWN MEMBERS OF `surface.md §2.4` item 9 (f)'s `A127`
377
- * clause, `10 + 1 + 1 = 12` ✓: THE TEN METHODS, `register` AND `settle`.** Each is reached through the
527
+ * **THE INSTANCE `storeCreate` RETURNS — THE FOURTEEN OWN MEMBERS READ THROUGH `contract.md §2.7` ITEM 9,
528
+ * `10 + 1 + 1 + 2 = 14` ✓: THE TEN METHODS, `register`, `constraints` AND THE TWO REMOVE MEMBERS
529
+ * `removeListener(handle)` AND `removeConstraint(pair)`.** Each is reached through the
378
530
  * factory's own product alone (`package.md §1.3` item 3) — **NO member below is a named export**, because
379
531
  * the module namespace carries ONE name, `storeCreate` (`§2.9` item 1's `A127` clause; `11 → 1` ✓).
380
532
  *
533
+ * **⟶ AND THE OPENING FIGURE ABOVE WAS *"THE TWELVE OWN MEMBERS OF `surface.md §2.4` item 9 (f)'s clause of
534
+ * 2026-10-18"*, SUPERSEDED HERE 2026-10-19: the operative set is the FOURTEEN of
535
+ * `docs/specs/storeroom-held-listener-identity/contract.md §2.7` item 9, the withdrawn `12 → 13` figure not
536
+ * among the readings** (`P: docs/pending.md · (AA-5)`: *"the member set is 14 and the `12 → 13` figure is
537
+ * withdrawn by name"*). **THE BYTES STAND AS THAT PASS'S READING AND ARE READ THROUGH THIS CLAUSE**
538
+ * (`DEF-2026-10-02`: no whole-file rewrite).
539
+ *
381
540
  * **THE TEN METHODS ARE THE DECLARED POSITIONS OF `§2.2`, `§2.4`, `§2.10` AND `§2.12` WITH THE LEADING
382
541
  * `instance` POSITION DROPPED** (`A127`): `a.read(address, tier?)` is the declared `read`, `a.write(address,
383
542
  * tier, value, commit?)` the declared `write`, and so on — **the receiver IS the instance, so the position
@@ -387,9 +546,18 @@ export interface CommitRecord {
387
546
  *
388
547
  * **THE STATE IS PRIVATE AND NONE OF THE TWELVE IS A RELEASE VERB** (`surface.md §2.1` (e) item 1; `A74`):
389
548
  * the instance's own state is released with the instance and by nothing else — no `dispose()`, no `close()`
390
- * and no finalizer is declared here. **⟶ AND `"THE TWELVE"` READS AS `THIRTEEN` FROM 2026-10-17, the
391
- * thirteenth being `constraints()`** (this interface's own clause for it below; the file's header carries the
392
- * member-set mark and the two still-refused routes).
549
+ * and no finalizer is declared here. **⟶ AND `"THE TWELVE"` IS THE OPERATIVE FIGURE FROM 2026-10-18: the
550
+ * set read THIRTEEN from 2026-10-17 to that date, and `settle`'s removal brings it BACK TO TWELVE — the ten
551
+ * methods, `register` and `constraints`** (this interface's own clause for the last one below; the file's
552
+ * header carries the member-set mark, the architect's rulings and the two still-refused routes).
553
+ * **⟶ AND `"THE TWELVE"` IS SUPERSEDED IN TURN, 2026-10-19: THE OPERATIVE FIGURE IS `"THE FOURTEEN"` —
554
+ * `10 + 1 + 1 + 2 = 14` ✓, the ten methods, `register`, `constraints` AND the two remove members
555
+ * `removeListener(handle)` and `removeConstraint(pair)`** (`docs/specs/storeroom-held-listener-identity/
556
+ * contract.md §2.7` item 9; the file header's clause of this date names the two members and the arithmetic).
557
+ * **THIS SENTENCE'S ONWARD CLAIM IS UNMOVED AND IS THE POINT OF THE PASS: none of the fourteen is a RELEASE
558
+ * VERB** (`surface.md §2.1` (e) item 1; `A74`) — **the two remove members remove a LISTENER and a
559
+ * CONSTRAINT PAIR, never the instance's own state, and no `dispose()`, `close()` or finalizer stands beside
560
+ * them.**
393
561
  */
394
562
  export interface StoreInstance {
395
563
  /**
@@ -450,6 +618,16 @@ export interface StoreInstance {
450
618
  * RESERVED WORD, so under the superseded module-level spelling the function had to be declared as
451
619
  * `deleteOp` and re-exported (`export { deleteOp as delete }`). **A METHOD NAME IS NOT AN IDENTIFIER
452
620
  * BINDING, so the member is declared under the one name the surface publishes** (`A127`).
621
+ *
622
+ * **⟶ AND THE WORKAROUND THAT SENTENCE DESCRIBES IS HISTORICAL AND NO LONGER EXISTS, 2026-10-19: `deleteOp`
623
+ * HAS BEEN DELETED FROM THE CODEBASE ENTIRELY** — the `P-8` merge removed the module-level spelling, so
624
+ * `grep -n "deleteOp" bindings/js/index.mjs` now returns THAT NAME ONLY INSIDE MOVED-POINTER COMMENTS
625
+ * (the `delete` member's own doc block, whose body was `deleteOp`'s) **and no live binding by that name
626
+ * stands at any site** (`P: docs/pending.md · P-8`; `archive/p8-merge/2026-10-18/blocks/deleteOp.md`).
627
+ * **SO `export { deleteOp as delete }` IS NOT A SHAPE THIS PACKAGE ANY LONGER HAS AND MUST NOT BE READ AS
628
+ * ONE — the module namespace is ONE name, `storeCreate` (`11 → 1` ✓), and `delete` is reached as the
629
+ * instance's own method alone** (`§2.9` item 1's `A127` clause). **THE DECLARATION BELOW IS UNCHANGED AND
630
+ * WAS ALWAYS CORRECT: `delete(address, tier?): DeleteRecord`.**
453
631
  */
454
632
  delete(address: Address, tier?: Tier): DeleteRecord;
455
633
  /**
@@ -461,17 +639,50 @@ export interface StoreInstance {
461
639
  */
462
640
  rollback(opId: string): RollbackRecord;
463
641
  /**
464
- * Begin watching an address, and answer the fresh opaque handle it is keyed by.
642
+ * Begin watching the addresses the caller names under the caller's own handle.
643
+ *
644
+ * **⟶ THIS BLOCK'S FEATURE SENTENCE READ *"Begin watching an address, and answer the fresh opaque handle
645
+ * it is keyed by"*, AND BOTH HALVES OF IT ARE SUPERSEDED, 2026-10-19** (`DEF-2026-10-02`: no whole-file
646
+ * rewrite — the bytes stand above and are read through this clause; `docs/specs/storeroom-held-listener-
647
+ * identity/contract.md §2.2` items 1, 2 and 10; `listen-verb.md §1` item 1). **THE CALLER SPELLS THE
648
+ * HANDLE AND `listen` ANSWERS `undefined`** — a DECLARED change of the return shape `Handle → undefined`,
649
+ * forced because returning the supplied handle would be a second spelling of the caller's own datum
650
+ * (`contract.md §2.2` item 10) — and **THE ADDRESS POSITION IS A SET**: position `2` is `addresses`, an
651
+ * ARRAY of addresses with the EMPTY ARRAY in the domain. **(The declaration below already carries both:
652
+ * `listen(handle: Handle, addresses: readonly Address[]): void` — `listen-verb.md §2.2` item 1's arity
653
+ * `2`, with no third position.)**
465
654
  *
466
655
  * **AND IT IS AN ADDRESS SITE THAT DECLARES ITS ARGUMENT POSITION** (`parameter-semantics.md §2.17`'s
467
656
  * dated clause; `surface.md §2.5` item 5 (b)'s position half): the address is `1` of `1`, so a CLASS
468
657
  * refusal here — a `Proxy` over an array included — carries `a Proxy` AND `first argument` inside the one
469
- * failure form's message, and NO trap is run (`NG-JS-I`).
658
+ * failure form's message, and NO trap is run (`NG-JS-I`). **⟶ READ WITH THE CLAUSE ABOVE, the class test
659
+ * this sentence describes is the SET POSITION'S: the six outside classes are `listen-verb.md §2.2` item 2's
660
+ * and the declared answer for every one of them is the surface's one thrown form with the store's
661
+ * `AddressMalformed` (`§2.2` item 3; the position figure `1` of `1` above is the PRE-2026-10-18 reading —
662
+ * position `1` is `1` OF TWO, `listen-verb.md §1` item 1's arity `2`).**
470
663
  *
471
664
  * **A REPEATED CALL AT A HELD ADDRESS MINTS NOTHING AND ANSWERS THE ADDRESS'S EXISTING ENTRY'S HANDLE**
472
665
  * (`write-and-read.md §6.5` item 12 (c); `§0.4` clause 2), so the two calls answer ONE opaque value.
666
+ * **⟶ SUPERSEDED, 2026-10-19: `listen(h, S2)` AFTER `listen(h, S1)` IS SET-ASSIGNMENT AND NOT UNION —
667
+ * `S1` IS PURGED WHOLESALE AND `S2` INSTALLED, with no intermediate state observable — AND THE CALL
668
+ * ANSWERS NOTHING** (`contract.md §2.2` items 3 and 10; `listen-verb.md §3` item 1). **THE SURVIVING HALF
669
+ * IS THE MINTING HALF: the handle is the CALLER'S, so nothing mints one.** (`P: docs/pending.md · (R1)`,
670
+ * verbatim: *"`listen(h, S2)` AFTER `listen(h, S1)` IS SET-ASSIGNMENT, NOT UNION"*.)**
671
+ *
672
+ * **⟶ AMENDED 2026-10-24 (`strata/decisions.md` `D-22`, verbatim: *"Listen should return the handle on
673
+ * success, or error message on fail. Discard the noop prefix"*): `listen` ANSWERS THE HANDLE IT WATCHES
674
+ * UNDER ON SUCCESS — the caller's own spelling, returned as THE IDENTITY THE STORE HOLDS FOR THAT ENTRY —
675
+ * and EVERY FAILURE REMAINS THE SURFACE'S ONE THROWN FORM (`{status, message, log}`), because this ruling
676
+ * mints no second failure channel. THE RETURN IS A SUCCESS SIGNAL THAT CARRIES THE IDENTITY AND NOT AN ECHO
677
+ * TO BE SUPPRESSED**: the ground this block states above — *"returning the supplied handle would be a
678
+ * second spelling of the caller's own datum"* — is OVERRULED BY NAME, and the sentence stands as text read
679
+ * THROUGH this clause (`RCA-8(d)` ANNOTATE-BESIDE; `DEF-2026-10-02`: no whole-file rewrite). **What it is
680
+ * FOR, declared because the return has one consumer:** `K-1` ADOPTS the value, which is what
681
+ * `kernel-surface.md` declared all along (*"adopted, never minted by the kernel"*) and what the discarded
682
+ * `constraint@<JSON address>` prefix had replaced. **A caller that ignores the return is unaffected by
683
+ * widening `void → Handle`.**
473
684
  */
474
- listen(address: Address): Handle;
685
+ listen(handle: Handle, addresses: readonly Address[]): Handle;
475
686
  /**
476
687
  * Withdraw a watching, and answer `undefined` — a no-op success for every value outside the domain.
477
688
  *
@@ -497,6 +708,17 @@ export interface StoreInstance {
497
708
  *
498
709
  * **Every outside form of either position throws ONE `TypeError`, whose `status` member is ABSENT, and
499
710
  * nothing is added, enabled, disabled or otherwise changed.**
711
+ *
712
+ * **⟶ AMENDED 2026-10-24 (`D-25`, verbatim: *"Attempting to overwrite a listener with a constraint or vice
713
+ * versa is rejected"*; `D-29`, verbatim: *"Handle becomes the internal ID"*): THE OVERWRITE IS
714
+ * SAME-KIND ONLY.** The sentence above — *"throws nothing for the mere fact that the pair was held"* — is
715
+ * TRUE AND UNAFFECTED and is now read **SCOPED BY KIND**: a repeated handle of the SAME kind at this act is
716
+ * an overwrite (`D-24`), while **a pair whose `id` equals a LIVE LISTENER'S HANDLE is REJECTED** — it does
717
+ * not overwrite the listener and it does not throw nothing. **The rejection is the surface's one thrown
718
+ * form `{status, message, log}` with the store's `AddressMalformed`**, its `message` naming BOTH SIDES and
719
+ * carrying the shared rule sentence *"a listener and a constraint do not share one"*, and it is taken
720
+ * **after the two positions' class tests and before the held-pair purge and before any store call**, so
721
+ * **no state moves**. `register`'s own direction of the same rule stands at that member (§its own clause).
500
722
  */
501
723
  addConstraint(pair: ConstraintPair, constraint: Constraint): ConstraintIdentity;
502
724
  /** **THE ENABLE HALF** (`§2.12` item 2 (a) and item 3's `constraintOn` row): `undefined`. **The
@@ -510,66 +732,41 @@ export interface StoreInstance {
510
732
  * refused is ACCEPTED**. The `constraint` position's rule is `constraintOn`'s, clause for clause.
511
733
  * **Idempotent success where the pair already stands DISABLED.** */
512
734
  constraintOff(pair: ConstraintPair, constraint: Constraint): void;
513
- /** Register `listener` under the opaque `handle`, and answer `undefined` (`surface.md §2.4` item 5 (b)). */
514
- register(handle: Handle, listener: Listener): void;
515
- /**
516
- * **THE ORDERING SEAM — `settle(record) -> undefined`** (`surface.md §2.4` item 9; `A116` (D1)–(D2);
517
- * `PAR-JS-19`): the one member THE KERNEL CALLS and the entry implements, at the two instants of a
518
- * kernel-driven write — **the adoption at the first call for a record identity**, taken before the write
519
- * verb (the write in flight is withheld: the in-window invocation set is empty), **and the delivery at
520
- * the second call for that identity**, taken at the pass's terminal arm (the residue standing in the
521
- * record's own `pending` member is delivered through this instance's own registry, one invocation per
522
- * handle, each with the triggering address as its single argument). **Every other form at the record
523
- * position — absent, `undefined`, `null`, a primitive, a function, a `Proxy`, an identity this instance
524
- * never adopted — throws THE ORDERING SEAM'S OWN `TypeError`, whose `status` member is ABSENT and whose
525
- * STRING `message` member is REQUIRED, and changes nothing.**
526
- *
527
- * **⟶ CORRECTED 2026-10-17 — THIS CELL ATTRIBUTED THAT `TypeError` TO *"the registration site's own"*
528
- * FORM AND THAT ATTRIBUTION WAS FALSE** (`DEF-2026-10-16-Q`; `surface.md` §2.5 item 5 (g), the operative
529
- * reading of the registration site; `§2.4` item 9 (b), landed 2026-10-15 on `A116` (D1), which re-spells
530
- * the re-spelling this position takes). **THE REGISTRATION SITE ANSWERS A PLAIN `{status, message}` with
531
- * `status` `AddressMalformed` — a `TypeError` there is a FAILURE** (`register.test.mjs`'s
532
- * `isRegistrationRefusal`), and **the seam's own form is declared at `§2.4` item 9 (b) and not at item
533
- * 5**: *"a `TypeError` with its `status` member ABSENT and a STRING `message` member REQUIRED AND NOT
534
- * FORBIDDEN"* (`§2.5` item 5 (g)'s own record of that re-spelling, whose two dated readings of one
535
- * phrase it reports and settles by no clause). **SO THE TWO SITES' FORMS ARE NOT ONE FORM, and this
536
- * member's is the seam's.**
537
- *
538
- * **THE RECORD POSITION TAKES THE KERNEL'S OWN `CommitRecord` — `{ attempt, op, triggered, pending }`,
539
- * FOUR MEMBERS — AND NOT THE STORE'S `WriteRecord`** (`surface.md` `§2.4` item 9 (f)'s *"each with its
540
- * argument types"* read with item 9's own two-instant table; `PAR-JS-19`'s `supplier` cell; `A116` (D4):
541
- * *"the carrier `CommitRecord.pending` and its two removal rules unchanged"*). **THE INSTANTS' OWN TABLE
542
- * NAMES IT: the record is *"the `CommitRecord` `commit` is building"* at instant (a) and *"the SAME record
543
- * identity"* at instant (b)** (`surface.md` `§2.4` item 9 (a)–(b)). **AND THE STORE'S RECORD IS NOT ONE:
544
- * `WriteRecord` above is the three-member `{op, watched, triggered}` the `write` member answers with and
545
- * carries NO `pending` member, `PAR-JS-13` is that record's returned `op` field (`parameter-semantics.md
546
- * §2.13`) and not the record's own shape, and the kernel's record carries TWO of the store's members
547
- * VERBATIM beside its own `attempt` identity and its own `pending` member** (`kernel-surface.md §2.1` item
548
- * 2's *"WHAT IT IS NOT"* clause: *"the `CommitRecord` is the KERNEL'S OWN record and is NOT the store's
549
- * `WriteResult`"*).
550
- *
551
- * **`CommitRecord` IS THE KERNEL'S DECLARED SHAPE AND IS NOT MINTED HERE** (`surface.md` `§2.4` item 9
552
- * (f) forbids *"a `pending`-shaped record type this unit does not declare"*, and this unit declares none):
553
- * the type is declared above with the kernel's own four members and cited from its own unit's declaration
554
- * — `kernel-surface.md §1` item 4's closed record enumeration, `§2.1` item 2 for the record, and
555
- * `attempt-lifecycle.md §2.4` item 1 for its `AttemptRef` — **and NO named export is added for it or for
556
- * `settle`.**
735
+ /** Register `listener` under the opaque `handle`, and answer `undefined` (`surface.md §2.4` item 5 (b)).
557
736
  *
558
- * **It is NOT a named export of this entry** (`package.md §1.3` item 3): it is reached through
559
- * `storeCreate`'s own product alone.
560
- */
561
- settle(record: CommitRecord): void;
737
+ * **⟶ AND IT REFUSES WHERE A CONSTRAINT'S `id` STANDS AT THE ADDRESS** (`D-25`'s *"vice versa"*; `D-29`):
738
+ * the cross-kind rule's register-side direction, in the surface's **own** thrown form
739
+ * `{status, message, log}` with the store's `AddressMalformed` — **not** the `TypeError` this member's
740
+ * conflict arm carried while a reserved `constraint@` prefix existed to be exempted — taken after the
741
+ * handle's domain and registry tests and **before the registry write and before the re-install `listen`**,
742
+ * so **no state moves**. **The exemption for kernel-prefixed handles is DELETED, not moved**: under `D-22`
743
+ * the kernel's handle is no longer a reserved spelling and under `D-25` **the kernel registers nothing**, so
744
+ * nothing needs to get past the test. */
745
+ register(handle: Handle, listener: Listener): void;
746
+ /** **`removeListener(handle) -> undefined`** — the entry removed WHOLE and its store entries withdrawn; every arm that is not a real removal THROWS (`contract.md §2.7` item 2; `PAR-HL-14`, `PAR-HL-15`). */
747
+ removeListener(handle: Handle): void;
748
+ /** **`removeConstraint(pair) -> undefined`** — the pair, its N address rows, the kernel's registration and the store's home entry all gone; it is the ONE act that deletes an identity (`contract.md §2.7` item 3; `PAR-HL-16`, `PAR-HL-17`). */
749
+ removeConstraint(pair: ConstraintPair): void;
562
750
  /**
563
751
  * **THE REGISTERED-PAIR READ — `constraints() -> ConstraintPair[]`** (`surface.md §2.4` item 9 (f)'s
564
752
  * `constraints` clause of 2026-10-17, items 2–9; `§2.12` item 2-bis; `parameter-semantics.md §2.27` =
565
- * `PAR-JS-27`) — **the THIRTEENTH own member** (`10 + 1 + 1 + 1 = 13` ✓, the third `1` being this member),
566
- * added on the architect's ruling of that date, verbatim: *"Add surface methods for reading registered
567
- * constraints."*
753
+ * `PAR-JS-27`**) — **one of the FOURTEEN own members, `10 + 1 + 1 + 2 = 14` ✓, the SECOND of the two
754
+ * remaining singles** (`docs/specs/storeroom-held-listener-identity/contract.md §2.7` item 9 — the
755
+ * member-set clause of 2026-10-19, which moves the figure `12 → 14`). **⟶ AND THE FIGURE THAT STOOD HERE WAS
756
+ * *"THE TWELVE own members, `10 + 1 + 1 = 12`"*, read from `surface.md §2.4` item 9 (f)'s clause of
757
+ * 2026-10-18, `13 → 12`: THAT READING IS SUPERSEDED — the two remove members `removeListener(handle)` and
758
+ * `removeConstraint(pair)` are the `+ 2`** (`P: docs/pending.md · (AA-5)`, verbatim: *"the member set is 14
759
+ * and the `12 → 13` figure is withdrawn by name"*; `DEF-2026-10-02`: no whole-file rewrite). **AND THIS
760
+ * MEMBER'S OWN SIBLING AMONG THE NON-STORE-REACHING MEMBERS IS `register` ALONE FROM THAT DATE
761
+ * (2026-10-18)**: the sentence that read *"beside `register` and `settle`"* is re-spelled at its own bytes,
762
+ * and this is the operative reading — **and it is NOT read as a count of the fourteen-member set's
763
+ * classes, because no clause of this file asserts which members make up that class** (`contract.md §2.7`
764
+ * items 2–5 for the two new members' own clauses; `§2.7` item 9).
568
765
  *
569
766
  * **THE RECEIVER IS THE STORE, THE CALL TAKES NO ARGUMENT (arity `0`) AND IT THROWS NOTHING**: there is no
570
767
  * outside argument for the class test to refuse, and the call makes NO STORE CALL, MINTS NO CODE, APPENDS
571
768
  * NO JOURNAL ENTRY AND CHANGES NO NODE — so this member is one of the product's NON-STORE-REACHING members
572
- * beside `register` and `settle`, and `§2.4` item 9 (f)'s rule (ii) has no subject at it.
769
+ * and `§2.4` item 9 (f)'s rule (ii) has no subject at it.
573
770
  *
574
771
  * **WHAT IS RETURNED, EXACTLY — THE PAIRS AND NOT THE FUNCTIONS:** a **FRESH JS ARRAY on every call**,
575
772
  * whose **every element is a FRESH plain object carrying EXACTLY TWO MEMBERS** — `address` (a fresh array of
@@ -604,6 +801,12 @@ export interface StoreInstance {
604
801
  * registration — at the batch loop or at `addConstraint` — leaves the entry exactly as it stood and does not
605
802
  * appear. **An overwrite changes no membership**: a second `addConstraint` at a held pair replaces the
606
803
  * function at the SAME pair and returns the SAME identity, so the pair is carried ONCE before and after.
804
+ * **⟶ AMENDED 2026-10-24 (`D-26` item 4; `D-27` item 1): THE BATCH HALF OF THAT EXCLUSION HAS NO PRODUCER
805
+ * AND IS READ THROUGH THIS CLAUSE.** A `cfg.constraints` element **must** carry its function, and the batch
806
+ * **arms** it (`D-27`: *"Functions are armed"*), so *"a well-formed `cfg.constraints` element that carried no
807
+ * function"* is an element the construction now REFUSES under `ConstraintListInvalid` **before any
808
+ * filesystem act** — and the exclusion above stands for **the add route's refused registration alone**, and
809
+ * for a pair whose function was never supplied by any route.
607
810
  *
608
811
  * **IT ADDS NO POPULATION ROUTE** (`§2.12` item 2-bis): the two routes stand at TWO, and a read closes none
609
812
  * and opens none. **It is NOT a `pending()` reader, NOT an `attempts()` enumerator and NOT a live view of a
@@ -612,7 +815,7 @@ export interface StoreInstance {
612
815
  * **AND IT MOVES NO OTHER FIGURE**: the module namespace keeps its ONE name `storeCreate` (`§2.9` item 1's
613
816
  * `A127` clause, `11 → 1` ✓), the kernel's extent stays FIVE with no `K-6` proposed (`§2.4` item 9 (f),
614
817
  * item 8 — the pairs are read from the entry's OWN registry, which is keyed exactly as the kernel's is), the
615
- * store's closed `16`-member set is not reached, the kernel's `KC` set stands closed at `8`, and the register
818
+ * store's closed `17`-member set is not reached, the kernel's `KC` set stands closed at `8`, and the register
616
819
  * keeps its `8` rows.
617
820
  *
618
821
  * **It is NOT a named export of this entry** (`package.md §1.3` item 3): it is reached through
@@ -650,7 +853,21 @@ export function storeCreate(cfg: StoreConfig): StoreInstance;
650
853
  * the element**, so no third member is declared here and this interface is left exactly as it stood.
651
854
  */
652
855
  export interface ConstraintPair {
653
- readonly address: Address;
856
+ /**
857
+ * **THE ADDRESS MEMBER'S TYPE MOVES.** At the CREATION act it is a single address (`constraint-identity.md
858
+ * §6`'s pair table: *"and, at the REGISTRATION act, a single address"*); on the READ and at the REMOVAL it
859
+ * is the pair's own SET (`P: docs/pending.md · P-7`'s answer clause: *"1. (one id, N addresses)"*;
860
+ * `contract.md §2.6` item 5; `PAR-HL-13`).
861
+ */
862
+ readonly address: Address | readonly Address[];
863
+ /**
864
+ * **THE PAIR'S `id` — WHICH IS ITS HANDLE, ONE `id` NAMING ONE PAIR, ONE IDENTITY AND ONE HANDLE**
865
+ * (`D-23`/`D-24`, and `D-29`'s *"Handle becomes the internal ID"*, verbatim). **⟶ AND THE SENTENCE THE PAIR
866
+ * HAS CARRIED SINCE 2026-10-17 — *"two pairs at two addresses are TWO pairs"* — IS READ THROUGH THIS
867
+ * CLAUSE: the pair-local reuse of one `id` at two addresses is NO LONGER LAWFUL**, because a handle is
868
+ * INSTANCE-SCOPED and a repeated handle is REJECTED in one supplied list (`cfg.constraints`, `D-27`) and an
869
+ * OVERWRITE at the add route (`D-24`). **THE SHAPE IS UNCHANGED — NO FIELD IS ADDED** (`D-24` item 1).
870
+ */
654
871
  readonly id: string;
655
872
  }
656
873