@twinsearth/w2m-dsh-plugin 0.37.0 → 0.38.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/CHANGELOG.md CHANGED
@@ -4,6 +4,47 @@ 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.38.0] — 2026-10-15
8
+
9
+ **A seven-phase council run on MacMini — real-machine evidence for the tool that had never touched one.**
10
+
11
+ 0.37.0's `w2m_council` was the only substantial addition in this span that had **never run anywhere but this
12
+ laptop.** It now has a measurement, and the exit code came from the machine:
13
+
14
+ ```
15
+ OK phases=7 outcome=ship dissent=1 reproduced=true exit 0
16
+ ```
17
+
18
+ Driven through `node -e` on MacMini against its own checkout at 0.37.0: the council was convened, roles
19
+ assigned, two arguments recorded, two weighted votes cast, the outcome fixed, the decision sealed, and the
20
+ sealed decision **read back after the council stopped being advanceable** — with its dissent, its reason, and a
21
+ `recount` that reproduced the outcome from the stored ballots. **Every one of those was asserted before the
22
+ process was allowed to exit `0`**, so this is not a "did it load" smoke test.
23
+
24
+ ### The same run answered a question that had only been a hypothesis for four rounds
25
+
26
+ **v4.10.0's council works on MacMini because it reaches for nothing that machine lacks.** `council.mjs` imports
27
+ `node:crypto` and `./authority.mjs`, and neither needs `node_modules`. The eight suites that failed there in
28
+ 0.32.0 therefore failed on **what their fixtures reach for**, not on the modules under test — **a measurement
29
+ now, where four earlier releases recorded a guess as a guess.**
30
+
31
+ It also sharpens the shape of that failure: a suite whose *subject* has no dependencies still fails if the
32
+ *suite* imports one, and **from an exit code alone the two are indistinguishable.**
33
+
34
+ ### The sixth time I exceeded the ceiling
35
+
36
+ The update dispatch — download a release tarball and extract it — **expired**. Measured again, and the number
37
+ has not moved: the agent's lease survives roughly **50 seconds** (`heartbeatIntervalMs 10s × missedHeartbeats 2
38
+ + leaseGraceMs 30s`), and an expired lease carries **no exit code at all**, so the work was lost rather than
39
+ reported as failed.
40
+
41
+ **What matters is what happened next:** rather than retrying the download, a **three-line probe** established
42
+ that the extraction had in fact completed — **the partial run had succeeded and only the report was lost.** A
43
+ retry would have spent another dispatch redoing finished work, and could have raced the `tar` it had left
44
+ half-written.
45
+
46
+ **No new tests.** What changed is a measurement, and a hypothesis that stopped being one.
47
+
7
48
  ## [0.37.0] — 2026-10-15
8
49
 
9
50
  **`council.mjs` is wired. v4.10.0's committee governance is reachable, and its dissent arrives with its decision.**
@@ -68,16 +68,24 @@ declared its own `export const AUTHORITY_MAX = 100` instead of importing the bou
68
68
  **Two copies of a limit that nothing can keep in step, failing silently** — raise the real maximum and this
69
69
  module keeps refusing `101` while naming the wrong number as authoritative. It now imports it.
70
70
 
71
- ### `v4.10.0`'s council is built and not routed — found here, not claimed before
71
+ ### `v4.10.0`'s council was BUILT AND NOT ROUTED — **fixed in 0.37.0**
72
72
 
73
73
  `reachability-classify` reported `src/agent/council.mjs` as a closed loop, and reading it to check that
74
74
  confirmed the finding: **275 lines implementing committee governance, imported by nothing but its own suite.**
75
75
  `v4.10.0` is marked *shipped in 0.11.0* in `ROADMAP.md`, and **0.30.0 verified its three falsifying tests are
76
76
  asserted by name** — which they are. **What was never checked is whether anything routes a question to it.**
77
77
 
78
- **This is the same defect as `field-authority` and `approval-gate`, in a third module**, and it is the one the
79
- reachability work was built to find. It is recorded here as **BUILT, NOT ROUTED** rather than described as
80
- delivered, and routing it needs a tool surface and a session — not a line of code.
78
+ **This was the same defect as `field-authority` and `approval-gate`, in a third module** — the one the
79
+ reachability work was built to find.
80
+
81
+ **`w2m_council` now routes it.** The state lives in `createCouncilSessions` because a council walks **seven
82
+ phases across many calls** and one held inside a single invocation **could never finish**. Every read of a
83
+ decision returns the **dissent with its reasons** and a **`recount`**, so v4.10.0's third falsifying test —
84
+ *"a decision with recorded dissent is retrievable with the dissent"* — holds **after the council that produced
85
+ it is gone**, which is a property of the session rather than of the decision. Both are tested.
86
+
87
+ **A tie is still refused, not broken**, and the tool does not paper over it: a split council is the one case
88
+ where the council exists to escalate to a person.
81
89
 
82
90
  ---
83
91
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twinsearth/w2m-dsh-plugin",
3
- "version": "0.37.0",
3
+ "version": "0.38.0",
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",
@@ -202,7 +202,7 @@ const MAX_STAGES = 16;
202
202
  * `package.json` during `scripts/pack.mjs` rather than hand-maintained, and `W2M_PLUGIN_VERSION`
203
203
  * overrides it at runtime for tests and packagers.
204
204
  */
205
- const PLUGIN_VERSION = '0.37.0';
205
+ const PLUGIN_VERSION = '0.38.0';
206
206
 
207
207
  /** How long any single HTTP call may take before it is aborted, in milliseconds. */
208
208
  const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;