provident-storeroom 1.6.0 → 1.6.2
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 +75 -1
- package/README.md +1 -1
- package/RELEASE-NOTES.md +56 -6
- package/index.d.ts +69 -0
- package/package.json +6 -6
- package/src/entry/constraints.mjs +15 -1
- package/src/entry/kernel-attempt.mjs +29 -1
- package/src/entry/kernel-foundations.mjs +74 -0
- package/src/entry/kernel-registration.mjs +109 -1
package/README.guide.md
CHANGED
|
@@ -30,7 +30,7 @@ preflight REFUSES when these two lines do not read what it computed** (`scripts/
|
|
|
30
30
|
one check, read-only). **THE TWO LINES ARE THIS GUIDE'S OPERATIVE FIGURES; every dated paragraph below is the
|
|
31
31
|
reading of its own date and is read through them.**
|
|
32
32
|
|
|
33
|
-
PUBLISH-GUIDE-VERSION-LINE: THE VERSION THIS GUIDE DESCRIBES IS `1.6.
|
|
33
|
+
PUBLISH-GUIDE-VERSION-LINE: THE VERSION THIS GUIDE DESCRIBES IS `1.6.2`.
|
|
34
34
|
PUBLISH-GUIDE-CUT-STATE: NOT STATED -- this document describes the behaviour at the version line above, and the cut-state is the release's to state, not a shipped document's (`D-57`).
|
|
35
35
|
|
|
36
36
|
**⟶ AND THE CUT-STATE SENTENCE ABOVE IS WITHDRAWN, 2026-10-28 — THE CUT-STATE IS NOT A DOCUMENT'S TO STATE.** `RCA-8(g)` ANNOTATE-BESIDE, and the architect's ruling verbatim (`strata/decisions.md` · `D-57`): *"Drop the cut-state."* **The two marked lines above stand BYTE-FOR-BYTE as the reading of their own date and are read THROUGH this clause — not one byte of either is deleted — and the sentence this clause withdraws is the SECOND of them, the one that claims to say whether the release this guide travels in is cut.** **THE REASON IS MEASURED, THREE TIMES OVER, AND IT IS STRUCTURAL RATHER THAN A MISTAKE: A SHIPPED DOCUMENT IS SEALED BEFORE THE TAG THAT MAKES ITS CUT-STATE TRUE**, so every release packed before its tag ships a document denying itself, and a guard running in that release's own preflight can only ever confirm *"not cut"* — `1.2.0` shipped *"NOT CUT"*, `1.3.0` shipped *"`v1.3.0` DOES NOT EXIST"*, and the change list's head was stale within minutes of the tag that falsified it. **SO THE CUT-STATE SENTENCE IS DROPPED AS A CLAIM AND THE VERSION LINE STAYS**, because the version line is the ONE figure a tarball can be right about: the manifest knows it and travels beside it. **`scripts/publish.sh --figures` GENERATES AND ASSERTS THE VERSION LINE AND NOTHING ELSE** — the cut-state generation and its assertion are removed in the same act, so a tag set that moves can no longer redden this guide — **and the same one line is asserted in THREE shipped documents: this guide, `README.md` beside it, and the change list** (`DEF-AC`'s remaining demand, *"guard the release notes too"* and *"`README.md` still declares no version at all"*). **THE TAG SET IS NOT DELETED AND NOT DENIED: it is a RECORD OF RELEASES held in the change list, PAST TENSE — a list of what has been cut — and never a claim about the current one.** **AND WHAT THIS CLAUSE DOES NOT SAY, SAID PLAINLY BECAUSE A READER WILL LOOK FOR IT: it does not say whether the version this guide prints is cut.** That is not a document's to state; the record of what has been cut is in `RELEASE-NOTES.md`, and the registry is the registry.
|
|
@@ -74,6 +74,7 @@ measurements on a locally packed, installed artefact, and is still not witnessed
|
|
|
74
74
|
**⟶ AND THE ELEVEN VERSION SITES READ `1.5.0`, 2026-10-29 — THE PREPARED FIGURE, AND EVERY `1.3.0` THIS GUIDE PRINTS READS `1.5.0` FROM HERE ON.** `RCA-8(g)` ANNOTATE-BESIDE: **the nine dated paragraphs above stand BYTE-FOR-BYTE and are read THROUGH this clause — so do their readings of `0.5.0`, `1.0.0`, `1.0.1`, `1.1.0`, `1.2.0` and `1.3.0`; each was true of the tree it was read on.** **THE MANIFEST AT ITS OWN BYTES THIS DATE: `bindings/js/package.json`'s `version` is `"1.5.0"`, all five `optionalDependencies` pins are `1.5.0` with it, and the five `bindings/js/platforms/*/package.json` `version` fields read `1.5.0` with them — ELEVEN CELLS, ONE VERSION, moved TOGETHER in this act and never singly (§0 item 1; `PUB-DD-10`) — and `npm run build` stamps the artefact from that manifest, so `version()` answers `1.5.0` at the built artefact and at a package installed from it.** **AND THE RELEASE THIS CHAIN SKIPPED IS NAMED RATHER THAN SILENTLY ABSORBED: `1.4.0` read `1.4.0` at those same eleven cells and was cut from them — the tag `v1.4.0` names a tree whose `bindings/js/package.json` reads `"version": "1.4.0"` at its own bytes.** **SO THE SITES ARE RE-READ, NOT RE-SPELLED:** this section's version line, §2.2's five exact pins, §8.1's *"an installed `0.5.0`"* — itself already corrected to `1.0.0`, `1.0.1`, `1.1.0`, `1.2.0` and `1.3.0` — and §11's manifest table all read `1.5.0`.
|
|
75
75
|
|
|
76
76
|
**⟶ AND THE ELEVEN SITES READ `1.6.0` FROM THIS PREPARATION, 2026-10-29 — THE BUMP IS MADE HERE AND EVERY `1.5.0` ABOVE IS READ THROUGH THIS CLAUSE.** `RCA-8(g)` ANNOTATE-BESIDE: **every dated paragraph above stands BYTE-FOR-BYTE and is read THROUGH this clause — including its `1.5.0` — because each was true of the tree it was read on.** **THE MANIFEST AT ITS OWN BYTES THIS DATE: `bindings/js/package.json`'s `version` is `"1.6.0"`, all five `optionalDependencies` pins are `1.6.0` with it, and the five `bindings/js/platforms/*/package.json` `version` fields read `1.6.0` with them — ELEVEN CELLS, ONE VERSION, moved TOGETHER in this act and never singly (§0 item 1; `PUB-DD-10`)** — and **`npm run build` stamps the artefact from that manifest, so `version()` answers `1.6.0` at the built artefact and at a package installed from it** (measured this date at `bindings/js/build/Release/storeroom_js_binding.node`, and again at a package installed into a `/tmp` consumer with no repository in its ancestry). **SO THE SITES ARE RE-READ AGAIN, NOT RE-SPELLED:** this section's version line above, §2.2's five exact pins, §8.1's *"an installed …"* clause and §11's manifest table each read `1.6.0`, **and the one figure this guide can be right about is generated from that manifest and asserted in three shipped documents by `scripts/publish.sh --figures`.** **AND THE TAG SET IS A RECORD OF RELEASES AND NOT A CLAIM ABOUT THIS TREE:** `git tag --list` answers `v1.0.0` · `v1.0.1` · `v1.1.0` · `v1.2.0` · `v1.3.0` · `v1.4.0` · `v1.5.0`, `git describe` reads `v1.5.0-11-g8f5454f`, and **no `v1.6.0` is among them** — **so this clause states the version and NOT whether it is cut, because the cut-state is not a document's to state** (`D-57`; the clause above). **AND THE TAG SET IS A RECORD OF RELEASES AND NOT A CLAIM ABOUT THIS TREE:** `git tag --list` answers `v1.0.0` · `v1.0.1` · `v1.1.0` · `v1.2.0` · `v1.3.0` · `v1.4.0`, and `git describe` reads `v1.4.0-27-ga3312b7` — **so this clause states the version and NOT whether it is cut, because the cut-state is not a document's to state** (`D-57`; the clause above).
|
|
77
|
+
**⟶ AND THE ELEVEN SITES READ `1.6.2` FROM THIS PREPARATION, 2026-11-02, AS THEY READ `1.6.1` FROM THE DOCUMENTATION RELEASE BEFORE IT — EVERY `1.6.1` AND `1.6.0` ABOVE IS READ THROUGH THIS CLAUSE.** `RCA-8(g)` ANNOTATE-BESIDE: **every dated paragraph above stands BYTE-FOR-BYTE and is read THROUGH this clause, because each was true of the tree it was read on.** **THE MANIFEST AT ITS OWN BYTES THIS DATE: `bindings/js/package.json`'s `version` is `"1.6.1"`, all five `optionalDependencies` pins are `1.6.1` with it, and the five `bindings/js/platforms/*/package.json` `version` fields read `1.6.1` with them — ELEVEN CELLS, ONE VERSION, moved TOGETHER in this act and never singly (§0 item 1; `PUB-DD-10`) — and `npm run build` stamps the artefact from that manifest, so `version()` answers `1.6.1` at the built artefact and at a package installed from it.** **SO THE SITES ARE RE-READ AGAIN, NOT RE-SPELLED:** this section's version line above, §2.2's five exact pins, §8.1's *"an installed …"* clause and §11's manifest table each read `1.6.1`. **AND WHAT THIS RELEASE CHANGES FOR YOU IS NO ARM OF THE PACKAGE: the failure form stays four members, a log entry stays five, the status set stays twenty and the kernel's token set stays nine** — the change list's `§1.6.1` states it with its arithmetic. **AND THE TAG SET IS A RECORD OF RELEASES AND NOT A CLAIM ABOUT THIS TREE:** `git tag --list` answers `v1.0.0` · `v1.0.1` · `v1.1.0` · `v1.2.0` · `v1.3.0` · `v1.4.0` · `v1.5.0` · `v1.6.0`, and `git describe` reads `v1.6.0-4-g674b79e`. (`D-57`; the change list's `§1.6.1`; `scripts/publish.sh --figures`, which asserts the one figure in three shipped documents.)
|
|
77
78
|
|
|
78
79
|
**AND ONE THING A READER OF THE INSTALLED PACKAGE SHOULD KNOW BEFORE THE CITATIONS: WHEN THIS DOCUMENT IS AT
|
|
79
80
|
`node_modules/provident-storeroom/README.guide.md`, IT IS THIS GUIDE.** **Its ONE authored home is
|
|
@@ -890,6 +891,18 @@ instance: at CONSTRUCTION, and at a boot over an existing `filePath`, where the
|
|
|
890
891
|
the list you supplied** (`native/contract.md §8.1` #16's amended trigger clause). **So a constraint list is code
|
|
891
892
|
your application carries, not state your store stores.**
|
|
892
893
|
|
|
894
|
+
**⟶ AND THREE CONSEQUENCES THE TWO ROUTES OWE THEIR READER, PLUS THE ONE ROUTE A REPAIR MAY TAKE THERE, PLUS THE ONE SCOPE CLAUSE THE LIST-PERSISTENCE PARAGRAPH OWES — 2026-11-02.** `RCA-8(g)` ANNOTATE-BESIDE: **every byte of `§7.2` above stands BYTE-FOR-BYTE and is read THROUGH this clause; nothing above is deleted, no other section of this guide moves, and this clause is one dated correction and not a second site.** Its ground is two rulings of this date — `strata/decisions.md` · `D-90` and `D-91` (`docs/guides/package-use.md §7.2`'s own subject, read at the positions it names).
|
|
895
|
+
|
|
896
|
+
**(1) ★ THE BATCH AND THE ADD ROUTE TAKE THE SAME ACT, AND THE BATCH'S ACT IS TAKEN WHILE YOU HOLD NO HANDLE.** `cfg.constraints` is armed INSIDE `storeCreate`, before that call has answered you an instance — so **a function the batch arms cannot reach the store by your own binding: there is not yet a binding to close over.** **What a repair invoked at that instant has is THE RECORD IT IS HANDED, and at a registration instant that record carries the route below.** The add route performs the same act with your binding in hand, and the two answer the same evaluation.
|
|
897
|
+
|
|
898
|
+
**(2) ★ AND THE SKIP'S THRESHOLD IS ABSENCE ALONE — A PAIR IS CARRIED AND SKIPPED EXACTLY WHEN ITS PARENT DOES NOT RESOLVE, AND IT IS APPLIED WHERE THAT PARENT RESOLVES, WHETHER AS A CONTAINER, AS A LEAF, OR AS THE REGISTER.** The discriminator is the pair's own ADDRESS MINUS ITS LAST SEGMENT, and the parent's ABSENCE is the only skip. **⟶ AND THE LEAF ARM THIS ITEM FIRST PRINTED IS REPLACED HERE, 2026-11-02, AND NOT SCOPED — `D-96` (1)–(2); the architect, verbatim: *"Reject this, the constraint being there implicitly expects `'x'` to be a container"*.** **A LEAF STANDING AT A PAIR'S PARENT DOES NOT SKIP ITS PAIR: the pair's own presence declares that parent a container, so the pair is ASKED (`D-96` (2)) — and a body that REFUSES the state it meets at a resolving parent REFUSES THE REGISTRATION AT RANK `19`, `ConstraintRefusedAtRegistration`, on the arm where the refusing pair is the repaired one.** **A skip is not a refusal:** the function is not asked, nothing is refused for it, no entry is written for it, and **the registration does not fail for it** — the pair is registered, `constraints()` names it, and **it applies at the first later instant its parent resolves and an act of yours reaches its address.** **And the rule is GLOBAL, not batch-only:** it is read at every instant that would apply a pair — the batch at construction, the list at a boot over an existing `filePath`, `addConstraint`, a re-enable, and the pass over a write, a `delete` or a `rollback` (`D-90` (1)–(4); `D-96`). **The line is drawn by the NODE and not by how the value looks:** an object written at the parent makes it a container and a primitive written there makes a leaf — **and a pair under EITHER of them is APPLIED**, because neither of them is an absence.
|
|
899
|
+
|
|
900
|
+
**(3) ★ AND A PAIR WHOSE OWN KEY IS ABSENT IS APPLIED, AND MAY REPAIR ITSELF.** `['window']` on a store holding no `window` has the REGISTER for a parent, and the register is always a container — so **the absence of its own key is the state that pair judges**, which is the arm a repair can rescue. **It is the only arm a repair can rescue: a pair under an absent parent is never asked, so nothing runs to create that parent and a repair it carries cannot reach the arm** (`D-91` (iv)). **To have a repair create `window`, register the pair at `['window']`** — whose own absence is what is judged — and not at an address beneath it.
|
|
901
|
+
|
|
902
|
+
**(4) ★ AND THE ROUTE A REPAIR MAY TAKE AT A REGISTRATION INSTANT — `D-91`, THE ARCHITECT, VERBATIM: *"Give the registration instant a lawful write route."*** **A repair invoked at a registration instant — from `cfg.constraints`, from a boot over an existing `filePath`, from `addConstraint`, or from a re-enable — CAN WRITE, THROUGH A `write` FUNCTION ON THE RECORD IT IS HANDED.** **THE CONSTRAINT BODY'S OWN CONTEXT IS UNMOVED AND CARRIES NO SUCH MEMBER** (`D-92`: the route is the repair's alone), **so a body that needs a change returns a repair.** **THE ROUTE'S POSITIONS ARE THE STORE'S OWN THREE — `write(address, tier, value)` — AND THERE IS NO FOURTH: the commit is the registration's own and cannot be named**, and a call supplying one is refused before any store act. **ITS ANSWER IS THE STORE'S OWN WRITE RECORD — the very record the store's `write` answers — and the repair becomes creditable by `§7.6`'s repairable arm returning that record's own `op`**, which is the same rule a write's own repair is judged by, pointed at and not re-spelled here. **THE WRITE RUNS NO PASS OF ITS OWN:** the pair is judged by **THE REGISTRATION'S OWN RE-RUN over the op the repair returned**, so a repair that lands the state its own body admits makes the registration stand — **and a write the route lands before a refusal STANDS, because a registration composes no rollback.** **AND THE ROUTE EXISTS AT A REGISTRATION INSTANT AND NOWHERE ELSE**: at a write's own evaluation you already hold the instance, the repair there is handed the record it always was, and nothing about that instant moves.
|
|
903
|
+
|
|
904
|
+
**(5) ★ AND THE LIST-PERSISTENCE PARAGRAPH ABOVE — the one that opens *"★ AND THE LIST IS NEVER PERSISTED — not in the file, not as a register key and not in any journal entry"* — IS READ THROUGH THIS ITEM FROM HERE, 2026-11-02, AND THIS ITEM IS THE SCOPE CLAUSE THAT PARAGRAPH OWES.** **THE LOADED STATE IS NOT VALIDATED FOR RESOLVABILITY:** a pair whose parent does not resolve is not refused at CONSTRUCTION and not refused at a boot over an existing `filePath`, **and no list is refused for it — the pair is CARRIED and SKIPPED, which is item (2)'s rule, and a skip is not a refusal of the pair or of the list.** **So at both of those instants `ConstraintListInvalid` — the one status that paragraph declares — answers THE MALFORMED LIST ALONE:** an element whose `address` is not a segment array, an `id` that is not a string, the list's own outside forms, **and the package's own construction-time rejections, which `§7.2` states at its own paragraphs and which this item points at rather than re-spells.** **AND A WELL-FORMED PAIR IS NEVER ANSWERED BY THE SHAPE ARM** — `native/contract.md §8.1` item 3's own sentence, which the withdrawal above makes TRUE of this tree rather than needing an amendment.
|
|
905
|
+
|
|
893
906
|
**★ AND A REPEATED HANDLE ANSWERS DIFFERENTLY AT THE TWO ROUTES, WHICH IS A DIFFERENCE OF ACT AND NOT AN
|
|
894
907
|
INCONSISTENCY** (`D-27`'s own table):
|
|
895
908
|
|
|
@@ -988,6 +1001,62 @@ you already hold, and `store.read(address)` is a published verb. **Measured 2026
|
|
|
988
1001
|
restored — **and the same body without the read passed, answering its record with its own value still standing at
|
|
989
1002
|
its address.** **The read is the whole difference.**
|
|
990
1003
|
|
|
1004
|
+
**⟶ AND THE TWO RETURNS YOUR CONSTRAINT AND ITS REPAIR MAY MAKE ARE DECLARED HERE, 2026-10-30 — AND THE SECOND OF THEM IS THE ONE THIS SECTION IS ABOUT.** **EVERY SENTENCE OF THIS CLAUSE — THE ONE THIS MARK OPENS, DATED 2026-10-30 — HOLDS AT THE WRITE'S OWN EVALUATION, THE INSTANT THE KERNEL EVALUATES THE VALUE YOUR FUNCTION RETURNED, AND AT THAT INSTANT ONLY, EXCEPT WHERE A SENTENCE NAMES ITS OWN INSTANT IN ITS OWN WORDS.** **AND §7.6 CARRIES CLAUSES THIS DATED CLAUSE DID NOT WRITE, EACH AT ITS OWN EARLIER DAY — the clauses that state what a READ reads and what a DELETE asks, and the clauses that fix which pairs an act asks — AND A SENTENCE STANDING IN ONE OF THOSE IS OUTSIDE THIS FRAME AND IS READ AT ITS OWN INSTANT BY ITS OWN WORDS.** `RCA-8(g)` ANNOTATE-BESIDE: **every other clause of §7.6 — those standing above this one and those standing below it alike — stands BYTE-FOR-BYTE and is read THROUGH this one; the read rule, the addresses the pass asks, and the membership rule do not move, and this clause MOVES no byte of theirs. What this clause adds is the SHAPE of the two returns, the four ways the repair arm meets you, and ONE EXAMPLE you can drive as written.**
|
|
1005
|
+
|
|
1006
|
+
**★ YOUR CONSTRAINT'S ANSWER IS A CLOSED THREE-ARM SET, READ IN THIS ORDER, AND THERE IS NO FOURTH ARM.** **`true` is the ONLY pass value; `{ message, repair }` is a REPAIRABLE violation; `{ message }` is an UNREPAIRABLE violation, whose `message` is the refusal's own sentence.** **A value outside those three is read as the `{ message }` arm and never as an arm of its own**, so a shape you invent beyond them is not distinguished from a bare refusal — the kernel does not ask it a second question.
|
|
1007
|
+
|
|
1008
|
+
**AND `message` IS REQUIRED ON THE REPAIR ARM, BECAUSE THE KERNEL READS IT FIRST.** The arm's gate is the `message` member, read before any `repair` is looked for, and a `repair` is looked for only inside that branch: **a return carrying only `repair` is the arm outside the three, and its repair is NEVER SEEN**; **and AT THE WRITE'S OWN EVALUATION a `message` present but not a non-empty string keeps the repair readable while the refusal answers the kernel's own unrecognized sentence** — so write both members, and write `message` as the sentence you want your caller to read. **AT THE WRITE'S OWN EVALUATION — AT THAT INSTANT AND NO OTHER — THE KERNEL READS `message` AND `repair` AS OWN MEMBERS OF THE OBJECT YOUR FUNCTION RETURNED: a pair carried on a prototype is NOT SEEN there, and such a return answers the unrecognized sentence instead** (`bindings/js/src/entry/kernel-attempt.mjs:686-699`, `:690-696`). **THIS IS THE ONLY SENTENCE IN THIS GUIDE THAT STATES THAT RULE, AND IT IS THE LANDING INSTANT'S: the registration act reads the same closed outcome at `bindings/js/src/entry/kernel-registration.mjs:330-332`, where an inherited `repair` IS seen and invoked, so ONE RETURNED SHAPE ANSWERS TWO DIFFERENT THINGS AT THE TWO INSTANTS — a repair at registration and no repair at a write — and that divergence is OWED to a code-bearing unit and is contradicted by no sentence here** (`strata/decisions.md` · `D-35`). **THE EXAMPLE BELOW ESCAPES THE QUESTION BY CONSTRUCTION: it returns ONE OBJECT LITERAL whose two members are own members, so both instants read it alike.**
|
|
1009
|
+
|
|
1010
|
+
**THE REPAIR'S OWN RETURN IS A CLOSED TWO-ARM SET.** **`{ ok: true, op }` is the repairable arm: `op` is REQUIRED and is THE STORE'S OWN OPERATION RECORD — `WriteRecord.op`, or `DeleteRecord.op` where that member is non-`null`, a `delete` that removed nothing answering `null` and crediting nothing — the one the verb your repair called returned.** **`{ ok: false, message }` is the failed arm: `ok` and `message`, and `op` ABSENT and never `null`, because an `op` there is read by nothing.** **At the write's own evaluation a return carrying any other identity fails `KC-4`** (`docs/specs/storeroom-constraints/contract.md:552`; the two arms print at `:558`) — **that one sentence covers every outside form of that return and this guide enumerates none of them.** **AND THE OP MUST BE ONE THE ATTEMPT CAN BE SHOWN TO HAVE LANDED: that ground is the kernel's own credit check, declared at `bindings/js/src/entry/kernel-foundations.mjs:1105-1131`, and it is POINTED AT here rather than re-spelled.** **No ordinal ground is claimed at the registration instant, whose credit check runs with no invoked-for op** (`bindings/js/src/entry/kernel-registration.mjs:510-517`).
|
|
1011
|
+
|
|
1012
|
+
**THE REPAIR IS HANDED ONE ARGUMENT — ITS OWN RECORD, WHICH IS NOT YOUR CONSTRAINT'S AND IS NOT INTERCHANGEABLE WITH IT: the two records stand apart at THREE PLACES — by COUNT, SIX against FIVE; by `id`, which the repair's record carries where the constraint's carries `attempt`; and by `pending`, which rides the repair's record ALONE** (`bindings/js/src/entry/kernel-attempt.mjs:607-613`, `:756-782`; the kernel's own words at `bindings/js/src/entry/kernel-registration.mjs:373-374`). **AND THE COMMIT YOUR REPAIR IS PART OF RIDES THAT RECORD — its own `pending` member, the `CommitRecord.pending` this package declares at `bindings/js/index.d.ts:772`, POINTED AT and re-declared nowhere: pass it as `write`'s DECLARED FOURTH POSITION and the write you make JOINS the commit you are inside** (`bindings/js/index.d.ts:862`; `strata/decisions.md` · `D-46`). **No member census of either record is printed here, and that position's own class test is not restated.** A repair that names nothing in the fourth place also joins, by the kernel's own name; the fourth position is how YOU name it.
|
|
1013
|
+
|
|
1014
|
+
**AND THE FOUR WAYS THIS ARM MEETS YOU, EACH DECLARED BECAUSE SILENCE HIDES A STATE A CONSUMER MEETS:**
|
|
1015
|
+
|
|
1016
|
+
1. **(a) A THROW FROM YOUR REPAIR BODY CROSSES TO YOUR OWN CALL UNCONVERTED ON A WRITE**, where the throwable carries no store code: the write hands you back the very value you threw (`bindings/js/src/entry/kernel-attempt.mjs:833-854`).
|
|
1017
|
+
2. **(b) AT THE REGISTRATION INSTANT THAT SAME THROW IS CAUGHT AND CONVERTED INTO THE REGISTRATION'S REFUSAL** — `addConstraint` refuses, and no caller meets your body's value on that route (`bindings/js/src/entry/kernel-registration.mjs:498-508`).
|
|
1018
|
+
3. **(c) A PAIR'S REPAIR NEVER RUNS TWICE:** an applied repair may not run again, and a second violation of the same pair FAILS the attempt (`docs/specs/storeroom-constraints/contract.md:736`, `P-SM-6`'s row).
|
|
1019
|
+
4. **⟶ (d) AND WHAT A FAILED ATTEMPT DOES TO THE EDITS A REPAIR LANDED IS `docs/guides/package-use.md §5.4`'s OWN RULE — CITED BY PATH AND SECTION, STATED THERE AND NOT RE-SPELLED HERE.** **The plan that rule is read against is live code and is read at its own bytes: `bindings/js/src/entry/kernel-terminal.mjs:184-196`, the call site at `:215`, and `floorCallPlan` at `:288-343`; `strata/decisions.md` · `D-40` is the ruling that CLOSES that scope.** **AND ONE SENTENCE FOLLOWS FROM `§5.4`'s RULE, AS THAT RULE'S CONSEQUENCE AND NOTHING MORE: a repair's own writes are part of the attempt.**
|
|
1020
|
+
|
|
1021
|
+
**⟶ AND HERE IS THE EXAMPLE THIS SECTION OWES — a repair that lands SOMEWHERE ELSE, which is this section's own subject, self-contained and driveable as written through the package's one export.** It is the shape the package's own e2e drive takes (`tests/e2e/repair-in-commit.test.mjs:95-115`), with the commit named by the repair's own hand:
|
|
1022
|
+
|
|
1023
|
+
```js
|
|
1024
|
+
const store = storeCreate({ journalLength: 256, listeners: [] });
|
|
1025
|
+
|
|
1026
|
+
store.write(['a'], 'mem', 1);
|
|
1027
|
+
store.addConstraint({ address: ['a'], id: 'two-goes-elsewhere' }, (context) =>
|
|
1028
|
+
(context.value === 2
|
|
1029
|
+
? {
|
|
1030
|
+
message: 'the landed value is not one this pair admits, and the repair moves it elsewhere',
|
|
1031
|
+
repair: (repairContext) => {
|
|
1032
|
+
const landed = store.write(['b'], 'mem', 11, repairContext); // the commit, at write's fourth position
|
|
1033
|
+
return { ok: true, op: landed.op }; // the store's own record, not a copy
|
|
1034
|
+
},
|
|
1035
|
+
}
|
|
1036
|
+
: true));
|
|
1037
|
+
|
|
1038
|
+
const written = store.write(['a'], 'mem', 2); // the pair refuses 2, its repair writes 11 at ['b'], the re-run passes
|
|
1039
|
+
store.read(['a']); // 2 — the address your pair judges; the repair did not move it
|
|
1040
|
+
store.read(['b']); // 11 — where the repair landed, inside the commit it is part of
|
|
1041
|
+
```
|
|
1042
|
+
|
|
1043
|
+
**WHAT THE EXAMPLE SHOWS, IN THE ORDER THE MACHINERY RUNS IT.** **Your constraint returns ONE object literal carrying both members** — `message` the refusal's sentence, `repair` a function — so both instants read the same pair. **The repair runs with ITS OWN RECORD, makes its OWN `write` at `['b']` with that record in the fourth position, and RETURNS `{ ok: true, op: landed.op }`: the store's own record of the write it just made, never a number and never a record you assembled yourself.** **And the credit is visible to you:** `written.op` is that same op — in the drive named below, `{"opId":"op-3","kind":"write","address":["b"],"seq":3,…}` — **so the op the repair returned IS the op its own edit produced, which is what makes the re-run come back through that op's own landing and hand your body the value the repair landed (`11`) while the address your pair judges still stands at `2`.** **The write answers its record because that re-run passes; a repair that returned an op it did not land fails `KC-4` instead.** **Note what is NOT in the block: no type annotation, no new symbol, no import the guide does not already publish (`§3`), and no fourth outcome arm.**
|
|
1044
|
+
|
|
1045
|
+
**MEASURED 2026-10-30, on this checkout, through the published entry (`bindings/js/index.mjs`), on the block above's exact bytes:** the write's own record carries `op` `{"opId":"op-3","kind":"write","address":["b"],"tier":"mem","before":{"present":false},"after":{"present":true,"value":11},"seq":3,"compacted":false}`, `store.read(['a'])` answers `2` and `store.read(['b'])` answers `11` — **so the repair was READ, its edit LANDED at the beside address, and its op was CREDITED.** **That drive is a measurement of the landing pass and not a committed test**; the package's own suite drives this arm at `tests/e2e/repair-in-commit.test.mjs`.
|
|
1046
|
+
|
|
1047
|
+
**(1) WHAT CROSSED.** **A repair's answer that the credit check does not admit FAILS THE ATTEMPT, and what your caller catches is the refusal crossing as the set's rank-`20` member `ConstraintPassRefused`, with the kernel's token `KC-4` riding the TERMINAL entry's `state`** — `KC-4` is the kernel's repair-failed token (`bindings/js/src/entry/kernel-foundations.mjs:62`), the crossing and the token's seat are declared at `docs/specs/storeroom-js/surface.md:2079`, and the repair-body path that answers it prints at `docs/specs/storeroom-constraints/contract.md:557`. **This clause names `KC-4` and declares no member of any set.**
|
|
1048
|
+
**(2) WHAT THE REFUSAL SAYS — THREE MESSAGES REACH THE ARM AND THE COPY BELOW IS THE FALL-THROUGH'S ALONE.** **The message a `KC-4` refusal carries is drawn from ONE OF THREE SOURCES, the choice among them standing at `bindings/js/src/entry/kernel-attempt.mjs:878`-`:883`: where `ok` is `true` and the op the return names is defective, the kernel's own OP-IDENTITY SENTENCE, which stands at `bindings/js/src/entry/kernel-foundations.mjs:1139`-`:1150` and which this clause NAMES AND NEVER QUOTES; where `ok` is `false` and the return's `message` is a non-empty string, THE CALLER'S OWN `message`, which is no kernel sentence at all, so a caller holding a `{ok: false, message}` refusal is holding THEIR OWN WORDS and not the copy below; and, on the remaining arm, the `produced no op` template at `bindings/js/src/entry/kernel-attempt.mjs:883`, COPIED ON 2026-11-01 FROM THAT ONE LINE, template literal and interpolations included, character for character:**
|
|
1049
|
+
|
|
1050
|
+
```js
|
|
1051
|
+
`the repair ${pair.id} produced no op at ${addressSpelling(attempt.address)}`
|
|
1052
|
+
```
|
|
1053
|
+
|
|
1054
|
+
**and the one thing a reader must not take from it is this: the address in that sentence is the ATTEMPT's, and it is no claim about where the repair wrote** — **the sentence's own text is unedited here, this clause mints no second address, and it claims no correction and no fix of it; and the scope holds at EVERY sentence this arm composes, the op-identity pair interpolating the same `addressSpelling(attempt.address)`, while the caller's own arm composes no sentence to conclude anything from.**
|
|
1055
|
+
**(3) WHAT THE LIST IS — THE CENSUS, THE ONE RULE ABOUT IT, AND THE POINTER TO `§8.0a`.** **THE CENSUS IS THIS CLAUSE'S: the `log` a `KC-4` refusal crosses with is the COMMIT's one list and not the attempt's** (`docs/guides/package-use.md:1337`-`:1345`), **and the reading rule about a count of entries and a count of verdicts is `§8.0a`'s alone — this clause SENDS YOU TO THAT SENTENCE, names its home and not its content, and prints no count, no member census and no kind** (`docs/guides/package-use.md:1389`-`:1392`). **THE ONE RULE THIS CLAUSE STATES, AND IT IS A RULE ABOUT THE LIST: THE VERDICT IS THE LAST ENTRY WHOSE `state` IS NOT `null`; the terminal act appends the deciding attempt's `outcome` entry ONCE and it carries the arm's one token (`bindings/js/src/entry/kernel-terminal.mjs:66`-`:72`); it stands last because that attempt appended it LAST, and NEVER because no other entry carries a `state`.** **A CROSSED LIST MAY LAWFULLY CARRY MORE THAN ONE SUCH ENTRY: a constraint body's refused write shows that refusal's own entries VERBATIM before the enclosing `outcome` entry, as `§8.0a`'s nested-write bullet says in its own words, and `tests/e2e/blind-defect-cases.test.mjs:633`-`:646` prints an inner refusal's own `outcome` entry in ONE list beside the enclosing attempt's entries — so AN INNER REFUSAL'S ENTRY IS NOT THE VERDICT, and the LAST such entry is.** **The member the verdict is found by is the one `bindings/js/index.d.ts:357`-`:358` prints, cited for that member alone and for NO per-attempt scope, that scope being this clause's own statement of what a list may hold.** **The instance is cited and not re-taken: `tests/e2e/downstream-claims.test.mjs:1498`-`:1501` prints a `passed` entry inside a refusal's own list.** **The seat that token rides is already printed in this guide, at `§7.8`'s step 3 (`docs/guides/package-use.md:1102`-`:1105`), and this clause cites it there instead of re-deriving it.**
|
|
1056
|
+
**(4) WHETHER YOUR REPAIR'S EDIT STANDS — THE ADDRESS GEOMETRY, BOTH CONJUNCTS OF THE SWEEP, AND THE PLAN'S ONE SKIP ARM THAT BEARS ON IT.** **THE TEST IS THE ADDRESS, and it is the credit rule's declared consequence: whether the address the repair wrote IS ONE THE ATTEMPT'S OWN OPS NAMED — AT IT OR UNDER IT — because the floor call's candidates are taken from `attempt.ops` ALONE (`bindings/js/src/entry/kernel-terminal.mjs:288`-`:343`), each call's own scope is the named op's ADDRESSED SUBTREE AT OR AFTER THAT OP'S `seq` (`bindings/js/src/entry/kernel-terminal.mjs:255`-`:256`), and the store's own filter is `is_prefix(address, entry.address) && entry.seq >= floor` (`src/store.rs:2628`), where `address` is the call's named op's own address (`src/store.rs:2617`) and `floor` is that op's own `seq` (`src/store.rs:2622`).** **CREDIT IS THE MECHANISM AND NEVER THE TEST: the refusal returns before the uncredited op ever joins `attempt.ops` (`bindings/js/src/entry/kernel-attempt.mjs:885`-`:892`), and the ground that refused it is the kernel's own credit check (`bindings/js/src/entry/kernel-foundations.mjs:1105`-`:1131`).** **THE SWEEP DECIDES AT BOTH HALVES OF ITS FILTER: an entry must stand AT OR UNDER the address the call named AND ITS ORDINAL AT OR ABOVE THAT CALL'S FLOOR — so a write whose ordinal stands below the call's floor is NOT swept by that call whatever its address, and the prefix half ALONE sweeps nothing.** **AND THE FLOOR CALL'S PLAN DECLARES TWO SKIP CASES AT ITS OWN RANGE AND NAMES THEM, `COVERED` and `UNREACHABLE`, and this clause states those two names and no third case (`bindings/js/src/entry/kernel-terminal.mjs:264`-`:274`): `COVERED`, where every entry was already swept; and `UNREACHABLE`, where an already-issued address is a prefix of the candidate's and that call's floor stands AFTER the candidate's own first owed op while that address still has an owed op at or after that floor — and `UNREACHABLE` is the one that bears on the consequence, because the OUTER CALL IS KEPT AND THE INNER ADDRESS'S EARLIER ENTRIES STAND, so a write at an address the attempt DID name can still stand and *"credited or not"* is no answer at that end either.**
|
|
1057
|
+
**(5) WHAT THAT MEANS FOR THE STORE — THE CONSEQUENCE IN THE GEOMETRY'S OWN TERMS, AND `§5.4` READ BY LINE AT BOTH OF ITS SENTENCES.** **The store's answer for the address the repair wrote: a write AT OR UNDER AN ADDRESS THE ATTEMPT'S OWN OPS NAMED IS SWEPT WITH THE ATTEMPT, and a write at an address NO attempt op named STANDS — and it stands too where that address's call is skipped on `UNREACHABLE`, the arm item (4) names at `bindings/js/src/entry/kernel-terminal.mjs:264`-`:274`.** **AND `§5.4` IS READ BY LINE, AT BOTH OF ITS SENTENCES: `docs/guides/package-use.md:469` declares that the floor call restores the address the attempt wrote and that an address a repair landed at BESIDE it is NOT restored — the arm where the address lies OUTSIDE the attempt's own addressed subtree, so it STANDS; `docs/guides/package-use.md:476`(2) declares that A REPAIR'S WRITE GOES WITH THE WRITE — the arm where the repair's write lies INSIDE the attempt's own commit, so it is UNDONE WITH THE WRITE — and that sentence is UNSCOPED BY CREDIT, so it is no statement about credited writes only.** **THE DISCRIMINATOR BETWEEN THE TWO IS THE ADDRESS AND NEVER THE CREDIT, which is what lets both stand at once: this clause sends you to both lines, adjudicates neither, and moves no byte of `§5.4`.**
|
|
1058
|
+
**CONSOLIDATED, 2026-11-02 — ONE CLAUSE OF FIVE ITEMS, ONE QUOTE AND THIS MARK.** **What stands above is the five items as ONE clause, consolidated on 2026-11-02 from a first draft whose superseded sentences moved out, and the move is declared at `docs/specs/storeroom-repair-failure-path/contract.md`, the unit's live corpus path.** **The first draft got six things wrong, and here is each in one sentence.** **It presented the copy as the arm's sentence, when the copy is the fall-through's, one of three.** **It put the reading rule at this clause as well as at `§8.0a`, when the rule is `§8.0a`'s alone and this clause keeps the census and the pointer.** **It made the verdict the one entry whose `state` is not `null`, when the verdict is the LAST such entry and a crossed list may lawfully carry more than one.** **It made credit the test, when the axis is the address's membership in the attempt's ops, read at both conjuncts of the filter and at the plan's `UNREACHABLE` arm.** **It named `§5.4` once only, when both of its lines are read here at `docs/guides/package-use.md:469` and `docs/guides/package-use.md:476`(2), with the address as the discriminator and never the credit.** **It stated the store-state consequence by credit, when the consequence is stated in the address geometry.**
|
|
1059
|
+
|
|
991
1060
|
**★ AND THE CONSEQUENCE A READER GETS WRONG, IN `D-50`'S OWN WORDS: *"a constraint that reads inside its body is
|
|
992
1061
|
caller code entering the surface, so by `D-45` that read opens its own commit"* — **⟶ MEASURED 2026-10-28, AND THAT CLAUSE IS WRONG: A READ BRACKETS NO COMMIT AT ALL.** `read`, `readLiteral` and `constraints` are the surface's **NON-BRACKETING** calls — the count during a constraint body's read is the attempt's own and is left undisturbed, `attempt-opened` does not fire for it, and the same `attempt` is in force. **So the accurate consequence is the shorter one: a read inside a body runs INSIDE the attempt's window, opens nothing, and disturbs nothing.** (The `D-45` quote above is kept as the reading of its own date; this sentence governs.) — AND A READ RUNS NO CHECK, SO
|
|
993
1062
|
NOTHING IS JUDGED BY IT.** **No constraint is asked on the value it returns, no pass runs, and the value you
|
|
@@ -1329,10 +1398,13 @@ with. **NO OTHER MEMBER, KIND, STATUS, COUNT OR SENTENCE OF THIS GUIDE MOVES** (
|
|
|
1329
1398
|
detached member's — and a `TypeError` from a constraint method carries `[]` too. **The list is the COMMIT's
|
|
1330
1399
|
and there is no commit there.**
|
|
1331
1400
|
|
|
1401
|
+
**⟶ AND THAT BULLET IS SCOPED TO THE STATE IT IS TRUE OF — 2026-11-02.** `RCA-8(g)` ANNOTATE-BESIDE: **the bullet above stands BYTE-FOR-BYTE and is read THROUGH this clause.** **A CONSTRUCTION REFUSAL CARRIES `[]` WHERE THE ELEMENT THAT REFUSED CARRIED NO REPAIR** — **and where that element DID carry one, and its pair was asked, the refusal carries the entries that element's own `constraint-check` and `repair-run` appended**, because a repair is invoked at that instant and its invocation is part of the judgement. **So the two states are told apart by THE ELEMENT YOU SUPPLIED and by nothing about the route**: no repair on the element, no entries; a repair on it, that element's own. **And where the element's pair is SKIPPED — its parent does not resolve — there is nothing to refuse and nothing to carry: `§7.2`'s own clause states what a skip is.** **The counting caution below and the verdict rule it sends you to are UNMOVED by this sentence and neither is restated here.**
|
|
1402
|
+
|
|
1332
1403
|
**READ THIS BEFORE YOU LOG-COUNT.** `log.length` is **not** *"how many constraints were evaluated"* and not
|
|
1333
1404
|
*"how many attempts this write made"*: it is **every entry of the commit**, in append order, from every attempt
|
|
1334
1405
|
the commit held. Count entries by `kind` and `id` (and by `opId` where you need the iteration) rather than
|
|
1335
1406
|
assuming a shape, because **a repair or a body's own write legitimately adds entries to the list you caught.**
|
|
1407
|
+
**And what the count above cannot tell you: where the refusal you caught carries a commit's list, several entries in it may lawfully read *passed*, so a count of entries is not a count of verdicts, and `§7.6`'s clause names the one entry that decides — while on the other arm, where a refusal names no attempt and still carries `[]`, nothing above promises a list to count.**
|
|
1336
1408
|
|
|
1337
1409
|
**AND THE ONE PLACE THE INVARIANT IS NOT REACHED, SAID PLAINLY RATHER THAN LEFT TO A MEASUREMENT: a pair body
|
|
1338
1410
|
invoked at a REVERSAL's judgement has no commit record standing beside it to name**, so a write such a body
|
|
@@ -2174,3 +2246,5 @@ quietly.**
|
|
|
2174
2246
|
the instrument that decides between them.**
|
|
2175
2247
|
|
|
2176
2248
|
**⟶ CORRECTED 2026-10-28 — THE BULLET ABOVE'S *"the two of 2026-10-26"* NO LONGER COUNTS THIS FILE, AND THE FIGURE IS MOVED RATHER THAN THE RULE.** `RCA-8(g)` ANNOTATE-BESIDE: **the bullet above stands BYTE-FOR-BYTE and is read THROUGH this clause.** **This file now names FOUR measurements of its own — the two of 2026-10-26 the bullet carries, §7.6's two-address `b1` drive and §7.7's 60/40-reversal restart-budget drive, both taken 2026-10-28 on this checkout through the published entry — and each is named where it stands rather than gathered here.** **WHAT DOES NOT MOVE IS THE BULLET'S RULE AND THE DOCUMENT'S OWN STANDING: this guide is a consumer document and not a test report; a figure it states is either declared and cited or measured and marked; and the declared documents and the driven batteries remain the instruments for questions of semantics and of behaviour respectively.** **A reader who wants the measurements re-run finds their drives named at their sites, and no figure of this file is offered as a green.**
|
|
2249
|
+
|
|
2250
|
+
**⟶ CORRECTED 2026-10-30 — THE COUNT IN THE CLAUSE ABOVE NO LONGER COUNTS THIS FILE EITHER, AND THE FIGURE IS MOVED RATHER THAN THE RULE.** `RCA-8(g)` ANNOTATE-BESIDE: **that clause stands BYTE-FOR-BYTE and is read THROUGH this one.** **This file now names FIVE measurements of its own — the FOUR that clause counts, and `§7.6`'s landing drive of 2026-10-30, taken on this checkout through the published entry on its block's exact bytes — and each is named where it stands rather than gathered here.** **WHAT DOES NOT MOVE IS THE BULLET'S RULE AND THE DOCUMENT'S OWN STANDING: this guide is a consumer document and not a test report; a figure it states is either declared and cited or measured and marked; and the declared documents and the driven batteries remain the instruments for questions of semantics and of behaviour respectively.**
|
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ an edit belongs.
|
|
|
31
31
|
|
|
32
32
|
**⟶ AND THE ONE FIGURE THIS PAGE CAN BE RIGHT ABOUT IS GENERATED AND ASSERTED, 2026-10-28 — `DEF-AC`'s third part, and `D-57`'s one surviving figure.** `RCA-8(g)` ANNOTATE-BESIDE: **every clause above stands BYTE-FOR-BYTE and is read THROUGH this one; nothing above moves.** **THE DEFECT THIS CLOSES: THIS PAGE DECLARED NO VERSION AT ALL** — a shipped document a consumer reads first, saying nothing about which release it describes — **so `scripts/publish.sh --figures` now GENERATES the line below from `bindings/js/package.json`'s `version` and REFUSES when it disagrees, exactly as it does at the guide's and the change list's own marked lines: three shipped documents, three version lines, one generator, one assertion.** **AND THE CUT-STATE IS NOT STATED HERE, OR ANYWHERE ELSE IN THIS PACKAGE'S DOCUMENTS** (`D-57`, the architect verbatim: *"Drop the cut-state"*): a document is sealed before the tag that would make its cut-state true, so **the cut-state is not a document's to state**; the record of what has been cut is the change list's, and it is past tense. **EVERY OTHER CLAIM OF THIS PAGE STANDS EXACTLY AS IT STOOD.**
|
|
33
33
|
|
|
34
|
-
PUBLISH-README-VERSION-LINE: THE VERSION THIS README DESCRIBES IS `1.6.
|
|
34
|
+
PUBLISH-README-VERSION-LINE: THE VERSION THIS README DESCRIBES IS `1.6.2`.
|
|
35
35
|
|
|
36
36
|
## The one entry
|
|
37
37
|
|
package/RELEASE-NOTES.md
CHANGED
|
@@ -16,10 +16,12 @@ claims to be installable.**
|
|
|
16
16
|
|
|
17
17
|
**⟶ AND THE CUT-STATE IS DROPPED FROM THIS FILE, 2026-10-28 — `D-57`, THE ARCHITECT VERBATIM: *"Drop the cut-state."*** `RCA-8(g)` ANNOTATE-BESIDE: **the title line and every dated paragraph of this file stand BYTE-FOR-BYTE as the reading of their own date, THIS clause is the one that reads them, and not one byte is deleted.** **THE REASON IS STRUCTURAL AND IT WAS MEASURED THREE TIMES: A SHIPPED DOCUMENT IS SEALED BEFORE THE TAG THAT MAKES ITS CUT-STATE TRUE**, so every release packed before its tag ships a document denying itself, and a guard running in that release's own preflight can only ever confirm *"not cut"* — `1.2.0` shipped *"NOT CUT"*, `1.3.0` shipped *"`v1.3.0` DOES NOT EXIST"*, and this file's own head was stale within minutes of the tag that falsified it. **SO EVERY SENTENCE BELOW THAT CLAIMS WHETHER SOME VERSION IS OR IS NOT CUT — *"PREPARED — NOT CUT"*, *"no `v1.3.0`"*, *"nothing in this section is cut"*, *"the release is not cut"*, *"what is installed today is still `1.1.0`"*, and each reading printed beside them — IS READ THROUGH THIS CLAUSE: the cut-state is not a document's to state.** **WHAT SURVIVES IS THE ONE FIGURE A SHIPPED DOCUMENT CAN BE RIGHT ABOUT, AND IT IS GENERATED FROM THE MANIFEST AND ASSERTED BY THE PREFLIGHT:**
|
|
18
18
|
|
|
19
|
-
PUBLISH-NOTES-VERSION-LINE: THE VERSION THIS CHANGE LIST DESCRIBES IS `1.6.
|
|
19
|
+
PUBLISH-NOTES-VERSION-LINE: THE VERSION THIS CHANGE LIST DESCRIBES IS `1.6.2`.
|
|
20
20
|
|
|
21
21
|
**AND THE TAG SET SURVIVES AS A RECORD OF RELEASES — PAST TENSE, A LIST OF WHAT HAS BEEN CUT, NEVER A CLAIM ABOUT THE CURRENT ONE** (the record stands in `§1.4.0` below — the section this file's head called `§main` until it was re-cut to name the version it prepares, 2026-10-28 — beside the section for the tree this file describes). (`D-57`; `DEF-AC` (b) — `scripts/publish.sh --figures` generates that line from `bindings/js/package.json`'s `version` and refuses on any disagreement, in this file, in `bindings/js/README.md` and in the shipped guide: three documents, three version lines, one generator, one assertion.)
|
|
22
22
|
|
|
23
|
+
**⟶ AND THE CUT-STATE'S ONE AUTHORITY IS THE TAG SET, 2026-10-29 — `D-79` ITEM 2, KEPT BY `D-81` ITEM 2.** `RCA-8(g)` ANNOTATE-BESIDE: **no byte above or below moves; this clause is added beside the record paragraph above, and every dated paragraph of this file stands BYTE-FOR-BYTE as the reading of its own date.** **THE AUTHORITY IS `git tag --list` AND IT IS THE WHOLE OF IT: what has been released is what the tag set answers, and NO PROSE PARAGRAPH OF THIS FILE — or of the consumer guide, or of `bindings/js/README.md`, or of either landed copy — MAY ASSERT OR DENY THAT IN THE PRESENT TENSE.** **EVERY SENTENCE BELOW THAT DOES IS THE READING OF ITS OWN DATE AND IS READ THROUGH THIS CLAUSE**: the change lists of `§1.2.0` through `§1.5.0` describe releases the tag set answers for, and each one's sentence about what had or had not been released belongs to the date that wrote it. **AND WHAT THIS CLAUSE DOES NOT DO, SAID SO IT IS NOT READ AS DONE: it corrects none of them and deletes no byte of them** — `D-81` item `2`'s sweep is a REPORT of where each stands, and the catalogue at `docs/guides/backup/D81-2026-10-29-notes-move-out.md` §3 is that report, entry by entry, so a reader can check a scan by eye. (`D-79`; `D-81`; `git tag --list`.)
|
|
24
|
+
|
|
23
25
|
**THE ONE THING THIS DOCUMENT IS FOR: `1.1.0` IS A MINOR, AND THIS IS WHERE ITS BREAKING CHANGES ARE
|
|
24
26
|
DECLARED.** `1.0.1` was published as a PATCH and it carried behaviour changes a patch may not carry. The
|
|
25
27
|
architect ruled the remedy a MINOR — *"the next release is `1.1.0`"* (`strata/decisions.md` · `D-42` item `1`)
|
|
@@ -53,6 +55,35 @@ the value to assert against, not the crate's own `Cargo.toml` version.
|
|
|
53
55
|
|
|
54
56
|
---
|
|
55
57
|
|
|
58
|
+
## §1.6.2 · **PREPARED — the release this tree is being cut as** — a BEHAVIOUR release: what the thirty-four commits past the previous tag carry, the one additive member, the workaround it retires, and the four things it does not fix
|
|
59
|
+
|
|
60
|
+
**THE VERSION: `1.6.2`, AT ELEVEN CELLS THAT MOVE TOGETHER AND NEVER SINGLY** — the main manifest's `version`, its **five** exact `optionalDependencies` pins, and the **five** `platforms/*/package.json` versions — **plus the three shipped documents' one generated version line each.** **The artefact is stamped from the manifest by `bindings/js/build.rs`, so `version()` answers the release figure** and that is the value the coupling rule is asserted against, not the crate's own `Cargo.toml` version.
|
|
61
|
+
|
|
62
|
+
**THE ARITHMETIC, MEASURED AT THIS TREE: `git rev-list --count v1.6.1..HEAD` READS `34`.** The release's own work is `U-STOREROOM-CONSTRAINT-REGISTRATION-INSTANT` — the constraint registration instant — and the guide and corpus corrections it carried.
|
|
63
|
+
|
|
64
|
+
**WHAT A CONSUMER SEES CHANGE, EACH A RULING OF 2026-11-02 AND EACH IN THE SHIPPED GUIDE:**
|
|
65
|
+
|
|
66
|
+
1. **A pair whose PARENT address does not resolve is SKIPPED, not asked** (`D-90`). Before, it was asked with `undefined` and could refuse a construction; now the pair is **carried**, the registration stands, and it is applied at the first instant its parent resolves.
|
|
67
|
+
2. **A pair whose parent RESOLVES is applied — including where the parent holds a LEAF** (`D-96`). **The pair's presence declares that parent a container**, so a leaf standing there is the state the pair judges: the body is asked, and a body that refuses refuses the registration at rank `19`.
|
|
68
|
+
3. **A boot no longer refuses a constraint list for an unresolvable address** (`D-90` (5)). The list-wide walk is gone; `ConstraintListInvalid` now answers **the malformed list alone**, and a well-formed pair is never answered by the shape arm.
|
|
69
|
+
4. **A repair invoked at a registration instant can WRITE** (`D-91`). The repair's own record carries a `write` function taking exactly the store write's first three positions; it joins the registration's own commit, and the repair is credited by returning the op it landed.
|
|
70
|
+
5. **The re-run after a repair always runs, and reads the pair-application rule** (`D-94`).
|
|
71
|
+
6. **`value` on a registration record is read once, and a write does not refresh it** (`D-95`).
|
|
72
|
+
7. **A `rollback`'s own judgement reads the same rule** (`D-97`).
|
|
73
|
+
|
|
74
|
+
**AND ONE MEMBER IS ADDED, WHICH IS WHY THIS IS A PATCH AND NOT A FEATURE** — **the package's own policy, `PUB-DD-9`: a PATCH is *"a fix inside the declared surface"*.** `write` exists **on the repair's record at a REGISTRATION instant only**: the landing instant's record still has six members, the constraint body's context still has five, **no status, verb, config key, `KC` token or other member moves**, and the closed status set stays twenty ranked `1`…`20`. A consumer that enumerates the registration repair record sees seven; one that enumerates either of the other two sees what it saw before.
|
|
75
|
+
|
|
76
|
+
**THE WORKAROUND THIS RELEASE RETIRES, MEASURED ON THIS TREE.** Until now a "must exist, with a repair" pair could not travel in `cfg.constraints`, and this project's own register told a consumer to add it after construction instead. **That is no longer true:** with a `cfg.constraints` element whose body refuses on `ctx.value === undefined` and whose repair writes through the route, the construction **stands**, the body is asked **twice**, the repair's record carries `write` as a function, the object lands, and the pair stands. **The `addConstraint`-after-construction advice is withdrawn by this release.**
|
|
77
|
+
|
|
78
|
+
**TWO CHANGES WITH A MIGRATION COST, SAID PLAINLY RATHER THAN LEFT TO A BUG REPORT:**
|
|
79
|
+
|
|
80
|
+
- **A pair registered at a deep address no longer guards its ancestor's removal.** A `delete` of `['window']` reaches a pair at `['window','tabs']` and **skips it**, so the delete lands. **To guard a container, register the pair AT the container** — its parent is the register, which always resolves.
|
|
81
|
+
- **A construction that refused for a well-formed pair whose parent was absent now stands.** A consumer who relied on that refusal to catch a stale list gets an instance with the pairs carried instead.
|
|
82
|
+
|
|
83
|
+
**WHAT THIS RELEASE DOES NOT FIX**, recorded with owners in the unit's tracker entry and the live ledger: the refusal sentence's address at `kernel-attempt.mjs` (a recorded defect row, no successor queued); `§5.4`'s beside-write sentence, a named adjacent tension read through and edited by no pass; a body's direct write, now **declared unsupported** while the capability stays (`D-92`/`D-93`); and four corpus residuals — two property rows' wording, a `KC` token that no registration refusal prints, and a re-run arm unreachable through this route.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
56
87
|
## §1.4.0 · **CUT AND PUBLISHED — tag `v1.4.0`** — what that release carries: the seven commits on `main` past `v1.3.0`, and the one figure this section states
|
|
57
88
|
|
|
58
89
|
**⟶ THE HEADING THAT STOOD HERE WAS *"`## §1.4.0 · **PREPARED** — what `1.4.0` carries: the seven commits on `main` past `v1.3.0`, and the one figure this section states`"*, AND IT IS CORRECTED AT ITS OWN LINE, 2026-10-28.** `RCA-8(g)` ANNOTATE-BESIDE: **the withdrawn bytes are quoted above, every paragraph of this section below stands BYTE-FOR-BYTE as the reading of its own date, and nothing is deleted.** **THE DEFECT IS THE `DEF-AC` CLASS AT ITS THIRD ITERATION AND AT ITS SHARPEST: A HEADING THAT DENIED THE RELEASE ITS OWN TAG NAMES.** The tag set at this date reads `v1.0.0` · `v1.0.1` · `v1.1.0` · `v1.2.0` · `v1.3.0` · `v1.4.0`; **the tag `v1.4.0` names a tree whose `bindings/js/package.json` reads `"version": "1.4.0"` at its own bytes**, its five `optionalDependencies` pins read `1.4.0` with it, and the five platform manifests' `version` fields read `1.4.0` with them; and **a reader opening this file met *"PREPARED"* over a version the registry carries.** **SO THE HEADING NOW READS `CUT AND PUBLISHED — tag `v1.4.0``, which is a PAST-TENSE RECORD OF A RELEASE AND NOT A CLAIM ABOUT THE TREE YOU ARE READING** — the tag set is the record of what has been cut, and the state of the current tree's version is not a document's to state (`D-57`, and the head clause of this file, which stands). **AND WHAT THE SECTION BELOW DECLARES IS UNMOVED BY THE CORRECTION: the ancestor set (`D-56`), the `delete`'s own attempt and its `CommitRecord` (`D-57`), the five smaller items of `D-55`, and the one shipped sentence that all of it falsified — those are `1.4.0`'s content, they travelled in its tarball, and a consumer who installed `1.4.0` has them.** (`D-57`; the head clause of 2026-10-28 above; `git tag --list` and `bindings/js/package.json` read at their own bytes this date.)
|
|
@@ -73,7 +104,28 @@ the value to assert against, not the crate's own `Cargo.toml` version.
|
|
|
73
104
|
|
|
74
105
|
**4 · AND A SHIPPED SENTENCE WAS FALSIFIED BY ALL OF IT, AND IS CORRECTED AT ITS OWN HOME.** **The package's `README.md` said a `delete` and a `rollback` both perform no file I/O at any tier scope.** **A `delete` SAVES NOW** — a `file`-tier delete left the bytes standing and a fresh boot read the old value; the terminal arm saves the delete's own op, and a failed save is the write's arm with `KC-9`. **A `rollback` still performs no file I/O, because it has no op of its own to save at** — and that half of the sentence was never in doubt. (`1090e1e`; `bindings/js/README.md`'s own 2026-10-28 clause.)
|
|
75
106
|
|
|
76
|
-
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## §1.6.1 · **CUT AND PUBLISHED — tag `v1.6.1`** — a DOCUMENTATION release: what `1.6.1` carries, and the arithmetic that says how many commits
|
|
110
|
+
|
|
111
|
+
**⟶ AND THIS HEADING CARRIED THE PRE-RELEASE MARKER UNTIL THE TAG WAS CUT, 2026-10-30 — `D-83`.** `RCA-8(g)`
|
|
112
|
+
ANNOTATE-BESIDE: **the withdrawn heading's bytes stand in the withdrawn record and are read THROUGH this clause; this
|
|
113
|
+
sentence deliberately does not quote them, because a quotation of a claim reads as a claim and the scan cannot tell
|
|
114
|
+
them apart — which is `D-80`'s own finding.** **A cut-state is the tag set's to answer: the tag exists, so this section
|
|
115
|
+
names a past act and not a present claim — and it is the one new cut-claim `D-82`'s ratchet could not admit until
|
|
116
|
+
`D-83` gave it the arm.**
|
|
117
|
+
|
|
118
|
+
**⟶ THIS SECTION IS NEW, 2026-10-30, AND IT STATES THE VERSION AND NOT THE CUT-STATE.** `RCA-8(g)` ANNOTATE-BESIDE: **no byte of the sections below moves; this section is added above `§1.6.0`, and that section's heading is corrected at its own line in the same act.** **AND THIS SECTION DOES NOT STATE WHETHER `1.6.1` HAS BEEN CUT: the cut-state is the tag set's to carry and not a document's to state** (`D-57`; the head clause of 2026-10-28 above, which governs every sentence here).
|
|
119
|
+
|
|
120
|
+
**THE VERSION: `1.6.1` AT ELEVEN CELLS THAT MOVE TOGETHER AND NEVER SINGLY** — `bindings/js/package.json`'s `version`, its five exact `optionalDependencies` pins, and the five `bindings/js/platforms/*/package.json` `version` fields, read at their own bytes this date — **and `npm run build` stamps the artefact from that manifest, so `version()` answers `1.6.1` at the built artefact and at a package installed from it** (measured this date at `bindings/js/build/Release/storeroom_js_binding.node`, and again at a package installed into a `/tmp` consumer with no repository in its ancestry). **AND `scripts/publish.sh --figures` REPORTS THE SAME FIGURE IN THREE SHIPPED DOCUMENTS** — this change list's marked line, the guide's and `bindings/js/README.md`'s are each generated from that manifest, and the three agree: one generator, one assertion. (`DEF-AC` (b); `D-57`; `scripts/publish.sh --figures`.)
|
|
121
|
+
|
|
122
|
+
**THE ARITHMETIC, RE-MEASURED AT THIS TREE: `git rev-list --count v1.6.0..HEAD` READS `4` AND `git describe` READS `v1.6.0-4-g674b79e`.** **The four — `636e69f`, `9ac7e0e`, `93682f3` and `674b79e` — each write `strata/decisions.md` and no other path: they are the rulings `D-79`, `D-80`, `D-81` and `D-82`, recorded beside the tree they measured, and not one of them changes a line the package ships.** **SO THE FOUR COMMITS MOVE NO BEHAVIOUR, AND THE RELEASE'S CONTENT IS THE WORKING TREE THIS PASS CARRIES BESIDE THEM — named here because a consumer must be able to read it before the cut:** **the TWO MOVE-OUTS** (`D-81` item `1`: the `§1.3.0` paragraph that claimed a cut-state and the clause that preserved it, each moved out byte-exactly into `docs/guides/backup/D81-2026-10-29-notes-move-out.md`, each leaving a one-line pointer at this file's lines `267` and `269`); **the SCANNER** (`D-81` item `3`: `scripts/publish.sh --cut-claims`, four documents and nine phrase spellings, NOT section-scoped); and **the RATCHET** (`D-82`: the catalogue is the exemption set — a cut claim at a catalogued site is accepted, a claim anywhere else is refused, and an entry whose site no longer carries one is a stale entry); **and beside them this version's bump, this section, the guide's and the README's generated lines, and the heading correction above.** **AND WHAT THAT ADDS UP TO FOR YOU, SAID INSTEAD OF LEFT TO INFERENCE: four record commits past `v1.6.0`, four documents touched on the working tree, and `4 + 4` is the whole of it — no line of `bindings/js/src/`, `bindings/js/index.mjs` or `bindings/js/index.d.ts` moved.**
|
|
123
|
+
|
|
124
|
+
**NO BEHAVIOUR CHANGE — the failure form stays four members, `LogEntry` stays five, the status set stays twenty, the `KC` set stays nine, and not one call a consumer makes changes its answer.** **THIS IS A DOCUMENTATION RELEASE AND IT SAYS SO PLAINLY:** what `1.6.1` carries is the record of a guard's design and of a document's honesty — a scanner, a baseline, two moved-out passages and the arithmetic above — and **a consumer who installs `1.6.1` meets the behaviour of `1.6.0` at every arm the suite measures**, because no arm moved. (`D-74`; `D-75`; `D-77`; `D-78`; `§1.6.0`'s items `1` through `8`, which are the behaviour `1.6.0` carries; `npm test`'s reading on this tree.)
|
|
125
|
+
|
|
126
|
+
## §1.6.0 · **CUT AND PUBLISHED — tag `v1.6.0`** — what that release carries: the eleven commits on `main` past `v1.5.0`, derived from the tree
|
|
127
|
+
|
|
128
|
+
**⟶ `RCA-8(g)` MOVE-OUT OF THE HEADING THAT STOOD AT THIS LINE, AUTHORED 2026-10-30 BY THE `1.6.1` PASS (`D-82` · `DEF-AC`): THE HEADING THAT STOOD HERE CLAIMED A PREPARATION STATE OVER `1.6.0`, THE VERSION THE TAG `v1.6.0` NAMES — ITS BYTE-EXACT TEXT, WITH THE `sha256` OF ITS ONE LINE, STANDS AT `docs/guides/backup/D81-2026-10-29-notes-move-out.md` `§5`.** **`git tag --list` answers `v1.6.0`, so a heading over that version is a PAST-TENSE RECORD OF A RELEASE and not a preparation, which is the spelling `§1.4.0` and `§1.5.0` above already carry.** **AND WHAT THIS ACT DOES NOT DO: it moves no other byte of this section, its body and its items below stand BYTE-FOR-BYTE as the reading of their own date, and the `1.6.1` bump is stated in the section above and in no line of this one.** (`D-57`; `D-79`; `D-82`; `git tag --list`.)
|
|
77
129
|
|
|
78
130
|
**⟶ THE HEADING THAT STOOD HERE WAS *"`## §1.6.0 · **PREPARED** — what `1.6.0` carries: the six commits on `main` past `v1.5.0`, derived from the tree`"*, AND ITS COUNT IS CORRECTED AT ITS OWN LINE, 2026-10-29.** `RCA-8(g)` ANNOTATE-BESIDE: **the withdrawn bytes are quoted above, every paragraph of this section below stands BYTE-FOR-BYTE as the reading of its own date, and nothing is deleted.** **THE COUNT MOVED BECAUSE THE TREE DID**: the section was written when `git describe` read `v1.5.0-6-g9e7a766`, and **the five commits after that reading — `74d871e` through `8f5454f` — carry `D-77`'s member and `D-78`'s clause, which this preparation declares.** **A HEADING THAT UNDERCOUNTS THE COMMITS IT PREPARES IS THE `DEF-AC` CLASS AT ITS MILDLEST AND IS CORRECTED RATHER THAN ANNOTATED AROUND, because the count is the one figure this section's own arithmetic prints.** (`D-57`; `git describe` at `v1.5.0-11-g8f5454f`; the arithmetic clause below, which is the re-sort.)
|
|
79
131
|
|
|
@@ -262,11 +314,9 @@ travelled in.** **Now `scripts/publish.sh` GENERATES both from `bindings/js/pack
|
|
|
262
314
|
beside a generated *"IS CUT"* fails, and the generated line passes; `--figures` runs that one check read-only. **A
|
|
263
315
|
hand-written line that contradicts the manifest can no longer travel.**
|
|
264
316
|
|
|
265
|
-
|
|
266
|
-
`1.2.0`.** **The two behaviour changes are declared here because a consumer must be able to read them BEFORE the cut and
|
|
267
|
-
must not be told they are in a tarball that does not carry them** — the same honesty the corrected head above owes.
|
|
317
|
+
**⟶ `RCA-8(g)` MOVE-OUT, AUTHORED 2026-10-29 BY `D-81` ITEM 1 (`D-79` · `DEF-AC`): THE PARAGRAPH THAT STOOD HERE — the `§1.3.0` clause that asserted the cut-state of the version this section prepares, denied the tag set beside it, and named the figure the version cells then read — IS NO LONGER AT THESE LINES.** **Its byte-exact text stands at `docs/guides/backup/D81-2026-10-29-notes-move-out.md §1`, whose head names this source path, the pre-move lines `265`–`267` and the `sha256` of the region.** **The cut-state's ONE authority is `git tag --list`, stated at this file's head clause of 2026-10-29: no paragraph here asserts or denies it.** **AND WHAT DID NOT MOVE: the two behaviour changes the paragraph preceded travelled in `1.3.0`'s tarball and are declared at this section's items `1` and `2` above, unmoved.** (`D-79`; `D-81`; `git tag --list`.)
|
|
268
318
|
|
|
269
|
-
**⟶
|
|
319
|
+
**⟶ `RCA-8(g)` MOVE-OUT, AUTHORED 2026-10-29 BY `D-81` ITEM 1 (`D-79` · `DEF-AC`): THE CLAUSE THAT STOOD HERE — the `2026-10-28` annotate-beside that preserved the paragraph above's cut-state while superseding its figures — IS NO LONGER AT THIS LINE.** **Its byte-exact text stands at `docs/guides/backup/D81-2026-10-29-notes-move-out.md §2`, whose head names this source path, the pre-move line `269` and the `sha256` of the region.** **The distinction that clause drew is kept where it belongs: `§1.3.0`'s own head records the release the tag set answers for, and its half about the figures is the reading of its own date.** **The cut-state's ONE authority is `git tag --list`, stated at this file's head clause of 2026-10-29: no paragraph here asserts or denies it.** (`D-79`; `D-81`; `git tag --list`.)
|
|
270
320
|
|
|
271
321
|
---
|
|
272
322
|
|
package/index.d.ts
CHANGED
|
@@ -1173,6 +1173,75 @@ export interface ConstraintPair {
|
|
|
1173
1173
|
* item 1: `true` is the only pass value). **Every non-function is outside the position AT EVERY ONE OF THE
|
|
1174
1174
|
* THREE METHODS**, and a non-function at the toggle's position is refused on the ARGUMENT's ground and
|
|
1175
1175
|
* never on the pair's.
|
|
1176
|
+
*
|
|
1177
|
+
* **⟶ AND THE TWO RETURNS THIS POSITION ADMITS ARE DECLARED HERE, ADDED 2026-10-30 — WHAT YOUR
|
|
1178
|
+
* CONSTRAINT MAY RETURN, AND WHAT ITS REPAIR MAY RETURN.** **EVERY SENTENCE OF THIS CLAUSE — THE ONE THIS MARK
|
|
1179
|
+
* OPENS, ADDED 2026-10-30 — HOLDS AT THE WRITE'S OWN EVALUATION, THE INSTANT THE KERNEL EVALUATES THE VALUE
|
|
1180
|
+
* YOUR FUNCTION RETURNED, AND AT THAT INSTANT ONLY, EXCEPT WHERE A SENTENCE NAMES ITS OWN INSTANT IN ITS OWN
|
|
1181
|
+
* WORDS.** **AND A SENTENCE STANDING ABOVE THIS CLAUSE IS OUTSIDE THIS FRAME AND IS READ AT ITS OWN INSTANTS
|
|
1182
|
+
* BY ITS OWN WORDS — this clause moves none of it.** The clause above prints the answer's PASS value;
|
|
1183
|
+
* this one declares the rest of the closed set IN ITS OWN WORDS, so a reader holding this package reads the
|
|
1184
|
+
* rule and needs no second document for it.
|
|
1185
|
+
*
|
|
1186
|
+
* **THE OUTCOME IS A CLOSED THREE-ARM SET, READ IN THIS ORDER: `true` — THE ONLY PASS VALUE;
|
|
1187
|
+
* `{ message, repair }` — A REPAIRABLE VIOLATION; `{ message }` — AN UNREPAIRABLE VIOLATION, ITS `message`
|
|
1188
|
+
* THE REFUSAL'S OWN SENTENCE. A VALUE OUTSIDE THE THREE IS READ AS THE `{ message }` ARM AND NEVER AS A
|
|
1189
|
+
* FOURTH ARM OF ITS OWN**, so a return you invent beyond them declares an outcome this kernel does not
|
|
1190
|
+
* distinguish.
|
|
1191
|
+
*
|
|
1192
|
+
* **AND `message` IS REQUIRED ON THE REPAIR ARM AND IS READ FIRST**: the gate is the `message` member,
|
|
1193
|
+
* read before any `repair` is looked for, and a `repair` is looked for only inside that branch — **so a
|
|
1194
|
+
* return carrying only `repair` is the arm outside the three and ITS REPAIR IS NEVER SEEN**, and **AT THE
|
|
1195
|
+
* WRITE'S OWN EVALUATION a `message` that is not a NON-EMPTY STRING keeps the repair readable while the
|
|
1196
|
+
* refusal answers the kernel's own unrecognized sentence** (the closed set, its order and this read stand at
|
|
1197
|
+
* `bindings/js/src/entry/kernel-attempt.mjs:686-699`).
|
|
1198
|
+
*
|
|
1199
|
+
* **THE ATTACH: the `repair` your function returns IS A FUNCTION TAKING ONE ARGUMENT — ITS OWN RECORD,
|
|
1200
|
+
* WHICH IS NOT YOUR CONSTRAINT'S AND IS NOT INTERCHANGEABLE WITH IT.** **The two records stand apart at
|
|
1201
|
+
* THREE PLACES: by COUNT, SIX against FIVE; by `id`, which the repair's record carries where the
|
|
1202
|
+
* constraint's carries `attempt`; and by `pending`, which rides the repair's record ALONE**
|
|
1203
|
+
* (`bindings/js/src/entry/kernel-attempt.mjs:607-613`, `:756-782`; the kernel's own words at
|
|
1204
|
+
* `bindings/js/src/entry/kernel-registration.mjs:373-374`). **No member census of either record is
|
|
1205
|
+
* printed here.**
|
|
1206
|
+
*
|
|
1207
|
+
* **AT THE WRITE'S OWN EVALUATION — AT THAT INSTANT AND NO OTHER — THE KERNEL READS `message` AND
|
|
1208
|
+
* `repair` AS OWN MEMBERS OF THE OBJECT YOUR FUNCTION RETURNED: a pair carried on a prototype is NOT SEEN
|
|
1209
|
+
* there, and such a return answers the kernel's unrecognized sentence instead**
|
|
1210
|
+
* (`bindings/js/src/entry/kernel-attempt.mjs:690-696`). **THIS IS THE ONLY SENTENCE IN THIS FILE THAT
|
|
1211
|
+
* STATES THAT RULE, AND IT IS THE LANDING INSTANT'S**: the registration act reads the same
|
|
1212
|
+
* closed outcome at `bindings/js/src/entry/kernel-registration.mjs:330-332`, where an inherited `repair`
|
|
1213
|
+
* IS seen and invoked — **ONE RETURNED SHAPE ANSWERING TWO DIFFERENT THINGS AT THE TWO INSTANTS, a repair
|
|
1214
|
+
* at registration and no repair at a write — and that divergence is OWED to a code-bearing unit and is
|
|
1215
|
+
* CONTRADICTED BY NO SENTENCE HERE** (`strata/decisions.md` · `D-35`, whose parameter-access rule the
|
|
1216
|
+
* registration read does not yet hold).
|
|
1217
|
+
*
|
|
1218
|
+
* **THE REPAIR'S OWN RETURN IS A CLOSED TWO-ARM SET: `{ ok: true, op }` — the repairable arm, `op`
|
|
1219
|
+
* REQUIRED and BEING THE OPERATION RECORD THE STORE'S OWN VERB RETURNED (`WriteRecord.op`, or
|
|
1220
|
+
* `DeleteRecord.op` where that member is non-`null` — a `delete` that removed nothing answers `null` and
|
|
1221
|
+
* credits nothing) — and `{ ok: false, message }` — the failed arm. WHERE `ok` IS FALSE THE RETURNED
|
|
1222
|
+
* OBJECT'S MEMBERS ARE `ok` AND `message`, AND `op` IS ABSENT AND NEVER `null`, BECAUSE AN `op` THERE IS
|
|
1223
|
+
* READ BY NOTHING. **AT THE WRITE'S OWN EVALUATION A RETURN CARRYING ANY OTHER IDENTITY FAILS `KC-4`**
|
|
1224
|
+
* (`KC-4`'s token and the repair-body path print at `docs/specs/storeroom-constraints/contract.md:552`,
|
|
1225
|
+
* and the two arms print at `:558`). **That one sentence covers every outside form of that return, and
|
|
1226
|
+
* this file enumerates none of them.**
|
|
1227
|
+
*
|
|
1228
|
+
* **AND THE OP MUST BE ONE THE ATTEMPT CAN BE SHOWN TO HAVE LANDED: that ground is the kernel's own credit
|
|
1229
|
+
* check, and it is POINTED AT here and never re-spelled** —
|
|
1230
|
+
* `bindings/js/src/entry/kernel-foundations.mjs:1105-1131` — **and NO ORDINAL GROUND IS CLAIMED AT THE
|
|
1231
|
+
* REGISTRATION INSTANT, whose credit check runs with no invoked-for op**
|
|
1232
|
+
* (`bindings/js/src/entry/kernel-registration.mjs:510-517`).
|
|
1233
|
+
*
|
|
1234
|
+
* **AND THE COMMIT YOUR REPAIR IS PART OF RIDES THAT ONE ARGUMENT: supply it at `write`'s DECLARED FOURTH
|
|
1235
|
+
* POSITION and the write your repair makes JOINS the commit it is part of**
|
|
1236
|
+
* (`bindings/js/index.d.ts:862`) — **the record the repair is handed carries that commit at its `pending`
|
|
1237
|
+
* member, the `CommitRecord.pending` this file declares at `bindings/js/index.d.ts:772`, POINTED AT here
|
|
1238
|
+
* and re-declared nowhere.** **That position's own class test is not restated.**
|
|
1239
|
+
*
|
|
1240
|
+
* **AND NOTHING HERE MINTS A TYPE, A SYMBOL, AN ALIAS, A SEAM, A RECORD MEMBER OR AN EXPORT**: this clause
|
|
1241
|
+
* DOCUMENTS the pair your function returns and a two-arm result the kernel already reads, and DECLARES
|
|
1242
|
+
* nothing — `Constraint` below is unmoved, one `unknown` in and one `unknown` out. **Nor does it name an
|
|
1243
|
+
* archived part as the place its rule is to be read: the rule IS the sentences above, and every point they
|
|
1244
|
+
* cite is a live print of the kept contract or a live source range on this branch.**
|
|
1176
1245
|
*/
|
|
1177
1246
|
export type Constraint = (context: unknown) => unknown;
|
|
1178
1247
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "provident-storeroom",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.2",
|
|
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",
|
|
@@ -41,11 +41,11 @@
|
|
|
41
41
|
"src/constraint-kernel.mjs"
|
|
42
42
|
],
|
|
43
43
|
"optionalDependencies": {
|
|
44
|
-
"@auspicion/provident-storeroom-js-linux-x64-gnu": "1.6.
|
|
45
|
-
"@auspicion/provident-storeroom-js-linux-arm64-gnu": "1.6.
|
|
46
|
-
"@auspicion/provident-storeroom-js-darwin-x64": "1.6.
|
|
47
|
-
"@auspicion/provident-storeroom-js-darwin-arm64": "1.6.
|
|
48
|
-
"@auspicion/provident-storeroom-js-win32-x64-msvc": "1.6.
|
|
44
|
+
"@auspicion/provident-storeroom-js-linux-x64-gnu": "1.6.2",
|
|
45
|
+
"@auspicion/provident-storeroom-js-linux-arm64-gnu": "1.6.2",
|
|
46
|
+
"@auspicion/provident-storeroom-js-darwin-x64": "1.6.2",
|
|
47
|
+
"@auspicion/provident-storeroom-js-darwin-arm64": "1.6.2",
|
|
48
|
+
"@auspicion/provident-storeroom-js-win32-x64-msvc": "1.6.2"
|
|
49
49
|
},
|
|
50
50
|
"publishConfig": {
|
|
51
51
|
"access": "public"
|
|
@@ -19,7 +19,7 @@ import { currentWindow, homeAddressKey, installRestartConsumer, isStoreReceiver,
|
|
|
19
19
|
// function the pass appends with — rather than pushed here with a member set of its own; the REFUSAL's own
|
|
20
20
|
// list keeps its five members and no `seq`, because no attempt stands at the judgement that built it
|
|
21
21
|
// (`D-41` item 4). Two records, two honest forms, one append.
|
|
22
|
-
import { append, boundedEntryMessage, boundedQuotation, externalCall, kernelFor, throwableForm } from './kernel-foundations.mjs';
|
|
22
|
+
import { append, boundedEntryMessage, boundedQuotation, externalCall, kernelFor, pairAppliesAt, throwableForm } from './kernel-foundations.mjs';
|
|
23
23
|
// **⟶ AND THE TWO KERNEL ACTS THE DELETE'S PATH OWES — `D-55` ITEM 3, 2026-10-29.** The kernel's public
|
|
24
24
|
// barrel (`src/constraint-kernel.mjs`) is untouched and keeps its five names; **these are two PART modules' own
|
|
25
25
|
// acts, reached here the way `append` and `kernelFor` above are** (`kernel-surface.md §1` item 1's empty import
|
|
@@ -2529,6 +2529,20 @@ export function judgeReversal(instance, watched, reversalId) {
|
|
|
2529
2529
|
const moved = movedStanding(instance, watched);
|
|
2530
2530
|
for (let index = 0; index < moved.length; index += 1) {
|
|
2531
2531
|
const one = moved[index];
|
|
2532
|
+
// ═══════════════════════════════════════════════════════════════════════════════════════════════
|
|
2533
|
+
// **⟶ THE PAIR-APPLICATION RULE IS READ AT THE REVERSAL'S JUDGEMENT — `D-96`, `PIN-2` (v), `PIN-3`,
|
|
2534
|
+
// `PIN-4` (iv).**
|
|
2535
|
+
// ═══════════════════════════════════════════════════════════════════════════════════════════════
|
|
2536
|
+
//
|
|
2537
|
+
// **A `rollback` APPENDS NO JOURNAL ENTRY, so no pass reaches it** (`kernel-attempt.mjs`'s loop runs on a
|
|
2538
|
+
// landed act): **the reversal's judgement is this walk, and the rule reaches it because the rule is
|
|
2539
|
+
// GLOBAL** — a reversal over a state that leaves a pair's parent unresolvable is the fifth instant's own
|
|
2540
|
+
// case (`D-90` (4)). **ONE GUARD, THE PASS'S OWN PREDICATE** (`pairAppliesAt`, asked of the pair's own
|
|
2541
|
+
// registry row and never minted again here): **a pair the rule skips is NOT ASKED here either** — it is
|
|
2542
|
+
// not refused for, it appends no `constraint-check` entry, and it cannot refuse the reversal, so the
|
|
2543
|
+
// reversal LANDS. **IT IS NOT REMOVED**: the pair stays CARRIED (`PIN-4` (i)) and is asked at the first
|
|
2544
|
+
// later instant its parent stands.
|
|
2545
|
+
if (pairAppliesAt(instance, one.entry) === false) continue;
|
|
2532
2546
|
// **THE BODY'S THROW IS THE JUDGEMENT'S OWN CATCH AND NOT A PROPAGATING VALUE** — `reversalOutcome` converts
|
|
2533
2547
|
// a body's throwable to the surface's rank-`18` form and re-throws anything unmarked as itself, and BOTH
|
|
2534
2548
|
// arrive here: the reversal has run, so a judgement that cannot complete restores and refuses (below).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// `D-13` (`docs/L1/kernel-subdivision.md` §1 part `9d`) — the pass: bytes moved from `bindings/js/src/constraint-kernel.mjs`; no logic changed.
|
|
2
|
-
import { KC, KC_TOKENS, SETTLED_ON_THE_PASSING_ARM, SAVE_FAILED_AT_THE_TERMINAL_ARM, TERMINAL_ARM, markBodyThrow, throwableForm, boundedEntryMessage, refuse, isKernelRefusal, pairSpelling, addressSpelling, sameAddress, kernelFor, append, appendOwn, ownMember, withdraw, landedOp, landedOpDefect, pairsTriggered, enterCommitFrame, leaveCommitFrame, commitLogInFlight, sealHandoff } from './kernel-foundations.mjs';
|
|
2
|
+
import { KC, KC_TOKENS, SETTLED_ON_THE_PASSING_ARM, SAVE_FAILED_AT_THE_TERMINAL_ARM, TERMINAL_ARM, markBodyThrow, throwableForm, boundedEntryMessage, refuse, isKernelRefusal, pairSpelling, addressSpelling, sameAddress, kernelFor, append, appendOwn, ownMember, withdraw, landedOp, landedOpDefect, pairsTriggered, pairAppliesAt, enterCommitFrame, leaveCommitFrame, commitLogInFlight, sealHandoff } from './kernel-foundations.mjs';
|
|
3
3
|
import { commitAttemptIdOf, terminal, close, dropHandoff } from './kernel-terminal.mjs';
|
|
4
4
|
|
|
5
5
|
/// **⟶ ADDED 2026-10-28 — THE BUMP'S CHANNEL, SPELLED ON THIS SIDE TOO (`D-63`).** **THE PASSING SWEEP MOVES THE
|
|
@@ -601,6 +601,34 @@ function evaluate(kernel, attempt, landing) {
|
|
|
601
601
|
for (const key of list) {
|
|
602
602
|
const pair = kernel.pairs.get(key);
|
|
603
603
|
if (pair === undefined) continue;
|
|
604
|
+
// ═══════════════════════════════════════════════════════════════════════════════════════════════
|
|
605
|
+
// **⟶ THE PAIR-APPLICATION RULE IS READ AT THE LOOP'S HEAD, BEFORE THE CONTEXT IS BUILT — `D-90`,
|
|
606
|
+
// `PIN-2` (v), `PIN-3`, `PIN-4` (iv).**
|
|
607
|
+
// ═══════════════════════════════════════════════════════════════════════════════════════════════
|
|
608
|
+
//
|
|
609
|
+
// **A PAIR WHOSE PARENT DOES NOT RESOLVE IS SKIPPED AT EVERY INSTANT THAT WOULD APPLY IT**, and the pass
|
|
610
|
+
// over a `write`, a `delete` or a `rollback` is the fifth of those instants (`D-90` (4)). **⟶ CORRECTED
|
|
611
|
+
// 2026-11-02 ON `D-96` (1)–(3): THIS SENTENCE READ *"A PAIR WHOSE PARENT IS NOT A CONTAINER"*, AND THE
|
|
612
|
+
// THRESHOLD IS ABSENCE ALONE** — the architect, verbatim: *"Reject this, the constraint being there
|
|
613
|
+
// implicitly expects `'x'` to be a container"* — **so the answers that APPLY a pair are the BRANCH parent
|
|
614
|
+
// and the LEAF parent, and the one answer that SKIPS it is `AddressNotFound` at the parent.**
|
|
615
|
+
// **The rule is read HERE and not at the store: the store still computes the reach** (`D-56`/`D-66`/`D-69`,
|
|
616
|
+
// untouched — the membership filter above is byte-unmoved), and what this clause decides is only **which of
|
|
617
|
+
// the pairs that reach names is actually ASKED**. **THE ADDRESS IT IS ASKED AT IS THE PAIR'S OWN** — the
|
|
618
|
+
// array it was registered at, and never the act's — because the rule's discriminator is *"the address's
|
|
619
|
+
// parent"*: a pair at `['window','tabs']` is SKIPPED after a `delete` of `['window']` however the act is
|
|
620
|
+
// addressed.
|
|
621
|
+
// **A pair standing over more than one address is applicable where ANY of them RESOLVES at its parent — as a
|
|
622
|
+
// container, as a leaf, or as the register**: one body is asked once, and the pair is not killed for a
|
|
623
|
+
// second address's sake.
|
|
624
|
+
//
|
|
625
|
+
// **A SKIP IS NOT A REFUSAL** (`PIN-3`): the pair is not asked, it joins neither `ran` nor
|
|
626
|
+
// `appliedRepairs`, it appends no `constraint-check` entry, it opens no repair and it cannot reach a
|
|
627
|
+
// terminal arm — **so an act the pair would have refused LANDS.** It is not counted as a judgement.
|
|
628
|
+
// **AND IT IS NOT REMOVED**: the pair stays CARRIED and is asked at the first later instant its parent
|
|
629
|
+
// stands and an act's own touched set reaches it (`PIN-4` (i)–(ii)). **The `pending`/`triggered`
|
|
630
|
+
// machinery moves no byte**: `releasePending` reads the run's snapshot and never the pairs that were asked.
|
|
631
|
+
if (!pairAppliesAt(attempt.store, pair)) continue;
|
|
604
632
|
// `kernel-surface.md §2.3` item 1 — THE OP WHOSE LANDING LEFT THE STATE THIS EVALUATION RUNS AT,
|
|
605
633
|
// VERBATIM, and the value that write returned, VERBATIM: "the data the constraint confirms".
|
|
606
634
|
const op = landing;
|
|
@@ -1164,6 +1164,80 @@ function opSpelling(value) {
|
|
|
1164
1164
|
return `a ${typeof value} (which is no op)`;
|
|
1165
1165
|
}
|
|
1166
1166
|
|
|
1167
|
+
// ---------------------------------------------------------------------------------------------
|
|
1168
|
+
// **⟶ THE PAIR-APPLICATION PREDICATE — ONE PREDICATE AT ONE HOME, AND ITS THIRD ARM READ THROUGH `D-96`
|
|
1169
|
+
// (2026-11-02).**
|
|
1170
|
+
//
|
|
1171
|
+
// **THE DISCRIMINATOR IS THE ADDRESS'S PARENT, AND THE SKIP THRESHOLD IS ABSENCE ALONE.** A pair's ADDRESS is
|
|
1172
|
+
// the array it was registered at, its KEY is that array's LAST segment, and its PARENT is the array MINUS that
|
|
1173
|
+
// segment; **the EMPTY PARENT IS THE REGISTER, WHICH ALWAYS RESOLVES.** So a pair is **SKIPPED** exactly when
|
|
1174
|
+
// its PARENT DOES NOT RESOLVE and **APPLICABLE** exactly when the walk reaches it at all.
|
|
1175
|
+
//
|
|
1176
|
+
// **THE WALK IS THE STORE'S OWN `readLiteral(parent)` WITH THE TIER ARGUMENT OMITTED, AND ITS THREE ANSWERS ARE
|
|
1177
|
+
// THE THREE ARMS**: `ReadTargetIsBranch` ⇒ the parent is a CONTAINER ⇒ APPLICABLE · `AddressNotFound` ⇒ the
|
|
1178
|
+
// parent does not resolve ⇒ SKIPPED · A VALUE ANSWERED ⇒ the parent is a LEAF ⇒ APPLICABLE. **The tier argument
|
|
1179
|
+
// is omitted because the zero-tier call selects every tier**, and the omission is the whole of the call's
|
|
1180
|
+
// shape: this predicate asks the store nothing else and reads no value class of its own.
|
|
1181
|
+
//
|
|
1182
|
+
// **THE LEAF ARM IS APPLICABLE BECAUSE A PAIR'S PRESENCE DECLARES ITS PARENT A CONTAINER, SO A LEAF STANDING
|
|
1183
|
+
// THERE IS THE STATE THAT PAIR IS THERE TO JUDGE.** A pair registered at `['x','deep']` is registered because
|
|
1184
|
+
// `['x']` is meant to hold it: the body is asked with `context.value === undefined` (its own address cannot be
|
|
1185
|
+
// read), it may refuse, and a repair may replace the leaf with the container the pair declares.
|
|
1186
|
+
//
|
|
1187
|
+
// **THE VERDICT IS AN INSTANT'S FACT AND IS STORED NOWHERE** (`PIN-2` (v)): every caller asks at the instant it
|
|
1188
|
+
// would apply the pair. **A SKIP IS NOT A REFUSAL** (`PIN-3`): it crosses nothing, opens no attempt, appends no
|
|
1189
|
+
// entry and removes no pair — the pair stays CARRIED and applies at the first instant its parent stands
|
|
1190
|
+
// (`PIN-4`). **NO STATUS IS MINTED AND NO VERB IS ADDED**: the two answers are two EXISTING members of the
|
|
1191
|
+
// store's closed set and one existing value.
|
|
1192
|
+
// ---------------------------------------------------------------------------------------------
|
|
1193
|
+
|
|
1194
|
+
/** **APPLICABLE** — the pair's parent RESOLVES (as a container or as a leaf), so the pair is APPLIED at this instant. */
|
|
1195
|
+
export const PAIR_APPLICABLE = 'applicable';
|
|
1196
|
+
/** **SKIPPED, ABSENT** — the pair's parent does not resolve, so the pair is SKIPPED at this instant. */
|
|
1197
|
+
const PAIR_SKIPPED_ABSENT = 'absent';
|
|
1198
|
+
|
|
1199
|
+
/**
|
|
1200
|
+
* **THE PAIR-APPLICATION PREDICATE** — one answer per call, at the one instant it is asked:
|
|
1201
|
+
* `PAIR_APPLICABLE` or `PAIR_SKIPPED_ABSENT` — **a leaf parent ANSWERS APPLICABLE**, because a pair's presence
|
|
1202
|
+
* declares its parent a container (`D-96`).
|
|
1203
|
+
*
|
|
1204
|
+
* `store` IS THE CALLER'S INTERFACE AND IT IS ASKED ONE THING: `readLiteral(address's PARENT)` with the tier
|
|
1205
|
+
* argument omitted. **NOTHING IS CAUGHT BUT THE STORE'S OWN ANSWER**, and a refusal that names any other status
|
|
1206
|
+
* is read as the absence arm — an in-domain address's parent can answer only the three answers the clause names,
|
|
1207
|
+
* so a fourth cannot arise and is not invented here.
|
|
1208
|
+
*/
|
|
1209
|
+
export function pairApplication(store, address) {
|
|
1210
|
+
const parent = address.slice(0, address.length - 1);
|
|
1211
|
+
try {
|
|
1212
|
+
// THE ONE CALL: the tier argument is OMITTED, so the walk selects every tier.
|
|
1213
|
+
store.readLiteral(parent);
|
|
1214
|
+
} catch (refused) {
|
|
1215
|
+
const status = refused !== null && typeof refused === 'object' ? ownMember(refused, 'status') : undefined;
|
|
1216
|
+
return status === 'ReadTargetIsBranch' ? PAIR_APPLICABLE : PAIR_SKIPPED_ABSENT;
|
|
1217
|
+
}
|
|
1218
|
+
// A VALUE ANSWERED: the parent is a LEAF, and a pair's presence declares its parent a container — APPLICABLE.
|
|
1219
|
+
return PAIR_APPLICABLE;
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
/**
|
|
1223
|
+
* **THE SAME ONE PREDICATE, READ OVER THE ADDRESSES A REGISTRY ROW STANDS AT** — the form the pass, the
|
|
1224
|
+
* registration's re-run and a reversal's judgement need, and the ONLY place the row's address set is walked.
|
|
1225
|
+
*
|
|
1226
|
+
* **ONE PAIR IS ONE BODY AND IS ASKED ONCE**, so a pair registered over more than one address cannot be asked
|
|
1227
|
+
* at one address and skipped at another: **it is APPLICABLE at an instant where ANY of its own addresses
|
|
1228
|
+
* resolves at its parent**, and SKIPPED only where none does. **THE PREDICATE IS NOT RE-STATED HERE** — this
|
|
1229
|
+
* loop asks `pairApplication` of each address in the registry's own order and answers the first APPLICABLE one;
|
|
1230
|
+
* a row carrying no address at all is SKIPPED, which is the absent arm's own answer.
|
|
1231
|
+
*/
|
|
1232
|
+
export function pairAppliesAt(store, pair) {
|
|
1233
|
+
const addresses = pair !== null && typeof pair === 'object' ? pair.addresses : undefined;
|
|
1234
|
+
if (!Array.isArray(addresses)) return false;
|
|
1235
|
+
for (let i = 0; i < addresses.length; i += 1) {
|
|
1236
|
+
if (pairApplication(store, addresses[i]) === PAIR_APPLICABLE) return true;
|
|
1237
|
+
}
|
|
1238
|
+
return false;
|
|
1239
|
+
}
|
|
1240
|
+
|
|
1167
1241
|
/**
|
|
1168
1242
|
* **THE PASS'S EVALUATED SET — A FILTER OVER THE STORE'S OWN `triggered`, AND NO SECOND REACH.**
|
|
1169
1243
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// `D-13` (`docs/L1/kernel-subdivision.md` §1 part `9b`) — the registration act, its evaluation, and the registry's removal: bytes moved from `bindings/js/src/constraint-kernel.mjs`; no logic changed.
|
|
2
|
-
import { KC, KERNEL_REFUSAL, markBodyThrow, refuse, inDomainAddress, inDomainId, pairRowAt, sameAddress, kernelFor, append, appendOwn, landedOp, pairsTriggered, enterCommitFrame, leaveCommitFrame } from './kernel-foundations.mjs';
|
|
2
|
+
import { KC, KERNEL_REFUSAL, markBodyThrow, refuse, inDomainAddress, inDomainId, pairRowAt, sameAddress, kernelFor, append, appendOwn, landedOp, pairsTriggered, enterCommitFrame, leaveCommitFrame, pairApplication, PAIR_APPLICABLE } from './kernel-foundations.mjs';
|
|
3
3
|
import { dropHandoff } from './kernel-terminal.mjs';
|
|
4
4
|
|
|
5
5
|
/// **⟶ ADDED 2026-10-27 — `D-46`'s NAME ON A REPAIR INVOCATION'S OWN ENTRY, SPELLED HERE AS
|
|
@@ -289,6 +289,30 @@ function withdrawRegistration(kernel, address, id, fresh, home) {
|
|
|
289
289
|
* invocation below is NOT wrapped — a throwing body reaches the caller as the very value it threw.
|
|
290
290
|
*/
|
|
291
291
|
function registrationEvaluation(kernel, store, address, id, constraint) {
|
|
292
|
+
// ═══════════════════════════════════════════════════════════════════════════════════════════════
|
|
293
|
+
// **⟶ THE PAIR-APPLICATION RULE IS READ HERE, FIRST — `D-90`, `PIN-2` (v), `PIN-3`, `PIN-4` (iv).**
|
|
294
|
+
// ═══════════════════════════════════════════════════════════════════════════════════════════════
|
|
295
|
+
//
|
|
296
|
+
// **A PAIR WHOSE PARENT DOES NOT RESOLVE IS SKIPPED AT EVERY REGISTRATION INSTANT** — construction, a boot
|
|
297
|
+
// over an existing `filePath`, `addConstraint` and a re-arm alike, because the rule is GLOBAL and not
|
|
298
|
+
// batch-only (`D-90` (4)). **⟶ CORRECTED 2026-11-02 ON `D-96` (1)–(2): THIS CLAUSE READ *"A PAIR WHOSE PARENT
|
|
299
|
+
// IS NOT A CONTAINER IS SKIPPED"* AND THE SKIP'S THRESHOLD IS ABSENCE ALONE** — the architect, verbatim: *"Reject
|
|
300
|
+
// this, the constraint being there implicitly expects `'x'` to be a container"* — **so a parent that RESOLVES
|
|
301
|
+
// applies its pair, as a CONTAINER, as a LEAF or as the REGISTER, and only `AddressNotFound` at the parent skips
|
|
302
|
+
// it: a leaf standing at the pair's parent is the state the pair is asked to judge, not one to look away from.**
|
|
303
|
+
// **THE PREDICATE IS ASKED BEFORE THE CONTEXT IS BUILT AND BEFORE THE COMMIT FRAME IS
|
|
304
|
+
// ENTERED**, so a skipped pair builds no context, appends no `constraint-check` or `repair-run` entry, enters
|
|
305
|
+
// no frame and opens no attempt; **it returns state 1's answer (`null`) and the registry row the caller's
|
|
306
|
+
// `K-1` already wrote stands UNMOVED** — the pair is CARRIED and `constraints()` names it (`PIN-4` (i)).
|
|
307
|
+
//
|
|
308
|
+
// **A SKIP IS NOT A REFUSAL AND IT IS NOT A REFUSAL OF THE PAIR** (`PIN-3`, `D-90` (3)): the body is not
|
|
309
|
+
// asked, so nothing runs, nothing is refused for it, and no `status`, `message` or `log` entry crosses. **THE
|
|
310
|
+
// ONE THING THIS EARLY RETURN MUST NOT DO IS WITHDRAW THE ROW** — `withdrawRegistration` runs only on the
|
|
311
|
+
// refusing arm, one frame above, and a skip never reaches it.
|
|
312
|
+
//
|
|
313
|
+
// **THE REGISTRY WRITE AND THE STORE'S `listen` HAVE ALREADY HAPPENED** above this function, so a skipped pair
|
|
314
|
+
// is carried BY CONSTRUCTION and not by a second act: this function is the third step and no step moves.
|
|
315
|
+
if (pairApplication(store, address) !== PAIR_APPLICABLE) return null;
|
|
292
316
|
// **⟶ THE REGISTRATION'S OWN COMMIT AND ITS OWN ONE LIST — `D-53`, 2026-10-28.** A registration is a commit
|
|
293
317
|
// (`addConstraint`'s and `constraintOn`'s brackets open one, and `3-bis` (a) already declares *"the
|
|
294
318
|
// `CommitRecord` of the registration act"*), so the record is built FIRST and the list beside it: **a verb the
|
|
@@ -383,6 +407,19 @@ function readCurrent(store, address) {
|
|
|
383
407
|
* `RollbackStep.checkpoint` precedent already fixes — while `value` is the store's CURRENT value at the
|
|
384
408
|
* pair's address, read and not landed (its (3)). **`id` IS THE PAIR'S OWN**, which the constraint's context
|
|
385
409
|
* does not carry at all, the repair's shape declaring it.
|
|
410
|
+
*
|
|
411
|
+
* **⟶ AND THE RECORD GAINS ITS SEVENTH MEMBER AT THIS INSTANT AND AT NO OTHER — `write`, 2026-11-02.** `D-91`,
|
|
412
|
+
* the architect, verbatim: ***"Give the registration instant a lawful write route."*** **THE CARRIER IS THIS
|
|
413
|
+
* RECORD AND NOTHING ELSE** (`PIN-6` (i)): the constraint body's five-member context is UNMOVED and gains
|
|
414
|
+
* nothing at any instant (`D-92` (1): the route *"is the repair's own record and by nothing else"*), and a
|
|
415
|
+
* third carrier would have to be a second argument to a ONE-argument invocation. **THE MEMBER IS
|
|
416
|
+
* INSTANT-SCOPED** (`PIN-8` (iii) (c)): the LANDING instant's six-member record at `kernel-attempt.mjs` is
|
|
417
|
+
* byte-unmoved and gains no route, so *"six"* and *"seven"* are one census each, never one census across the
|
|
418
|
+
* two instants.
|
|
419
|
+
*
|
|
420
|
+
* **THE MEMBER'S VALUE IS A FUNCTION OF THE STORE'S OWN THREE POSITIONS — `(address, tier, value)` — AND NO
|
|
421
|
+
* FOURTH.** It is built by `registrationRoute` below, which names THE REGISTRATION'S OWN `CommitRecord` and
|
|
422
|
+
* refuses a supplied fourth position BEFORE any store act.
|
|
386
423
|
*/
|
|
387
424
|
function registrationRepairContext(store, address, id, commitRecord) {
|
|
388
425
|
return {
|
|
@@ -394,6 +431,51 @@ function registrationRepairContext(store, address, id, commitRecord) {
|
|
|
394
431
|
op: null,
|
|
395
432
|
// THE COMMIT THE REPAIR IS PART OF — a FRESH LIST, never the record's own member (`§2.3` item 2).
|
|
396
433
|
pending: Array.isArray(commitRecord.pending) ? commitRecord.pending.slice() : [],
|
|
434
|
+
// THE SEVENTH MEMBER, AT THIS INSTANT ALONE (`PIN-6` (ii)): the route the repair may take.
|
|
435
|
+
write: registrationRoute(store, commitRecord),
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/**
|
|
440
|
+
* **THE WRITE ROUTE A REPAIR MAY TAKE AT A REGISTRATION INSTANT — `D-91` (ii), `PIN-6`, `PIN-7`.**
|
|
441
|
+
*
|
|
442
|
+
* **THREE POSITIONS, EXACTLY THE STORE'S `write`'S FIRST THREE — `(address, tier, value)` — AND THE COMMIT IS
|
|
443
|
+
* NOT A POSITION.** The route NAMES the registration's own `CommitRecord` — the record `registrationEvaluation`
|
|
444
|
+
* built and this record's `pending` copy-carries — **and the caller cannot name another, which is what the
|
|
445
|
+
* arity refusal below secures.** **WHERE A COMMIT WINDOW STANDS (`addConstraint`, the re-arm) THE WRITE JOINS IT
|
|
446
|
+
* AND OPENS NOTHING; WHERE NONE STANDS FOR THE CALLER (construction, a boot) THE CALL OPENS THE WINDOW ITS OWN
|
|
447
|
+
* WRITE NEEDS AND RELEASES IT ON EVERY ARM** (`state.mjs`'s `openCommit`: *"A JOIN CAN ONLY BE A JOIN OF A
|
|
448
|
+
* COMMIT THAT IS OPEN"*). Both arms are the entry's own, reached by handing the record to `write`'s FOURTH
|
|
449
|
+
* position — the position `D-46` declares for a commit — and no second mechanism is minted here.
|
|
450
|
+
*
|
|
451
|
+
* **A SUPPLIED FOURTH POSITION IS REFUSED BEFORE ANY STORE ACT, WHATEVER ITS CLASS — A LAWFUL `CommitRecord`
|
|
452
|
+
* INCLUDED — AND THE TEST IS THIS UNIT'S OWN AND NOT THE COMMIT POSITION'S.** The position's own test ACCEPTS
|
|
453
|
+
* any object carrying an own present `pending` (`delivery.mjs`), **which is exactly the record a repair holds**,
|
|
454
|
+
* so re-using it would admit the very call this clause forbids. **The refusal's form is the entry's class
|
|
455
|
+
* refusal: ONE `TypeError` whose `status` member is ABSENT, which carries NO `log` member, and which is thrown
|
|
456
|
+
* unwrapped** — the form the commit position's own refusal takes. **NO STATUS IS MINTED** (`PIN-10`): this is
|
|
457
|
+
* the package's class refusal and not a store code.
|
|
458
|
+
*
|
|
459
|
+
* **WHAT IT ANSWERS AND WHAT IT DOES NOT DO.** It answers THE STORE'S OWN `WriteRecord` — `{op, watched,
|
|
460
|
+
* triggered}`, the very record `write` answers — and a refusal CROSSES UNCONVERTED AND UNCAUGHT, in the store's
|
|
461
|
+
* own form (`WriteParentNotLink`, `AddressNotFound`, `AddressMalformed`, `ContainerKindConflict`, and the
|
|
462
|
+
* boundary's own `ValueRefusedAtBoundary` where the value is one the crossing refuses): **the route converts
|
|
463
|
+
* nothing, catches nothing and mints no code** (`PIN-6` (iv)). **IT RUNS NO PASS OF ITS OWN** (`PIN-6` (v)): it
|
|
464
|
+
* appends no `constraint-check` entry, no `outcome` entry and no terminal act, delivers no listener, and opens
|
|
465
|
+
* no attempt — **the pair is judged by the registration's own re-run over the op it landed** (`PIN-7` (iii)).
|
|
466
|
+
* **AND IT IS NOT A COPY OF THE STORE**: it is the route the kernel binds to the instance the registration is
|
|
467
|
+
* constructing, so it answers this store and no other.
|
|
468
|
+
*/
|
|
469
|
+
function registrationRoute(store, commitRecord) {
|
|
470
|
+
return function write(address, tier, value) {
|
|
471
|
+
// THE ARITY TEST IS THIS UNIT'S OWN AND IT STANDS BEFORE ANY STORE ACT (`PIN-6` (iii)).
|
|
472
|
+
if (arguments.length > 3) {
|
|
473
|
+
throw new TypeError(
|
|
474
|
+
'the registration write route takes three positions — (address, tier, value) — and no fourth: the '
|
|
475
|
+
+ 'commit is the registration\'s own and cannot be named',
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
return store.write(address, tier, value, commitRecord);
|
|
397
479
|
};
|
|
398
480
|
}
|
|
399
481
|
|
|
@@ -593,6 +675,32 @@ function registrationRerun(kernel, attempt, produced, key) {
|
|
|
593
675
|
for (const evaluated of list) {
|
|
594
676
|
const pair = kernel.pairs.get(evaluated);
|
|
595
677
|
if (pair === undefined) continue;
|
|
678
|
+
// ═══════════════════════════════════════════════════════════════════════════════════════════════
|
|
679
|
+
// **⟶ THE RE-RUN IS AN INSTANT THAT WOULD APPLY A PAIR, AND IT READS THE RULE — `D-94`, `PIN-4` (iv).**
|
|
680
|
+
// ═══════════════════════════════════════════════════════════════════════════════════════════════
|
|
681
|
+
//
|
|
682
|
+
// **`D-90`'s RULE IS GLOBAL, SO NO ARM OF IT MAY BE CARVED OUT SILENTLY**: the re-run's one reachable
|
|
683
|
+
// instance is a repair that leaves the pair's OWN parent UNRESOLVABLE during the registration — it DELETES
|
|
684
|
+
// it — **and on that arm the parent does not resolve at the instant the re-run would apply the pair.**
|
|
685
|
+
// **THE PAIR IS SKIPPED THERE AND THE REGISTRATION STANDS ON THE REPAIR'S LANDING**, and the pair is CARRIED
|
|
686
|
+
// for the first later instant its parent stands (`PIN-4` (i)). **It is not asked, it crosses nothing, and it
|
|
687
|
+
// cannot refuse the registration** (`PIN-3`).
|
|
688
|
+
//
|
|
689
|
+
// **⟶ AND THAT CLAUSE'S FIRST READING IS RE-DERIVED HERE, 2026-11-02 — `D-96` (1)–(5), the architect on this
|
|
690
|
+
// arm verbatim: *"See above"*.** It read *"a repair that removes the pair's OWN parent … it writes a leaf over
|
|
691
|
+
// it, or deletes it … THE PAIR IS SKIPPED THERE AND THE REGISTRATION STANDS ON THE REPAIR'S LANDING"*, **and
|
|
692
|
+
// a LEAF does not skip its pair**: a pair's presence declares its parent a container, so **a repair that
|
|
693
|
+
// WRITES A LEAF over that parent makes the pair ASKED at the re-run** — the body meets `undefined` as its own
|
|
694
|
+
// address's state — **and a body that REFUSES refuses the REGISTRATION at rank `19`
|
|
695
|
+
// `ConstraintRefusedAtRegistration`, on the `KC-5` arm**: the pair is the repaired one. **The inert-pair
|
|
696
|
+
// hazard survives at the DELETE arm ALONE** (`D-96` (5)): that is the arm that skips, and the pair it skips
|
|
697
|
+
// is carried until its parent stands again.
|
|
698
|
+
//
|
|
699
|
+
// **AND THE RE-RUN ITSELF IS UNCONDITIONAL (`D-94` (1), the architect verbatim: *"Always rerun after a
|
|
700
|
+
// repair"*).** This clause skips a PAIR inside the re-run and never the re-run: `registrationAttempt` calls
|
|
701
|
+
// it after every credited repair, `0`-PAIRS-ASKED INCLUDED, and this frame still returns the run's own
|
|
702
|
+
// answer. **A SKIPPED PAIR LEAVES THE RE-RUN PASSING VACUOUSLY.**
|
|
703
|
+
if (pairApplication(attempt.store, attempt.address) !== PAIR_APPLICABLE) continue;
|
|
596
704
|
let outcome;
|
|
597
705
|
const context = {
|
|
598
706
|
address: attempt.address.slice(),
|