provident-storeroom 1.0.1 → 1.1.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.guide.md CHANGED
@@ -30,6 +30,32 @@ pins, `§8.1`'s *"an installed `0.5.0`"*, and `§11`'s manifest table.** **AND T
30
30
  IS UNMOVED: no `npm install` was run against the registry, so a registry-installed `1.0.0` is described here from
31
31
  the manifest and from measurements on this checkout, and is still not witnessed.**
32
32
 
33
+ **⟶ AND THE FIGURE THAT CORRECTION CARRIES IS ITSELF ONE RELEASE BEHIND, 2026-10-27 — THE VERSION THIS GUIDE
34
+ DESCRIBES IS `1.0.1`, AND EVERY `1.0.0` THIS GUIDE PRINTS READS `1.0.1` FROM HERE ON.** `RCA-8(g)`
35
+ ANNOTATE-BESIDE: **the paragraph above stands BYTE-FOR-BYTE and is read THROUGH this clause — so do its reading of
36
+ `0.5.0` and its reading of `1.0.0`; each was true of the tree it was read on and each is one release behind the
37
+ shipped tree from this date.** **THE MANIFEST AT ITS OWN BYTES: `bindings/js/package.json`'s `version` is
38
+ `"1.0.1"`, and all five `optionalDependencies` pins are `1.0.1` with it** — the six figures move together and never
39
+ singly (§0 item 1; `PUB-DD-10`) — **and the tags the tree carries are `v1.0.0` and `v1.0.1`, with `main` sixteen
40
+ commits past `v1.0.1` and no version bump in any of them** (`git describe` at this date reads `v1.0.1-16-gdf3ef88`;
41
+ `D-41` item `1`'s semver ruling names the next release `1.1.0`, and that release has not been cut). **SO THE SITES
42
+ ARE RE-READ, NOT RE-SPELLED:** §2.2's five exact pins, §8.1's *"an installed `0.5.0`"* — itself already corrected to
43
+ `1.0.0` — and §11's manifest table all read `1.0.1`; **every `0.5.0` this guide prints is the figure of its writing
44
+ date and reads `1.0.1` from here on.** **AND THE ONE THING NO PASS WITNESSED IS STILL UNMOVED: no `npm install` was
45
+ run against the registry, so a registry-installed `1.0.1` is described here from the manifest and from
46
+ measurements on a locally packed, installed artefact, and is still not witnessed as a registry download.**
47
+
48
+ **AND ONE THING A READER OF THE INSTALLED PACKAGE SHOULD KNOW BEFORE THE CITATIONS: WHEN THIS DOCUMENT IS AT
49
+ `node_modules/provident-storeroom/README.guide.md`, IT IS THIS GUIDE.** **Its ONE authored home is
50
+ `docs/guides/package-use.md` in the repository, and the release's assembly stages it byte-for-byte at the packaging
51
+ root as `README.guide.md`, beside `README.md`, where the manifest's `files` row ships it** (`PUB-DD-11`;
52
+ `docs/specs/storeroom-publish/contract.md §2.3` item `3`; `scripts/publish.sh`'s guide stage). **The paths this guide
53
+ cites — `bindings/js/…`, `docs/specs/…`, `tests/…` — are the CHECKOUT's, and they do not travel in the tarball; a
54
+ consumer reading from `node_modules` has this guide's text and the package's own shipped bytes (`index.mjs`,
55
+ `index.d.ts`, `README.md`, `src/`), and every declaration a citation names is answered first by those bytes.** **So
56
+ nothing here is addressed to a checkout reader alone: the installed tree carries this text unaltered, and a clause
57
+ that names a repository path says where its authority lives, not where you must stand to use it.**
58
+
33
59
  **Every figure carries one of four marks, and the four are not the same thing:**
34
60
 
35
61
  | the mark | what it means |
@@ -156,6 +182,13 @@ range, all six figures moving together (§0 item 1; `PUB-DD-10`).** **`1.0.0` is
156
182
  §11), so the main `version` and the five pins are one figure and a consumer who reads a `0.5.0` anywhere in a
157
183
  manifest has the wrong package.**
158
184
 
