provident-storeroom 0.4.0 → 0.5.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
@@ -22,6 +22,18 @@
22
22
  // clause of that date, the crossing form's ONE home; **the ONE figure that moves is the arity, and
23
23
  // `storeCreate` remains the namespace's one name and the product its twelve own members**).
24
24
  //
25
+ // **⟶ AND THE MEMBER-SET FIGURE ABOVE IS SUPERSEDED AND IS READ THROUGH THIS CLAUSE, 2026-10-17: THE
26
+ // OPERATIVE SET IS THIRTEEN OWN MEMBERS, `10 + 1 + 1 + 1 = 13` ✓, THE THIRTEENTH BEING `constraints()`** —
27
+ // the registered-pair read, declared at `surface.md §2.4` item 9 (f)'s `constraints` clause of that date and
28
+ // at `§2.12` item 2-bis, on the architect's ruling verbatim *"Add surface methods for reading registered
29
+ // constraints."* **THE BYTES ABOVE STAND AS THE `A127` PASS'S READING (`DEF-2026-10-02`: no whole-file
30
+ // rewrite) and every "twelve own members" figure in this file is read through this sentence as THIRTEEN.**
31
+ // **SO A DECLARATION FILE THAT STILL READS TWELVE OWN MEMBERS AFTER THAT DATE IS A FINDING** (`surface.md
32
+ // §2.4` item 9 (f)'s item 10, which names the declaration file among the cells that go red; item 13; its own
33
+ // mark at `§2.9` item 1). **THE TWO ROUTES THAT WOULD HAVE MOVED THE SET EARLIER ARE STILL REFUSED BY NAME
34
+ // AND THIS ONE IS NOT ONE OF THEM** (`§2.5`'s clause of 2026-10-16: a `constraintLog(commit)` reader and a
35
+ // second module-namespace name) — and the second `1` above is `settle`, the third `1` being `constraints`.
36
+ //
25
37
  // **THE TEN METHODS TAKE THE RECEIVER'S OWN POSITION AWAY: `8 → 1` ✓ AND `4 → 12` ✓** (`surface.md §2.9`
26
38
  // item 1's and `§2.4` item 9 (f)'s `A127` clauses). The seven verbs that reach the store are METHODS of the
27
39
  // object `storeCreate` returned, so **NO DECLARED SIGNATURE CARRIES A LEADING `instance` POSITION** — the
