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 +84 -1
- package/index.mjs +59 -0
- package/package.json +6 -6
- package/src/constraint-kernel.mjs +39 -4
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.
|
|
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.
|
|
42
|
-
"@auspicion/provident-storeroom-js-linux-arm64-gnu": "0.
|
|
43
|
-
"@auspicion/provident-storeroom-js-darwin-x64": "0.
|
|
44
|
-
"@auspicion/provident-storeroom-js-darwin-arm64": "0.
|
|
45
|
-
"@auspicion/provident-storeroom-js-win32-x64-msvc": "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 (
|
|
1631
|
-
const
|
|
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
|
-
|
|
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`
|