@githolon/dsl 0.57.0 → 0.58.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.
@@ -2,8 +2,15 @@
2
2
  /// `package:nomos_client/nomos_client.dart` barrel (which stays web-safe).
3
3
  ///
4
4
  /// MULTI-WORKSPACE BY DESIGN. A [NomosBridge] is a device's LOCAL HOLARCHY PLANE: one bridge / one
5
- /// transport, and MANY live workspaces on it (the home, each estate, each catalogue, locally-born children).
6
- /// Each workspace is a LOCAL githolon — cloud sync is an optional per-workspace posture, not a prerequisite.
5
+ /// transport / ONE shared engine plane, and MANY live workspaces mounted on it (the home, each estate, each
6
+ /// catalogue, locally-born children) — N workspaces on one wasm engine, not N engines. Each workspace is a
7
+ /// LOCAL githolon — cloud sync is an optional per-workspace posture, not a prerequisite.
8
+ ///
9
+ /// LOCAL BIRTHS OPEN IN-PLACE. A `.births()` directive offered into one workspace writes the child's custody
10
+ /// straight into this same plane; the child is resident the moment it is born, so `bridge.connect(session:
11
+ /// child)` (no `restoreFrom`) mounts it IN-PLACE — no re-clone — and reads/writes flow into the born child at
12
+ /// once. (Proof: dsl/dart/test/cluster_births_test.dart; JS twin: cloud/web-client/test/realm.e2e.mjs.)
13
+ ///
7
14
  /// Open workspaces and hold their [NomosSession] handles:
8
15
  ///
9
16
  /// ```dart
@@ -190,7 +190,13 @@ class NomosTestHarness {
190
190
  allowUnborn: true,
191
191
  );
192
192
  final harness = NomosTestHarness._(
193
- bridge, workspace, transport, workdir, onDiagnostic, [workspace]);
193
+ bridge, workspace, transport, workdir, onDiagnostic, [workspace],
194
+ frameworkHash: info['frameworkHash']?.toString(),
195
+ lawHashes: {
196
+ workspace: ((info['lawHashes'] as List?) ?? const [])
197
+ .map((e) => e.toString())
198
+ .toList()
199
+ });
194
200
  if (autoTearDown && registerTearDown != null) {
195
201
  registerTearDown(harness.dispose);
196
202
  }