185
+ **⟶ AND THE FIGURE MOVES AGAIN, 2026-10-27: each of the five is pinned to `1.0.1`, not `1.0.0`**
186
+ (`bindings/js/package.json`, read at its own bytes; §0's correction of this date; `RCA-8(g)` ANNOTATE-BESIDE — the
187
+ two clauses above stand and are read THROUGH this one). **THE READING THEY TEACH IS UNMOVED AND IS THE POINT: five
188
+ EXACT pins, no caret, no tilde and no range, all six figures moving together (§0 item 1; `PUB-DD-10`) — so `1.0.1`
189
+ is the package's own version and the five pins' one figure, and a consumer who reads anything else in a manifest
190
+ has the wrong package.**
191
+
159
192
  ### §2.3 The three rungs
160
193
 
161
194
  1. **RUNG ONE — the scoped platform package for this runtime's `process.platform` × `process.arch` key.** This is
@@ -756,6 +789,11 @@ BYTE and is read THROUGH this clause). **(i) *"The store implements seventeen (`
756
789
  NINETEEN**: `src/error.rs`'s `CODES` is `[&str; 19]`, ranks `18` and `19` being the two this set's 2026-10-26 ruling
757
790
  appended — **so the declaration of record and the crate agree at nineteen, which is the row above.** **(ii)
