cross-tab-worker-databus 0.21.37 → 0.21.39
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/CHANGELOG.md +22 -1
- package/dist/centrifuge.js +1 -1
- package/dist/{chunk-COFXTIRW.js → chunk-6DLLPWNT.js} +2 -2
- package/dist/cjs/centrifuge.cjs +1 -1
- package/dist/cjs/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/docs/roadmap.md +15 -3
- package/docs/zh/roadmap.md +14 -2
- package/package.json +1 -1
- /package/dist/{chunk-COFXTIRW.js.map → chunk-6DLLPWNT.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
## [0.21.39] - 2026-09-25
|
|
2
|
+
|
|
3
|
+
One section of this file carried a date on which no release event happened — not a figure that aged, but a line written a day behind the one above it. The check that now reads every section date does so against the tag rather than against npm, and the two rows that forced that choice are recorded below. No library behavior, export, option, default, frame or storage key changed; the coverage floors and the zero-count arm ledger are `0.21.38`'s.
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- **`## [0.20.10]` said 2026-09-02; that release is 2026-09-03.** Its tag reads `2026-09-03T12:27:29+08:00` and the registry recorded the version at `2026-09-03T04:28:11Z` — the same instant, and the same calendar day under either frame, so no reading of either authority produces `09-02`. The neighboring `0.20.9` was tagged 2026-09-02T21:33+08:00, which is what the heading should have advanced past and did not. Correcting it is not a dated record being rewritten: the exemption in `AGENTS.md` covers numbers *measured* at the time (test counts, lag samples), whereas a release date has one answer that the repository and the registry both hold. Of the 151 sections that carry a tag, this was the only one dated outside both readings of its tag instant.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **`tests/documentation.test.ts` now compares every dated section with its tag.** For each `## [<version>] - <date>`, the date must be the calendar day of `v<version>`'s creation instant read either in UTC or in `+08:00`. The **tag** is the authority and not `time[<version>]`, because publishing lags tagging across a UTC midnight: `0.4.0`'s tag reads `2026-08-30T21:28Z` while its registry record reads `2026-08-31T00:03Z`, and `0.20.85` has the same shape — so a registry-keyed rule reports three bad sections where the tag reports one, and two of its three findings are the gate being wrong. Both frames are accepted because the prose genuinely uses both: over the tag-dated sections, 84 agree whichever frame is read, 46 only in `+08:00` and 20 only in UTC, so a single-frame rule would fail 66 rows that each describe a real event. Three controls ride along: a floor on how many sections were checked (a clone without tags would skip all of them and report a clean pass), an empty-instant case reported as a broken read rather than a skip, and an assertion that the checked rows span **both** tag object types — this repository tags releases both ways (92 lightweight, 59 annotated), and `%(creatordate)` is the only field that answers for the two, so `%(creatordate)` → `%(*creatordate)` reddens 92 sections rather than quietly emptying them. Mutation record in `docs/progress.md`. The same case also reads `docs/roadmap.md` and its Chinese mirror, because the release date ships *twice*: as this file's ISO section heading and as the roadmap preamble's written-out `September 25, 2026` / `2026 年 9 月 25 日`. The preamble is required to name the newest **tagged** release rather than `package.json`'s version, since while a release is being prepared the pending version legitimately has no tag yet, and a pattern that stops matching either language's preamble fails rather than skipping.
|
|
12
|
+
|
|
13
|
+
## [0.21.38] - 2026-09-25
|
|
14
|
+
|
|
15
|
+
One English sentence in the shipped roadmap described a ratio backwards while its Chinese mirror had the direction right — the class of defect only a two-language comparison finds. No library behavior, export, option, default, frame or storage key changed; the coverage floors and the zero-count arm ledger are `0.21.37`'s.
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- **`docs/roadmap.md` placed the failing seed *below* the floor it is above.** The `0.21.17` block said the `storage-fail` interleaving reddens the sweep "from seed 414 onward, which is four times below the sweep's depth floor". The floor is `MIN_SEEDS = 100` in `tests/coordination-invariants.test.ts`, and 414 is more than four times it — which is the whole point of the sentence: the finding needs depth past what the sweep asserts as a minimum, so it is a finder rather than a guard. The Chinese mirror read 是……下限的四倍, correct in direction, so the two languages agreed on every digit and disagreed on the relation. Fixed in the English side; the Chinese side is left as written.
|
|
20
|
+
- **The English side of the same file now names the timeout its mirror names.** The `0.21.37` block credited `scripts/publication-lag.mjs` with "a per-call timeout"; the Chinese block said 30 秒超时. The script sets `CALL_TIMEOUT_MS = 30_000`, so the figure is in `scripts/publication-lag.mjs` and both languages now make the same claim rather than one making it more precisely than the other.
|
|
21
|
+
|
|
1
22
|
## [0.21.37] - 2026-09-25
|
|
2
23
|
|
|
3
24
|
One shipped instruction told every reader to run a script that exists in no clone, and making that script tracked turned up three numbers its own quoted prose had wrong. No library behavior, export, option or storage key changed.
|
|
@@ -1480,7 +1501,7 @@ No behavior, wire-format, storage-layout or cluster-protocol change: `git diff -
|
|
|
1480
1501
|
|
|
1481
1502
|
- Release workflow runs one serialized job per tag and records the exact npm version, tag, and commit in the GitHub step summary for easier failure diagnosis.
|
|
1482
1503
|
|
|
1483
|
-
## [0.20.10] - 2026-09-
|
|
1504
|
+
## [0.20.10] - 2026-09-03
|
|
1484
1505
|
|
|
1485
1506
|
### Added
|
|
1486
1507
|
|
package/dist/centrifuge.js
CHANGED
|
@@ -2475,7 +2475,7 @@ var SDK_VERSION = (
|
|
|
2475
2475
|
// declaration's type is `string | undefined` and the export's is `string`
|
|
2476
2476
|
// (dropping the conditional is TS2322, measured). Recorded here so the leg reads
|
|
2477
2477
|
// as a shape the harness cannot reach rather than as a case nobody exercised.
|
|
2478
|
-
true ? "0.21.
|
|
2478
|
+
true ? "0.21.39" : ""
|
|
2479
2479
|
);
|
|
2480
2480
|
|
|
2481
2481
|
// src/core/data-bus.ts
|
|
@@ -3715,4 +3715,4 @@ export {
|
|
|
3715
3715
|
parseDataBusPublication,
|
|
3716
3716
|
selectWorkerBackend
|
|
3717
3717
|
};
|
|
3718
|
-
//# sourceMappingURL=chunk-
|
|
3718
|
+
//# sourceMappingURL=chunk-6DLLPWNT.js.map
|
package/dist/cjs/centrifuge.cjs
CHANGED
|
@@ -2604,7 +2604,7 @@ var SDK_VERSION = (
|
|
|
2604
2604
|
// declaration's type is `string | undefined` and the export's is `string`
|
|
2605
2605
|
// (dropping the conditional is TS2322, measured). Recorded here so the leg reads
|
|
2606
2606
|
// as a shape the harness cannot reach rather than as a case nobody exercised.
|
|
2607
|
-
true ? "0.21.
|
|
2607
|
+
true ? "0.21.39" : ""
|
|
2608
2608
|
);
|
|
2609
2609
|
|
|
2610
2610
|
// src/core/data-bus.ts
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -2570,7 +2570,7 @@ var SDK_VERSION = (
|
|
|
2570
2570
|
// declaration's type is `string | undefined` and the export's is `string`
|
|
2571
2571
|
// (dropping the conditional is TS2322, measured). Recorded here so the leg reads
|
|
2572
2572
|
// as a shape the harness cannot reach rather than as a case nobody exercised.
|
|
2573
|
-
true ? "0.21.
|
|
2573
|
+
true ? "0.21.39" : ""
|
|
2574
2574
|
);
|
|
2575
2575
|
|
|
2576
2576
|
// src/core/data-bus.ts
|
package/dist/index.js
CHANGED
package/docs/roadmap.md
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
# Roadmap
|
|
2
2
|
|
|
3
|
-
0.21.
|
|
3
|
+
0.21.38 was released on September 25, 2026. The project is intentionally continuing through reliability-focused releases before a 1.0.0 stability freeze.
|
|
4
|
+
|
|
5
|
+
## 0.21.39 delivered scope
|
|
6
|
+
|
|
7
|
+
- **One release in this changelog was dated on a day nothing happened.** `## [0.20.10]` said 2026-09-02 while its tag (`2026-09-03T12:27:29+08:00`) and its registry record (`2026-09-03T04:28:11Z`) are the same instant on the same day under either reading; the release before it was tagged at 21:33 on 09-02, so the heading simply never advanced. It is corrected, and of the 151 dated sections that carry a tag it was the only one outside both readings of its own tag.
|
|
8
|
+
- **The new check keys on the tag, not on npm, and that choice is measured.** `tests/documentation.test.ts` now requires each section date to be the calendar day of its tag instant in either the UTC or the `+08:00` frame. Keying the same rule on `time[<version>]` would report three bad sections instead of one, because publishing finishes after midnight UTC far often enough to matter: `0.4.0` is tagged 2026-08-30T21:28Z and recorded 2026-08-31T00:03Z, and `0.20.85` has the same shape. Two of those three "findings" would have been the gate being wrong.
|
|
9
|
+
- **Why both frames, and what stops an empty read from passing.** Accepting only one frame fails dozens of sections that each describe a real event (measured: 84 agree in either frame, 46 only in `+08:00`, 20 only in UTC), so the rule is "some reading of the tag", not "the local day". A floor on the number of sections checked turns a clone with no tags into a failure instead of a clean pass, and an assertion that the checked rows span both tag object types catches the silent version of that — this repository tags releases both ways, and only `%(creatordate)` answers for the two. A sibling case reads the same claim from both roadmap languages, where the date is written out (`September 25, 2026` / `2026 年 9 月 25 日`) rather than as an ISO heading, and requires the named version to be the newest *tagged* one — not `package.json`'s, which is ahead of the tag for the whole duration of a release prep.
|
|
10
|
+
|
|
11
|
+
## 0.21.38 delivered scope
|
|
12
|
+
|
|
13
|
+
- **A ratio described backwards in one language and correctly in the other.** The `0.21.17` block of this file said the `storage-fail` interleaving reddens the sweep "from seed 414 onward, which is four times below the sweep's depth floor". The floor is `MIN_SEEDS = 100` in `tests/coordination-invariants.test.ts`, so 414 sits more than four times *above* it — and that is the sentence's own point: the finding needs depth past what the sweep asserts as a minimum, which makes it a finder rather than a guard. The Chinese mirror had the direction right, so the two languages agreed on every digit and disagreed on the relation. No value-by-value comparison can see that; the block-paired sweep that found it compares the Nth release block of each language, then the sentences inside it.
|
|
14
|
+
- **Both languages now carry the same two figures for the promoted sweep tool.** The English `0.21.37` block credited the tool with "a per-call timeout" where the Chinese block said 30 秒超时. `scripts/publication-lag.mjs` sets `CALL_TIMEOUT_MS = 30_000`, so the number is now in the English sentence as well.
|
|
15
|
+
- **Nothing else moved.** No library code, export, option, default, frame or storage key changed; the zero-count arm ledger and the coverage aggregates are `0.21.37`'s.
|
|
4
16
|
|
|
5
17
|
## 0.21.37 delivered scope
|
|
6
18
|
|
|
7
|
-
- **A shipped instruction pointed at a directory git never had.** Both release checklists told the reader to re-derive the publication-lag series from `.gate-logs/publication-pair.mjs`, and that path is gitignored — live on the one machine that wrote it, dead in every clone and in the published tarball's own docs. Nothing can gate it: the citation sweep resolves test *titles*, and a shell command is neither a title nor a symbol. The tool is now `scripts/publication-lag.mjs`, tracked, resolving the repository and the Release workflow id through `gh` instead of hardcoding either, with a per-call timeout after the previous sweep hung 18 minutes on one `gh api`, a `reading <version>` line so a stopped run names where it stopped, and a printed line for every member its denominator drops.
|
|
19
|
+
- **A shipped instruction pointed at a directory git never had.** Both release checklists told the reader to re-derive the publication-lag series from `.gate-logs/publication-pair.mjs`, and that path is gitignored — live on the one machine that wrote it, dead in every clone and in the published tarball's own docs. Nothing can gate it: the citation sweep resolves test *titles*, and a shell command is neither a title nor a symbol. The tool is now `scripts/publication-lag.mjs`, tracked, resolving the repository and the Release workflow id through `gh` instead of hardcoding either, with a 30 s per-call timeout after the previous sweep hung 18 minutes on one `gh api`, a `reading <version>` line so a stopped run names where it stopped, and a printed line for every member its denominator drops.
|
|
8
20
|
- **Running it corrected three numbers in the prose that quotes it.** The sub-second consumer steps inside the measured set are two (`0.20.86`, `0.20.87`), not the six both languages carried — the other four pre-`0.20.92` releases print as `NEGATIVE` and sit outside the 45, the exact distinction the tool draws and the copied sentence lost. The `0.20.92`-onward window holds 43 releases, not the 42 `AGENTS.md` still counted, and since that number moves every release the count became the lookup. "Prints the attempt each reading came from" over-stated a flag that fires only for a non-first attempt.
|
|
9
21
|
- **What the series confirmed, and what the instrument itself taught.** Every per-release sample the prose quotes re-read identical — 127.2 / 76.1 / 75.5 / 75.8 / 127.3 / 126.4 s of record lag across `0.21.31`–`0.21.36`, their steps at 304–308 s, `0.21.30` alone at 310.0 s and 364.0 s, 42 of 45 steps inside 300–310 s, no gap over 310 s — so the 720 s budget and its floor test are unchanged. And the promoted script first ran *broken*: a `const` formatter scoped inside the sweep loop killed it with a `ReferenceError` after all 45 tags had been read, printing four lines and exit 1 — the formatter moved to module scope, and what made the failure diagnosable at all was the non-zero exit, since four rows from a 49-tag sweep reads like a short series rather than a broken one.
|
|
10
22
|
- **A copied-forward count in the progress log had never been measured.** The `bench:browser` debt read "four releases", then "five", in successive `Next` lines; the newest `bench-results/browser-*.json` is `2026-09-24T13:40:52Z`, eight minutes before `0.21.22`'s release commit regenerated `docs/benchmarks.md`, so it is fourteen (`0.21.23` on). Neither number is in a shipped file, so the correction stays in the log, where both older lines now point at the two artifacts.
|
|
@@ -186,7 +198,7 @@
|
|
|
186
198
|
`confirmedAt`, a state no worker writes and precisely the shape the new pass releases, so its assertion was passing
|
|
187
199
|
by a mechanism other than the one it named.
|
|
188
200
|
- **The `storage-fail` fuzz interleaving that found this is measured and deliberately not shipped** — it reddens the
|
|
189
|
-
sweep on the pre-fix code from seed 414 onward, which is four times
|
|
201
|
+
sweep on the pre-fix code from seed 414 onward, which is more than four times the sweep's 100-seed depth floor, so it is a finder
|
|
190
202
|
rather than a guard; its knob (`MemoryStorage.failNextWrites`) and the recipe are committed.
|
|
191
203
|
- **A classification, comment-only:** `handoffAssignedTopics()`'s unreachable `if (!owner) continue;` now names the
|
|
192
204
|
four links that make it unreachable, the test that pins each, and the measured counterfactual — deleting it keeps
|
package/docs/zh/roadmap.md
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
# 路线图
|
|
2
2
|
|
|
3
|
-
0.21.
|
|
3
|
+
0.21.38 已于 2026 年 9 月 25 日发布。项目会先持续完成可靠性发布,再进入 1.0.0 稳定性冻结。
|
|
4
|
+
|
|
5
|
+
## 0.21.39 已完成范围
|
|
6
|
+
|
|
7
|
+
- **变更日志里有一个发布被标成了一个什么都没发生的日期。** `## [0.20.10]` 写的是 2026-09-02,而它的标签(`2026-09-03T12:27:29+08:00`)和它的 registry 记录(`2026-09-03T04:28:11Z`)是同一个瞬间,且在两种读法下同一天;它前一个发布的标签打在 09-02 的 21:33,所以那行标题只是没跟着往前走。这条已经改正,而在带标签的 151 个有日期的段落里,它是唯一一个落在自己标签两种读法之外的。
|
|
8
|
+
- **新增的检查以标签为准,而不是以 npm 为准,而且这个选择是量出来的。** `tests/documentation.test.ts` 现在要求每个段落日期,是其标签瞬间在 UTC 或 `+08:00` 任一框架下的日历日。把同一条规则改成用 `time[<version>]`,会报出三个错段落而不是一个,因为发布完成的时间跨过 UTC 零点的情况多到不能忽略:`0.4.0` 的标签是 2026-08-30T21:28Z,记录却是 2026-08-31T00:03Z,`0.20.85` 同形。那三个"发现"里有两个是检查自己错了。
|
|
9
|
+
- **为什么两种框架都收,以及一次空读取为什么骗不过去。** 只收一种框架会让几十段各自描述真实事件的段落被判错(实测:84 段两种框架都对,46 段只在 `+08:00` 对,20 段只在 UTC 对),所以规则是"标签的某一种读法",不是"本地那一天"。对被检查段落数的下限,会把一个没有标签的克隆变成失败而不是干净通过;而要求被检查的行同时覆盖两种标签对象类型,挡住的正是它的静默版本——本仓库两种打标签方式都有,而只有 `%(creatordate)` 对两者都给出答案。 同级用例如从两种语言的路线图中读出同一个说法。那里的日期是写出来的(`September 25, 2026` / `2026 年 9 月 25 日`)而不是 ISO 标题,并且要求所写的版本是**已打标**的最新版本 —— 不是 `package.json` 的那个,因为在整个发布准备期间,待发布的版本还没有标签。
|
|
10
|
+
|
|
11
|
+
## 0.21.38 已完成范围
|
|
12
|
+
|
|
13
|
+
- **一个比例在一种语言里被写反,另一种语言写对了。** 本文 `0.21.17` 那段说 `storage-fail` 交错"从 seed 414 起就让 sweep 失败,这比 sweep 的深度下限低四倍"。下限是 `tests/coordination-invariants.test.ts` 里的 `MIN_SEEDS = 100`,而 414 是它的四倍*以上*——这正是那句话的本意:这条发现需要的深度超过了 sweep 自己断言的最小值,所以它是发现器而不是守卫。中文镜像的方向本来就是对的,于是两种语言每个数字都一致、关系却是反的。逐值比对看不见这种错;找到它的按块配对扫描比较的是两种语言的第 N 个发布块,再比块里的每一句。
|
|
14
|
+
- **两种语言现在写出同一个工具的同两个数。** 英文 `0.21.37` 那段只说"每次调用带一个超时",中文那段说 30 秒超时。`scripts/publication-lag.mjs` 里是 `CALL_TIMEOUT_MS = 30_000`,现在英文也带上了这个数值。
|
|
15
|
+
- **其余未动。** 库代码、导出、选项、默认值、帧格式与存储键均未改动;零计数分支账本与覆盖率聚合仍是 `0.21.37` 的。
|
|
4
16
|
|
|
5
17
|
## 0.21.37 已完成范围
|
|
6
18
|
|
|
@@ -183,7 +195,7 @@
|
|
|
183
195
|
- **一个既有测试的前提被改正**:它手写的"被接管"路由带着前任 owner 的 `confirmedAt`,而没有任何 Worker 会写出这种
|
|
184
196
|
状态——它恰好就是新清扫会释放的形状——所以那条断言其实是通过另一个机制成立的,而不是它声称的那一个。
|
|
185
197
|
- **找到这个问题的 `storage-fail` 交错被测量过,并且刻意没有留在 fuzz 里**:在修复前的代码上,它从 seed 414 起就让
|
|
186
|
-
sweep 失败,而这个深度是 sweep 自身 100-seed
|
|
198
|
+
sweep 失败,而这个深度是 sweep 自身 100-seed 下限的四倍多,所以它是发现器而不是守卫;它需要的开关
|
|
187
199
|
(`MemoryStorage.failNextWrites`)和复现配方已经提交。
|
|
188
200
|
- **一条纯注释的归类**:`handoffAssignedTopics()` 里那条走不到的 `if (!owner) continue;` 现在写清了使它不可达的四个
|
|
189
201
|
环节、每个环节各自被哪个测试固定,以及实测的反事实——删掉它整个测试套件的数字不变,而类型检查会报 5 个错误,所以它是
|
package/package.json
CHANGED
|
File without changes
|