@@ -259,9 +265,11 @@ class NomosTestHarness {
259
265
  try {
260
266
  // 1. install each workspace's law offline → one snapshot per workspace (colocated, still separate law).
261
267
  final snapshots = <String, String>{};
268
+ final lawHashesByWs = <String, List<String>>{};
269
+ String? frameworkHash;
262
270
  for (final e in workspaces.entries) {
263
271
  final snap = '${workdir.path}/${e.key}.bin';
264
- await _runInstall(
272
+ final info = await _runInstall(
265
273
  node: node,
266
274
  useInRepoScript: useInRepoScript,
267
275
  inRepoScript: resolvedHelper,
@@ -272,6 +280,10 @@ class NomosTestHarness {
272
280
  runtimeDir: runtimeDir,
273
281
  onDiagnostic: onDiagnostic);
274
282
  snapshots[e.key] = snap;
283
+ lawHashesByWs[e.key] = ((info['lawHashes'] as List?) ?? const [])
284
+ .map((x) => x.toString())
285
+ .toList();
286
+ frameworkHash ??= info['frameworkHash']?.toString();
275
287
  }
276
288
 
277
289
  // 2. ONE runner / ONE bridge for the whole plane — no env restore default; each connect brings its own.
@@ -324,7 +336,9 @@ class NomosTestHarness {
324
336
  final names = workspaces.keys.toList();
325
337
  final harness = NomosTestHarness._(
326
338
  bridge, names.first, transport, workdir, onDiagnostic, names,
327
- devicePublics);
339
+ devicePublics: devicePublics,
340
+ frameworkHash: frameworkHash,
341
+ lawHashes: lawHashesByWs);
328
342
  if (autoTearDown && registerTearDown != null) {
329
343
  registerTearDown(harness.dispose);
330
344
  }
@@ -772,8 +772,9 @@ class NomosOfferOutcome {
772
772
  final List<NomosCreated> created;
773
773
 
774
774
  /// The born child workspace name(s), when the offer ran a `.births()` directive (else empty). Each is a
775
- /// LOCAL workspace on this device's plane; `bridge.session(name)` returns its handle. (Opening a born
776
- /// child as its own live session across a colocated cluster is gated on the shared engine plane, #42.)
775
+ /// LOCAL workspace on this device's plane, resident in the shared engine plane the moment it is born:
776
+ /// `bridge.session(name)` returns its handle, and `bridge.connect(session: name)` (no `restoreFrom`) mounts
777
+ /// it IN-PLACE and opens it as a live sibling session — reads/writes flow into the child at once (#42).
777
778
  final List<String> born;
778
779
 
779
780
  /// The raw per-child birth outcomes the holon reported (`{ workspace, genesisHead, … }`), when present.
@@ -1127,14 +1128,18 @@ class NomosBridge {
1127
1128
  .whereType<Map>()
1128
1129
  .map((m) => m.cast<String, Object?>())
1129
1130
  .toList();
1131
+ // `born` elements may be plain workspace-name strings OR `{workspace,…}` objects (both shapes ship);
1132
+ // fall back to the birth outcomes' workspace names when no bare `born` list was sent.
1133
+ final bornRaw = (r['born'] as List?);
1130
1134
  final bornNames = <String>[
1131
- ...((r['born'] as List?) ?? const []).map((e) => e.toString()),
1132
- // Fall back to the workspace field of each birth outcome when a bare `born` list wasn't sent.
1133
- if ((r['born'] as List?) == null)
1135
+ if (bornRaw != null)
1136
+ ...bornRaw.map((e) =>
1137
+ (e is Map ? (e['workspace'] ?? '') : e).toString())
1138
+ else
1134
1139
  ...births
1135
1140
  .map((m) => (m['workspace'] ?? '').toString())
1136
1141
  .where((s) => s.isNotEmpty),
1137
- ];
1142
+ ]..removeWhere((s) => s.isEmpty);
1138
1143
  return NomosOfferOutcome(
1139
1144
  head: r['head'].toString(),
1140
1145
  created: ((r['created'] as List?) ?? const [])
package/dart/pubspec.yaml CHANGED
@@ -11,7 +11,7 @@ description: >-
11
11
  Nomos 2 Dart frontend types — the hand-written kernel wire types plus the
12
12
  code-generated per-domain aggregate + directive-payload types. (De)serializes
13
13
  the EXACT serde JSON the Rust kernel + projection produce/consume.
14
- version: 0.36.0
14
+ version: 0.37.0
15
15
 
16
16
  environment:
17
17
  sdk: ^3.5.0
@@ -0,0 +1,189 @@
1
+ // LOCAL BIRTHS — DART LEG. An offline `.births()` directive dispatch: the estate-birth `home` law's
2
+ // `birthEstateWorkspace` OFFERS a birth on THIS device's local plane — no cloud. Three things are proven:
3
+ //
4
+ // 1. THE DART API PATH: the offer surfaces the typed birth verdict — `born` (the child workspace name) +
5
+ // `birthOutcomes` (the per-child fate) — off NomosOfferOutcome. A birth is observable from Dart.
6
+ // 2. THE OFFLINE BIRTH SUCCEEDS (status=born): the child genesis (installDomain×2 + seed) folds through the
7
+ // CHILD's own gate, fully offline. This needed a lane fix — the client holon's wasm provider now stages
8
+ // the stage-0 bootstrap package at the preopen root (`/work/domain.package.usda`), the SAME file the
9
+ // adapter engine stages, which `run_birth_effect` reads as the genesis-lane executor for the child's
10
+ // step-0 `bootstrap/installDomain`. Without it the birth failed with "bare JavaScript is not a domain
11
+ // package" (see cloud/web-client/src/kernel_provider_wasm.mjs boot).
12
+ // 3. A FAILED birth carries a TYPED reason to Dart (deliberate bad framework hash) — never a silent drop.
13
+ // 4. THE LOOP CLOSES (task #42): the born child OPENS as a sibling session on the SAME bridge and a typed
14
+ // query INSIDE it returns the genesis-seeded row. This is the whole point — a local birth is not just
15
+ // observable, it is USABLE: the child custody born in the parent session is resident in the shared
16
+ // engine plane, so `bridge.connect(session: born)` mounts it IN-PLACE (no re-clone) and reads its seed.
17
+ //
18
+ // (HISTORICAL: this leg was once a NAMED GAP — before the runner ran openRealm, each session was its own
19
+ // single-workspace engine, so a sibling session could not see custody born in another. The shared engine
20
+ // plane closed it; the JS twin of this proof is cloud/web-client/test/realm.e2e.mjs T2.)
21
+ @TestOn('vm')
22
+ library;
23
+
24
+ import 'dart:io';
25
+
26
+ import 'package:nomos_client/nomos_client.dart' show NomosOfferOutcome;
27
+ import 'package:nomos_client/nomos_headless.dart';
28
+ import 'package:test/test.dart';
29
+
30
+ String get _root => '${Directory.current.path}/../..';
31
+ String get _repoEntry => '$_root/cloud/web-client/runner/node-entry.mjs';
32
+ String get _birthDeploy =>
33
+ '$_root/bench/scale/fixtures/estate-birth/build/estate-birth.deploy.json';
34
+ String get _runtimeDir => '${Platform.environment['HOME'] ?? ''}/.holon/runtime';
35
+
36
+ String? _missingPrereq() {
37
+ if (!File(_repoEntry).existsSync()) return 'in-repo runner not found at $_repoEntry';
38
+ if (!File(_birthDeploy).existsSync()) {
39
+ return 'compile the fixture: cd bench/scale/fixtures/estate-birth && node ../../../../dsl/compile_package.mjs — missing $_birthDeploy';
40
+ }
41
+ if (!File('$_runtimeDir/holon.wasm').existsSync() ||
42
+ !File('$_runtimeDir/packages.json').existsSync()) {
43
+ return 'warm ~/.holon/runtime first (run any `githolon` command once)';
44
+ }
45
+ return null;
46
+ }
47
+
48
+ const _owner = 'sample-owner';
49
+
50
+ /// Set up a single-session plane over the estate-birth law + OFFER `birthEstateWorkspace` on it. Returns the
51
+ /// harness (for teardown) + the offer outcome (born / birthOutcomes surfaced). [frameworkHash] overrides the
52
+ /// real framework hash (pass a bogus one to force a genesis failure).
53
+ Future<(NomosTestHarness, NomosOfferOutcome)> _birth({String? frameworkHash}) async {
54
+ final harness = await NomosTestHarness.ephemeral(
55
+ deployJsonPaths: [_birthDeploy],
56
+ nodeEntry: _repoEntry,
57
+ runtimeDir: _runtimeDir,
58
+ workspace: 'estate-birth',
59
+ );
60
+ // The genesis recipe installs the framework + child law BY HASH — the harness surfaces both (frameworkHash
61
+ // is not derivable client-side; lawHash is this package's own domainHash).
62
+ final fw = frameworkHash ?? harness.frameworkHash;
63
+ final lawHash = harness.lawHashes('estate-birth').first;
64
+ final outcome = await harness.bridge.offerCreates(
65
+ domain: 'home',
66
+ directiveId: 'birthEstateWorkspace',
67
+ payload: {
68
+ 'owner': _owner,
69
+ 'frameworkHash': fw,
70
+ 'lawHash': lawHash,
71
+ 'bornAt': '2026-07-05T00:00:00Z',
72
+ },
73
+ actor: _owner,
74
+ );
75
+ return (harness, outcome);
76
+ }
77
+
78
+ void main() {
79
+ test('offline .births() dispatch surfaces born + birthOutcomes TYPED to Dart', () async {
80
+ final skip = _missingPrereq();
81
+ if (skip != null) {
82
+ markTestSkipped(skip);
83
+ return;
84
+ }
85
+ final (harness, outcome) = await _birth();
86
+ try {
87
+ expect(outcome.head, isNotEmpty,
88
+ reason: 'the birth offer admitted on the local plane');
89
+ // THE API PATH (co2's ask): the birth verdict is typed back to Dart.
90
+ expect(outcome.born, isNotEmpty,
91
+ reason: 'the offer-effect allocated the estate child workspace on the local plane');
92
+ expect(outcome.born.single, startsWith('estate-'),
93
+ reason: 'the born workspace is estate-<sha256(owner)>');
94
+ expect(outcome.birthOutcomes, isNotEmpty,
95
+ reason: 'the typed birth verdict rides beside born');
96
+ expect(outcome.birthOutcomes.first['workspace'], outcome.born.single);
97
+ expect(outcome.birthOutcomes.first['status'], isNotNull);
98
+
99
+ // The child handle is addressable on the plane (the loop that OPENS + reads it is the dedicated test
100
+ // below — 'born child OPENS as a sibling session ...').
101
+ expect(harness.bridge.session(outcome.born.single).workspace, outcome.born.single);
102
+ } finally {
103
+ await harness.dispose();
104
+ }
105
+ }, timeout: const Timeout(Duration(minutes: 3)));
106
+
107
+ test('offline birth genesis SUCCEEDS (status=born) — the child is folded through its own gate', () async {
108
+ final skip = _missingPrereq();
109
+ if (skip != null) {
110
+ markTestSkipped(skip);
111
+ return;
112
+ }
113
+ final (harness, outcome) = await _birth();
114
+ try {
115
+ // The lane is fixed (the provider stages the stage-0 bootstrap package at the preopen root), so the
116
+ // child genesis folds clean and the born verdict is `born` — hard-asserted, no skip.
117
+ expect(outcome.born, hasLength(1));
118
+ expect(outcome.birthOutcomes, hasLength(1));
119
+ expect(outcome.birthOutcomes.first['status'], 'born',
120
+ reason: 'the child genesis (installDomain×2 + seed) folded through the child\'s own gate offline');
121
+ expect(outcome.birthOutcomes.first['workspace'], outcome.born.single);
122
+ } finally {
123
+ await harness.dispose();
124
+ }
125
+ }, timeout: const Timeout(Duration(minutes: 3)));
126
+
127
+ test('born child OPENS as a sibling session on the SAME bridge → typed query returns the seeded row (THE LOOP)',
128
+ () async {
129
+ final skip = _missingPrereq();
130
+ if (skip != null) {
131
+ markTestSkipped(skip);
132
+ return;
133
+ }
134
+ final (harness, outcome) = await _birth();
135
+ try {
136
+ expect(outcome.birthOutcomes.first['status'], 'born',
137
+ reason: 'precondition: the child is born on the local plane');
138
+ final child = outcome.born.single;
139
+
140
+ // THE LOOP CLOSES: open the born child as its OWN session on the SAME bridge. No `restoreFrom` — the
141
+ // child custody is ALREADY resident in the shared engine plane (born in the parent session), so the
142
+ // runner mounts it IN-PLACE (openRealm.workspace(child)), no re-clone. This is exactly realm.e2e T2.
143
+ await harness.bridge.connect(workspace: child, session: child);
144
+
145
+ // A typed query INSIDE the born child returns its genesis-seeded row — the estate the child's genesis
146
+ // chain seeded via estate/seedEstateWorkspace, keyed on the owner (`estate-<sha256(owner)>` self-bound).
147
+ final rows = await harness.bridge.session(child).query('estatesByOwner', {'owner': _owner});
148
+ expect(rows, hasLength(1),
149
+ reason: 'the born child\'s genesis seed reads back through its OWN session (the loop is closed)');
150
+ expect(rows.first['data']?['owner'], _owner,
151
+ reason: 'the seeded EstateOwner belongs to the birth\'s owner');
152
+ expect(rows.first['data']?['estateName'], child,
153
+ reason: 'the estate self-committed its own workspace name (estate-<sha256(owner)>)');
154
+
155
+ // listWorkspaces now enumerates BOTH the parent and the newly-opened born child on the one plane.
156
+ final listed = await harness.bridge.listWorkspaces();
157
+ final sessions = listed.map((w) => w['session'].toString()).toSet();
158
+ expect(sessions, contains(child),
159
+ reason: 'listWorkspaces surfaces the born child as a live session');
160
+ expect(sessions, contains('estate-birth'),
161
+ reason: 'the parent workspace is still listed alongside its born child');
162
+ } finally {
163
+ await harness.dispose();
164
+ }
165
+ }, timeout: const Timeout(Duration(minutes: 3)));
166
+
167
+ test('birth FAILURE carries a typed reason to Dart (deliberate bad framework hash)', () async {
168
+ final skip = _missingPrereq();
169
+ if (skip != null) {
170
+ markTestSkipped(skip);
171
+ return;
172
+ }
173
+ // A well-formed but WRONG framework hash the parent does not fold → the child's step-0 install can't be
174
+ // satisfied → the genesis fold refuses. The offer still admits on the parent (the birth ORDER is valid);
175
+ // the child's fate comes back as a TYPED failure outcome, not a thrown error or a silent drop.
176
+ final badHash = 'deadbeef' * 8; // 64 hex chars, not a package the parent holds
177
+ final (harness, outcome) = await _birth(frameworkHash: badHash);
178
+ try {
179
+ expect(outcome.birthOutcomes, isNotEmpty,
180
+ reason: 'a failed birth still reports its typed verdict to Dart');
181
+ expect(outcome.birthOutcomes.first['status'], isNot('born'),
182
+ reason: 'an unresolvable framework hash cannot yield a born child');
183
+ expect((outcome.birthOutcomes.first['reason'] ?? '').toString(), isNotEmpty,
184
+ reason: 'the failure carries a human-legible reason (never a silent drop)');
185
+ } finally {
186
+ await harness.dispose();
187
+ }
188
+ }, timeout: const Timeout(Duration(minutes: 3)));
189
+ }
@@ -0,0 +1,117 @@
1
+ // SCALE SANITY — DART LEG (task #42). "A device holds dozens of live workspaces" is a TESTED truth here,
2
+ // not a slogan: one bridge / one runner / ONE shared engine plane mounts ~20 local-only workspaces, each with
3
+ // the SAME tenant law installed offline (one compiled fixture's deploy.json, reused N times — same law, N
4
+ // distinct workspaces), then writes + reads each in isolation and asserts `listWorkspaces` surfaces all 20.
5
+ //
6
+ // This is the colocation architecture the shared engine plane (openRealm) exists for: N workspaces on ONE
7
+ // wasm engine, not N engines. The suite is deliberately DOZENS (CI-friendly), not hundreds — enough to pin
8
+ // the "many live workspaces per device" claim while completing in sane wall-clock time (asserted below).
9
+ @TestOn('vm')
10
+ library;
11
+
12
+ import 'dart:io';
13
+
14
+ import 'package:nomos_client/nomos_headless.dart';
15
+ import 'package:test/test.dart';
16
+
17
+ String get _root => '${Directory.current.path}/../..';
18
+ String get _repoEntry => '$_root/cloud/web-client/runner/node-entry.mjs';
19
+ String get _guestbookDeploy => '$_root/examples/guestbook/build/guestbook.deploy.json';
20
+ String get _runtimeDir => '${Platform.environment['HOME'] ?? ''}/.holon/runtime';
21
+
22
+ /// How many colocated workspaces to open on the one plane. Dozens (CI-friendly), tunable via env for a
23
+ /// heavier local soak (`NOMOS_SCALE_N=100 dart test test/cluster_scale_test.dart`).
24
+ int get _n => int.tryParse(Platform.environment['NOMOS_SCALE_N'] ?? '') ?? 20;
25
+
26
+ String? _missingPrereq() {
27
+ if (!File(_repoEntry).existsSync()) return 'in-repo runner not found at $_repoEntry';
28
+ if (!File(_guestbookDeploy).existsSync()) {
29
+ return 'compile the guestbook example: cd examples/guestbook && npx nomos-compile — missing $_guestbookDeploy';
30
+ }
31
+ if (!File('$_runtimeDir/holon.wasm').existsSync() ||
32
+ !File('$_runtimeDir/packages.json').existsSync()) {
33
+ return 'warm ~/.holon/runtime first (run any `githolon` command once)';
34
+ }
35
+ return null;
36
+ }
37
+
38
+ void main() {
39
+ test('a device holds dozens of live workspaces on ONE engine plane — write + read each, all listed',
40
+ () async {
41
+ final skip = _missingPrereq();
42
+ if (skip != null) {
43
+ markTestSkipped(skip);
44
+ return;
45
+ }
46
+
47
+ final names = [for (var i = 0; i < _n; i++) 'ws-${i.toString().padLeft(2, '0')}'];
48
+ // Same law (one deploy.json), N distinct workspaces — the exact "one device, many workspaces" shape.
49
+ final workspaces = {for (final ws in names) ws: [_guestbookDeploy]};
50
+
51
+ final sw = Stopwatch()..start();
52
+ final harness = await NomosTestHarness.cluster(
53
+ workspaces: workspaces,
54
+ nodeEntry: _repoEntry,
55
+ runtimeDir: _runtimeDir,
56
+ // Installing + mounting N workspaces takes longer than the single-session default; give it headroom.
57
+ readyTimeout: const Duration(seconds: 90),
58
+ );
59
+ final openMs = sw.elapsedMilliseconds;
60
+ try {
61
+ expect(harness.sessions.toSet(), names.toSet(),
62
+ reason: 'all $_n workspaces connected as sessions on the one bridge');
63
+
64
+ // WRITE one row into each workspace, keyed by its own name — so a cross-workspace read must come back
65
+ // EMPTY (isolation) and the own-workspace read must return exactly the one row (no bleed on the plane).
66
+ sw.reset();
67
+ for (final ws in names) {
68
+ await harness.session(ws).offerDirective(
69
+ domain: 'guestbook',
70
+ directiveId: 'signGuestbook',
71
+ payload: {
72
+ 'author': ws,
73
+ 'message': 'hello from $ws',
74
+ 'mood': 'delighted',
75
+ 'signedAt': '2026-07-05T00:00:00Z',
76
+ },
77
+ actor: ws,
78
+ );
79
+ }
80
+ final writeMs = sw.elapsedMilliseconds;
81
+
82
+ // READ each back — the own author returns its single row; a foreign author returns nothing (isolation).
83
+ sw.reset();
84
+ for (final ws in names) {
85
+ final own = await harness.session(ws).query('entriesByAuthor', {'author': ws});
86
+ expect(own, hasLength(1), reason: '$ws holds exactly its own 1 row');
87
+ expect(own.first['data']?['message'], 'hello from $ws');
88
+
89
+ final foreign = names.firstWhere((o) => o != ws);
90
+ final cross = await harness.session(ws).query('entriesByAuthor', {'author': foreign});
91
+ expect(cross, isEmpty, reason: '$ws does NOT see $foreign\'s data — per-workspace isolation');
92
+ }
93
+ final readMs = sw.elapsedMilliseconds;
94
+
95
+ // listWorkspaces enumerates the whole local plane — every one of the N is present + mounted.
96
+ final listed = await harness.bridge.listWorkspaces();
97
+ expect(listed.map((w) => w['session'].toString()).toSet(), names.toSet(),
98
+ reason: 'listWorkspaces surfaces all $_n live workspaces');
99
+ expect(listed.every((w) => w['mounted'] == true), isTrue,
100
+ reason: 'every listed workspace is mounted');
101
+
102
+ // Wall-clock sanity — dozens of live workspaces must open + drive in a CI-sane budget, not minutes.
103
+ // Generous ceilings (CI is slow); the point is "seconds per workspace is a bug", not a micro-benchmark.
104
+ // ignore: avoid_print
105
+ print('[scale] $_n workspaces: open+install ${openMs}ms, '
106
+ 'write ${writeMs}ms (${(writeMs / _n).toStringAsFixed(1)}ms/ws), '
107
+ 'read ${readMs}ms (${(readMs / _n).toStringAsFixed(1)}ms/ws)');
108
+ expect(writeMs, lessThan(_n * 5000),
109
+ reason: 'per-workspace write stays well under a 5s/ws ceiling (got ${(writeMs / _n).round()}ms/ws)');
110
+ expect(readMs, lessThan(_n * 5000),
111
+ reason: 'per-workspace read stays well under a 5s/ws ceiling (got ${(readMs / _n).round()}ms/ws)');
112
+ } finally {
113
+ await harness.dispose();
114
+ }
115
+ // The whole suite (open + install + write + read + teardown of N workspaces) completes in sane time.
116
+ }, timeout: const Timeout(Duration(minutes: 10)));
117
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@githolon/dsl",
3
- "version": "0.57.0",
3
+ "version": "0.58.0",
4
4
  "type": "module",
5
5
  "description": "Nomos 2 domain-authoring DSL: aggregates + directives in TS, executed and encoded to the Rust kernel's wire shapes.",
6
6
  "license": "SEE LICENSE IN LICENSE.md",