758
791
  *"installed `0.5.0`"* READS `1.0.0`** (`bindings/js/package.json`, read at its own bytes; §0's correction clause).
792
+
793
+ **⟶ AND THAT CORRECTED FIGURE IS ITSELF ONE RELEASE BEHIND, 2026-10-27: *"installed `0.5.0`"* READS `1.0.1`**
794
+ (`bindings/js/package.json` at its own bytes; §0's correction of this date; `RCA-8(g)` ANNOTATE-BESIDE — the
795
+ sentence above stands and is read THROUGH this one). **THE SENTENCE'S OWN POINT IS UNMOVED: the escape arm is what
796
+ keeps a member the set has since gained typeable in an installed copy, and the set is the store's to close.**
759
797
  **(iii) THE SET HAS NOW MOVED FOUR TIMES, NOT THREE**: fourteen to fifteen, fifteen to sixteen, sixteen to
760
798
  seventeen, **and seventeen to nineteen** — **the escape arm's argument is strengthened rather than weakened by the
761
799
  fourth move, which is exactly the arm's own evidence.** **NO TABLE ROW, NO RANK AND NO TRIGGER MOVES, and the two
@@ -876,6 +914,21 @@ defect** (`DD-28`; `native/contract.md §7.2` item 6; `write-and-read.md §4.3`'
876
914
  **What this means for you, in one line: durability is a property of `file`-tier WRITES. If you delete something
877
915
  durable and the process then restarts, expect it back — and delete it again after the boot, or write over it.**
878
916
 
917
+ **⟶ AND THE SENTENCE ABOUT THE BYTES IS ONE PRODUCER SHORT, 2026-10-27 — A REFUSED REVERSAL'S RESTORE NOW WRITES
918
+ THEM WHERE IT MOVED A `file`-TIER NODE (`bd0fd8c`).** `RCA-8(g)` ANNOTATE-BESIDE: **the section above stands
919
+ BYTE-FOR-BYTE and is read THROUGH this clause; THIS clause is a PURE INSERTION and moves no verb, no tier, no status
920
+ and no record.** **WHAT MOVED: the restore a REFUSED `rollback` performs — the compensating act that puts the state
921
+ back before the reversal — takes the `file` tier's projection before it and again after it, and where a version
922
+ standing at `Tier::File` moved it SAVES the restored image with the store's one writer.** **SO THE BYTES AT
923
+ `filePath` ARE THE LAST SUCCESSFUL SAVE'S, whose producers are a `file`-tier `write`'s commit AND a restore that moved
924
+ a file-tier node** — and **`and no other state` stands whole: the boot reads the register image at the file tier and
925
+ nothing else** (`native/contract.md §6.6` item `5`'s clause of 2026-10-27, the declaration's one home; `DD-28`'s
926
+ amended cell). **WHAT DOES NOT MOVE, SAID SO THE READING IS NOT TAKEN WIDER THAN IT IS:** **a `delete` still performs
927
+ no file I/O and a SUCCESSFUL `rollback` still performs none either**, so the paragraph above holds for both — the
928
+ removed version still stands again after the re-boot; **the save is the REFUSED arm's alone, it appends no journal
929
+ entry (a save is an effect and not an op), and a save that cannot land is reported (`FileCommitFailed`, the
930
+ in-memory state restored and the bytes not updated) rather than swallowed.**
931
+
879
932
  ### §9.4 When the save itself fails
880
933
 
881
934
  **On a `file`-tier write's save that fails — the act itself failing, not a constraint — the store rolls the write
@@ -1016,6 +1069,24 @@ contract.**
1016
1069
  clause). **`name`, `type`, `license`, `engines`, `exports` and `files` are UNMOVED and were re-read at the same
1017
1070
  bytes; the five `files` rows are still a fact of this tree and not a rule (the ★ paragraph below).**
1018
1071
 
1072
+ **⟶ AND THE TWO FIGURES THAT CLAUSE CORRECTS MOVE AGAIN, 2026-10-27: `version` is `1.0.1` and each of the five
1073
+ `optionalDependencies` is pinned to `1.0.1`** (`bindings/js/package.json`, read at its own bytes; §0's correction of
1074
+ this date; `RCA-8(g)` ANNOTATE-BESIDE — the table and the correction above stand and are read THROUGH this clause).
1075
+ **AND THE `files` ROW'S OWN FIGURE IS RE-READ AT ITS OWN SITE IN THE CLAUSE BELOW: it reads SIX rows, the sixth
1076
+ being the consumer guide's landed copy, `README.guide.md`.**
1077
+
1078
+ **⟶ AND THE FIVE FIGURES THIS GUIDE PRINTS ABOUT THE SHIPPED TREE ARE RE-MEASURED AT IT ON ONE DATE, 2026-10-27, SO
1079
+ THE GUIDE IS NOT LEFT ONE TREE BEHIND ANY OF THEM.** `RCA-8(g)` ANNOTATE-BESIDE: **every table row, every ★
1080
+ paragraph and every figure above stands BYTE-FOR-BYTE and is read THROUGH this clause; THIS clause adds no rule and
1081
+ moves no figure — it records, at one date, the reading of each figure the guide states about the shipped tree, and
1082
+ each is the figure its own clause already prints.** **THE FIVE, EACH WITH ITS MEASUREMENT:**
1083
+ 1. **THE STATUS SET IS TWENTY** — `src/error.rs`'s `CODES` is `[&str; 20]`, ranks `1`…`20`, and the declaration of record (`index.d.ts`, `StoreStatus`) agrees with the crate at twenty (§8.1's heading, its table's `20` row and its dated clauses).
1084
+ 2. **THE PACKED MEMBER SET IS NINETEEN BARE AND TWENTY ASSEMBLED** — measured with `npm pack --json` at `bindings/js`: the BARE tarball carries `19` paths (`1` `package.json` + `4` root files — `README.guide.md` among them + `13` entry modules + `1` kernel: `1 + 4 + 13 + 1 = 19` ✓), and the ASSEMBLED tarball — the same stage with the release's `LICENSE` copy — carries `20`, the nineteen plus the licence (the ★ re-read clause (ii) below; the installed battery's `INSTALL-01` prints `members=20` on every run).
1085
+ 3. **THE ALLOWLIST IS SIX ROWS** — `bindings/js/package.json`'s `files` reads `index.mjs` · `README.md` · `README.guide.md` · `index.d.ts` · `src/entry/` · `src/constraint-kernel.mjs` (`6 = 4 + 2` ✓) — **and `README.guide.md` is THIS document's landed copy** (§0's clause on the landing; the ★ re-read clause (i) below).
1086
+ 4. **THE INSTANCE CARRIES FOURTEEN OWN MEMBERS** — measured on an instance built in memory from the shipped artefact: `Object.keys` and `Object.getOwnPropertyNames` are both the same fourteen-name list, and `read`'s own descriptor reads `writable: true, enumerable: true, configurable: true` (§3's table; §3.1).
1087
+ 5. **THE DEPTH CEILING IS `126`** — the crossing's guard reads `depth > 126` (`bindings/js/src/crossing.rs`), so a value of depth `126` is admitted and one of depth `127` is refused; the node ceiling stands at `1,000,000` beside it (`json-crossing/contract.md §4`'s clause; §10.4).
1088
+ **NO FIGURE MOVES BY THIS CLAUSE, AND THE ONE THING IT ADDS IS THE DATE ON WHICH ALL FIVE WERE READ AT THE SAME TREE.**
1089
+
1019
1090
  **★ THE `exports` MAP HAS ONE ARM, AND THAT IS A PROMISE ABOUT WHAT IS REACHABLE:** **the addon is NOT reachable
