provident-storeroom 1.6.2 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.guide.md +39 -7
- package/README.md +1 -1
- package/RELEASE-NOTES.md +39 -2
- package/index.d.ts +66 -12
- package/index.mjs +98 -111
- package/package.json +6 -6
- package/src/entry/artefact.mjs +24 -4
- package/src/entry/constraints.mjs +25 -16
- package/src/entry/delivery.mjs +240 -99
- package/src/entry/frame.mjs +20 -5
- package/src/entry/kernel-registration.mjs +31 -8
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.
|
|
33
|
+
PUBLISH-GUIDE-VERSION-LINE: THE VERSION THIS GUIDE DESCRIBES IS `1.7.0`.
|
|
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.
|
|
@@ -917,6 +917,20 @@ adopts — a cross-KIND collision, rejected regardless of kind** (`D-27`, verbat
|
|
|
917
917
|
batch - regardless of listener/constraint type"*; `index.d.ts`, `StoreConfig.constraints`). **Both are refused
|
|
918
918
|
before any filesystem act, under `ConstraintListInvalid`; the package mints no code.**
|
|
919
919
|
|
|
920
|
+
**⟶ READ THROUGH THIS CLAUSE FROM 2026-11-01 — THE BATCH'S CROSS-KIND COLLISION IS THE HANDLE, AND THE ADDRESS IS NOT A
|
|
921
|
+
COLLISION AT ALL (`D-98`, `ACTIVE`, 2026-11-01).** `RCA-8(g)` ANNOTATE-BESIDE: **the two construction refusals above stand
|
|
922
|
+
BYTE-FOR-BYTE and are read THROUGH this clause; nothing above is deleted, and this clause is one dated correction and not
|
|
923
|
+
a second site.** **IT IS THE HANDLE RULE AND IT ALWAYS WAS** — `D-27`, verbatim: *"Reject duplicate handles in batch -
|
|
924
|
+
regardless of listener/constraint type"* — **and its sentence is spelled now as the rest of this corpus spells it: *a
|
|
925
|
+
listener and a constraint do not share one handle*** (`bindings/js/README.md:232`–`:233`, the hand-authored page that
|
|
926
|
+
already read this way and that this correction makes the others agree with rather than the file it edits). **AND ONE
|
|
927
|
+
SENTENCE THIS PARAGRAPH OWED ITS READER, THE SHARED ADDRESS BEING THE WHOLE OF WHAT THE RULING MAKES LAWFUL: an element's
|
|
928
|
+
`address` coinciding with an adopted listener's `address` is NOT a collision at all** — a constraint pair and a listener
|
|
929
|
+
MAY stand at ONE address, so the construction refuses the shared HANDLE and admits the shared address (`D-98` clauses
|
|
930
|
+
(i)–(iii); `docs/L1/cross-kind-handle-only.md` §3.4, §4.2). **Its member, its instant and its no-state-moves sentence are
|
|
931
|
+
unmoved**: `ConstraintListInvalid`, in the pre-create walk, before any filesystem act (`docs/L1/surface-deltas.md` §2's
|
|
932
|
+
`B-3` row).
|
|
933
|
+
|
|
920
934
|
### §7.3 A cross-kind duplicate is REJECTED, in both directions
|
|
921
935
|
|
|
922
936
|
**A duplicate handle of the SAME kind is an overwrite. A duplicate handle ACROSS KINDS — a listener where a
|
|
@@ -924,12 +938,30 @@ constraint stands, or a constraint where a listener stands — is REJECTED** (`D
|
|
|
924
938
|
overwrite a listener with a constraint or vice versa is rejected"*; `D-29`: *"Listen cannot overwrite constraint,
|
|
925
939
|
only other listeners"*).
|
|
926
940
|
|
|
927
|
-
|
|
928
|
-
`
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
941
|
+
**⟶ RE-DERIVED 2026-11-01 — THE RULE SENTENCE READS THE HANDLE, AND THE ADDRESS IT USED TO READ IS LAWFUL (`D-98`,
|
|
942
|
+
`ACTIVE`, 2026-11-01).** `RCA-8(g)` ANNOTATE-BESIDE: **`§7.3`'s heading and its first paragraph stand BYTE-FOR-BYTE and
|
|
943
|
+
are read THROUGH this clause; the paragraph that stood below them measured the DEFECT and has MOVED OUT, and its one
|
|
944
|
+
pointer stands where it stood.** **THE LAW, IN THREE CLAUSES** — `D-98` item 1, the architect, verbatim: *"A constraint and
|
|
945
|
+
a listener can share an address, as can multiple constraints/listeners. The restriction is that a listener and a
|
|
946
|
+
constraint cannot have the same **handle**."* **(i) A CONSTRAINT PAIR AND A LISTENER MAY STAND AT ONE ADDRESS** — different
|
|
947
|
+
handles, one address, both reached by the act: the pair ASKED by the pass, the listener DELIVERED after it. **(ii) MULTIPLE
|
|
948
|
+
CONSTRAINTS at one address, and MULTIPLE LISTENERS at one address, are LAWFUL.** **(iii) THE ONLY CROSS-KIND RESTRICTION IS
|
|
949
|
+
THE HANDLE** — a listener's handle equal to a constraint pair's `id`, and a pair whose `id` equals a live listener's
|
|
950
|
+
handle, are REFUSED, **in both directions**. **AND A `listen` AT A PAIR'S ADDRESS STANDS**: the act is lawful, it answers
|
|
951
|
+
its handle (`D-22`), it purges none of the pair's rows and installs the listener beside it — so an application that moved
|
|
952
|
+
a subscription off a constrained address to work around a refusal may reclaim that address, and whether it does is that
|
|
953
|
+
application's decision and not this guide's.
|
|
954
|
+
|
|
955
|
+
**THE RULE SENTENCE, RE-DERIVED IN PLACE: *a listener and a constraint do not share one handle*** — one word more than the
|
|
956
|
+
address reading, its spelling `bindings/js/README.md:232`–`:233`'s, and it is the clause half of all four refusal
|
|
957
|
+
messages (`docs/L1/cross-kind-handle-only.md` §3.4, §3.6). **WHAT DOES NOT MOVE:** a duplicate handle of the SAME kind is
|
|
958
|
+
still an OVERWRITE (`D-24`); the cross-kind refusal is still the surface's ONE thrown form `{status, message, log,
|
|
959
|
+
address}` — `status` `'AddressMalformed'` at the three single-registration arms and `'ConstraintListInvalid'` at the batch,
|
|
960
|
+
`log` `[]`, and `address` `null` because the subject is a string in the handle namespace and not a place — and **no state
|
|
961
|
+
moves**: each refusal is taken after the positions' class tests and above every store act and every purge (`index.d.ts`,
|
|
962
|
+
the `register`/`addConstraint`/`StoreConfig.constraints` clauses; `docs/L1/surface-deltas.md` §2).
|
|
963
|
+
|
|
964
|
+
**⟶ THE 2026-10-26 MEASURED PARAGRAPH THAT STOOD HERE HAS MOVED OUT BYTE-EXACTLY (`RCA-8(g)`, `D-98` item 5).** **the measurement that stood here measured the address refusal this guide's rule no longer makes; its bytes are at `docs/guides/backup/D98-2026-11-01-guide-move-out.md §1`.**
|
|
933
965
|
|
|
934
966
|
### §7.4 The toggles, and the read
|
|
935
967
|
|
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.
|
|
34
|
+
PUBLISH-README-VERSION-LINE: THE VERSION THIS README DESCRIBES IS `1.7.0`.
|
|
35
35
|
|
|
36
36
|
## The one entry
|
|
37
37
|
|
package/RELEASE-NOTES.md
CHANGED
|
@@ -16,7 +16,7 @@ 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.
|
|
19
|
+
PUBLISH-NOTES-VERSION-LINE: THE VERSION THIS CHANGE LIST DESCRIBES IS `1.7.0`.
|
|
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
|
|
|
@@ -55,7 +55,44 @@ the value to assert against, not the crate's own `Cargo.toml` version.
|
|
|
55
55
|
|
|
56
56
|
---
|
|
57
57
|
|
|
58
|
-
## §1.
|
|
58
|
+
## §1.7.0 · a MINOR — the cross-kind correction's landing: the four refusal messages a consumer reads differently, what does not move, and the arithmetic that says how many commits
|
|
59
|
+
|
|
60
|
+
**⟶ THIS SECTION IS NEW, 2026-11-01, 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.2`, whose heading is corrected at its own line in the same act.** **AND THIS SECTION DOES NOT STATE WHETHER `1.7.0` HAS BEEN RELEASED: 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 and the authority clause of 2026-10-29 above, which govern every sentence here).
|
|
61
|
+
|
|
62
|
+
**THE VERSION IS `1.7.0` AND ITS CLASS IS A MINOR — `D-100`, THE ARCHITECT'S RULING OF 2026-11-01 (`strata/decisions.md` `D-100`), VERBATIM: *"Minor — 1.7.0"*.** **THE GROUND IS A MEASUREMENT AND NOT A PREFERENCE: FOUR REFUSAL MESSAGES CHANGE THEIR TEXT ON A PUBLISHED SURFACE**, which is more than this project's own `PUB-DD-9` row allows a PATCH (*"a fix inside the declared surface"*) and less than a break of any member — so the class is the MINOR the number names (`D-100` item (i)).
|
|
63
|
+
|
|
64
|
+
**THE ELEVEN CELLS 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 — **and the artefact is stamped from that manifest by `bindings/js/build.rs`, so `version()` answers `1.7.0` at the rebuilt artefact and at a package installed from it**; that, and not the crate's own `Cargo.toml` version, is the value the coupling rule is asserted against (`§1.6.2`'s version clause states the shape and is read through it; `scripts/publish.sh`'s own cell enumeration).
|
|
65
|
+
|
|
66
|
+
**THE ARITHMETIC, MEASURED AT THIS TREE: `git rev-list --count v1.6.2..HEAD` READS `1`.** **The one commit is `e024195`, *"Land the cross-kind correction: one address is lawful, the handle is the restriction (D-98–D-100)"*, and `git show --stat e024195` reads `33` files changed, `4506` insertions and `355` deletions — a split by what the commits ARE rather than by what they touch, in four kinds:** **the JS entry and its parts** (`index.mjs`, `src/entry/delivery.mjs`, `constraints.mjs`, `frame.mjs`, `kernel-registration.mjs`, `artefact.mjs`); **the addon's facade and the store's own message generator** (`bindings/js/src/facade.rs`, `src/error.rs`); **the declaration** (`bindings/js/index.d.ts`); **and the documents and the batteries** (the L1 declaration, the guide with its landing, the move-out record, two spec parts, three records, and eleven paths under `tests/e2e/`). **AND THE RELEASE'S OWN LANDING IS THIS PASS'S WORKING TREE AND NOT A COMMIT COUNT** — the bump, this section, `§1.6.2`'s heading repair, the two generated landings and the ledger row — **so the figure above is printed with its instrument and is not summed with them.** (`git rev-list --count v1.6.2..HEAD`; `git show --stat e024195`.)
|
|
67
|
+
|
|
68
|
+
**WHAT A CONSUMER SEES, EACH AN ARM TO DRIVE RATHER THAN A SENTENCE TO TRUST:**
|
|
69
|
+
|
|
70
|
+
1. **A CONSTRAINT PAIR AND A LISTENER MAY STAND AT ONE ADDRESS.** Before this release a `listen` at an address a carried pair stood at was refused; now the act stands, both actors are carried, and **a write at that address triggers the pair AND delivers the listener** (`D-98` item 1; `docs/L1/cross-kind-handle-only.md` §1 and its `XK-1`). **AND THE ONLY CROSS-KIND RESTRICTION IS THE HANDLE**: a listener's handle and a constraint's `id` are **one string**, and neither kind may claim a handle the other keeps (`D-98` item 1 (iii); `D-99`).
|
|
71
|
+
2. **THE FOUR CROSS-KIND REFUSALS PRINT NEW MESSAGE TEXT, AND THE RULE SENTENCE IS *"a listener and a constraint do not share one handle"*.** `AddressMalformed` stands at **three** arms — `listen` (`B-6`), `register` (`B-5`) and `addConstraint` (`B-4`) — and `ConstraintListInvalid` at **one**, the construction's batch element (`B-3`); the four texts whole are `docs/L1/cross-kind-handle-only.md` §3.6, and they are asserted **whole** at five cell homes, so a pass that edits one word of a message moves five cells. **THE STATUSES DO NOT MOVE; THE SENTENCES DO** — and the half they carried that was false at every arm, the store's segment sentence rendered with an empty container, is gone (`D-98` item 4, verbatim: *"the false half cannot stay"*).
|
|
72
|
+
3. **A DISABLED PAIR'S HANDLE BLOCKS A CALLER EXACTLY AS AN ENABLED ONE'S DOES** — a caller's `listen('<pair id>', …)` and a caller's `register('<pair id>', fn)` are both refused after `constraintOff`, where the second was admitted before (`D-99`; `docs/L1/cross-kind-handle-only.md` §9.4, and `XK-6` is the measurement).
|
|
73
|
+
4. **THE KERNEL REACHES THE STORE THROUGH ITS OWN ROUTE AND NO LONGER THROUGH A CALLER-FACING MEMBER.** That is the correction's one internal restructure (`D-99`'s ANSWERED clause: `listenOn`, the `LISTEN_ROUTE` symbol and `installListenRoute`, §9.2), **it deletes the `state.establishing` marker and its four brackets, and it changes no answer a consumer's own call receives** — which is why it is stated here rather than left to a reader who meets the changed call in a stack.
|
|
74
|
+
|
|
75
|
+
**WHAT DOES NOT MOVE, ENUMERATED SO THE MINOR IS NOT READ AS WIDER THAN IT IS:**
|
|
76
|
+
|
|
77
|
+
- **THE CLOSED STATUS SET IS TWENTY, ranked `1`…`20`, and no status is minted.** `AddressMalformed` keeps rank `1` and `ConstraintListInvalid` keeps `16` (`src/error.rs`'s `CODES`; `D-99` item 1; `D-100` item (ii)).
|
|
78
|
+
- **EVERY MEMBER, EVERY TYPE AND EVERY CONSUMER-VISIBLE ARITY.** The instance's fourteen members, the log entry's five, the failure form's four, `KC`'s nine tokens and the module namespace's one name are all unmoved (`D-100` item (ii)).
|
|
79
|
+
- **THE ONE ARITY THAT WIDENS IS THE ADDON'S OWN GENERATOR, AND IT IS ARTEFACT-INTERNAL.** `errorMessage` gains **one optional fourth position** carrying the closed arm token `'handle'`, so the artefact's internal range reads **`2`–`4`** where the census cell read `2`–`3`; **no named export of the module namespace and no subpath reaches it**, so this is a widening of the artefact's own generator and not of a consumer API (`D-100` item (iii); `docs/L1/cross-kind-handle-only.md` §3.7–§3.8).
|
|
80
|
+
- **THE SURFACE MAP IS UNMOVED AT `19` MODULES AND `61` ENDPOINTS** — the correction adds a part to a module and no endpoint (`D-100`; `docs/L1/cross-kind-handle-only.md` §6.3, which is the L2 reading this release declares).
|
|
81
|
+
|
|
82
|
+
**THE CELLS AND THE RECORDS THE CORRECTION CARRIES, NAMED SO A READER CAN CHECK THE BATTERY AGAINST THEM** (`docs/L1/cross-kind-handle-only.md` §6.1's write set, verbatim: *"§5.1's six rewrites, §5.2's two, §5.3's eight"*):
|
|
83
|
+
|
|
84
|
+
- **SIX REWRITTEN CELLS**, each one a cell that asserted the address dimension the ruling withdraws — `HLI-11.3` and `HLI-11.3.a`, `G3-22`, the two `constraints-publication` probes with their prose, the `blind-listener-surface` form cell, and `DEF-N`'s constant — beside **two kept cells whose MESSAGES are re-read** rather than weakened (§5.2).
|
|
85
|
+
- **EIGHT `XK` CELLS ADDED**, `XK-1`…`XK-8`, in the file `tests/e2e/cross-kind-handle-only.test.mjs`; **`XK-6` and `XK-8` are re-shaped by `D-99`** (§9.5), and `Q-1`'s residual is retired by name rather than carried.
|
|
86
|
+
- **THE MOVE-OUT RECORD**: the guide's 2026-10-26 measured paragraph left **byte-exactly** to `docs/guides/backup/D98-2026-11-01-guide-move-out.md`, with its source path, its pre-move position, its date, a computed `sha256` and why — and the delivered text states the rule in its place (`docs/L1/cross-kind-handle-only.md` §4.1).
|
|
87
|
+
- **THE CONTRACT'S `§2.2` ITEM 7 POINTER**: a **pure insertion** of 2026-11-01 at `docs/specs/storeroom-held-listener-identity/contract.md` `§2.2` item 7, which *"moves no position, no domain, no fail arm and no other item"* of that section.
|
|
88
|
+
|
|
89
|
+
**AND WHAT THIS SECTION IS NOT: a restatement of `§1.6.2`.** **That section is the change list of the previous release and stands BYTE-FOR-BYTE beneath this one; what this release carries of it is the version and the arithmetic and nothing else.**
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## §1.6.2 · **CUT AND PUBLISHED — tag `v1.6.2`** — 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
|
|
94
|
+
|
|
95
|
+
**⟶ AND THIS HEADING CARRIED THE PRE-RELEASE MARKER UNTIL THE TAG WAS CUT, 2026-11-01 — `DEF-AC` at its fifth iteration, and the one red `D-82`'s ratchet refused on every run before this one.** `RCA-8(g)` ANNOTATE-BESIDE: **the withdrawn heading's bytes stand in the withdrawn record — `docs/guides/backup/D81-2026-10-29-notes-move-out.md` `§6`, which carries the source path, the pre-move line, the date, a computed `sha256` and why they moved — and are read THROUGH this clause; this sentence deliberately does not quote them, for the reason the `§1.6.1` clause above states and `D-80` measured: a quotation of a claim reads as a claim, and the scan cannot tell the two apart.** **AND THE CORRECTED HEADING IS THE PAST-TENSE RECORD THIS FILE'S OWN PRECEDENT USES** — the spelling `§1.6.0`, `§1.6.1`, `§1.5.0` and `§1.4.0` already carry — **because a cut-state belongs to the tag set: `git tag --list` answers `v1.6.2`, so this section names a past act and not a present claim, and `D-82`'s past-tense condition accepts the line for exactly that reason.** **AND WHAT THIS ACT DOES NOT DO: it moves no other byte of `§1.6.2`, whose body and items below stand BYTE-FOR-BYTE as the reading of their own date; it adds no entry to the exemption set, because a line whose bytes change must leave that set rather than join it and the set may only SHRINK; and it changes no figure the withdrawn line carried, which the record names.** (`D-57`; `D-82`; `git tag --list`.)
|
|
59
96
|
|
|
60
97
|
**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
98
|
|
package/index.d.ts
CHANGED
|
@@ -241,6 +241,27 @@ export interface StoreConfig {
|
|
|
241
241
|
* in the surface's one thrown form `{status, message, log}`, under the store's existing
|
|
242
242
|
* `ConstraintListInvalid` — **the package mints no code**.
|
|
243
243
|
*
|
|
244
|
+
* **⟶ AND THE CROSS-KIND ARM'S DIMENSION IS THE HANDLE, AND ITS MESSAGE NAMES THREE THINGS — ADDED 2026-11-01
|
|
245
|
+
* (`D-98` item 4; `docs/L1/cross-kind-handle-only.md` §2, §3.4, §3.6).** **THE ARM IS `adoptedHandles[n] ===
|
|
246
|
+
* element.id`: a HANDLE, never an address** — so a batch pair and an adopted listener MAY stand at one address,
|
|
247
|
+
* which is the ruling's clause (i) — and it is compared over the handles `cfg.listeners` adopts, which are the
|
|
248
|
+
* same set a successful construction adopts (`docs/L1/surface-deltas.md` §3.2). **ITS MESSAGE NAMES:**
|
|
249
|
+
* * **THE POSITION**, because two elements may carry one address and the position is what identifies the
|
|
250
|
+
* offending element;
|
|
251
|
+
* * **THE HANDLE** — the shared string, which is the refusal's SUBJECT and the generated half's first word;
|
|
252
|
+
* * **THE ADOPTED LISTENER'S ONE ADDRESS**, which an adopted `cfg.listeners` element carries exactly one of
|
|
253
|
+
* (`frame.mjs`), so naming it asserts no order and is exact.
|
|
254
|
+
*
|
|
255
|
+
* **AND THE GENERATED HALF IS THE STORE'S OWN QUALIFIED `ConstraintListInvalid` ARM** — *"'<handle>' is already
|
|
256
|
+
* a handle this instance carries, a batch element's id is its pair's handle and it may not be one this
|
|
257
|
+
* construction adopts as a listener's"* — which **prints no `<CONTAINER>` slot**: the list's name `constraints`
|
|
258
|
+
* is named on the package's clause side and never in the generated half, where it would read as the place the
|
|
259
|
+
* mismatch was found. **The package still mints no code**, the status is still `ConstraintListInvalid`, and the
|
|
260
|
+
* instant is still before any filesystem act. **AND THE SUBJECT MOVES FROM AN ADDRESS TO THE HANDLE, which
|
|
261
|
+
* incidentally repairs a second rendering defect**: the address spelling quotes its string segments and the
|
|
262
|
+
* facade quotes the whole subject again, so the bytes read `''ck''`; **a bare handle renders `'shared-handle'`
|
|
263
|
+
* and the doubling has no subject at this arm.**
|
|
264
|
+
*
|
|
244
265
|
* **AND THE NAME'S OTHER TWO READERS NEED NOTHING** (`D-24` items 2–3, both recorded so no pass adds a
|
|
245
266
|
* member): `constraints()` already returns the bare `id`, so its four exclusions stand exactly as written;
|
|
246
267
|
* and `LogEntry` already carries `id`, so **the name's logging role moves no member-set** and no undeclared
|
|
@@ -974,10 +995,21 @@ export interface StoreInstance {
|
|
|
974
995
|
* TRUE AND UNAFFECTED and is now read **SCOPED BY KIND**: a repeated handle of the SAME kind at this act is
|
|
975
996
|
* an overwrite (`D-24`), while **a pair whose `id` equals a LIVE LISTENER'S HANDLE is REJECTED** — it does
|
|
976
997
|
* not overwrite the listener and it does not throw nothing. **The rejection is the surface's one thrown
|
|
977
|
-
* form `{status, message, log}` with the store's `AddressMalformed`**, its `message` naming BOTH SIDES and
|
|
978
|
-
*
|
|
979
|
-
* **
|
|
980
|
-
*
|
|
998
|
+
* form `{status, message, log}` with the store's `AddressMalformed`**, its `message` naming BOTH SIDES, and
|
|
999
|
+
* it is taken **after the two positions' class tests and before the held-pair purge and before any store
|
|
1000
|
+
* call**, so **no state moves**. `register`'s own direction of the same rule stands at that member (§its own
|
|
1001
|
+
* clause).
|
|
1002
|
+
*
|
|
1003
|
+
* **⟶ AND THE RULE SENTENCE RE-DERIVES BY ONE WORD, 2026-11-01 (`D-98`; `docs/L1/cross-kind-handle-only.md`
|
|
1004
|
+
* §3.4): *"a listener and a constraint do not share one"* READS *"a listener and a constraint do not share one
|
|
1005
|
+
* HANDLE"*.** **THE CONDITION, THE STATUS AND THE INSTANT ARE UNMOVED** — a live listener is
|
|
1006
|
+
* `off === false` **and** a function **and** `kind !== 'constraint'`, so a reserved `listen` with no
|
|
1007
|
+
* `register` is NOT one and a pair may take its handle; and the member is still `AddressMalformed` after the
|
|
1008
|
+
* two class tests and before the held-pair branch. **What moves is the sentence, because the OLD SPELLING READ
|
|
1009
|
+
* THE ADDRESS and `D-98` declares the address LAWFUL.** The missing word is added from the project's own
|
|
1010
|
+
* anchor (`bindings/js/README.md`: *"a listener and a constraint do not share one handle"*), and the
|
|
1011
|
+
* refusal's `address` member is `null`: the subject is the identity, and naming one of a listener's N mirror
|
|
1012
|
+
* addresses would assert a membership no clause supports.
|
|
981
1013
|
*/
|
|
982
1014
|
addConstraint(pair: ConstraintPair, constraint: Constraint): ConstraintIdentity;
|
|
983
1015
|
/** **THE ENABLE HALF** (`§2.12` item 2 (a) and item 3's `constraintOn` row): `undefined`. **The
|
|
@@ -993,14 +1025,36 @@ export interface StoreInstance {
|
|
|
993
1025
|
constraintOff(pair: ConstraintPair, constraint: Constraint): void;
|
|
994
1026
|
/** Register `listener` under the opaque `handle`, and answer `undefined` (`surface.md §2.4` item 5 (b)).
|
|
995
1027
|
*
|
|
996
|
-
* **⟶ AND IT REFUSES WHERE A CONSTRAINT'S `id
|
|
997
|
-
*
|
|
998
|
-
*
|
|
999
|
-
*
|
|
1000
|
-
*
|
|
1001
|
-
*
|
|
1002
|
-
*
|
|
1003
|
-
*
|
|
1028
|
+
* **⟶ AND IT REFUSES WHERE THE HANDLE EQUALS A CARRIED CONSTRAINT PAIR'S `id`** (`D-25`'s *"vice versa"*;
|
|
1029
|
+
* `D-29`; **⟶ RE-DERIVED 2026-11-01 BY `D-98`'s HANDLE RULE, WHICH IS THE WHOLE OF IT**: *"A constraint and a
|
|
1030
|
+
* listener can share an address, as can multiple constraints/listeners. The restriction is that a listener
|
|
1031
|
+
* and a constraint cannot have the same **handle**."*). **THE CLAUSE THAT STOOD HERE READ *"it refuses where a
|
|
1032
|
+
* constraint's `id` STANDS AT THE ADDRESS"* AND THAT CONDITION IS WITHDRAWN**: an ADDRESS is not a collision
|
|
1033
|
+
* at all — a pair and a listener MAY stand at one address — so what the member tests is the **HANDLE, and
|
|
1034
|
+
* nothing else**: a carried pair whose `id` is that string, **disabled pair included** (`D-98` (iii)'s rule is
|
|
1035
|
+
* unconditional in both directions, and the loss a skipped disabled pair would permit lands at the next
|
|
1036
|
+
* `constraintOn` with no observable at the instant of the loss).
|
|
1037
|
+
*
|
|
1038
|
+
* **THE REFUSAL IS THE SURFACE'S OWN THROWN FORM** `{status, message, log}` with the store's
|
|
1039
|
+
* `AddressMalformed` — **not** the `TypeError` this member's conflict arm carried while a reserved
|
|
1040
|
+
* `constraint@` prefix existed to be exempted — taken after the handle's domain and registry tests and
|
|
1041
|
+
* **before the registry write and before the re-install `listen`**, so **no state moves**: no store act, no
|
|
1042
|
+
* mirror row, no registry entry.
|
|
1043
|
+
*
|
|
1044
|
+
* **ITS MESSAGE IS TWO PARTS AND BOTH ARE NAMED HERE** (`D-98` item 4; `docs/L1/cross-kind-handle-only.md`
|
|
1045
|
+
* §3.6's `B-5` text): **the generated half is the STORE'S OWN** — the qualified `AddressMalformed` arm, *"'<id>'
|
|
1046
|
+
* is already a handle this instance carries, a listener's handle and a constraint's id are one string and one
|
|
1047
|
+
* string only"*, which **names no address, no segment and no placeholder container** — and **the clause half is
|
|
1048
|
+
* the package's**, naming the pair that keeps the handle and carrying the shared rule sentence *"a listener and
|
|
1049
|
+
* a constraint do not share one handle"*. **The refusal's `address` member is `null`**, and that is now correct
|
|
1050
|
+
* rather than incidental: the subject is a string in the handle namespace and the address is lawful.
|
|
1051
|
+
*
|
|
1052
|
+
* **The exemption for kernel-prefixed handles is DELETED, not moved**: under `D-22` the kernel's handle is no
|
|
1053
|
+
* longer a reserved spelling. **⟶ AND THE SENTENCE THAT FOLLOWED IT — *"under `D-25` the kernel registers
|
|
1054
|
+
* nothing, so nothing needs to get past the test"* — IS RE-DERIVED BY `D-99`'s ANSWERED CLAUSE AND NOT ABSORBED:**
|
|
1055
|
+
* the kernel **does** register, and it reaches the store through its **own internal route** rather than through
|
|
1056
|
+
* this member, so **this test is a CALLER's test and the kernel's act never meets it** — which is why there is
|
|
1057
|
+
* still nothing to get past it. */
|
|
1004
1058
|
register(handle: Handle, listener: Listener): void;
|
|
1005
1059
|
/** **`removeListener(handle) -> undefined`** — the entry removed WHOLE and its store entries withdrawn; every arm that is not a real removal THROWS (`contract.md §2.7` item 2; `PAR-HL-14`, `PAR-HL-15`). */
|
|
1006
1060
|
removeListener(handle: Handle): void;
|
package/index.mjs
CHANGED
|
@@ -87,9 +87,11 @@ import { withAddon, boundaryReject, adoptModuleContext } from './src/entry/artef
|
|
|
87
87
|
import { VALUE_ARGUMENT_POSITION, accessorOrSymbolArm, arrayClass, classSpelling, extendedPath, hasLoneSurrogate, inDomainAddress, isAdmittedArray, isLawfulListenerElement, isPlainObjectValue, protoClass, shapeArmClass, targetSpelling, valueReject, valueTargetSpelling } from './src/entry/class-decision.mjs';
|
|
88
88
|
import { encodeAddress, encodeFilePath, encodeJournalLength, encodeOpId, encodeTier, encodeValue, handleWire, inDomainHandle } from './src/entry/carrier.mjs';
|
|
89
89
|
import { admittedConstraintBatch, constraintAddress, decodeBaseState, decodeJournalOp, decodeSegments, decodeValue, encodeConfig, spellConstraintAddress } from './src/entry/frame.mjs';
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
// ⟶ `addressSpelling`'s import is DELETED 2026-11-01 with its last two readers (`B-6`'s and `B-4`'s messages,
|
|
91
|
+
// which now name no address at all — `D-98` §3.4). The function keeps its home and its other readers in the
|
|
92
|
+
// entry's other parts.
|
|
93
|
+
import { FORGET_PAIR, INSTANCES, STORE_INDEX, STORE_RETIREMENT, TERMINAL_ARM, carryRefusal, closeCommit, crossTriggered, currentWindow, entryOf, installAttemptSeam, isStoreReceiver, openCommit, writeRefusal } from './src/entry/state.mjs';
|
|
94
|
+
import { commitPositionRefusal, constraintOverwrittenByListen, deliver, installListenRoute, installRegistrationSeam, listenerStandingAt, listenOn, registerOn, terminalArm } from './src/entry/delivery.mjs';
|
|
93
95
|
import { ARGUMENT_POSITION_FIRST, addressSetKey, carryConstraint, constraintDetached, constraintPairKey, constraintRefuse, constraintSite, constraintUncarried, constraintDelete, constraintWrite, constraintsKernel, currentRaise, defineDiscardWitness, enumerateConstraints, judgeReversal, registrationCrossing, restoreHeldPair, reversalWatch, unionAddressSets, withEmptyLog, witnessDiscardedReversal, witnessRaise, withdrawStanding } from './src/entry/constraints.mjs';
|
|
94
96
|
const require_ = createRequire(import.meta.url);
|
|
95
97
|
const ADDON_PATH = join(dirOf(fileURLToPath(import.meta.url)), 'build', 'Release', 'storeroom_js_binding.node');
|
|
@@ -97,22 +99,14 @@ const ADDON_PATH = join(dirOf(fileURLToPath(import.meta.url)), 'build', 'Release
|
|
|
97
99
|
adoptModuleContext(import.meta.url, require_, ADDON_PATH);
|
|
98
100
|
|
|
99
101
|
// ---------------------------------------------------------------------------------------------
|
|
100
|
-
//
|
|
101
|
-
// `
|
|
102
|
-
// `addresses[i].slice()` sites
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
//
|
|
108
|
-
// item `(1)`(c)): a local index loop over the array's own exotic `length` and its own indices, appending by
|
|
109
|
-
// `appendOwn` — the same helper every other append on this file's paths already takes. **NO ANSWER MOVES**: the
|
|
110
|
-
// same segments in the same order, in a FRESH array, exactly as the `slice` produced.
|
|
111
|
-
function copySegments(address) {
|
|
112
|
-
const copy = [];
|
|
113
|
-
for (let i = 0; i < address.length; i += 1) appendOwn(copy, address[i]);
|
|
114
|
-
return copy;
|
|
115
|
-
}
|
|
102
|
+
// **⟶ `copySegments` MOVED WITH ITS ONLY READER, 2026-11-01 (`D-99`'s ANSWERED clause; `C-17`, §9.2).**
|
|
103
|
+
// `D-35`'s READ HALF — the one copy of a caller-supplied address's segments, which replaced the two
|
|
104
|
+
// `addresses[i].slice()` sites a mutable prototype could answer — lived here because `listen`'s body lived
|
|
105
|
+
// here. **THE BODY IS `delivery.mjs`'s `listenOn` NOW, AND THE HELPER MOVED WITH IT, BYTE-FOR-BYTE, INTO THE
|
|
106
|
+
// SAME FILE**: one copy, one home, and no second implementation of one reach. **NOTHING IT DOES MOVES** — the
|
|
107
|
+
// same local index loop over the caller's own exotic `length` and its own indices, appending by `appendOwn`,
|
|
108
|
+
// answering a FRESH segment list — and no member of this module's namespace was ever this function.
|
|
109
|
+
// ---------------------------------------------------------------------------------------------
|
|
116
110
|
|
|
117
111
|
// ---------------------------------------------------------------------------------------------
|
|
118
112
|
// THE SURFACE — `surface.md §2.9` item 1: the EIGHT verbs, and NOTHING else. `findAddress` is NOT exposed
|
|
@@ -232,15 +226,19 @@ export function storeCreate(cfg) {
|
|
|
232
226
|
// else. There is no `token` property"*). **`state.home` SURVIVES AS THE MIRROR** — its column is now the
|
|
233
227
|
// CALLER'S OWN HANDLE and not a token (`identity-and-domain.md §1` item 2 (ii)) — **and `state.constraints`
|
|
234
228
|
// stays the read model.**
|
|
235
|
-
// **⟶ AND `establishing` IS
|
|
236
|
-
//
|
|
237
|
-
// the
|
|
238
|
-
//
|
|
239
|
-
//
|
|
240
|
-
//
|
|
241
|
-
//
|
|
229
|
+
// **⟶ AND `establishing` IS DELETED 2026-11-01 (`D-99`'s ANSWERED clause; `C-18`, §9.3), SO THIS MEMBER'S
|
|
230
|
+
// OWN SEVEN-OCCURRENCE CENSUS CLOSES AT ZERO.** The clause that stood here declared a marker — *"the `id` of
|
|
231
|
+
// the pair the kernel is right now registering, and nothing else"* — and named its purpose as *"how `B-6`'s
|
|
232
|
+
// cross-kind test still knows the act is a CONSTRAINT's own registration and not a listener's"*. **BOTH
|
|
233
|
+
// SENTENCES ARE WITHDRAWN, AND THEY STAND AS TEXT READ THROUGH THIS ONE:** the act that needed the exemption
|
|
234
|
+
// **does not pass the test at all** any more, because the kernel's registration reaches the store through its
|
|
235
|
+
// OWN ROUTE (`LISTEN_ROUTE`, `delivery.mjs`'s `listenOn`) and the cross-kind test lives on the CALLER's
|
|
236
|
+
// members and nowhere else. **SO: NO MARKER LANDS, NO BRACKET LANDS AT ANY OF THE FOUR SITES, AND `Q-1`'S
|
|
237
|
+
// RESIDUAL (`docs/L1/cross-kind-handle-only.md` §7) DISAPPEARS WITH THE MARKER RATHER THAN BEING ACCEPTED OR
|
|
238
|
+
// TIGHTENED** — a constraint body that calls `listen('<its own pair id>', …)` during its own registration is
|
|
239
|
+
// now refused at `B-6` exactly as any caller's act is.
|
|
242
240
|
const state = {
|
|
243
|
-
home: [], registry: new Map(), constraints: new Map(), leg: null, receiver: null,
|
|
241
|
+
home: [], registry: new Map(), constraints: new Map(), leg: null, receiver: null,
|
|
244
242
|
// **⟶ AND THE RESIDUE'S DELIVERER, ADDED 2026-10-29 — A PRIVATE FACT ABOUT WHICH ACT OWNS A LEG'S
|
|
245
243
|
// DELIVERY.** The terminal arm performs `surface.md §2.7` item 7's delivery for a kernel-driven WRITE
|
|
246
244
|
// (`delivery.mjs`'s `terminalArm`), and it is the delete's OWN member that performs it (`D-49` declared that
|
|
@@ -775,92 +773,50 @@ export function storeCreate(cfg) {
|
|
|
775
773
|
);
|
|
776
774
|
}
|
|
777
775
|
}
|
|
778
|
-
// ── `B-6` — THE CROSS-KIND REJECTION, AND
|
|
779
|
-
// **⟶
|
|
780
|
-
//
|
|
781
|
-
//
|
|
782
|
-
//
|
|
783
|
-
//
|
|
784
|
-
//
|
|
785
|
-
//
|
|
776
|
+
// ── `B-6` — THE CROSS-KIND REJECTION: THE HANDLE, AND NOTHING ELSE (`D-98`) ──────────────────────────
|
|
777
|
+
// **⟶ RE-DERIVED 2026-11-01 (`D-98`, verbatim: *"A constraint and a listener can share an address … The
|
|
778
|
+
// restriction is that a listener and a constraint cannot have the same *handle*"*).** **THE ADDRESS-SET
|
|
779
|
+
// DIMENSION IS DELETED**: its ground — `D-29`'s *"the address dimension is NECESSARY, because the purge is
|
|
780
|
+
// address-reaching"* — is FALSE at this build and `D-98` item 3 withdraws it: the purge is BY HANDLE
|
|
781
|
+
// (`src/store.rs:476`–`:494`, `:2594`) and the mirror's is too (this file's own purge, in
|
|
782
|
+
// `delivery.mjs`'s `listenOn`), so an act under a different handle cannot reach a pair's rows. **What the
|
|
783
|
+
// dimension admitted was the defect.**
|
|
784
|
+
// **THE HANDLE DIMENSION IS THE WHOLE TEST**, and it is the SAME read `B-5` takes — one helper, one rule
|
|
785
|
+
// (§1.1). **NO STATE MOVES**: no store act, no mirror row, no registry write.
|
|
786
786
|
//
|
|
787
|
-
// **
|
|
788
|
-
// the
|
|
789
|
-
//
|
|
790
|
-
//
|
|
791
|
-
//
|
|
792
|
-
//
|
|
793
|
-
//
|
|
794
|
-
//
|
|
795
|
-
//
|
|
796
|
-
//
|
|
797
|
-
|
|
787
|
+
// **AND THE ONE ACT THE OLD TEST ALLOWED WENT WITH ITS INSTRUMENT** (`D-99`'s ANSWERED clause, `C-18`):
|
|
788
|
+
// the kernel's own re-listing is not exempted here — **it does not pass this test at all**, because `K-1`
|
|
789
|
+
// reaches the store through its own route (`LISTEN_ROUTE`, `delivery.mjs`'s `listenOn`) and this member is
|
|
790
|
+
// a CALLER's door. **THERE IS NO MARKER, NO BRACKET AND NO `state.establishing` LEFT TO READ**; a
|
|
791
|
+
// constraint body that calls `listen('<its own pair id>', …)` during its own registration is refused here
|
|
792
|
+
// exactly as any caller's act is.
|
|
793
|
+
//
|
|
794
|
+
// **AND THE MESSAGE'S GENERATED HALF IS THE STORE'S OWN QUALIFIED ARM, NOT THE SEGMENT TEMPLATE**
|
|
795
|
+
// (`D-98` item 4; `C-7`–`C-11`, §3.3 and §3.6): the `'handle'` arm token is supplied at
|
|
796
|
+
// `boundaryReject`'s appended FIFTH position and reaches the generator's fourth — so the sentence reads
|
|
797
|
+
// *"'<id>' is already a handle this instance carries, a listener's handle and a constraint's id are one
|
|
798
|
+
// string and one string only"* and **names no address and no placeholder container at all** (the
|
|
799
|
+
// fourth position is `undefined` ON PURPOSE: this arm passes NO container, §3.4).
|
|
800
|
+
const overwritten = constraintOverwrittenByListen(state, handle);
|
|
798
801
|
if (overwritten !== null) {
|
|
799
802
|
boundaryReject(
|
|
800
803
|
'AddressMalformed',
|
|
801
|
-
|
|
802
|
-
`the
|
|
803
|
-
+
|
|
804
|
+
overwritten.id,
|
|
805
|
+
`listen refuses: the constraint pair '${overwritten.id}' keeps that handle, and a listener and a `
|
|
806
|
+
+ 'constraint do not share one handle',
|
|
807
|
+
undefined,
|
|
808
|
+
'handle',
|
|
804
809
|
);
|
|
805
810
|
}
|
|
806
|
-
// ── THE
|
|
807
|
-
//
|
|
808
|
-
// the
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
// **THE MIRROR'S COLUMN IS THE CALLER'S OWN HANDLE AND NOT A TOKEN** (`identity-and-domain.md §1` item 2
|
|
816
|
-
// (ii)), and **THE PURGE REACHES IT**: every row the handle named is dropped before the set's own rows are
|
|
817
|
-
// recorded, which is the same wholesale assignment the store performed (`listen-verb.md §3` item 1's four
|
|
818
|
-
// structures). **THE `some(key)` GUARD IS GONE WITH `first_at`** (`P: docs/pending.md · R-B1`, deletion
|
|
819
|
-
// part (b)): with the idempotence deleted the mirror records one row per address in the act's own set, so
|
|
820
|
-
// N addresses answer N rows for ONE handle (`listen-verb.md §6` item 4 (iv)).
|
|
821
|
-
state.home = state.home.filter((row) => row.handle !== handle);
|
|
822
|
-
for (let i = 0; i < addresses.length; i += 1) {
|
|
823
|
-
// **⟶ AND THE MIRROR'S COPY IS `copySegments`, NOT `addresses[i].slice()`** (`D-35`'s read half,
|
|
824
|
-
// 2026-10-26 — see the function's own clause above; the caller's array is the receiver either way and
|
|
825
|
-
// the answer is the same fresh segment list).
|
|
826
|
-
appendOwn(state.home, { key: homeAddressKey(addresses[i]), address: copySegments(addresses[i]), handle });
|
|
827
|
-
}
|
|
828
|
-
// ── THE ENTRY'S FIRST STATE: RESERVED ────────────────────────────────────────────────────────────────
|
|
829
|
-
// ***"`listen` WRITES THE ENTRY WITH `off` SET — the reservation"*** (`P: docs/pending.md · P-5`, the
|
|
830
|
-
// entry-shape ruling; `contract.md §2.2` item 5 (a); `identity-and-domain.md §2` item 5). **AN ENTRY WITH
|
|
831
|
-
// NO FUNCTION IS NOT A LAWFUL VALUE, so the state `listen` creates is an entry that EXISTS AND IS OFF** —
|
|
832
|
-
// which is exactly what the ruling provides. **AND A REPEATED `listen` RE-RESERVES THE ENTRY**: it is a
|
|
833
|
-
// purge then a fresh reservation, never a fast path (`P: docs/pending.md · (R1)`, its own closing
|
|
834
|
-
// sentence; `contract.md §2.2` item 3).
|
|
835
|
-
// **⟶ AND THE SET'S COPY IS A LOCAL INDEX LOOP, NOT `Array.prototype.map` — 2026-10-24 (`contract.md §2.1`'s
|
|
836
|
-
// clause of that date on `F8-2`, items `(2a)`–`(2c)`, arm `(xix)`, cell `JC-TC-65`).** This position is the
|
|
837
|
-
// one `store.listen(id, set)` reaches from `carryConstraint`'s arming walk, so the `.map` that stood here
|
|
838
|
-
// threw `TypeError: addresses.map is not a function` OUT OF A LAWFUL `storeCreate` under a caller's
|
|
839
|
-
// `delete Array.prototype.map` — a raw host object crossing the boundary, which `§2.5` item `5 (e)` files as
|
|
840
|
-
// a FINDING. **IT IS THE SAME PRECEDENT `encodeConstraints` ALREADY FOLLOWS** (the fourth key's own walk:
|
|
841
|
-
// *"a LOCAL INDEX LOOP, NOT `Array.prototype.map`"*), and the bytes, the order and the fresh-array-per-member
|
|
842
|
-
// copy are unmoved. **THE `slice` IS THE ELEMENT'S AND NOT THE SET'S**: it copies one ADDRESS's segments, so
|
|
843
|
-
// the registry row's set is the fresh list this loop builds.
|
|
844
|
-
const standingSet = [];
|
|
845
|
-
for (let i = 0; i < addresses.length; i += 1) {
|
|
846
|
-
// **⟶ THE REGISTRY ROW'S SET TAKES THE SAME `copySegments`** (`D-35`'s read half, 2026-10-26): the
|
|
847
|
-
// element is the caller's address array, so its `slice` was a mutable prototype's member.
|
|
848
|
-
appendOwn(standingSet, copySegments(addresses[i]));
|
|
849
|
-
}
|
|
850
|
-
state.registry.set(handle, {
|
|
851
|
-
fn: undefined,
|
|
852
|
-
off: true,
|
|
853
|
-
// **THE SET THE LAST `listen` GAVE THE HANDLE** — the referent `PAR-HL-2` names (*"the set of addresses the
|
|
854
|
-
// handle stands at after this act — the whole set, never a delta"*), and the one datum `register` reads to
|
|
855
|
-
// re-install a reserved entry's store side.
|
|
856
|
-
addresses: standingSet,
|
|
857
|
-
});
|
|
858
|
-
// **⟶ AND IT ANSWERS THE HANDLE IT WATCHES UNDER — `D-22`'s `void → Handle`, 2026-10-24.** *"Listen should
|
|
859
|
-
// return the handle on success, or error message on fail."* **A SUCCESS SIGNAL THAT CARRIES THE
|
|
860
|
-
// IDENTITY, AND NOT AN ECHO TO BE SUPPRESSED**: the value the caller spelled is the identity the store
|
|
861
|
-
// holds for that entry, and it is what `K-1` ADOPTS (`const adopted = store.listen(id, set)`), which is
|
|
862
|
-
// what `kernel-surface.md` declared all along — *"adopted, never minted by the kernel"*.
|
|
863
|
-
return handle;
|
|
811
|
+
// ── THE POST-TEST BODY, EXTRACTED BY NAME — `D-99`'S ANSWERED CLAUSE, 2026-11-01 ──────────────────────
|
|
812
|
+
// **⟶ THE BYTES ABOVE ARE A CALL NOW** (`C-17`, §9.2): the address encode, the ONE store act, the home
|
|
813
|
+
// mirror's purge-and-install, the entry's registry reservation and the returned handle all moved
|
|
814
|
+
// BYTE-FOR-BYTE into `delivery.mjs`'s `listenOn`, which the kernel's own registration calls too. **THE
|
|
815
|
+
// MEMBER KEEPS WHAT IS THE MEMBER'S**: the commit bracket (`openCommit`/`closeCommit`), the two position
|
|
816
|
+
// class tests and `B-6` above — **so `listen` is a CALLER's door and the kernel's act is the kernel's own**,
|
|
817
|
+
// which is the whole of `D-99`'s route reading. **NO ANSWER MOVES**: the same handle, the same store act,
|
|
818
|
+
// the same mirror rows and the same registry entry, because it is the same function.
|
|
819
|
+
return listenOn(this, state, handle, addresses);
|
|
864
820
|
} finally {
|
|
865
821
|
closeCommit(instance, opened);
|
|
866
822
|
}
|
|
@@ -984,13 +940,26 @@ export function storeCreate(cfg) {
|
|
|
984
940
|
// listener is outside this instance's handle domain for a constraint.** It is also the status the
|
|
985
941
|
// register-side sibling answers for the adjacent fact, **so one namespace question does not print two
|
|
986
942
|
// codes.** **NO STATE MOVES.**
|
|
943
|
+
//
|
|
944
|
+
// **⟶ AND ITS MESSAGE RE-DERIVES 2026-11-01 (`D-98` item 4; `C-9`, `C-11`; §3.4, §3.6), WHILE ITS
|
|
945
|
+
// CONDITION, ITS STATUS AND ITS INSTANT ARE UNMOVED.** **`listenerStandingAt` ANSWERS `true`/`false` NOW**
|
|
946
|
+
// (its address loop existed for the message alone and the message names no address — §2's one deletion),
|
|
947
|
+
// and the refusal's subject is the HANDLE: the generated half is the store's own QUALIFIED
|
|
948
|
+
// `AddressMalformed` arm under the appended `'handle'` token, and the clause names the listener and the
|
|
949
|
+
// rule's re-spelt sentence. **NO ADDRESS APPEARS ANYWHERE IN IT** — the pair's own address belongs to the
|
|
950
|
+
// caller, and a listener's mirror address asserted which of its N rows "kept" the identity (§3.4) — so the
|
|
951
|
+
// refusal's `address` member stays `null` by construction. **The rule's sentence moves by ONE WORD, and its
|
|
952
|
+
// spelling is the anchor `bindings/js/README.md:233` already carries: *"a listener and a constraint do not
|
|
953
|
+
// share one HANDLE"*.**
|
|
987
954
|
const collided = listenerStandingAt(site.state, site.id);
|
|
988
|
-
if (collided
|
|
955
|
+
if (collided === true) {
|
|
989
956
|
boundaryReject(
|
|
990
957
|
'AddressMalformed',
|
|
991
|
-
|
|
992
|
-
`the listener '${site.id}'
|
|
993
|
-
+
|
|
958
|
+
site.id,
|
|
959
|
+
`addConstraint refuses: the listener '${site.id}' keeps that handle, and a listener and a `
|
|
960
|
+
+ 'constraint do not share one handle',
|
|
961
|
+
undefined,
|
|
962
|
+
'handle',
|
|
994
963
|
);
|
|
995
964
|
}
|
|
996
965
|
const held = site.state.constraints.get(constraintPairKey(site.addresses, site.id));
|
|
@@ -1565,6 +1534,24 @@ export function storeCreate(cfg) {
|
|
|
1565
1534
|
STORE_RETIREMENT.register(instance, () => {
|
|
1566
1535
|
INSTANCES.delete(instance);
|
|
1567
1536
|
});
|
|
1537
|
+
// ═════════════════════════════════════════════════════════════════════════════════════════════════════
|
|
1538
|
+
// **⟶ AND `D-99`'S INTERNAL ROUTE, INSTALLED HERE AND NOT WITH THE OTHER TWO CHANNELS — 2026-11-01
|
|
1539
|
+
// (`C-17` (iv), §9.2).** **THE INSTALL SITE IS `state.receiver = instance`'S NEIGHBOURHOOD AND NOT `:1693`'S,
|
|
1540
|
+
// AND THE REASON IS A BYTE: THE CONSTRUCTION'S BATCH ARMING WALK BELOW REACHES `K-1` BEFORE
|
|
1541
|
+
// `installRegistrationSeam` RUNS**, so a channel installed there would leave the construction's own arming walk
|
|
1542
|
+
// as **the one kernel registration still passing through the caller's wrapper** — i.e. still through `B-6`,
|
|
1543
|
+
// which is the test `D-99`'s ANSWERED clause says the kernel's act does not pass at all.
|
|
1544
|
+
//
|
|
1545
|
+
// **THE LATER SITE'S PRINTED REASON DOES NOT REACH THIS CHANNEL**: `installAttemptSeam` is installed after the
|
|
1546
|
+
// batch *"so a `listen` the construction itself performs is not counted as a commit the caller opened"* — **a
|
|
1547
|
+
// fact about the ATTEMPT COUNT, and this route opens no commit** (`C-17` (v)).
|
|
1548
|
+
//
|
|
1549
|
+
// **IT CHANGES NO ORDER OF ACTS**: the batch still arms `cfg.constraints` first and `cfg.listeners` are still
|
|
1550
|
+
// applied afterwards through `listen` (`C-15`, unmoved), because installing a channel is not an act. **AND THE
|
|
1551
|
+
// CHANNEL ADDS NO MEMBER** — `Symbol.for`-keyed and `enumerable: false`, so the product's declared FOURTEEN own
|
|
1552
|
+
// members are unmoved (`A117` (D6)), exactly as the six channels beside it.
|
|
1553
|
+
// ═════════════════════════════════════════════════════════════════════════════════════════════════════
|
|
1554
|
+
installListenRoute(instance, state);
|
|
1568
1555
|
// **⟶ `docs/specs/storeroom-js/surface.md §2.12` ITEM 1 CLAUSE (b): `storeCreate` REGISTERS EACH OF `cfg.constraints`' ELEMENTS THAT CARRIES
|
|
1569
1556
|
// ITS OWN FUNCTION AT `K-1`, AT THE INSTANCE IT IS CONSTRUCTING** — the SAME call the ADD route makes, so
|
|
1570
1557
|
// a batch-populated pair is a pair the entry carries on the same footing (`docs/specs/storeroom-js/surface.md §2.12` item 3's preamble clause
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "provident-storeroom",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "U-STOREROOM-PUBLISH: the published Node ESM binding for the native Rust store of Provident-Storeroom — the entry resolves the scoped per-target platform package first, the checkout's own module-relative addon second, and answers the store's single declared absent-addon form when neither loads",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "AGPL-3.0",
|
|
@@ -41,11 +41,11 @@
|
|
|
41
41
|
"src/constraint-kernel.mjs"
|
|
42
42
|
],
|
|
43
43
|
"optionalDependencies": {
|
|
44
|
-
"@auspicion/provident-storeroom-js-linux-x64-gnu": "1.
|
|
45
|
-
"@auspicion/provident-storeroom-js-linux-arm64-gnu": "1.
|
|
46
|
-
"@auspicion/provident-storeroom-js-darwin-x64": "1.
|
|
47
|
-
"@auspicion/provident-storeroom-js-darwin-arm64": "1.
|
|
48
|
-
"@auspicion/provident-storeroom-js-win32-x64-msvc": "1.
|
|
44
|
+
"@auspicion/provident-storeroom-js-linux-x64-gnu": "1.7.0",
|
|
45
|
+
"@auspicion/provident-storeroom-js-linux-arm64-gnu": "1.7.0",
|
|
46
|
+
"@auspicion/provident-storeroom-js-darwin-x64": "1.7.0",
|
|
47
|
+
"@auspicion/provident-storeroom-js-darwin-arm64": "1.7.0",
|
|
48
|
+
"@auspicion/provident-storeroom-js-win32-x64-msvc": "1.7.0"
|
|
49
49
|
},
|
|
50
50
|
"publishConfig": {
|
|
51
51
|
"access": "public"
|
package/src/entry/artefact.mjs
CHANGED
|
@@ -357,7 +357,23 @@ function spellDottedContainer(container) {
|
|
|
357
357
|
return spelled;
|
|
358
358
|
}
|
|
359
359
|
|
|
360
|
-
|
|
360
|
+
/// **⟶ AND ONE APPENDED FIFTH PARAMETER IS THE ARM TOKEN, ADDED 2026-11-01 (`D-98` item 4; `C-7`/`C-12`;
|
|
361
|
+
/// §3.2, §3.7).** `boundaryReject(status, subject, clause, container, token)` — **POSITIONS 1–4 ARE UNMOVED, so
|
|
362
|
+
/// every one of the `27` existing call sites is BYTE-IDENTICAL**, and the token is supplied by the four
|
|
363
|
+
/// cross-kind arms alone.
|
|
364
|
+
///
|
|
365
|
+
/// **WHAT IT IS, EXACTLY: A CLOSED ARM TOKEN AND NEVER TEXT.** The one token this correction requires is
|
|
366
|
+
/// `'handle'`. It is **not** a message, a clause, a spelling or a member name the store will print: the store
|
|
367
|
+
/// renders ITS OWN WORDS from the flag the token sets (`src/error.rs`'s two qualified branches, §3.3), and **an
|
|
368
|
+
/// unknown token leaves the slot absent, so the ordinary rendering stands — which is the two-argument call's
|
|
369
|
+
/// bytes.** **NO CALLER-SUPPLIED TEXT CAN ENTER A GENERATED SENTENCE** (`surface.md §2.5` item 2, `DD-52`).
|
|
370
|
+
///
|
|
371
|
+
/// **WHY A TOKEN AND NOT A BETTER CONTAINER** (§3.2 (e)–(f), refused there on two measured grounds): no container
|
|
372
|
+
/// repairs a DOMAIN claim, `Some('')` is already occupied by genuine register-level refusals, and a sentinel
|
|
373
|
+
/// spelling would be **an identity carried by a spelling** — exactly the seam `D-22` deleted by name. **The
|
|
374
|
+
/// qualified arm prints NO `<CONTAINER>` slot at all**, which is why the fourth position is passed `undefined`
|
|
375
|
+
/// ON PURPOSE at those four sites: it is a DECLARATION and not an omission (§3.4).
|
|
376
|
+
export function boundaryReject(status, subject, clause, container, token) {
|
|
361
377
|
const addon_ = withAddon();
|
|
362
378
|
if (typeof addon_.errorMessage !== 'function') {
|
|
363
379
|
// An artefact that LOADED but does not carry the generator is not the declared artefact: the state is
|
|
@@ -368,9 +384,13 @@ export function boundaryReject(status, subject, clause, container) {
|
|
|
368
384
|
// `dotted_address`: a key bare, an index bare, joined by `.`) — the same reading the store's own
|
|
369
385
|
// `malformed_segment` triggers take, where the container is the segment the mismatch was found in.
|
|
370
386
|
const where = container === undefined ? undefined : spellDottedContainer(container);
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
387
|
+
// **THE TOKEN REACHES THE GENERATOR'S APPENDED FOURTH POSITION, AND THE THREE-POSITION AND TWO-POSITION CALLS
|
|
388
|
+
// ARE THE BYTES THEY WERE**: a call that supplies no token takes the branch it always took, so **not one byte
|
|
389
|
+
// of the generator's output moves where no token is supplied** (`facade.rs`'s own `..Default::default()`
|
|
390
|
+
// device, reused at this site).
|
|
391
|
+
const generated = token === undefined
|
|
392
|
+
? (where === undefined ? addon_.errorMessage(status, subject) : addon_.errorMessage(status, subject, where))
|
|
393
|
+
: addon_.errorMessage(status, subject, where, token);
|
|
374
394
|
fail({ status, message: `${generated}, ${clause}` });
|
|
375
395
|
}
|
|
376
396
|
|
|
@@ -414,10 +414,24 @@ export function carryConstraint(state, instance, addresses, id, constraint) {
|
|
|
414
414
|
// removal clears all N"*). **THE KERNEL'S OWN REGISTRY KEEPS ITS `(address, id)` KEY SHAPE** — one pair over
|
|
415
415
|
// N addresses IS N `(address, id)` rows sharing one id (`P: docs/pending.md · P-7`'s keying ruling, item (v);
|
|
416
416
|
// `AB-6`) — so N registrations stand behind the ONE element this entry carries.
|
|
417
|
-
// **⟶ `B-6`
|
|
418
|
-
//
|
|
419
|
-
//
|
|
420
|
-
//
|
|
417
|
+
// **⟶ AND THE `B-6` EXEMPTION THIS COMMENT DECLARED IS DELETED, NOT MOVED — 2026-11-01 (`D-99`'s ANSWERED
|
|
418
|
+
// clause; `C-18`, §9.3).** The clause that stood here read *"`B-6`'s ONE EXEMPTION, DECLARED HERE AT ITS
|
|
419
|
+
// PRODUCER: while this loop runs, `listen` is being called by the KERNEL for the pair whose `id` is `id`, so
|
|
420
|
+
// the act is a CONSTRAINT's own registration and the cross-kind test has no subject. It is cleared on every
|
|
421
|
+
// arm, so a caller's later `listen` at a constraint's address is tested with no marker standing."* **THE
|
|
422
|
+
// EXEMPTION HAS NO SUBJECT, NO PURPOSE AND NO INSTRUMENT LEFT, AND THAT IS NOT A REVERSAL OF THE RULE ABOVE IT
|
|
423
|
+
// — IT IS THE `D-99` ROUTE READING ARRIVING AT ITS OWN SITE.** The kernel's registration **does not pass the
|
|
424
|
+
// cross-kind test at all** any more: `K-1` reaches the store through its own route (`LISTEN_ROUTE`,
|
|
425
|
+
// `delivery.mjs`'s `listenOn`), so the test lives on the CALLER's members `listen` and `register` and on
|
|
426
|
+
// nothing else — **there is nothing here to exempt, and no marker to set, clear or clear "on every arm"**. The
|
|
427
|
+
// sentence *"it is cleared on every arm"* is withdrawn with the `finally` it described, and `Q-1`'s residual (a
|
|
428
|
+
// constraint body borrowing the bracket) disappears with the marker it borrowed. **THE KERNEL'S FOUR
|
|
429
|
+
// RE-LISTINGS ARE LAWFUL BECAUSE THEY ARE NOT TESTED, NOT BECAUSE AN INSTRUMENT ADMITTED THEM** — which is what
|
|
430
|
+
// `XK-6` measures: the construction's arming walk, a held-pair extension, a disable→enable cycle and
|
|
431
|
+
// `restoreHeldPair`'s wake, each at N = 1 and N = 3, and a caller's `listen('<pair id>', …)` refused at both.
|
|
432
|
+
// **AND THE LATENT DEFECT THE MARKER WAS ORDERED TO CLOSE IS CLOSED BY THE ROUTE AND NOT BY A BRACKET**:
|
|
433
|
+
// `restoreHeldPair`'s wake runs with the pair's own polarity, and no number of addresses and no polarity can
|
|
434
|
+
// produce that refusal any more because the wake's registration passes no test.
|
|
421
435
|
// **⟶ AND THE PAIR'S N REGISTRATIONS ARE A LOCAL INDEX LOOP, NOT `for … of` — 2026-10-24**
|
|
422
436
|
// (`contract.md §2.1`'s clause of that date on `F8-2`, items `(2a)`–`(2c)`, arm `(xix)`, cell `JC-TC-65`;
|
|
423
437
|
// `F8-8`'s items `(2a)`/`(2e)`, which count a GOVERNED site's take of `Array.prototype[Symbol.iterator]` as
|
|
@@ -427,19 +441,14 @@ export function carryConstraint(state, instance, addresses, id, constraint) {
|
|
|
427
441
|
// performs.** **IT IS THE SAME PRECEDENT `encodeConstraints` ALREADY FOLLOWS** (the fourth key's own walk:
|
|
428
442
|
// *"a LOCAL INDEX LOOP, NOT `Array.prototype.map`"*, arm `(xix)`), and it is the same shape `storeCreate`'s own
|
|
429
443
|
// batch-arming walk takes. **ONE MEMBER PER ITERATION, IN THE SET'S OWN ORDER, AND NOTHING ELSE MOVES**: the
|
|
430
|
-
// three-state act, the one refusal crossing per arm, and the `B-6` marker's bracket
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
} catch (refusal) {
|
|
438
|
-
registrationCrossing(refusal, addresses[position]);
|
|
439
|
-
}
|
|
444
|
+
// three-state act, the one refusal crossing per arm, and the `B-6` marker's bracket is DELETED; the act is the
|
|
445
|
+
// kernel's own route.
|
|
446
|
+
for (let position = 0; position < addresses.length; position += 1) {
|
|
447
|
+
try {
|
|
448
|
+
constraintsKernel().register(instance, addresses[position], id, constraint);
|
|
449
|
+
} catch (refusal) {
|
|
450
|
+
registrationCrossing(refusal, addresses[position]);
|
|
440
451
|
}
|
|
441
|
-
} finally {
|
|
442
|
-
state.establishing = outerEstablishing;
|
|
443
452
|
}
|
|
444
453
|
// **THE STORE'S PAIR RECORD CARRIES THE IDENTITY, AND `addConstraint` AT A HELD PAIR ANSWERS THE STORE'S
|
|
445
454
|
// IDENTITY FOR THAT PAIR** (`P: docs/pending.md · (AA-2)`, its own obligation; `contract.md §2.6` item 2;
|
package/src/entry/delivery.mjs
CHANGED
|
@@ -285,6 +285,159 @@ export function installRegistrationSeam(instance, state) {
|
|
|
285
285
|
});
|
|
286
286
|
}
|
|
287
287
|
|
|
288
|
+
// ═════════════════════════════════════════════════════════════════════════════════════════════════════════
|
|
289
|
+
// **⟶ ADDED 2026-11-01 — THE INTERNAL ROUTE: THE MEMBER'S POST-TEST BODY, ITS ONE SYMBOL-KEYED CHANNEL, AND
|
|
290
|
+
// THE `D-99` ANSWERED CLAUSE'S *"THE KERNEL'S ACT IS ITS OWN"* SPELLED AT THE BYTES (`C-17`, §9.2).**
|
|
291
|
+
// ═════════════════════════════════════════════════════════════════════════════════════════════════════════
|
|
292
|
+
//
|
|
293
|
+
// **`D-99`'S ANSWERED CLAUSE, VERBATIM: *"Route reading — the kernel's act is its own (Recommended)"*.** So
|
|
294
|
+
// **the kernel's own store-side registration DOES NOT PASS THROUGH THE CALLER-FACING TEST AT ALL**: the
|
|
295
|
+
// cross-kind test (`B-6`) lives on the CALLER's member `listen` and on the caller's member `register` (`B-5`),
|
|
296
|
+
// and what the kernel reaches is the member's POST-TEST body, extracted here by name and called by both sides.
|
|
297
|
+
// **THE STORE'S ONE VERB IS UNMOVED AND IS REACHED ONCE, BY BOTH CALLERS** (`entryOf().listen`, the same entry
|
|
298
|
+
// call at the same two positions with the same encoded set and the same `carryRefusal` wrapper), so **the store
|
|
299
|
+
// gains no verb, no arm, no kind and no test** (`D-99` item 1, honoured by construction rather than by
|
|
300
|
+
// restraint), and **what the route SKIPS is the CALLER's tests over the CALLER's arguments** — the handle's
|
|
301
|
+
// class test and the set's member/domain walk, which `K-1` has already taken at its own channel (i)
|
|
302
|
+
// (`inDomainAddress`, `inDomainId`, `typeof constraint === 'function'`). **The tree already contains this exact
|
|
303
|
+
// shape and declares it lawful at a neighbouring site** (`registerOn`'s re-install reaches `entryOf().listen.call`
|
|
304
|
+
// directly, and its own clause states *"no second route installs a store entry"*); **the internal route is that
|
|
305
|
+
// sentence generalised from one act to the kernel's.**
|
|
306
|
+
|
|
307
|
+
const LISTEN_ROUTE = Symbol.for('provident-storeroom.listen-route');
|
|
308
|
+
|
|
309
|
+
/// **THE ONE COPY OF A CALLER-SUPPLIED ADDRESS'S SEGMENTS — `D-35`'s READ HALF, MOVED HERE 2026-11-01 WITH THE
|
|
310
|
+
/// BODY THAT IS ITS ONLY READER.** `listen(handle, addresses)` hands the SET, and each member of it is THE
|
|
311
|
+
/// CALLER'S OWN ARRAY, so the two `addresses[i].slice()` sites the extracted body carries took
|
|
312
|
+
/// `Array.prototype.slice` OFF A MUTABLE PROTOTYPE at the moment of the call: a caller who deleted `slice`
|
|
313
|
+
/// turned a LAWFUL `listen` into the raw host `TypeError` *"addresses[i].slice is not a function"* — a raw host
|
|
314
|
+
/// object out of a lawful call, which `surface.md §2.5` item 5 (e) files as a FINDING — and one who forged it
|
|
315
|
+
/// made the package's own home mirror record an address the store never received, MEASURED as a wrong value out
|
|
316
|
+
/// of a lawful `addConstraint` + `constraints()`. **THE FORM IS THE CONTRACT'S OWN**
|
|
317
|
+
/// (`docs/specs/storeroom-json-crossing/contract.md §2.1` item `(1c)(i)` and item `(1)`(c)): a local index loop
|
|
318
|
+
/// over the array's own exotic `length` and its own indices, appending by `appendOwn` — the same helper every
|
|
319
|
+
/// other append on these paths already takes. **NO ANSWER MOVES**: the same segments in the same order, in a
|
|
320
|
+
/// FRESH array, exactly as the `slice` produced.
|
|
321
|
+
function copySegments(address) {
|
|
322
|
+
const copy = [];
|
|
323
|
+
for (let i = 0; i < address.length; i += 1) appendOwn(copy, address[i]);
|
|
324
|
+
return copy;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/// **THE MEMBER'S POST-TEST BODY, EXTRACTED BY NAME — `index.mjs:806`–`:863`'s bytes, moved here with no logic
|
|
328
|
+
/// changed** (`C-17` (i)). **THE CALLER'S `listen` AND THE KERNEL'S REGISTRATION BOTH CALL THIS FUNCTION, AND
|
|
329
|
+
/// THE TWO DIFFER BY EXACTLY THE TESTS THE CALLER OWES.**
|
|
330
|
+
///
|
|
331
|
+
/// **EACH OF ITS FIVE STEPS IS A FACT ANOTHER MEMBER READS, WHICH IS WHY "BESIDES THE STORE CALL" IS NOT
|
|
332
|
+
/// DECORATION** (§9.2 (iii)):
|
|
333
|
+
/// 1. **THE ADDRESS ENCODE**, in the caller's own order — one encoded address per set member, the whole set
|
|
334
|
+
/// and never a delta (`PAR-HL-2`).
|
|
335
|
+
/// 2. **THE ONE STORE ACT**, through the SAME `carryRefusal` wrapper, so the store's own refusal crosses
|
|
336
|
+
/// unconverted exactly as it does today.
|
|
337
|
+
/// 3. **THE PACKAGE'S HOME MIRROR** — the purge by handle and the N-row install. `unlisten` reads these rows
|
|
338
|
+
/// to find the row it withdraws, `removeListener` likewise.
|
|
339
|
+
/// 4. **THE ENTRY'S REGISTRY RESERVATION** — `{fn: undefined, off: true, addresses}`, each address copied by
|
|
340
|
+
/// `copySegments`. **IT IS LOAD-BEARING THREE TIMES**: `installRegistrationSeam` leaves an entry the handle
|
|
341
|
+
/// names nothing for UNTOUCHED, so a route that skipped the reservation would STRAND every pair's body;
|
|
342
|
+
/// `register`'s entry-membership test is what makes `register('<pair id>', fn)` reach `B-5`'s cross-kind arm
|
|
343
|
+
/// rather than the *"this instance holds no listener entry"* arm; and `unlisten('<pair id>')` would answer
|
|
344
|
+
/// the no-op success instead of withdrawing.
|
|
345
|
+
/// 5. **THE ANSWER** — `return handle`, which `D-22` makes `listen` answer and which `K-1` ADOPTS, so the
|
|
346
|
+
/// adoption point (`store.listen(addr) === K-1` by reference equality) is byte-unmoved.
|
|
347
|
+
///
|
|
348
|
+
/// **THE RECEIVER IS PASSED AND IS NEVER INVENTED**: for a member call `receiver === this`; for the kernel's
|
|
349
|
+
/// route `receiver === instance === state.receiver`, the one object `isStoreReceiver` compares against — so the
|
|
350
|
+
/// store act reaches the store the caller names and no second store is addressed. **A DETACHED `listen` IS
|
|
351
|
+
/// UNMOVED**: it passes its own `undefined` receiver through exactly as today, because this extraction adds
|
|
352
|
+
/// **no class test** (`listen` is not one of the members that takes the receiver arm).
|
|
353
|
+
///
|
|
354
|
+
/// **AND THE ROUTE TAKES NO COMMIT** (`C-17` (v), DECIDED): the member's `openCommit`/`closeCommit` bracket
|
|
355
|
+
/// stays with the MEMBER, and every path the kernel's route runs is inside a surface act whose window is
|
|
356
|
+
/// already open — `addConstraint`, `constraintOn` and the construction's own `storeCreate` — where a nested
|
|
357
|
+
/// `openCommit` today JOINS and takes no observable action. **The kernel's act is not a surface act and the
|
|
358
|
+
/// window belongs to the caller's act.**
|
|
359
|
+
export function listenOn(receiver, state, handle, addresses) {
|
|
360
|
+
// ── THE ONE STORE ACT: PURGE, THEN INSTALL, INSIDE THE STORE'S OWN VERB ───────────────────────────────
|
|
361
|
+
// The set crosses AS ENCODED ADDRESSES, one per member, in the caller's own order (`PAR-HL-2`'s referent:
|
|
362
|
+
// the whole set and never a delta).
|
|
363
|
+
const encoded = [];
|
|
364
|
+
for (let i = 0; i < addresses.length; i += 1) {
|
|
365
|
+
appendOwn(encoded, encodeAddress(addresses[i], 'second argument', 'second argument'));
|
|
366
|
+
}
|
|
367
|
+
carryRefusal(() => entryOf().listen.call(receiver, handleWire(handle), encoded), [handleWire(handle)]);
|
|
368
|
+
// ── THE PACKAGE'S OWN HOME MIRROR ────────────────────────────────────────────────────────────────────
|
|
369
|
+
// **THE MIRROR'S COLUMN IS THE CALLER'S OWN HANDLE AND NOT A TOKEN** (`identity-and-domain.md §1` item 2
|
|
370
|
+
// (ii)), and **THE PURGE REACHES IT**: every row the handle named is dropped before the set's own rows are
|
|
371
|
+
// recorded, which is the same wholesale assignment the store performed (`listen-verb.md §3` item 1's four
|
|
372
|
+
// structures). **THE `some(key)` GUARD IS GONE WITH `first_at`** (`P: docs/pending.md · R-B1`, deletion
|
|
373
|
+
// part (b)): with the idempotence deleted the mirror records one row per address in the act's own set, so
|
|
374
|
+
// N addresses answer N rows for ONE handle (`listen-verb.md §6` item 4 (iv)).
|
|
375
|
+
state.home = state.home.filter((row) => row.handle !== handle);
|
|
376
|
+
for (let i = 0; i < addresses.length; i += 1) {
|
|
377
|
+
// **⟶ AND THE MIRROR'S COPY IS `copySegments`, NOT `addresses[i].slice()`** (`D-35`'s read half,
|
|
378
|
+
// 2026-10-26 — see the function's own clause above; the caller's array is the receiver either way and
|
|
379
|
+
// the answer is the same fresh segment list).
|
|
380
|
+
appendOwn(state.home, { key: homeAddressKey(addresses[i]), address: copySegments(addresses[i]), handle });
|
|
381
|
+
}
|
|
382
|
+
// ── THE ENTRY'S FIRST STATE: RESERVED ────────────────────────────────────────────────────────────────
|
|
383
|
+
// ***"`listen` WRITES THE ENTRY WITH `off` SET — the reservation"*** (`P: docs/pending.md · P-5`, the
|
|
384
|
+
// entry-shape ruling; `contract.md §2.2` item 5 (a); `identity-and-domain.md §2` item 5). **AN ENTRY WITH
|
|
385
|
+
// NO FUNCTION IS NOT A LAWFUL VALUE, so the state `listen` creates is an entry that EXISTS AND IS OFF** —
|
|
386
|
+
// which is exactly what the ruling provides. **AND A REPEATED `listen` RE-RESERVES THE ENTRY**: it is a
|
|
387
|
+
// purge then a fresh reservation, never a fast path (`P: docs/pending.md · (R1)`, its own closing
|
|
388
|
+
// sentence; `contract.md §2.2` item 3).
|
|
389
|
+
// **⟶ AND THE SET'S COPY IS A LOCAL INDEX LOOP, NOT `Array.prototype.map` — 2026-10-24 (`contract.md §2.1`'s
|
|
390
|
+
// clause of that date on `F8-2`, items `(2a)`–`(2c)`, arm `(xix)`, cell `JC-TC-65`).** This position is the
|
|
391
|
+
// one the kernel's registration reaches, so the `.map` that stood here
|
|
392
|
+
// threw `TypeError: addresses.map is not a function` OUT OF A LAWFUL `storeCreate` under a caller's
|
|
393
|
+
// `delete Array.prototype.map` — a raw host object crossing the boundary, which `§2.5` item `5 (e)` files as
|
|
394
|
+
// a FINDING. **IT IS THE SAME PRECEDENT `encodeConstraints` ALREADY FOLLOWS** (the fourth key's own walk:
|
|
395
|
+
// *"a LOCAL INDEX LOOP, NOT `Array.prototype.map`"*), and the bytes, the order and the fresh-array-per-member
|
|
396
|
+
// copy are unmoved. **THE `slice` IS THE ELEMENT'S AND NOT THE SET'S**: it copies one ADDRESS's segments, so
|
|
397
|
+
// the registry row's set is the fresh list this loop builds.
|
|
398
|
+
const standingSet = [];
|
|
399
|
+
for (let i = 0; i < addresses.length; i += 1) {
|
|
400
|
+
// **⟶ THE REGISTRY ROW'S SET TAKES THE SAME `copySegments`** (`D-35`'s read half, 2026-10-26): the
|
|
401
|
+
// element is the caller's address array, so its `slice` was a mutable prototype's member.
|
|
402
|
+
appendOwn(standingSet, copySegments(addresses[i]));
|
|
403
|
+
}
|
|
404
|
+
state.registry.set(handle, {
|
|
405
|
+
fn: undefined,
|
|
406
|
+
off: true,
|
|
407
|
+
// **THE SET THE LAST `listen` GAVE THE HANDLE** — the referent `PAR-HL-2` names (*"the set of addresses the
|
|
408
|
+
// handle stands at after this act — the whole set, never a delta"*), and the one datum `register` reads to
|
|
409
|
+
// re-install a reserved entry's store side.
|
|
410
|
+
addresses: standingSet,
|
|
411
|
+
});
|
|
412
|
+
// **⟶ AND IT ANSWERS THE HANDLE IT WATCHES UNDER — `D-22`'s `void → Handle`, 2026-10-24.** *"Listen should
|
|
413
|
+
// return the handle on success, or error message on fail."* **A SUCCESS SIGNAL THAT CARRIES THE
|
|
414
|
+
// IDENTITY, AND NOT AN ECHO TO BE SUPPRESSED**: the value the caller spelled is the identity the store
|
|
415
|
+
// holds for that entry, and it is what `K-1` ADOPTS (`store[LISTEN_ROUTE](id, set)`), which is
|
|
416
|
+
// what `kernel-surface.md` declared all along — *"adopted, never minted by the kernel"*.
|
|
417
|
+
return handle;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/// **THE INSTALL, CALLED ONCE BY `storeCreate`** — the channel `K-1` reaches instead of the caller's member.
|
|
421
|
+
/// **IT TAKES THE `Symbol.for` KEY AND THE INSTANCE'S OWN STATE, AND IT MINTS NOTHING**: no member of the
|
|
422
|
+
/// product (`Object.defineProperty` at `enumerable: false` is invisible to `Object.keys` and to
|
|
423
|
+
/// `Object.getOwnPropertyNames` — `A117` (D6)), no kernel item, no record member.
|
|
424
|
+
///
|
|
425
|
+
/// **WHERE IT IS INSTALLED IS DECLARED AND IT IS NOT WHERE THE OTHER CHANNEL IS** (`C-17` (iv)): at
|
|
426
|
+
/// `index.mjs`'s `state.receiver = instance` neighbourhood, **BEFORE the construction's batch arming walk**, so
|
|
427
|
+
/// a pair armed by `cfg.constraints` is not the one kernel registration still passing through the caller's
|
|
428
|
+
/// wrapper. **An instance that carries no such channel answers nothing and is told nothing** (the family's own
|
|
429
|
+
/// absent arm, printed at `kernel-registration.mjs` for the body channel): **`storeCreate` installs it on every
|
|
430
|
+
/// instance it returns and installs it before the batch walk, so no drive in this tree reaches that arm.**
|
|
431
|
+
export function installListenRoute(instance, state) {
|
|
432
|
+
if (typeof instance[LISTEN_ROUTE] === 'function') return;
|
|
433
|
+
Object.defineProperty(instance, LISTEN_ROUTE, {
|
|
434
|
+
value: (handle, addresses) => listenOn(instance, state, handle, addresses),
|
|
435
|
+
writable: true,
|
|
436
|
+
enumerable: false,
|
|
437
|
+
configurable: true,
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
|
|
288
441
|
/// **THE REGISTRY'S OWN SITE AT THE PACKAGE'S BOUNDARY** (`surface.md §2.4` item 5): the caller's FUNCTION
|
|
289
442
|
/// for a handle, held by the package (`DD-15`) and invoked after the verb has returned (`docs/specs/storeroom-js/surface.md §2.7` item 2).
|
|
290
443
|
/// **`register` REPLACES, never fans out** (rule 2); a non-function `listener`, a `handle` THIS INSTANCE
|
|
@@ -366,13 +519,34 @@ export function registerOn(state, handle, listener) {
|
|
|
366
519
|
// `D-22` the kernel's handle is no longer a reserved spelling — it is the caller's own `id` — and under
|
|
367
520
|
// `D-25` the kernel REGISTERS NOTHING (*"so nothing needs to get past the test"*), so the exemption and its
|
|
368
521
|
// `KERNEL_HANDLE_PREFIX` constant have no subject and `Q2`'s hazard dissolves with its cause.**
|
|
369
|
-
|
|
522
|
+
//
|
|
523
|
+
// **⟶ AND TWO SENTENCES OF THIS BLOCK ARE RE-DERIVED 2026-11-01 (`D-98`; `D-99`'s ANSWERED clause), in the
|
|
524
|
+
// project's annotate-beside spelling — they stand above and are read THROUGH this clause.** ***"the message
|
|
525
|
+
// unchanged in content"* IS WITHDRAWN:** the generated half is now the store's own QUALIFIED
|
|
526
|
+
// `AddressMalformed` arm, selected by the closed `'handle'` token (§3.3, §3.6), and the clause half names the
|
|
527
|
+
// pair's `id` and the rule's re-spelt sentence — *"a listener and a constraint do not share one handle"*
|
|
528
|
+
// (§3.4) — with **no address anywhere in it**. ***"under `D-25` the kernel REGISTERS NOTHING"* IS WITHDRAWN
|
|
529
|
+
// TOO:** the kernel does register, and it registers through its OWN ROUTE (`LISTEN_ROUTE`, §9.2), which never
|
|
530
|
+
// reaches this test — so the paragraph's point (the prefix was a seam and it is DELETED rather than moved)
|
|
531
|
+
// stands, and what replaced the exemption is a route and not a narrower exemption.
|
|
532
|
+
//
|
|
533
|
+
// **⟶ RE-DERIVED 2026-11-01 (`D-98`, verbatim: *"A constraint and a listener can share an address, as can
|
|
534
|
+
// multiple constraints/listeners. The restriction is that a listener and a constraint cannot have the same
|
|
535
|
+
// *handle*."*).** **THE ADDRESS ARM IS DELETED, AND `constraintAtAnyAddress` IS DELETED WITH IT** (§1.1): its
|
|
536
|
+
// subject was the ADDRESS-SET MEMBERSHIP, which `D-98` (i) declares LAWFUL, and its only caller was this one
|
|
537
|
+
// line. **WHAT STANDS IS THE HANDLE**, read by the SAME helper `B-6` reads so the two arms cannot disagree
|
|
538
|
+
// again (`C-1`, `C-16`): a carried pair whose `id` equals the handle, and nothing else. **NO EXEMPTION IS
|
|
539
|
+
// REACHABLE HERE** (`C-2` is deleted with `D-99`'s ANSWERED clause): `B-5` is a caller's act, and the kernel's
|
|
540
|
+
// own re-listing does not pass this test at all because it does not come through this member (§9.2).
|
|
541
|
+
const conflicted = constraintOverwrittenByListen(state, handle);
|
|
370
542
|
if (conflicted !== null) {
|
|
371
543
|
boundaryReject(
|
|
372
544
|
'AddressMalformed',
|
|
373
|
-
|
|
374
|
-
`the
|
|
375
|
-
+
|
|
545
|
+
conflicted.id,
|
|
546
|
+
`register refuses: the constraint pair '${conflicted.id}' keeps that handle, and a listener and a `
|
|
547
|
+
+ 'constraint do not share one handle',
|
|
548
|
+
undefined,
|
|
549
|
+
'handle',
|
|
376
550
|
);
|
|
377
551
|
}
|
|
378
552
|
// **⟶ AND A RESERVED ENTRY IS RE-ARMED BY RE-INSTALLING ITS STORE SIDE** — *"the entry EXISTS with `off`
|
|
@@ -437,58 +611,14 @@ export function registerOn(state, handle, listener) {
|
|
|
437
611
|
return undefined;
|
|
438
612
|
}
|
|
439
613
|
|
|
440
|
-
///
|
|
441
|
-
/// read (`constraint-sites.md §5` items 1–2).
|
|
614
|
+
/// **`B-4`'S ONE READ — WHETHER A **LIVE LISTENER** STANDS UNDER `handle`.**
|
|
442
615
|
///
|
|
443
|
-
///
|
|
444
|
-
///
|
|
445
|
-
///
|
|
446
|
-
///
|
|
447
|
-
///
|
|
448
|
-
///
|
|
449
|
-
/// (`contract.md §2.6` item 4; `P: docs/pending.md · P-7`'s keying ruling, item (iv)).
|
|
450
|
-
function constraintAtAnyAddress(state, handle) {
|
|
451
|
-
if (state.constraints.size === 0) return null;
|
|
452
|
-
const standing = state.home.filter((row) => row.handle === handle);
|
|
453
|
-
if (standing.length === 0) return null;
|
|
454
|
-
for (const entry of state.constraints.values()) {
|
|
455
|
-
for (const key of standing) {
|
|
456
|
-
for (const address of entry.addresses) {
|
|
457
|
-
if (homeAddressKey(address) === key.key) return { address, id: entry.id };
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
return null;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
/// **`B-6`'S ONE READ — WHAT INSTALLING `handle` AT `addresses` WOULD DESTROY THAT IT MAY NOT OVERWRITE**
|
|
465
|
-
/// (`D-29`, verbatim: *"Listen cannot overwrite constraint, only other listeners"*).
|
|
466
|
-
///
|
|
467
|
-
/// **THE SUBJECT IS `listen`'S PURGE, STATED AS THE DECLARED INSTANT STATES IT: *"the act must not destroy
|
|
468
|
-
/// what it may not overwrite"*.** So the test is taken over the constraint pairs **whose home entry STANDS** —
|
|
469
|
-
/// `entry.enabled === true`, the very predicate `withdrawStanding` already reads (*"`enabled === true` ⟺ the
|
|
470
|
-
/// pair stands a registration"*), because **a pair the disable left standing none has no entry for the purge
|
|
471
|
-
/// to reach and no entry for a refusal to protect.**
|
|
472
|
-
///
|
|
473
|
-
/// **THE TWO DIMENSIONS, BOTH TESTED** (`D-29`'s stated reading: *"both, because under `D-29` the handle and
|
|
474
|
-
/// the `id` are one string"*):
|
|
475
|
-
/// 1. **IDENTITY** — the handle equals the pair's `id`, so the same string names a listener entry and a
|
|
476
|
-
/// constraint pair. Under `D-29` that is one namespace and a cross-kind overwrite.
|
|
477
|
-
/// 2. **ADDRESS** — the set names an address the pair's home entry occupies, so the caller's act reaches
|
|
478
|
-
/// the address the constraint is registered at.
|
|
479
|
-
///
|
|
480
|
-
/// **AND ONE ACT IS LAWFUL UNDER BOTH: THE KERNEL'S OWN RE-LISTING OF A PAIR.** `K-1` calls
|
|
481
|
-
/// `store.listen(id, set)` with **the pair's own `id` and the pair's own accumulated set**; `constraintOn`'s
|
|
482
|
-
/// enable arm re-registers a pair whose registration the disable purged; `restoreHeldPair`'s wake re-registers
|
|
483
|
-
/// a pair after a refused re-registration. **Each is a SAME-KIND re-assignment that destroys nothing** — the
|
|
484
|
-
/// set covers every address the pair stands at and the handle IS the pair's own word for it — so the test
|
|
485
|
-
/// exempts exactly `handle === entry.id` **and** a set that covers **all** of `entry.addresses`. **That is not
|
|
486
|
-
/// a reserved namespace and not a second rule: it is the purge's own test read literally** (`D-22` discarded
|
|
487
|
-
/// the prefix, and `D-29` discards the namespace with it, so what distinguishes the kernel's act is the ACT
|
|
488
|
-
/// and not a spelling).
|
|
489
|
-
///
|
|
490
|
-
/// **NO STORE ACT IS TAKEN HERE**: both dimensions read `state.constraints`, the package's own read model.
|
|
491
|
-
/// **`B-4`'S ONE READ — THE ADDRESS AT WHICH A **LIVE LISTENER** STANDS UNDER `handle`, OR `null`.**
|
|
616
|
+
/// **⟶ RE-DERIVED 2026-11-01 (`D-98` §3.4): THE FUNCTION ANSWERS `true`/`false` AND THE ADDRESS LOOP IS
|
|
617
|
+
/// DELETED.** That loop existed for **the MESSAGE alone** — its own clause below said so — and it answered the
|
|
618
|
+
/// LISTENER's mirror address (`state.home[i].address`, one of that handle's N rows) and never the pair's.
|
|
619
|
+
/// **`B-4`'s corrected clause names NO address at all** (§3.4: the refusal's subject is the identity, and
|
|
620
|
+
/// `D-98` makes the address lawful), so the loop has no reader and goes with it; the refusal's `address` member
|
|
621
|
+
/// stays `null` at `boundaryReject`'s own call (`refusal.mjs`), which is now correct rather than incidental.
|
|
492
622
|
///
|
|
493
623
|
/// **"LIVE LISTENER" IS THE EXACT PREDICATE AND IT IS NOT A SHORTHAND.** The package's own registry holds an
|
|
494
624
|
/// entry for EVERY handle the store knows, **including a constraint pair's** — under `D-22`/`D-29` the kernel's
|
|
@@ -497,62 +627,73 @@ function constraintAtAnyAddress(state, handle) {
|
|
|
497
627
|
/// `register` sets and what nothing else sets, **and it is what keeps a constraint pair's own reservation from
|
|
498
628
|
/// reading as a listener at its own `id`** (`D-24`'s same-kind overwrite must stay lawful at a held pair).
|
|
499
629
|
///
|
|
500
|
-
/// **THE
|
|
501
|
-
///
|
|
630
|
+
/// **THE ANSWER IS A BOOLEAN AND NOT AN ADDRESS** (re-derived above, 2026-11-01): `true` where a live
|
|
631
|
+
/// listener's registration stands under the handle, `false` everywhere else. **NO MIRROR ROW IS READ AT ALL**,
|
|
632
|
+
/// so `B-4`'s refusal carries `address: null` by construction and not by an omission.
|
|
502
633
|
export function listenerStandingAt(state, handle) {
|
|
503
634
|
const entry = state.registry.get(handle);
|
|
504
|
-
if (entry === undefined || entry.off !== false || typeof entry.fn !== 'function') return
|
|
635
|
+
if (entry === undefined || entry.off !== false || typeof entry.fn !== 'function') return false;
|
|
505
636
|
// **⟶ AND A CONSTRAINT'S OWN ENTRY IS NOT A LISTENER'S — `D-69`, 2026-10-29.** The clause above reads
|
|
506
637
|
// *"a LISTENER stands exactly where `off === false` AND `fn` is a function"* and that pair of facts now also
|
|
507
638
|
// holds of a pair's registration, because `K-1` installs the pair's own constraint function in that slot. **THE
|
|
508
639
|
// KIND IS THE THIRD FACT AND IT IS WHAT KEEPS `D-25`'s CROSS-KIND REFUSAL POINTED AT A LISTENER**: a pair's `id`
|
|
509
640
|
// is its own handle, and a re-add at a held pair must stay LAWFUL (`D-24`) while a listener claiming a pair's
|
|
510
641
|
// `id`, or a pair claiming a listener's, must still be refused.
|
|
511
|
-
if (entry.kind === 'constraint') return
|
|
512
|
-
|
|
513
|
-
if (state.home[i].handle === handle) return { address: state.home[i].address };
|
|
514
|
-
}
|
|
515
|
-
return null;
|
|
642
|
+
if (entry.kind === 'constraint') return false;
|
|
643
|
+
return true;
|
|
516
644
|
}
|
|
517
645
|
|
|
518
|
-
|
|
646
|
+
/// **`B-6`'S AND `B-5`'S ONE READ — THE CARRIED CONSTRAINT PAIR WHOSE `id` IS `handle`, OR `null`.**
|
|
647
|
+
///
|
|
648
|
+
/// **⟶ RE-DERIVED 2026-11-01 (`D-98`, `D-99` and its ANSWERED clause; `C-1`/`C-16`): ONE HELPER, ONE RULE, AND
|
|
649
|
+
/// THE RULE IS THE HANDLE.** **`constraintAtAnyAddress` IS DELETED, NOT RE-POINTED** (§1.1's precedent: *"a
|
|
650
|
+
/// helper whose one caller is deleted has no subject"*): its subject was ADDRESS-SET MEMBERSHIP, which `D-98`
|
|
651
|
+
/// (i) declares **LAWFUL** — a pair and a listener MAY stand at one address, as may multiple pairs and multiple
|
|
652
|
+
/// listeners — and its ground, `D-29`'s *"the address dimension is NECESSARY, because the purge is
|
|
653
|
+
/// address-reaching"*, is **FALSE at this build**: the purge is BY HANDLE and unconditional
|
|
654
|
+
/// (`src/store.rs:476`–`:494`, `:2594`) and this package's mirror purge is by handle too (`index.mjs:821`), so
|
|
655
|
+
/// an act under a different handle cannot reach a pair's rows (`D-98` item 3). **What the dimension admitted
|
|
656
|
+
/// was the defect.**
|
|
657
|
+
///
|
|
658
|
+
/// **THE ONE PREDICATE THIS FUNCTION NOW TAKES IS `handle === entry.id`**, over the instance's carried pairs, in
|
|
659
|
+
/// ONE pass — and **it answers the pair row itself** (`{ addresses, addressKey, id, fn, enabled, identity,
|
|
660
|
+
/// registrationSeq }`, the record `carryConstraint` writes, `constraints.mjs`), or `null`. The `id` is read for
|
|
661
|
+
/// the message and nothing else is read at all.
|
|
662
|
+
///
|
|
663
|
+
/// **WHAT IT LOSES, ONE BY ONE, SO ITS NEW SHAPE IS NOT AN ACCIDENT OF EDITING** (§9.1): the third parameter
|
|
664
|
+
/// (`addresses`) and with it every use of the act's set; the `covers` computation; the `covers && handle ===
|
|
665
|
+
/// entry.id` continue; **the `entry.enabled !== true` skip** — `C-3`/`C-19` decide that **a DISABLED pair's
|
|
666
|
+
/// handle blocks a listener's claim exactly as an enabled one's**, because the loss the skip permitted is
|
|
667
|
+
/// FORWARD and not instant: the next `constraintOn` re-lists the pair at the same handle, `K-1`'s store act
|
|
668
|
+
/// purges by handle, and `installRegistrationSeam` overwrites the entry — the listener stops being delivered
|
|
669
|
+
/// with no observable at the instant of the loss (`D-25`, `D-98` (iii), `D-29`'s *"the act must not destroy
|
|
670
|
+
/// what it may not overwrite"*); and **the dimension-2 arm with its guard**, `state.establishing`'s read
|
|
671
|
+
/// included — **there is no marker any more** (`D-99`'s ANSWERED clause deletes it, and its readers with it).
|
|
672
|
+
///
|
|
673
|
+
/// **THE SOURCE IS `state.constraints` AND NOT THE KERNEL'S ROWS, WHICH IS `D-99` ITEM (b) TAKEN (§9.1): the
|
|
674
|
+
/// map is the one the kernel's own rows are keyed with, one row per pair, written by exactly the four places a
|
|
675
|
+
/// pair's standing is written and enumerated by `constraints()`, so *"this handle is a pair's"* and *"this
|
|
676
|
+
/// instance carries that pair"* are ONE fact here. `kernel.pairs`/`kernel.handles` are unreachable from the
|
|
677
|
+
/// entry (no export answers *"is this handle a pair's"*), and they are EMPTIED when a pair is disabled (`K-6`'s
|
|
678
|
+
/// `FORGET_PAIR`) while the pair stays carried — the one state where the two sources disagree, decided at
|
|
679
|
+
/// `C-19` in favour of the carried pair.**
|
|
680
|
+
///
|
|
681
|
+
/// **AND NO EXEMPTION IS REACHABLE FROM EITHER OF ITS TWO CALLERS** (`C-2` is deleted with `D-99`'s ANSWERED
|
|
682
|
+
/// clause): `B-6` (`listen`) and `B-5` (`register`) are CALLERS' acts, and the kernel's own re-listing does not
|
|
683
|
+
/// pass this test at all — its store-side act is its own route (`LISTEN_ROUTE`, `§9.2`), and the test lives on
|
|
684
|
+
/// the caller's members and nowhere else. **THE ONE ACT THE OLD TEST ALLOWED — THE KERNEL'S RE-LISTING, TOLD BY
|
|
685
|
+
/// ITS MARKER — HAS NO SUBJECT LEFT: there is no marker, nothing is bracketed, and a constraint body that calls
|
|
686
|
+
/// `listen('<its own pair id>', …)` during its own registration is REFUSED here like any caller's act.**
|
|
687
|
+
///
|
|
688
|
+
/// **NO STORE ACT IS TAKEN HERE**: the read is `state.constraints`, the package's own model of the pairs it
|
|
689
|
+
/// carries.
|
|
690
|
+
|
|
691
|
+
export function constraintOverwrittenByListen(state, handle) {
|
|
519
692
|
if (state.constraints.size === 0) return null;
|
|
520
|
-
|
|
521
|
-
|
|
693
|
+
// ONE PASS, ONE COMPARISON, AND THE PAIR ROW ITSELF IS THE ANSWER — see this helper's own clause above for
|
|
694
|
+
// every computation `D-98`, `C-1`, `C-3`/`C-19` and `C-16` took out of this loop and why.
|
|
522
695
|
for (const entry of state.constraints.values()) {
|
|
523
|
-
if (entry.
|
|
524
|
-
// IS THIS THE PAIR'S OWN RE-LISTING? the handle is its word and the set covers every address it stands at.
|
|
525
|
-
let covers = entry.addresses.length > 0;
|
|
526
|
-
for (let i = 0; i < entry.addresses.length; i += 1) {
|
|
527
|
-
const heldKey = homeAddressKey(entry.addresses[i]);
|
|
528
|
-
let found = false;
|
|
529
|
-
for (let k = 0; k < actKeys.length; k += 1) {
|
|
530
|
-
if (actKeys[k] === heldKey) {
|
|
531
|
-
found = true;
|
|
532
|
-
break;
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
if (!found) {
|
|
536
|
-
covers = false;
|
|
537
|
-
break;
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
if (covers === true && handle === entry.id) continue;
|
|
541
|
-
// DIMENSION 1 — THE HANDLE EQUALS THE PAIR'S `id`.
|
|
542
|
-
if (handle === entry.id) return { address: entry.addresses[0], id: entry.id };
|
|
543
|
-
// DIMENSION 2 — THE SET NAMES AN ADDRESS THE PAIR'S HOME ENTRY OCCUPIES.
|
|
544
|
-
// **AND THIS DIMENSION'S SUBJECT IS A *LISTENER'S* ACT, WHICH IS WHY IT IS READ LAST AND BEHIND THE
|
|
545
|
-
// CROSS-KIND QUALIFIER.** A handle that names a constraint pair this instance carries — or the one the
|
|
546
|
-
// kernel is establishing this instant — is a CONSTRAINT's word, so the act is same-kind and `D-25`'s
|
|
547
|
-
// overwrite rule governs it, not this refusal. **A LISTENER's handle names no pair, and that is exactly the
|
|
548
|
-
// act `D-29` closes:** `listen('listener-a', [a])` where a constraint stands at `a`.
|
|
549
|
-
if (state.constraints.has(handle) || state.establishing === handle) continue;
|
|
550
|
-
for (let i = 0; i < entry.addresses.length; i += 1) {
|
|
551
|
-
const heldKey = homeAddressKey(entry.addresses[i]);
|
|
552
|
-
for (let k = 0; k < actKeys.length; k += 1) {
|
|
553
|
-
if (actKeys[k] === heldKey) return { address: entry.addresses[i], id: entry.id };
|
|
554
|
-
}
|
|
555
|
-
}
|
|
696
|
+
if (handle === entry.id) return entry;
|
|
556
697
|
}
|
|
557
698
|
return null;
|
|
558
699
|
}
|
package/src/entry/frame.mjs
CHANGED
|
@@ -298,6 +298,21 @@ export function admittedConstraintBatch(cfg) {
|
|
|
298
298
|
);
|
|
299
299
|
}
|
|
300
300
|
// ── `B-3` — A BATCH `id` EQUAL TO AN ADOPTED LISTENER'S `handle`: THE CROSS-KIND COLLISION ───────────
|
|
301
|
+
// **⟶ RE-DERIVED 2026-11-01 (`D-98` item 4; `C-9`, `C-11`; §2, §3.4, §3.6), AND THE DIMENSION IS UNMOVED.**
|
|
302
|
+
// The arm compares a listener's **HANDLE** to a pair's **`id`** — the only cross-kind restriction `D-98`
|
|
303
|
+
// keeps, in the direction the ruling names second — so **its condition, its status (`ConstraintListInvalid`,
|
|
304
|
+
// `D-27`) and its instant are exactly what they were.** **TWO THINGS RE-DERIVE, AND BOTH ARE THE MESSAGE'S:**
|
|
305
|
+
// * **THE SUBJECT IS THE HANDLE AND NOT THE ADDRESS.** It was `spellConstraintAddress(element.address.s)` —
|
|
306
|
+
// an address whose string segments are ALREADY single-quoted here, and which the facade quotes again, so
|
|
307
|
+
// the rendered bytes read `''ck''` (`research.md` §5.3). **A BARE HANDLE RENDERS `'shared-handle'` and
|
|
308
|
+
// that doubling has no subject at this arm** (`B-1`/`B-2` keep it, and that residual is `Q-3`).
|
|
309
|
+
// * **ITS CLAUSE NAMES THE POSITION AND THE ADOPTED LISTENER'S ONE ADDRESS** (§3.4): an adopted
|
|
310
|
+
// `cfg.listeners` element carries exactly ONE `address`, so naming it asserts no order and is exact —
|
|
311
|
+
// where the POSITION names the element, whose address could not (two elements may carry one address).
|
|
312
|
+
// **AND THE CONTAINER IS `undefined` ON PURPOSE**: the generated half is the store's own QUALIFIED
|
|
313
|
+
// `ConstraintListInvalid` arm under the appended `'handle'` token, and **that arm prints NO `<CONTAINER>`
|
|
314
|
+
// slot at all** — the list's name `constraints` is named on the clause's side and not in the generated half,
|
|
315
|
+
// where it would read as the place the mismatch was found (§3.3).
|
|
301
316
|
let adoptedAt = -1;
|
|
302
317
|
for (let n = 0; n < adoptedHandles.length; n += 1) {
|
|
303
318
|
if (adoptedHandles[n] === element.id) {
|
|
@@ -308,11 +323,11 @@ export function admittedConstraintBatch(cfg) {
|
|
|
308
323
|
if (adoptedAt !== -1) {
|
|
309
324
|
boundaryReject(
|
|
310
325
|
'ConstraintListInvalid',
|
|
311
|
-
|
|
312
|
-
`the batch element at position ${position} names
|
|
313
|
-
+ `
|
|
314
|
-
|
|
315
|
-
|
|
326
|
+
element.id,
|
|
327
|
+
`the batch element at position ${position} names that handle, and this construction adopts a `
|
|
328
|
+
+ `listener under it at ${addressSpelling(adoptedAddresses[adoptedAt])}`,
|
|
329
|
+
undefined,
|
|
330
|
+
'handle',
|
|
316
331
|
);
|
|
317
332
|
}
|
|
318
333
|
appendOwn(namedHandles, element.id);
|
|
@@ -31,6 +31,15 @@ const EXTERNAL_CALL = Symbol.for('provident-storeroom.external-call');
|
|
|
31
31
|
/// seventh name, `§1` item 2), no member on any record, no store act.
|
|
32
32
|
const REGISTER_BODY = Symbol.for('provident-storeroom.register-body');
|
|
33
33
|
|
|
34
|
+
/// **⟶ AND `D-99`'S INTERNAL LISTEN ROUTE, SPELLED ON THIS SIDE TOO — 2026-11-01 (`C-17`, §9.2).**
|
|
35
|
+
/// `delivery.mjs`'s `installListenRoute` installs it and this module reaches it, **and neither side imports the
|
|
36
|
+
/// other**: the same `Symbol.for` device `EXTERNAL_CALL`, `REGISTER_BODY`, `TERMINAL_ARM`, `COMMIT_SCOPE` and
|
|
37
|
+
/// `FORGET_PAIR` already cross by (`kernel-surface.md §1` item 1's empty import footprint; `A110`). **IT TAKES
|
|
38
|
+
/// THE HANDLE AND THE PAIR'S ADDRESS SET AND ANSWERS THE ADOPTED HANDLE** — the caller's `listen` member's
|
|
39
|
+
/// post-test body, and not the member. **IT MINTS NOTHING**: no kernel item (`K-1`…`K-6` and no seventh name,
|
|
40
|
+
/// `§1` item 2), no member on any record, no store verb, no store act of its own.
|
|
41
|
+
const LISTEN_ROUTE = Symbol.for('provident-storeroom.listen-route');
|
|
42
|
+
|
|
34
43
|
/// **THE INVOCATION OF A REPAIR BODY, WITH THE SYNTHETIC ATTEMPT'S COMMIT NAMED ON ITS ENTRY** — one call, its
|
|
35
44
|
/// answer the body's own, and a throwable crosses unchanged. **THE SECOND COPY OF THE FIVE-LINE FORM
|
|
36
45
|
/// `kernel-attempt.mjs` DECLARES**, because the two part files share no import and neither may reach the entry
|
|
@@ -83,12 +92,18 @@ export function register(store, address, id, constraint) {
|
|
|
83
92
|
// route read (`write-and-read.md §6.5` item 12 (c)): a repeat at an address the home already holds mints
|
|
84
93
|
// nothing and answers the entry's own handle.
|
|
85
94
|
//
|
|
86
|
-
// **⟶ AND THE CALLER-SPELLED HANDLE IS A STRING THE KERNEL ITSELF SPELLS**, because the kernel
|
|
87
|
-
//
|
|
88
|
-
// `K-6` withdraws through the same route rather than inventing a second one"*).
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
//
|
|
95
|
+
// **⟶ AND THE CALLER-SPELLED HANDLE IS A STRING THE KERNEL ITSELF SPELLS**, because the kernel reaches **the
|
|
96
|
+
// app's own ROUTE** (`contract.md §2.9` item 2's route: *"the kernel already reaches a store verb … so
|
|
97
|
+
// `K-6` withdraws through the same route rather than inventing a second one"*). **⟶ RE-DERIVED 2026-11-01
|
|
98
|
+
// (`D-99`'s ANSWERED clause, *"Route reading — the kernel's act is its own"*): THE SENTENCE READ *"the kernel IS
|
|
99
|
+
// a caller of the app's own VERBS"*, AND THE VERBS ARE NOW THE ROUTE.** The kernel reaches no published member:
|
|
100
|
+
// it reaches `LISTEN_ROUTE`'s one function (`delivery.mjs`'s `listenOn`), which is the `listen` member's
|
|
101
|
+
// POST-TEST body — the same address encode, the same `entryOf().listen` act, the same mirror and the same
|
|
102
|
+
// registry reservation — so **the caller-facing cross-kind test (`B-6`) is skipped BY BEING SOMEWHERE ELSE**,
|
|
103
|
+
// not by an exemption. **THE STORE'S ONE VERB IS UNMOVED AND IS REACHED ONCE** (`D-99` item 1). **ONE ADDRESS
|
|
104
|
+
// HOLDS ONE KERNEL-OWNED REGISTRATION**, and the address's own spelling is the handle's own spelling — so two
|
|
105
|
+
// pairs at ONE address share ONE store entry, which is the declared consequence `(Y-1)` carries
|
|
106
|
+
// (`contract.md §2.2` item 7; `listen-verb.md §5` item 4).
|
|
92
107
|
// **⟶ `listen` ANSWERS `undefined` AND THE KERNEL ALREADY KNOWS THE HANDLE IT SPELLED** — the caller
|
|
93
108
|
// supplied it, so there is nothing to return (`contract.md §2.2` item 10; `PAR-HL-3`). **SO THE KERNEL SPELLS
|
|
94
109
|
// THE HANDLE ONCE AND USES IT AT BOTH VERBS**, which is exactly the *"handle replaces token in all cases"*
|
|
@@ -129,7 +144,15 @@ export function register(store, address, id, constraint) {
|
|
|
129
144
|
// accepted-but-never-delivered registration** (`Q2`'s hazard).
|
|
130
145
|
//
|
|
131
146
|
// **WHAT STANDS NOW, IN FOUR DECLARED PROPERTIES:**
|
|
132
|
-
// 1. **WHAT IT CALLS: `store
|
|
147
|
+
// 1. **WHAT IT CALLS: `store[LISTEN_ROUTE](id, set)` — the app's own ROUTE, two positions, the handle
|
|
148
|
+
// first.** **⟶ RE-DERIVED 2026-11-01 (`D-99`'s ANSWERED clause; `C-17`, §9.2): THIS PROPERTY READ
|
|
149
|
+
// *"`store.listen(id, set)` — the published member, two positions, the handle first"*, AND THE MEMBER IS
|
|
150
|
+
// NOW THE ROUTE.** `LISTEN_ROUTE` is `Symbol.for('provident-storeroom.listen-route')`, installed once per
|
|
151
|
+
// instance by `storeCreate` before the batch walk, and its one function is `listenOn` — **the `listen`
|
|
152
|
+
// member's POST-TEST body and not the member**, so no caller-facing test stands between this call and the
|
|
153
|
+
// store's one verb. **THE STORE'S ONE VERB IS UNMOVED AND IS REACHED ONCE**, and what the route skips is
|
|
154
|
+
// the CALLER's tests over the CALLER's arguments, which this function has already taken at its own
|
|
155
|
+
// channel (i) (`inDomainAddress`, `inDomainId`, `typeof constraint === 'function'`).
|
|
133
156
|
// **THE CALLER'S OWN `id` IS THE HANDLE** (`D-23`: *"Setting a constraint should expect a handle name to
|
|
134
157
|
// be used for handle and process/error logging purposes"*; `D-24`: *"The handle becomes the id"*), so the
|
|
135
158
|
// kernel neither mints a spelling nor derives one from the address: **no kernel-authored identity is
|
|
@@ -164,7 +187,7 @@ export function register(store, address, id, constraint) {
|
|
|
164
187
|
// CARRIES NO SUCH CHANNEL ANSWERS NOTHING AND NOTHING IS TOLD** (the device's own absent arm, `state.mjs`'s
|
|
165
188
|
// fallback read at `externalCall`/`bumpMark`): such a store is not this package's product, and its kernel is not
|
|
166
189
|
// this kernel's pass.
|
|
167
|
-
const adopted = store
|
|
190
|
+
const adopted = store[LISTEN_ROUTE](id, set);
|
|
168
191
|
const install = store[REGISTER_BODY];
|
|
169
192
|
if (typeof install === 'function') install.call(store, id, constraint, 'constraint');
|
|
170
193
|
// **THE PAIR'S OWN IDEMPOTENCE: a second registration under the SAME pair keeps the replaced registration's
|