provident-storeroom 0.4.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,18 +10,72 @@
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
  //
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.
78
+ //
25
79
  // **THE TEN METHODS TAKE THE RECEIVER'S OWN POSITION AWAY: `8 → 1` ✓ AND `4 → 12` ✓** (`surface.md §2.9`
26
80
  // item 1's and `§2.4` item 9 (f)'s `A127` clauses). The seven verbs that reach the store are METHODS of the
27
81
  // object `storeCreate` returned, so **NO DECLARED SIGNATURE CARRIES A LEADING `instance` POSITION** — the
@@ -37,16 +91,22 @@
37
91
  // them is a STORE type**: no register, no anchor, no tier tree, no journal and no store verb is declared
38
92
  // here (`§5.2` item 4).
39
93
  //
40
- // **AND TWO MORE SHAPES STAND BESIDE THOSE ELEVEN WITHOUT A BYTE OF EITHER BEING MINTED HERE, BECAUSE
41
- // `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
42
96
  // (f)'s *"each with its argument types"* read with its *"no `pending`-shaped record type this unit does
43
97
  // not declare"*): **`AttemptRef` (`1` member) and `CommitRecord` (`4` members — `attempt` · `op` ·
44
98
  // `triggered` · `pending`) are THE KERNEL'S OWN NAMED SHAPES, DECLARED BY THE KERNEL AND NOT BY THIS
45
99
  // UNIT** (`kernel-surface.md §1` item 4's closed record enumeration; its `§2.1` item 2 for the record's
46
- // four members; `attempt-lifecycle.md §2.4` item 1 for the one-member `AttemptRef`) — so the seam's
47
- // 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.
48
102
  // **`AttemptRef` and `CommitRecord` are therefore not STORE types either, and not store records**: they
49
- // 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"*).
50
110
  //
51
111
  // **AND THE ONE THING THIS DECLARATION MUST NOT CARRY, STATED SO THE FINDING RULE IS CHECKABLE**
52
112
  // (`distribution.md §5.2` item 4): **it declares NO store type, NO store verb, NO `findAddress`, NO
@@ -70,7 +130,10 @@
70
130
  // `AddressMalformed`. The narrowest lawful widening a declaration can make is `number`, and this file
71
131
  // makes it.
72
132
  // 3. **THE INSTANCE'S *"TWELVE OWN MEMBERS AND NOTHING ELSE"* IS NOT STRUCTURALLY ENFORCEABLE HERE**
73
- // (`§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
74
137
  // and constrains no excess member, so a product carrying a thirteenth own member still satisfies
75
138
  // `StoreInstance`. The count is driven at the boundary instead (`a127-surface.test.mjs`'s
76
139
  // `Object.getOwnPropertyNames` cell, which exists precisely because this declaration cannot fail on it).
@@ -140,8 +203,45 @@ export interface StoreConfig {
140
203
  * no-constraint store, and no default is declared for it"* — **and every element and every shape outside
141
204
  * the list is refused at the store's own construction with ITS OWN code and ITS OWN message**, which is
142
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.
143
239
  */
144
- 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
+ }[];
145
245
  }
146
246
 
147
247
  /**
@@ -170,6 +270,24 @@ export interface StoreConfig {
170
270
  * construction/startup, or of the LOADED state against that list at load — **and the store writes no byte of
171
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
172
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).
173
291
  */
174
292
  export type StoreStatus =
175
293
  | 'AddressMalformed'
@@ -188,6 +306,7 @@ export type StoreStatus =
188
306
  | 'ValueNotAdmitted'
189
307
  | 'FileCommitFailed'
190
308
  | 'ConstraintListInvalid'
309
+ | 'ValueRefusedAtBoundary'
191
310
  | (string & {});
192
311
 
193
312
  /**
@@ -233,8 +352,17 @@ export interface StoreRefusal {
233
352
  readonly log: LogEntry[];
234
353
  }
235
354
 
236
- /** The opaque handle a listener registration is keyed by: the package's own value for one registration. */
237
- 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;
238
366
 
239
367
  /** The caller's listener: any JS function, invoked with the triggering address as its ONE argument. */
240
368
  export type Listener = (address: Address) => void;
