@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 +41 -0
- package/docs/1.0.0-ACCEPTANCE.md +12 -4
- package/package.json +1 -1
- package/src/plugin/tools.mjs +1 -1
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.**
|
package/docs/1.0.0-ACCEPTANCE.md
CHANGED
|
@@ -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
|
|
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
|
|
79
|
-
reachability work was built to find.
|
|
80
|
-
|
|
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.
|
|
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",
|
package/src/plugin/tools.mjs
CHANGED
|
@@ -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.
|
|
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;
|