1020
1091
  as a subpath and neither is the constraint kernel.** **There is no wildcard export, no deep import to the addon
1021
1092
  and no CJS arm** (`bindings/js/README.md`; `docs/specs/storeroom-publish/contract.md §1.3`;
@@ -1202,6 +1273,21 @@ that a read-back's prototype is or is not a particular object.** **What IS decla
1202
1273
  tree sharing no mutable member with the store or with another crossing**, which is the guarantee worth relying on
1203
1274
  (`json-crossing/contract.md §5`, item (3)(c)).
1204
1275
 
1276
+ ### §12.6b The two known fail-states, and how you leave them
1277
+
1278
+ **⟶ ADDED `1.1.0` — THIS IS THE ONE PART OF THE PROMISE A CONSUMER READING ONLY `node_modules` HAD NOWHERE TO FIND, AND IT SHIPS HERE BECAUSE THIS DOCUMENT SHIPS.**
1279
+
1280
+ **Two windows in the constraint machinery are known and are NOT defects. Each is a state you can leave.**
1281
+
1282
+ 1. **A `delete`'s listener delivery.** A listener invoked by a delete's delivery runs **no constraint pass** — there is no attempt for a pass to run over. **A `rollback` issued from inside it is unjudged, and its effect stands.**
1283
+ 2. **A registration's own evaluation.** `addConstraint`'s and `constraintRegister`'s evaluation of a supplied body runs **no pass** for the same reason — **an action raised there is unjudged and its effect stands.**
1284
+
1285
+ **THE FIRST EXIT — RELOAD THE FILE.** Since `1.1.0`, **a restore that moved a version standing at the `file` tier SAVES the restored image**, so **the file records the state the store was restored to, and a fresh boot over that path returns to judged bytes.**
1286
+
1287
+ **THE SECOND EXIT — REGENERATE THE STORE.** Construct a new instance and replay your writes; **a judged state by construction.**
1288
+
1289
+ **Neither window is new and neither is a defect**: both are places **a pass does not begin**, not places a judgement was skipped mid-flight. **And every pass that DOES run drains its own restart request** — so the fail-state is bounded by the two acts that run none.
1290
+
1205
1291
  ### §12.7 A skip is not a green, and your own throws are not refusals
1206
1292
 
1207
1293
  **WHAT BREAKS:** **a `skipped` cell is a cell that DID NOT RUN** — *"a skip is not a green"*, in the authority
package/index.d.ts CHANGED
@@ -465,6 +465,26 @@ export interface DeleteRecord {
465
465
  readonly tiers: readonly Tier[];
466
466
  /** **THE TRIGGER'S PAIRS** (`contract.md §2.4` item 1; `PAR-HL-38`; `A43` — a delete fires its own set). */
467
467
  readonly triggered: readonly TriggerPair[];
468
+ /**
469
+ * **THE OP THE `delete` LANDED — THE STORE'S OWN JOURNAL RECORD, `null` WHERE THE ACT REMOVED NOTHING**
470
+ * (`strata/decisions.md` · `D-43` item 3, the architect, verbatim: *"Delete should be journaled and
471
+ * reversible"*).
472
+ *
473
+ * **IT IS THE MEMBER `WriteRecord` CARRIES, AT THE SAME NAME AND THE SAME TYPE** (`WriteRecord.op` above,
474
+ * the store's own eight-member `JournalOp`), so a caller has **one spelling for "the op this act landed"**
475
+ * and one route to reversing it: `store.rollback(record.op.opId)` restores every version the delete
476
+ * removed, **at its own tier**, exactly as a write's reversal restores what the write replaced.
477
+ *
478
+ * **THE MEASURED FACT THIS MEMBER EXISTS FOR.** The delete was already journaled — the store appended one
479
+ * entry carrying the address, the per-tier before-state and an op id, and `rollback` already accepted that
480
+ * id — but the record carried no identity, so **the act could not be NAMED, and an act that cannot be
481
+ * named cannot be reversed**: that is why the kernel's unwinding could not reach a delete's effect at all.
482
+ *
483
+ * **AND `null` IS THE `D-3` ARM, SAID PLAINLY.** A delete that removes no version is a **success** with
484
+ * `tiers: []` (`§4.4` arm `D-3`; `native contract.md §6.5` item 11 adds `triggered: []`) and appends no
485
+ * journal entry, so there is no op to carry: **nothing is named because nothing was destroyed.**
486
+ */
487
+ readonly op: JournalOp | null;
468
488
  }
469
489
 
470
490
  /**
@@ -665,6 +685,16 @@ export interface StoreInstance {
665
685
  * call `a.rollback(w.op.opId)`, whose id is the string `write` returned, is a correct call.
666
686
  */
667
687
  rollback(opId: string): RollbackRecord;
688
+
689
+ /**
690
+ * **⟶ AND IT THROWS: `1.1.0`'S DECLARATION, ADDED BESIDE THE SIGNATURE RATHER THAN IN IT.** **`rollback` was
691
+ * TOTAL at `1.0.1` — it answered a `RollbackRecord` and could not fail. It is PARTIAL now**: **a reversal the
692
+ * registered constraints do not admit REFUSES**, throwing the one plain form `{status, message, log}` with
693
+ * `status: 'ConstraintPassRefused'`, **and the store is restored to the state it stood at before the reversal**
694
+ * (`D-38`, `D-40`, `D-41`). **A TypeScript signature has no `throws` clause, so this is the honest place to say
695
+ * it**: *the return type describes what a call returns when it returns, and the throw is part of the contract.*
696
+ * **A lawful reversal is unchanged** — same record, same members, no `log`. **Callers on `1.0.1` must handle it.**
697
+ */
668
698
  /**
669
699
  * Begin watching the addresses the caller names under the caller's own handle.
670
700
  *
package/index.mjs CHANGED
@@ -312,12 +312,20 @@ export function storeCreate(cfg) {
312
312
  // the receiver is known to be one. **NO TOKEN IS MINTED AND NO SECOND FORM IS BUILT** — the entry's own
313
313
  // refusal is what answers, reached by handing the receiver on.
314
314
  if (!isStoreReceiver(this)) return decodeValue(carryRefusal(() => entryOf().write.call(this), []));
315
- // **⟶ `§4.1`: `write` OPENS ONE — AND A KERNEL-DRIVEN WRITE JOINS THE EXTANT RATHER THAN OPENING A
316
- // SECOND.** The bracket is taken at this member's OWN opening, so the kernel's four-position leg and a
317
- // listener body's nested write both find the count above zero and join it (`openCommit`). **THE
318
- // DECREMENT IS ON THE FINAL RETURN TO THE CLIENT** (`closeCommit`), taken in a `finally` so the bracket
319
- // is released on every arm — a count left standing after a return is on `§5`'s failure list.
320
- const opened = openCommit(instance);
315
+ // **⟶ `§4.1`: `write` OPENS ONE — UNLESS THE CALL NAMES A COMMIT AT THIS METHOD'S FOURTH POSITION, WHICH
316
+ // IS THE DISCRIMINATOR `D-46` SETS: A CALL THAT SUPPLIES IT JOINS THE COMMIT IT NAMES, AND A CALL THAT
317
+ // SUPPLIES NONE OPENS A NEW ONE** (`strata/decisions.md` · `D-46`). **THE POSITION IS READ HERE AND
318
+ // NOWHERE ELSE**, because this member is the one place a call's own entry names a commit: the kernel's
319
+ // store leg is a FOUR-position call (`store.write(address, tier, value, record)`, `kernel-commit.mjs`) and
320
+ // therefore JOINS the commit the caller's three-position write opened, while a caller's plain write, a
321
+ // listener body's write and a constraint body's write all supply three positions and OPEN — the listener's
322
+ // being `D-43` item `1`'s *"its own commit"*, reached by declaration rather than by an authorship the
323
+ // package used to infer. **A SUPPLIED POSITION NAMES A COMMIT WHETHER OR NOT IT IS IN THE POSITION'S CLASS
324
+ // DOMAIN**: the class test below refuses an outside value before any store act, and a refused write
325
+ // releases the bracket in the `finally` below like every other arm.
326
+ // **THE DECREMENT IS ON THE FINAL RETURN TO THE CLIENT** (`closeCommit`), taken in a `finally` so the
327
+ // bracket is released on every arm — a count left standing after a return is on `§5`'s failure list.
328
+ const opened = openCommit(instance, arguments.length >= 4 ? commit : undefined);
321
329
  try {
322
330
  // **⟶ `docs/specs/storeroom-js/surface.md §2.12` ITEM 1, STAGE 1, AMENDED 2026-10-18 — THE ENTRY→KERNEL EDGE IS UNCONDITIONAL: EVERY
323
331
  // FOUR-POSITION WRITE ENTERS THE KERNEL'S `K-2`, AND THE `carriesConstraintAt` GATE THIS VERB ONCE TOOK
@@ -457,6 +465,11 @@ export function storeCreate(cfg) {
457
465
  /// and the in-domain no-op arm a SUCCESS returning `tiers: []`. **Its declared NAME is `delete`, and it is
458
466
  /// published under that name ALONE** (`package.md §1.3` item 3): `deleteOp` is a reserved-word workaround
459
467
  /// for the declaration and never a member of the package's namespace.
468
+ ///
469
+ /// **⟶ AND IT CARRIES THE DELETE'S OWN `op` FROM 2026-10-27** (`D-43` item 3; `index.d.ts`
470
+ /// `DeleteRecord.op`): the member `write`'s record carries, at the same name, so `rollback(record.op.opId)`
471
+ /// reverses the delete. `null` is the `D-3` arm that removed nothing — it appended no entry, so it names
472
+ /// no op — and it crosses unchanged rather than folding to `undefined` (`crossing.md §1.3`).
460
473
  delete(address, tier) {
461
474
  // **⟶ `§4.1`: `delete` OPENS ONE.**
462
475
  const opened = openCommit(instance);
@@ -471,6 +484,7 @@ export function storeCreate(cfg) {
471
484
  address: decodeSegments(answer.address),
472
485
  tiers: answer.tiers,
473
486
  triggered: crossTriggered(state, answer.triggered),
487
+ op: answer.op === null ? null : decodeJournalOp(answer.op),
474
488
  };
475
489
  // `A43`: a delete FIRES its own triggered set, on the same window as a write (`docs/specs/storeroom-js/surface.md §2.7` item 2).
476
490
  deliver(state, receipt.triggered, answer.triggeringAddress);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "provident-storeroom",
3
- "version": "1.0.1",
3
+ "version": "1.1.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",
@@ -40,11 +40,11 @@
40
40
  "src/constraint-kernel.mjs"
41
41
  ],
42
42
  "optionalDependencies": {
43
- "@auspicion/provident-storeroom-js-linux-x64-gnu": "1.0.1",
44
- "@auspicion/provident-storeroom-js-linux-arm64-gnu": "1.0.1",
45
- "@auspicion/provident-storeroom-js-darwin-x64": "1.0.1",
46
- "@auspicion/provident-storeroom-js-darwin-arm64": "1.0.1",
47
- "@auspicion/provident-storeroom-js-win32-x64-msvc": "1.0.1"
43
+ "@auspicion/provident-storeroom-js-linux-x64-gnu": "1.1.0",
44
+ "@auspicion/provident-storeroom-js-linux-arm64-gnu": "1.1.0",
45
+ "@auspicion/provident-storeroom-js-darwin-x64": "1.1.0",
46
+ "@auspicion/provident-storeroom-js-darwin-arm64": "1.1.0",
47
+ "@auspicion/provident-storeroom-js-win32-x64-msvc": "1.1.0"
48
48
  },
49
49
  "publishConfig": {
50
50
  "access": "public"