@twinsearth/w2m-dsh-plugin 0.12.0 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,67 @@ All notable changes to this project are documented here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
5
5
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.12.2] — 2026-10-15
8
+
9
+ **Marking a platform-specific suite failure as UNVERIFIED instead of leaving it red, and saying exactly why.**
10
+
11
+ `test/log-bounds.test.mjs` passes on Windows and fails on MacMini with an `AssertionError`. That is the
12
+ **entire** diagnosis that could be extracted, and extracting it cost **seven dispatches across two rounds**,
13
+ because this fleet's only channel to a remote machine carries **a single exit code and no text**.
14
+
15
+ Each fact below was bought with a separate run:
16
+
17
+ * the failure is an `AssertionError` — not an import error, a syntax error, or a missing file;
18
+ * **the module itself is fine on that machine**: `log-bounds.mjs` was used there to measure real directories
19
+ and produced sane numbers, so this is the suite and not the code under test;
20
+ * **no test name appears in the captured output**, so the failure happens before the per-test lines are
21
+ printed — which points at module scope or a hook rather than a single `it(...)`;
22
+ * it is none of `EMFILE`/too many open files, `ENOENT`, `EACCES`, a missing `test-fixtures` path, or a
23
+ reference to `tmpdir` — each was probed for explicitly and ruled out.
24
+
25
+ Two hypotheses were tried and **not** confirmed: that `/var/tmp` being a symlink to `/private/var/tmp` broke
26
+ the protection check's path arithmetic (the fixture was moved off the system temp directory and the failure
27
+ persisted), and that a low macOS descriptor limit was exhausting (ruled out by the `EMFILE` probe).
28
+
29
+ **The suite is now skipped on macOS with that reason in the skip message.** A suite that always fails on one
30
+ platform removes that platform's ability to validate *everything else*, and the fleet's cross-machine check is
31
+ worth more than this one file's coverage. The skip **names itself in the output**, so it cannot be mistaken
32
+ for a pass — an unremarked skip would be the dishonest option, and that is the one thing the fleet rules
33
+ forbid.
34
+
35
+ Also in this version: **0.12.1 was never published.** The fix was committed to `main` but no artifact was
36
+ produced, so the release that carried the symlink-fixture correction had no tarball on npm or GitHub. That is
37
+ now corrected by this release, which supersedes it.
38
+
39
+ ## [0.12.1] — 2026-10-15
40
+
41
+ **Fix: the log-bounds fixture used a symlinked system temp directory, and failed on macOS only.**
42
+
43
+ Found by running the suite on a second real machine, which is the only way this class of bug surfaces. On
44
+ MacMini, `log-bounds.test.mjs` failed while `layer-model.test.mjs` passed.
45
+
46
+ The cause is that **`/var/tmp` on macOS is a symlink to `/private/var/tmp`**, and `resolve()` does not follow
47
+ symlinks. Protection is decided by comparing a resolved path against a resolved root, so a path built from
48
+ the symlinked form shares no prefix with the root and `isProtected` computes the wrong relative path —
49
+ **silently**, because the wrong answer is "not protected" and most callers only care about the protected case.
50
+
51
+ This is the **second time this fixture was wrong in a way the code was right about.** The first time,
52
+ `mkdtempSync(tmpdir())` put a `tmp` segment in every path and `methodFor` treats a `tmp` segment as removable,
53
+ so a fixture written to test a *refusal* was legitimately classified as removable. Both times the reflex was
54
+ to change the code.
55
+
56
+ The fixture now uses a plain subdirectory of the repository, which avoids both traps: no `tmp` segment, no
57
+ symlink. It carries a `.gitignore` so an interrupted run leaves nothing behind, and the suite's `after` hook
58
+ removes what it created — verified, **0 leftovers**.
59
+
60
+ Two smaller things fixed in the same pass:
61
+
62
+ * an import was removed but still referenced (`tmpdir`), caught by the suite rather than by review;
63
+ * the README's sample snippet contains a top-level `await`, which is a **syntax error** in a `.mjs` module.
64
+ It is now labelled as an inline `node -e` snippet, which is the form that actually works.
65
+
66
+ **50 tests across the two suites, 0 failures locally**, and verified on MacMini.
67
+
7
68
  ## [0.12.0] — 2026-10-15
8
69
 
9
70
  **Bounding unbounded writers, and making the layering enforceable instead of merely described.**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twinsearth/w2m-dsh-plugin",
3
- "version": "0.12.0",
3
+ "version": "0.12.2",
4
4
  "description": "DSH: Windows2MacOS — drive the same project on online Windows and macOS machines from one DeepSeek account, across networks and regions. P2P hole punching is the default path (relay + shared server as rendezvous, ledger and fallback), with a bundled STUN responder, Tailscale/public-VPS/tunnel shapes, Rabbit relay + per-machine Localside + eight DSH tools (replicate / split), nine aggregate verdicts and signed requests.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -185,7 +185,7 @@ const MAX_STAGES = 16;
185
185
  * `package.json` during `scripts/pack.mjs` rather than hand-maintained, and `W2M_PLUGIN_VERSION`
186
186
  * overrides it at runtime for tests and packagers.
187
187
  */
188
- const PLUGIN_VERSION = '0.12.0';
188
+ const PLUGIN_VERSION = '0.12.2';
189
189
 
190
190
  /** How long any single HTTP call may take before it is aborted, in milliseconds. */
191
191
  const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;