@@ -283,14 +411,33 @@ export interface JournalOp {
283
411
  export interface WriteRecord {
284
412
  readonly op: JournalOp;
285
413
  readonly watched: readonly Address[];
286
- 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;
287
433
  }
288
434
 
289
435
  /** The record a `delete` answers. */
290
436
  export interface DeleteRecord {
291
437
  readonly address: Address;
292
438
  readonly tiers: readonly Tier[];
293
- 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[];
294
441
  }
295
442
 
296
443
  /**
@@ -315,8 +462,11 @@ export interface RollbackRecord {
315
462
  * it as a named kernel-side shape).
316
463
  *
317
464
  * **IT IS DECLARED HERE FOR ONE POSITION AND NO OTHER**: the `attempt` member of the `CommitRecord` the
318
- * instance's `settle` member takes (`§2.4` item 9 (f)'s *"each with its argument types"*). **No verb of
319
- * 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.**
320
470
  */
321
471
  export interface AttemptRef {
322
472
  /** The attempt's identity: a non-empty, kernel-unique token. */
@@ -324,8 +474,11 @@ export interface AttemptRef {
324
474
  }
325
475
 
326
476
  /**
327
- * **THE ORDERING SEAM'S ONE ARGUMENT — THE KERNEL'S OWN `{ attempt, op, triggered, pending }` RECORD, AND
328
- * 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`,
329
482
  * a record with exactly FOUR members, the FOURTH added at the `A108` landing pass of 2026-10-13"*; its
330
483
  * `§1` item 4 counts it among the kernel's own named shapes).
331
484
  *
@@ -354,18 +507,36 @@ export interface CommitRecord {
354
507
  readonly attempt: AttemptRef;
355
508
  /** The op the store's write returned, VERBATIM (`JournalOp` above; `§2.1` item 2). */
356
509
  readonly op: JournalOp;
357
- /** The store's own `triggered` member, VERBATIM, read as a SET (`§2.1` item 2). */
358
- readonly triggered: readonly Handle[];
359
- /** THE WHOLE RETURNED SET OF TRIGGERED CONSTRAINTS, each entry leaving it only by being checked off as it passes (`§2.1` item 2). */
360
- 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[];
361
524
  }
362
525
 
363
526
  /**
364
- * **THE INSTANCE `storeCreate` RETURNS — THE TWELVE OWN MEMBERS OF `surface.md §2.4` item 9 (f)'s `A127`
365
- * 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
366
530
  * factory's own product alone (`package.md §1.3` item 3) — **NO member below is a named export**, because
367
531
  * the module namespace carries ONE name, `storeCreate` (`§2.9` item 1's `A127` clause; `11 → 1` ✓).
368
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
+ *
369
540
  * **THE TEN METHODS ARE THE DECLARED POSITIONS OF `§2.2`, `§2.4`, `§2.10` AND `§2.12` WITH THE LEADING
370
541
  * `instance` POSITION DROPPED** (`A127`): `a.read(address, tier?)` is the declared `read`, `a.write(address,
371
542
  * tier, value, commit?)` the declared `write`, and so on — **the receiver IS the instance, so the position
@@ -375,7 +546,18 @@ export interface CommitRecord {
375
546
  *
376
547
  * **THE STATE IS PRIVATE AND NONE OF THE TWELVE IS A RELEASE VERB** (`surface.md §2.1` (e) item 1; `A74`):
377
548
  * the instance's own state is released with the instance and by nothing else — no `dispose()`, no `close()`
378
- * and no finalizer is declared here.
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.**
379
561
  */
380
562
  export interface StoreInstance {
381
563
  /**
@@ -436,6 +618,16 @@ export interface StoreInstance {
436
618
  * RESERVED WORD, so under the superseded module-level spelling the function had to be declared as
437
619
  * `deleteOp` and re-exported (`export { deleteOp as delete }`). **A METHOD NAME IS NOT AN IDENTIFIER
438
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`.**
439
631
  */
440
632
  delete(address: Address, tier?: Tier): DeleteRecord;
441
633
  /**
@@ -447,17 +639,50 @@ export interface StoreInstance {
447
639
  */
448
640
  rollback(opId: string): RollbackRecord;
449
641
  /**
450
- * 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.)**
451
654
  *
452
655
  * **AND IT IS AN ADDRESS SITE THAT DECLARES ITS ARGUMENT POSITION** (`parameter-semantics.md §2.17`'s
453
656
  * dated clause; `surface.md §2.5` item 5 (b)'s position half): the address is `1` of `1`, so a CLASS
454
657
  * refusal here — a `Proxy` over an array included — carries `a Proxy` AND `first argument` inside the one
455
- * 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`).**
456
663
  *
457
664
  * **A REPEATED CALL AT A HELD ADDRESS MINTS NOTHING AND ANSWERS THE ADDRESS'S EXISTING ENTRY'S HANDLE**
458
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`.**
459
684
  */
460
- listen(address: Address): Handle;
685
+ listen(handle: Handle, addresses: readonly Address[]): Handle;
461
686
  /**
462
687
  * Withdraw a watching, and answer `undefined` — a no-op success for every value outside the domain.
463
688
  *
@@ -483,6 +708,17 @@ export interface StoreInstance {
483
708
  *
484
709
  * **Every outside form of either position throws ONE `TypeError`, whose `status` member is ABSENT, and
485
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).
486
722
  */
487
723
  addConstraint(pair: ConstraintPair, constraint: Constraint): ConstraintIdentity;
488
724
  /** **THE ENABLE HALF** (`§2.12` item 2 (a) and item 3's `constraintOn` row): `undefined`. **The
@@ -496,55 +732,96 @@ export interface StoreInstance {
496
732
  * refused is ACCEPTED**. The `constraint` position's rule is `constraintOn`'s, clause for clause.
497
733
  * **Idempotent success where the pair already stands DISABLED.** */
498
734
  constraintOff(pair: ConstraintPair, constraint: Constraint): void;
499
- /** Register `listener` under the opaque `handle`, and answer `undefined` (`surface.md §2.4` item 5 (b)). */
735
+ /** Register `listener` under the opaque `handle`, and answer `undefined` (`surface.md §2.4` item 5 (b)).
736
+ *
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. */
500
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;
501
750
  /**
502
- * **THE ORDERING SEAM — `settle(record) -> undefined`** (`surface.md §2.4` item 9; `A116` (D1)–(D2);
503
- * `PAR-JS-19`): the one member THE KERNEL CALLS and the entry implements, at the two instants of a
504
- * kernel-driven write — **the adoption at the first call for a record identity**, taken before the write
505
- * verb (the write in flight is withheld: the in-window invocation set is empty), **and the delivery at
506
- * the second call for that identity**, taken at the pass's terminal arm (the residue standing in the
507
- * record's own `pending` member is delivered through this instance's own registry, one invocation per
508
- * handle, each with the triggering address as its single argument). **Every other form at the record
509
- * position — absent, `undefined`, `null`, a primitive, a function, a `Proxy`, an identity this instance
510
- * never adopted — throws THE ORDERING SEAM'S OWN `TypeError`, whose `status` member is ABSENT and whose
511
- * STRING `message` member is REQUIRED, and changes nothing.**
751
+ * **THE REGISTERED-PAIR READ — `constraints() -> ConstraintPair[]`** (`surface.md §2.4` item 9 (f)'s
752
+ * `constraints` clause of 2026-10-17, items 2–9; `§2.12` item 2-bis; `parameter-semantics.md §2.27` =
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).
512
765
  *
513
- * **⟶ CORRECTED 2026-10-17 — THIS CELL ATTRIBUTED THAT `TypeError` TO *"the registration site's own"*
514
- * FORM AND THAT ATTRIBUTION WAS FALSE** (`DEF-2026-10-16-Q`; `surface.md` §2.5 item 5 (g), the operative
515
- * reading of the registration site; `§2.4` item 9 (b), landed 2026-10-15 on `A116` (D1), which re-spells
516
- * the re-spelling this position takes). **THE REGISTRATION SITE ANSWERS A PLAIN `{status, message}` with
517
- * `status` `AddressMalformed` — a `TypeError` there is a FAILURE** (`register.test.mjs`'s
518
- * `isRegistrationRefusal`), and **the seam's own form is declared at `§2.4` item 9 (b) and not at item
519
- * 5**: *"a `TypeError` with its `status` member ABSENT and a STRING `message` member REQUIRED AND NOT
520
- * FORBIDDEN"* (`§2.5` item 5 (g)'s own record of that re-spelling, whose two dated readings of one
521
- * phrase it reports and settles by no clause). **SO THE TWO SITES' FORMS ARE NOT ONE FORM, and this
522
- * member's is the seam's.**
523
- *
524
- * **THE RECORD POSITION TAKES THE KERNEL'S OWN `CommitRecord` — `{ attempt, op, triggered, pending }`,
525
- * FOUR MEMBERS — AND NOT THE STORE'S `WriteRecord`** (`surface.md` `§2.4` item 9 (f)'s *"each with its
526
- * argument types"* read with item 9's own two-instant table; `PAR-JS-19`'s `supplier` cell; `A116` (D4):
527
- * *"the carrier `CommitRecord.pending` and its two removal rules unchanged"*). **THE INSTANTS' OWN TABLE
528
- * NAMES IT: the record is *"the `CommitRecord` `commit` is building"* at instant (a) and *"the SAME record
529
- * identity"* at instant (b)** (`surface.md` `§2.4` item 9 (a)–(b)). **AND THE STORE'S RECORD IS NOT ONE:
530
- * `WriteRecord` above is the three-member `{op, watched, triggered}` the `write` member answers with and
531
- * carries NO `pending` member, `PAR-JS-13` is that record's returned `op` field (`parameter-semantics.md
532
- * §2.13`) and not the record's own shape, and the kernel's record carries TWO of the store's members
533
- * VERBATIM beside its own `attempt` identity and its own `pending` member** (`kernel-surface.md §2.1` item
534
- * 2's *"WHAT IT IS NOT"* clause: *"the `CommitRecord` is the KERNEL'S OWN record and is NOT the store's
535
- * `WriteResult`"*).
536
- *
537
- * **`CommitRecord` IS THE KERNEL'S DECLARED SHAPE AND IS NOT MINTED HERE** (`surface.md` `§2.4` item 9
538
- * (f) forbids *"a `pending`-shaped record type this unit does not declare"*, and this unit declares none):
539
- * the type is declared above with the kernel's own four members and cited from its own unit's declaration
540
- * — `kernel-surface.md §1` item 4's closed record enumeration, `§2.1` item 2 for the record, and
541
- * `attempt-lifecycle.md §2.4` item 1 for its `AttemptRef` — **and NO named export is added for it or for
542
- * `settle`.**
766
+ * **THE RECEIVER IS THE STORE, THE CALL TAKES NO ARGUMENT (arity `0`) AND IT THROWS NOTHING**: there is no
767
+ * outside argument for the class test to refuse, and the call makes NO STORE CALL, MINTS NO CODE, APPENDS
768
+ * NO JOURNAL ENTRY AND CHANGES NO NODE — so this member is one of the product's NON-STORE-REACHING members
769
+ * and `§2.4` item 9 (f)'s rule (ii) has no subject at it.
770
+ *
771
+ * **WHAT IS RETURNED, EXACTLY — THE PAIRS AND NOT THE FUNCTIONS:** a **FRESH JS ARRAY on every call**,
772
+ * whose **every element is a FRESH plain object carrying EXACTLY TWO MEMBERS** — `address` (a fresh array of
773
+ * the store's own segments) and `id` (the constraint's own BARE `id`, a `string`) — the same two data the
774
+ * kernel's own registry is keyed by. **The empty array `[]` is the declared value where the instance carries
775
+ * no pair at all** (`PAR-JS-27`'s `domain` cell).
776
+ *
777
+ * **THE FOUR DECLARED EXCLUSIONS, EACH STATED SO A DECLARATION THAT VIOLATED ONE WOULD BE VISIBLE AT ITS OWN
778
+ * BYTES:**
779
+ * 1. **NO CONSTRAINT FUNCTION IS RETURNED** (item 3, four named grounds — the operative one being the
780
+ * anti-pattern rulings' *do not hand out a value whose later use the contract cannot bound*). The
781
+ * `Constraint` type below is that function and **NO MEMBER OF THIS RETURN CARRIES ONE**; a disabled pair
782
+ * makes the hazard sharp, since `constraintOff` parks a stub in the kernel while the caller's function is
783
+ * kept in the entry.
784
+ * 2. **NO OPAQUE IDENTITY IS EXPOSED** (item 4): `ConstraintIdentity` is NOT reachable through this return —
785
+ * `PAR-JS-25`'s opacity would break the moment a consumer read one out of the array. **The pair is the
786
+ * caller's own datum; the identity is this unit's opaque handle for it, and the two are NOT the same
787
+ * datum.**
788
+ * 3. **NO ORDER IS PROMISED** (item 6): the returned array's order is **UNDECLARED** and a consumer compares
789
+ * the pairs **as a SET and never as a sequence** (`DD-22`; `§2.7` item 3). **Nothing in this declaration
790
+ * may be read as a registration order, an address order or a `seq`-like ordinal.**
791
+ * 4. **A DISABLED PAIR DOES APPEAR** (item 5): `constraintOff` is a TOGGLE and NOT A REMOVAL, so a pair it
792
+ * disabled is STILL REGISTERED and still enumerated — **and therefore there is NO `enabled` member on an
793
+ * element and NO way to read a pair's state off this return**; the state is read at the toggles' own
794
+ * clauses. **No removal route exists**, so an absence here means nothing was ever registered.
795
+ *
796
+ * **THE COVERAGE, BOTH POPULATION ROUTES ON ONE FOOTING** (item 7): a pair the batch registered at
797
+ * `storeCreate` (`cfg.constraints`) and a pair `addConstraint` registered appear alike, because *"the entry
798
+ * carries a pair if and only if a function stands registered at that pair in the kernel's own pair-keyed
799
+ * registry"*. **The two declared exclusions are therefore structural**: a well-formed `cfg.constraints`
800
+ * element that carried no function is **not** a carried pair and does not appear, and a REFUSED
801
+ * registration — at the batch loop or at `addConstraint` — leaves the entry exactly as it stood and does not
802
+ * appear. **An overwrite changes no membership**: a second `addConstraint` at a held pair replaces the
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.
810
+ *
811
+ * **IT ADDS NO POPULATION ROUTE** (`§2.12` item 2-bis): the two routes stand at TWO, and a read closes none
812
+ * and opens none. **It is NOT a `pending()` reader, NOT an `attempts()` enumerator and NOT a live view of a
813
+ * running commit**; it announces no identity, no function and no order.
814
+ *
815
+ * **AND IT MOVES NO OTHER FIGURE**: the module namespace keeps its ONE name `storeCreate` (`§2.9` item 1's
816
+ * `A127` clause, `11 → 1` ✓), the kernel's extent stays FIVE with no `K-6` proposed (`§2.4` item 9 (f),
817
+ * item 8 — the pairs are read from the entry's OWN registry, which is keyed exactly as the kernel's is), the
818
+ * store's closed `17`-member set is not reached, the kernel's `KC` set stands closed at `8`, and the register
819
+ * keeps its `8` rows.
543
820
  *
544
821
  * **It is NOT a named export of this entry** (`package.md §1.3` item 3): it is reached through
545
822
  * `storeCreate`'s own product alone.
546
823
  */
547
- settle(record: CommitRecord): void;
824
+ constraints(): ConstraintPair[];
548
825
  }
549
826
 
550
827
  /**
@@ -565,9 +842,32 @@ export function storeCreate(cfg: StoreConfig): StoreInstance;
565
842
  * `string`** — **and NOT the whole of a batch element**, which is this pair PLUS its constraint function.
566
843
  * **Every outside form of the pair throws the three methods' one `TypeError`**, and **a well-formed pair
567
844
  * the entry does not carry is outside the two toggles' domain**: it is NOT a third population route.
845
+ *
846
+ * **⟶ AND THIS SHAPE IS ALSO THE ELEMENT OF THE FOURTH MEMBER'S RETURN, ADDED 2026-10-17**
847
+ * (`surface.md §2.4` item 9 (f)'s `constraints` clause; `parameter-semantics.md §2.27` = `PAR-JS-27`,
848
+ * `return-field`): `a.constraints()`'s every element carries **exactly these TWO members and no third** —
849
+ * the `address` a pair was registered under and its bare `id` — **and NEITHER the constraint function nor the
850
+ * opaque identity** (`PAR-JS-25`'s opacity, unmoved). **THE TWO ROLES ARE ONE SHAPE AND NOT TWO**: this is the
851
+ * caller's own datum entering at `addConstraint` (and at `cfg.constraints`' elements, which are this pair
852
+ * PLUS a `constraint`) and coming back out at the read. **`Row 27`'s `alt` cell refuses an `enabled` member on
853
+ * the element**, so no third member is declared here and this interface is left exactly as it stood.
568
854
  */
569
855
  export interface ConstraintPair {
570
- 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
+ */
571
871
  readonly id: string;
572
872
  }
573
873