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/README.md +70 -10
- package/index.d.ts +372 -72
- package/index.mjs +1262 -3137
- package/package.json +7 -6
- package/src/constraint-kernel.mjs +4 -1718
- package/src/entry/artefact.mjs +376 -0
- package/src/entry/carrier.mjs +1002 -0
- package/src/entry/class-decision.mjs +1214 -0
- package/src/entry/constraints.mjs +844 -0
- package/src/entry/delivery.mjs +639 -0
- package/src/entry/frame.mjs +417 -0
- package/src/entry/kernel-attempt.mjs +598 -0
- package/src/entry/kernel-commit.mjs +166 -0
- package/src/entry/kernel-foundations.mjs +664 -0
- package/src/entry/kernel-registration.mjs +644 -0
- package/src/entry/kernel-terminal.mjs +324 -0
- package/src/entry/refusal.mjs +161 -0
- package/src/entry/state.mjs +602 -0
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, **
|
|
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(
|
|
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`
|
|
19
|
-
//
|
|
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
|
-
//
|
|
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
|
|
47
|
-
//
|
|
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
|
|
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)
|
|
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 {
|
|
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
|
-
/**
|
|
237
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
319
|
-
*
|
|
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
|
|
328
|
-
* NOT THE STORE'S `WriteRecord`** (
|
|
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
|
|
359
|
-
/**
|
|
360
|
-
|
|
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
|
|
365
|
-
*
|
|
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
|
|
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(
|
|
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
|
|
503
|
-
* `
|
|
504
|
-
*
|
|
505
|
-
*
|
|
506
|
-
*
|
|
507
|
-
*
|
|
508
|
-
*
|
|
509
|
-
*
|
|
510
|
-
*
|
|
511
|
-
*
|
|
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
|
-
*
|
|
514
|
-
*
|
|
515
|
-
*
|
|
516
|
-
*
|
|
517
|
-
*
|
|
518
|
-
*
|
|
519
|
-
*
|
|
520
|
-
*
|
|
521
|
-
*
|
|
522
|
-
*
|
|
523
|
-
*
|
|
524
|
-
* **THE
|
|
525
|
-
*
|
|
526
|
-
*
|
|
527
|
-
* *
|
|
528
|
-
*
|
|
529
|
-
*
|
|
530
|
-
*
|
|
531
|
-
*
|
|
532
|
-
*
|
|
533
|
-
*
|
|
534
|
-
*
|
|
535
|
-
*
|
|
536
|
-
*
|
|
537
|
-
*
|
|
538
|
-
*
|
|
539
|
-
*
|
|
540
|
-
*
|
|
541
|
-
*
|
|
542
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|