@@ -375,7 +387,9 @@ export interface CommitRecord {
375
387
  *
376
388
  * **THE STATE IS PRIVATE AND NONE OF THE TWELVE IS A RELEASE VERB** (`surface.md §2.1` (e) item 1; `A74`):
377
389
  * 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.
390
+ * and no finalizer is declared here. **⟶ AND `"THE TWELVE"` READS AS `THIRTEEN` FROM 2026-10-17, the
391
+ * thirteenth being `constraints()`** (this interface's own clause for it below; the file's header carries the
392
+ * member-set mark and the two still-refused routes).
379
393
  */
380
394
  export interface StoreInstance {
381
395
  /**
@@ -545,6 +559,66 @@ export interface StoreInstance {
545
559
  * `storeCreate`'s own product alone.
546
560
  */
547
561
  settle(record: CommitRecord): void;
562
+ /**
563
+ * **THE REGISTERED-PAIR READ — `constraints() -> ConstraintPair[]`** (`surface.md §2.4` item 9 (f)'s
564
+ * `constraints` clause of 2026-10-17, items 2–9; `§2.12` item 2-bis; `parameter-semantics.md §2.27` =
565
+ * `PAR-JS-27`) — **the THIRTEENTH own member** (`10 + 1 + 1 + 1 = 13` ✓, the third `1` being this member),
566
+ * added on the architect's ruling of that date, verbatim: *"Add surface methods for reading registered
567
+ * constraints."*
568
+ *
569
+ * **THE RECEIVER IS THE STORE, THE CALL TAKES NO ARGUMENT (arity `0`) AND IT THROWS NOTHING**: there is no
570
+ * outside argument for the class test to refuse, and the call makes NO STORE CALL, MINTS NO CODE, APPENDS
571
+ * NO JOURNAL ENTRY AND CHANGES NO NODE — so this member is one of the product's NON-STORE-REACHING members
572
+ * beside `register` and `settle`, and `§2.4` item 9 (f)'s rule (ii) has no subject at it.
573
+ *
574
+ * **WHAT IS RETURNED, EXACTLY — THE PAIRS AND NOT THE FUNCTIONS:** a **FRESH JS ARRAY on every call**,
575
+ * whose **every element is a FRESH plain object carrying EXACTLY TWO MEMBERS** — `address` (a fresh array of
576
+ * the store's own segments) and `id` (the constraint's own BARE `id`, a `string`) — the same two data the
577
+ * kernel's own registry is keyed by. **The empty array `[]` is the declared value where the instance carries
578
+ * no pair at all** (`PAR-JS-27`'s `domain` cell).
579
+ *
580
+ * **THE FOUR DECLARED EXCLUSIONS, EACH STATED SO A DECLARATION THAT VIOLATED ONE WOULD BE VISIBLE AT ITS OWN
581
+ * BYTES:**
582
+ * 1. **NO CONSTRAINT FUNCTION IS RETURNED** (item 3, four named grounds — the operative one being the
583
+ * anti-pattern rulings' *do not hand out a value whose later use the contract cannot bound*). The
584
+ * `Constraint` type below is that function and **NO MEMBER OF THIS RETURN CARRIES ONE**; a disabled pair
585
+ * makes the hazard sharp, since `constraintOff` parks a stub in the kernel while the caller's function is
586
+ * kept in the entry.
587
+ * 2. **NO OPAQUE IDENTITY IS EXPOSED** (item 4): `ConstraintIdentity` is NOT reachable through this return —
588
+ * `PAR-JS-25`'s opacity would break the moment a consumer read one out of the array. **The pair is the
589
+ * caller's own datum; the identity is this unit's opaque handle for it, and the two are NOT the same
590
+ * datum.**
591
+ * 3. **NO ORDER IS PROMISED** (item 6): the returned array's order is **UNDECLARED** and a consumer compares
592
+ * the pairs **as a SET and never as a sequence** (`DD-22`; `§2.7` item 3). **Nothing in this declaration
593
+ * may be read as a registration order, an address order or a `seq`-like ordinal.**
594
+ * 4. **A DISABLED PAIR DOES APPEAR** (item 5): `constraintOff` is a TOGGLE and NOT A REMOVAL, so a pair it
595
+ * disabled is STILL REGISTERED and still enumerated — **and therefore there is NO `enabled` member on an
596
+ * element and NO way to read a pair's state off this return**; the state is read at the toggles' own
597
+ * clauses. **No removal route exists**, so an absence here means nothing was ever registered.
598
+ *
599
+ * **THE COVERAGE, BOTH POPULATION ROUTES ON ONE FOOTING** (item 7): a pair the batch registered at
600
+ * `storeCreate` (`cfg.constraints`) and a pair `addConstraint` registered appear alike, because *"the entry
601
+ * carries a pair if and only if a function stands registered at that pair in the kernel's own pair-keyed
602
+ * registry"*. **The two declared exclusions are therefore structural**: a well-formed `cfg.constraints`
603
+ * element that carried no function is **not** a carried pair and does not appear, and a REFUSED
604
+ * registration — at the batch loop or at `addConstraint` — leaves the entry exactly as it stood and does not
605
+ * appear. **An overwrite changes no membership**: a second `addConstraint` at a held pair replaces the
606
+ * function at the SAME pair and returns the SAME identity, so the pair is carried ONCE before and after.
607
+ *
608
+ * **IT ADDS NO POPULATION ROUTE** (`§2.12` item 2-bis): the two routes stand at TWO, and a read closes none
609
+ * and opens none. **It is NOT a `pending()` reader, NOT an `attempts()` enumerator and NOT a live view of a
610
+ * running commit**; it announces no identity, no function and no order.
611
+ *
612
+ * **AND IT MOVES NO OTHER FIGURE**: the module namespace keeps its ONE name `storeCreate` (`§2.9` item 1's
613
+ * `A127` clause, `11 → 1` ✓), the kernel's extent stays FIVE with no `K-6` proposed (`§2.4` item 9 (f),
614
+ * item 8 — the pairs are read from the entry's OWN registry, which is keyed exactly as the kernel's is), the
615
+ * store's closed `16`-member set is not reached, the kernel's `KC` set stands closed at `8`, and the register
616
+ * keeps its `8` rows.
617
+ *
618
+ * **It is NOT a named export of this entry** (`package.md §1.3` item 3): it is reached through
619
+ * `storeCreate`'s own product alone.
620
+ */
621
+ constraints(): ConstraintPair[];
548
622
  }
549
623
 
550
624
  /**
@@ -565,6 +639,15 @@ export function storeCreate(cfg: StoreConfig): StoreInstance;
565
639
  * `string`** — **and NOT the whole of a batch element**, which is this pair PLUS its constraint function.
566
640
  * **Every outside form of the pair throws the three methods' one `TypeError`**, and **a well-formed pair
567
641
  * the entry does not carry is outside the two toggles' domain**: it is NOT a third population route.
642
+ *
643
+ * **⟶ AND THIS SHAPE IS ALSO THE ELEMENT OF THE FOURTH MEMBER'S RETURN, ADDED 2026-10-17**
644
+ * (`surface.md §2.4` item 9 (f)'s `constraints` clause; `parameter-semantics.md §2.27` = `PAR-JS-27`,
645
+ * `return-field`): `a.constraints()`'s every element carries **exactly these TWO members and no third** —
646
+ * the `address` a pair was registered under and its bare `id` — **and NEITHER the constraint function nor the
647
+ * opaque identity** (`PAR-JS-25`'s opacity, unmoved). **THE TWO ROLES ARE ONE SHAPE AND NOT TWO**: this is the
648
+ * caller's own datum entering at `addConstraint` (and at `cfg.constraints`' elements, which are this pair
649
+ * PLUS a `constraint`) and coming back out at the read. **`Row 27`'s `alt` cell refuses an `enabled` member on
650
+ * the element**, so no third member is declared here and this interface is left exactly as it stood.
568
651
  */
569
652
  export interface ConstraintPair {
570
653
  readonly address: Address;
package/index.mjs CHANGED
@@ -1997,6 +1997,16 @@ export function storeCreate(cfg) {
1997
1997
  constraintOff(pair, constraint) {
1998
1998
  return constraintToggle(false, instance, arguments.length, pair, constraint);
1999
1999
  },
2000
+ /// **`surface.md §2.4` item 9 (f)'s `constraints` clause of 2026-10-17: `a.constraints() -> Array<{ address,
2001
+ /// id }>` — THE REGISTERED-PAIR READ, the thirteenth own member (`10 + 1 + 1 + 1 = 13` ✓; `PAR-JS-27`;
2002
+ /// `§2.12` item 2-bis).** **THE RECEIVER IS THE STORE, THE CALL TAKES NO ARGUMENT (arity `0`) AND IT
2003
+ /// THROWS NOTHING** — there is no outside argument for the class test to refuse, and the call makes no
2004
+ /// store call, mints no code, appends no journal entry and changes no node. **It is NOT a named export of
2005
+ /// the entry** (`package.md §1.3` item 3; `§2.9` item 1's `A127` clause, `11 → 1` ✓): it is reached
2006
+ /// through the factory's own product alone.
2007
+ constraints() {
2008
+ return enumerateConstraints(state);
2009
+ },
2000
2010
  /// `surface.md §2.4` item 5 (b): `register(handle, listener) -> undefined` — the OPAQUE handle a verb
2001
2011
  /// returned or the construction adopted, and ANY JS function. **It is NOT a named export of the entry**
2002
2012
  /// (`package.md §1.3` item 3): it is reached through the factory's own product alone.
@@ -3150,6 +3160,55 @@ function constraintToggle(enabled, instance, n, pair, constraint) {
3150
3160
  return undefined;
3151
3161
  }
3152
3162
 
3163
+ /// **THE REGISTERED-PAIR READ — `surface.md §2.4` item 9 (f)'s `constraints` clause of 2026-10-17, items 2–8,
3164
+ /// AND ITS REGISTER ROW `PAR-JS-27` (`parameter-semantics.md §2.27`).** `a.constraints() -> Array<{ address,
3165
+ /// id }>`: **a FRESH JS ARRAY on every call, whose every element is a FRESH PLAIN OBJECT carrying EXACTLY
3166
+ /// TWO MEMBERS** — `address`, a FRESH JS array of the store's own segments, and `id`, the constraint's own
3167
+ /// BARE `id`, a `string` — the same two data the kernel's own registry is keyed by.
3168
+ ///
3169
+ /// **THE SOURCE IS THE ENTRY'S OWN `state.constraints`, AND ITS SHAPE IS ALREADY THE ANSWER'S**: a per-instance
3170
+ /// `Map` keyed by `constraintPairKey(address, id)` whose every value is the record `carryConstraint` writes —
3171
+ /// `{ address, addressKey, id, fn, enabled, identity }`. So the read is a CARRIAGE READ and no kernel item is
3172
+ /// touched or minted: `K-1`–`K-5` stand exactly as printed, the kernel's extent stays FIVE and no `K-6` is
3173
+ /// proposed (`§2.4` item 9 (f), item 8). **NO KERNEL MODULE IS EVEN LOADED HERE** — `constraintsKernel()` is
3174
+ /// not called, so a product that never carried and never asked for a constraint still reads `[]` on a tree
3175
+ /// that stages nothing beside it (`kernel-surface.md §1` item 1's lazy resolution).
3176
+ ///
3177
+ /// **THE FOUR DECLARED EXCLUSIONS, EACH HONOURED AT THIS SITE AND NAMED HERE SO THE CODE CAN BE READ AGAINST
3178
+ /// THEM:**
3179
+ /// * **(1) NO CONSTRAINT FUNCTION IS RETURNED** (item 3, four grounds, the operative one for this frame being
3180
+ /// the anti-pattern rulings: *do not hand out a value whose later use the contract cannot bound*). The
3181
+ /// element is BUILT FRESH from `entry.address` and `entry.id`, so `entry.fn` is never read, referenced or
3182
+ /// copied — and a disabled pair's parked stub is not reachable either, because a function is never touched
3183
+ /// at all.
3184
+ /// * **(2) NO OPAQUE IDENTITY IS EXPOSED** (item 4; `PAR-JS-25`'s opacity would break the moment a consumer
3185
+ /// read one out of the array). `entry.identity` is not read and no element carries it.
3186
+ /// * **(3) NO ORDER IS PROMISED, AND NONE IS MANUFACTURED** (item 6): the enumeration is `Map` iteration order
3187
+ /// and nothing else — **this function does NOT sort, and deliberately does not** — so a drive compares the
3188
+ /// pairs as a SET and never as a sequence (`DD-22`; `§2.7` item 3). No registration order, address order or
3189
+ /// `seq`-like ordinal is minted here, and none is asserted of it.
3190
+ /// * **(4) A DISABLED PAIR DOES APPEAR** (item 5): `constraintOff` is a TOGGLE and NOT A REMOVAL, so a pair
3191
+ /// whose `entry.enabled` is `false` is STILL CARRIED and is enumerated — **the read does not consult
3192
+ /// `enabled` at all**, and it returns no `enabled` member either (a third member is a value no clause
3193
+ /// declares).
3194
+ ///
3195
+ /// **AND THE TWO EXCLUSIONS ITEM 7 DECLARES ARE STRUCTURES AND NOT TESTS TAKEN HERE**: (i) a well-formed
3196
+ /// `cfg.constraints` element that carried no function never reached `carryConstraint` (`storeCreate`'s batch
3197
+ /// loop skips it), so it is no entry and cannot appear; and (ii) a refused registration wrote no entry
3198
+ /// (`carryConstraint`: *"THE ENTRY'S OWN RECORD IS WRITTEN ONLY WHERE THE REGISTRATION STOOD"*), so it
3199
+ /// cannot appear either. **THE SAME TWO MEMBERS ON EVERY ELEMENT AND NO THIRD**, and the `[]` arm is this
3200
+ /// member's declared value where the entry carries no pair at all (`PAR-JS-27`'s `domain` cell).
3201
+ function enumerateConstraints(state) {
3202
+ const pairs = [];
3203
+ for (const entry of state.constraints.values()) {
3204
+ // A FRESH PLAIN OBJECT PER CALL AND A FRESH SEGMENT ARRAY WITHIN IT (`slice`): a caller that mutates a
3205
+ // returned element, or an element's `address`, changes nothing the next call returns — and nothing of the
3206
+ // entry's own record either, the two members being copies of the pair's own data.
3207
+ pairs.push({ address: entry.address.slice(), id: entry.id });
3208
+ }
3209
+ return pairs;
3210
+ }
3211
+
3153
3212
  /// **WHETHER THIS INSTANCE CARRIES A PAIR AT THIS WRITE'S ADDRESS** (`§2.12` item 1's preamble clause (a)) —
3154
3213
  /// the gate stage 1 takes before the kernel is reached at all. **THE CLASS DECISION COMES FIRST AND NO TRAP
3155
3214
  /// IS RUN ON ANY PATH** (`DD-34`): a `Proxy` address, a class extending `Array` and every non-array lies
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "provident-storeroom",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "U-STOREROOM-PUBLISH: the published Node ESM binding for the native Rust store of Provident-Storeroom — the entry resolves the scoped per-target platform package first, the checkout's own module-relative addon second, and answers the store's single declared absent-addon form when neither loads",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0",
@@ -38,11 +38,11 @@
38
38
  "src/constraint-kernel.mjs"
39
39
  ],
40
40
  "optionalDependencies": {
41
- "@auspicion/provident-storeroom-js-linux-x64-gnu": "0.4.0",
42
- "@auspicion/provident-storeroom-js-linux-arm64-gnu": "0.4.0",
43
- "@auspicion/provident-storeroom-js-darwin-x64": "0.4.0",
44
- "@auspicion/provident-storeroom-js-darwin-arm64": "0.4.0",
45
- "@auspicion/provident-storeroom-js-win32-x64-msvc": "0.4.0"
41
+ "@auspicion/provident-storeroom-js-linux-x64-gnu": "0.5.0",
42
+ "@auspicion/provident-storeroom-js-linux-arm64-gnu": "0.5.0",
43
+ "@auspicion/provident-storeroom-js-darwin-x64": "0.5.0",
44
+ "@auspicion/provident-storeroom-js-darwin-arm64": "0.5.0",
45
+ "@auspicion/provident-storeroom-js-win32-x64-msvc": "0.5.0"
46
46
  },
47
47
  "publishConfig": {
48
48
  "access": "public"
@@ -1625,13 +1625,43 @@ function composeRollback(kernel, attempt) {
1625
1625
  callList.reverse();
1626
1626
  // THE REVERSALS EARLIER RETURNED CALLS PERFORMED — the store's own reports, the only member item 5's
1627
1627
  // "still owes" predicate (and item 5 (a)'s skip) is decided by.
1628
+ //
1629
+ // ⟶ AND THE PREDICATE IS THE MEMBER ALONE, READ AGAINST THE SET IT NAMES — CORRECTED 2026-10-17, AT THE
1630
+ // TEMPORAL-STOP AMENDMENT, AND THE CORRECTION IS NAMED WITH WHAT IT WAS AND WHAT IT IS BECAUSE THIS IS
1631
+ // THE ONE KERNEL EDIT THE AMENDMENT OWES. **WHAT IT WAS:** the guard below was
1632
+ // `!performed.includes(op.opId)`, which is the same reading ONLY WHILE THE STORE'S PER-OP REACH WAS
1633
+ // TOTAL OVER THE WHOLE ADDRESSED SUBTREE — under that reach an op's ABSENCE from every earlier
1634
+ // `undoneOps` member proved a call still owed it, because a call's `undoneOps` was the whole of what lay
1635
+ // under its own op. **WHAT IT IS:** under the amended scope an entry `E` is in scope iff `op.address` is
1636
+ // a prefix of `E.address` **AND** `E.seq` >= the named op's own `seq` (`A: docs/specs/storeroom-native/
1637
+ // write-and-read.md §6.4` item 1's `M-5` amendment and item 3's `M-7` amendment, both 2026-10-16;
1638
+ // `A: docs/decisions.md` · the architect's rulings *"Add temporal stop to the rollback."* and
1639
+ // *"Overshoot is a defect."*), so the store's own walk **STOPS AT THE NAMED OP** — this composition
1640
+ // passes ops in reverse creation order, so an op it has already passed is OLDER than every op a later
1641
+ // call names, is IN THE ADDRESSED SUBTREE AND OUT OF SCOPE, and the store does NOT report it undone by
1642
+ // that later call. The skip's premise is therefore void exactly there, and a still-owed op whose `opId`
1643
+ // stands in no earlier `undoneOps` member **GETS ITS OWN CALL.**
1644
+ //
1645
+ // **THE RULE ABOVE THIS LINE IS UNCHANGED AND SO IS ITS OBSERVABLE — WHICH IS WHAT THE AMENDED CLAUSE
1646
+ // DECLARES AT ITS OWN SITE** (`composition-and-states.md §2.6` item 5 (a)'s 2026-10-16 mark: *"a call's
1647
+ // totality is TOTAL OVER THE TEMPORALLY BOUNDED SET and never over the whole addressed subtree"*, and
1648
+ // *"the kernel still reads only the returned `undoneOps` member and still reasons about no mark"*): the
1649
+ // kernel derives NOTHING from a cross-call premise below. The guard reads the step index `i` instead of
1650
+ // `op.opId` for the ONE reason the two differ and this file's own work loop needs them to: a composition
1651
+ // may in principle receive one `opId` twice (every arm this unit drives holds unique ids), and step `i`
1652
+ // is the step a call over the `i`-th member ISSUED — the op's own id is what the store was NAMED, never
1653
+ // which member it was. **NO CLAUSE MOVES WITH IT: the step count stays the calls ISSUED, `failed` stays
1654
+ // that call's own answer, no mark is consulted and the walk still stops at the failing call.**
1628
1655
  const performed = [];
1656
+ const recorded = [];
1629
1657
  let floor = null;
1630
- for (const op of callList) {
1631
- const owed = !performed.includes(op.opId);
1658
+ for (let i = 0; i < callList.length; i += 1) {
1659
+ const op = callList[i];
1632
1660
  // (2) THE SKIP: an op an earlier returned call's own `undoneOps` already reports undone is not still
1633
- // owed, so NO call is issued over it and no step stands for it (item 5 (a)).
1634
- if (!owed) continue;
1661
+ // owed, so NO call is issued over it and no step stands for it (item 5 (a)) — and under the amended
1662
+ // scope that is the WHOLE of it: absence from the member is evidence of nothing beyond the store's own
1663
+ // performed set, so an op the member does not name GETS ITS OWN CALL.
1664
+ if (recorded.includes(i)) continue;
1635
1665
  let answer = 'ok';
1636
1666
  let failed = false;
1637
1667
  let record = null;
@@ -1661,6 +1691,11 @@ function composeRollback(kernel, attempt) {
1661
1691
  });
1662
1692
  for (const undone of undoneOps) {
1663
1693
  if (!performed.includes(undone)) performed.push(undone);
1694
+ // THE STEPS THAT ARE ALREADY — RECORDED BY THE MEMBER'S OWN NAMES, WHICH IS THE PREDICATE'S ONE
1695
+ // SOURCE (`item 5 (a)`, unmoved): an op this member names is one this composition has performed.
1696
+ for (let at = i + 1; at < callList.length; at += 1) {
1697
+ if (callList[at].opId === undone && !recorded.includes(at)) recorded.push(at);
1698
+ }
1664
1699
  }
1665
1700
  // AND THE WALK STOPS AT THE FAILING CALL: a call that met either floor code is the composition's
1666
1701
  // LAST — "the walk STOPS at the failing call" (`§2.6` item 6 (a); `fail-surface.md §2`'s `KC-8`