geospec 0.1.0-beta.7 → 0.1.0-beta.8

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.
Files changed (52) hide show
  1. package/agent/geospec-authoring/SKILL.md +11 -11
  2. package/agent/geospec-authoring/api-functions.md +1 -16
  3. package/agent/geospec-authoring/api-index.md +50 -46
  4. package/agent/geospec-authoring/api-types.md +188 -168
  5. package/agent/geospec-authoring/public-api-functions.md +29 -22
  6. package/agent/geospec-authoring/public-api-index.md +196 -183
  7. package/agent/geospec-authoring/public-api-types-2.md +188 -220
  8. package/agent/geospec-authoring/public-api-types-3.md +112 -99
  9. package/agent/geospec-authoring/public-api-types.md +236 -125
  10. package/agent/resources.js +12 -12
  11. package/agent/skills.json +2 -2
  12. package/dist/config/index.d.mts +1 -2
  13. package/dist/config/index.mjs +1 -1
  14. package/dist/config/types.d.mts +0 -3
  15. package/dist/config/validate.mjs +1 -1
  16. package/dist/mesh/index.d.mts +2 -2
  17. package/dist/model/index.d.mts +3 -3
  18. package/dist/model/index.mjs +1 -1
  19. package/dist/model/mesh-evidence-matchers.d.mts +12 -0
  20. package/dist/model/mesh-evidence-matchers.mjs +1 -0
  21. package/dist/model/native-model-loader.d.mts +8 -8
  22. package/dist/model/native-model-loader.mjs +1 -1
  23. package/dist/model/node/command-exporter.d.mts +31 -0
  24. package/dist/model/node/command-exporter.mjs +1 -0
  25. package/dist/model/node/index.d.mts +2 -0
  26. package/dist/model/node/index.mjs +1 -0
  27. package/dist/model/types.d.mts +111 -63
  28. package/dist/runner/collector.d.mts +0 -2
  29. package/dist/runner/node/index.d.mts +2 -0
  30. package/dist/runner/node/index.mjs +1 -0
  31. package/dist/runner/node/node-vm-filesystem.d.mts +22 -0
  32. package/dist/runner/node/node-vm-filesystem.mjs +1 -0
  33. package/dist/runner/pool/events.mjs +1 -0
  34. package/dist/runner/pool/pool-messages.d.mts +0 -10
  35. package/dist/runner/pool/pool.d.mts +36 -0
  36. package/dist/runner/pool/pool.mjs +1 -0
  37. package/dist/runner/pool/shard-planner.mjs +1 -0
  38. package/dist/runner/pool/shard-timings.d.mts +36 -0
  39. package/dist/runner/pool/transport.mjs +1 -0
  40. package/dist/runner/pool/worker-host.d.mts +36 -0
  41. package/dist/runner/pool/worker-host.mjs +1 -0
  42. package/dist/runner/run-geospec-module.mjs +1 -1
  43. package/dist/runner/types.d.mts +0 -4
  44. package/dist/runner/worker/index.d.mts +5 -2
  45. package/dist/runner/worker/index.mjs +1 -1
  46. package/dist/runner/worker/runner-types.d.mts +2 -14
  47. package/dist/runner/worker/serial-runner.mjs +1 -1
  48. package/package.json +14 -4
  49. package/dist/config/tau-project-artifact.d.mts +0 -54
  50. package/dist/config/tau-project-artifact.mjs +0 -3
  51. package/dist/model/export-intent.d.mts +0 -79
  52. package/dist/model/export-intent.mjs +0 -1
@@ -1,6 +1,6 @@
1
1
  # geospec — Types (2)
2
2
 
3
- 63 top-level symbols. Signatures are verbatim typescript.
3
+ 61 top-level symbols. Signatures are verbatim typescript.
4
4
 
5
5
  // Inline code-CAD model load options
6
6
  LoadModelCodeOptions: {
@@ -12,13 +12,9 @@ LoadModelCodeOptions: {
12
12
  rootDir?: never;
13
13
  /** Geometry format to export. Defaults to `glb`. */
14
14
  format?: GeoSpecModelFormat;
15
- /** Explicit parameters passed to the runtime. */
15
+ /** Explicit parameters passed to the exporter. */
16
16
  parameters?: Record<string, unknown>;
17
- /** Runtime client or lazy runtime factory. */
18
- runtime?: GeoSpecRuntimeClient | GeoSpecRuntimeClientFactory;
19
- /** Source-specific runtime adapters, e.g. host-provided GPL-isolated kernels. */
20
- sourceAdapters?: readonly GeoSpecRuntimeSourceAdapter[];
21
- /** Project root used by runtime integrations. */
17
+ /** Absolute project root passed to the exporter. */
22
18
  projectPath?: string;
23
19
  /** STEP reader strategy used for STEP exports. */
24
20
  stepStreaming?: StepStreamingMode;
@@ -35,12 +31,11 @@ LoadModelCodeOptions: {
35
31
  */
36
32
  workUnitLimit?: number;
37
33
  /**
38
- * Axis-aligned millimetre box the kernel crops the model to before export, so a large mesh model
39
- * can be checked region by region. Only kernels whose direct GLB export declares a `region` option
40
- * honor it; any other kernel, a STEP load or a crop the kernel does not confirm refuses with a typed
41
- * diagnostic instead of loading the whole model. The cropped subject is a different subject: its
42
- * admission carries the kernel's crop notice and its load evidence records `region`, so a claim on
43
- * it never stands for the whole model.
34
+ * Axis-aligned millimetre box the exporter crops the model to before export, so a large mesh model
35
+ * can be checked region by region. Only an exporter that declares `region` honours it; any other
36
+ * exporter, or a crop the exporter cannot make, refuses with a typed diagnostic instead of loading
37
+ * the whole model. The cropped subject is a different subject: its load evidence records `region`,
38
+ * so a claim on it never stands for the whole model.
44
39
  */
45
40
  region?: GeoSpecLoadRegion;
46
41
  }
@@ -57,16 +52,10 @@ LoadModelCodeOptions: {
57
52
  // Geometry format to export
58
53
  format?: GeoSpecModelFormat
59
54
 
60
- // Explicit parameters passed to the runtime
55
+ // Explicit parameters passed to the exporter
61
56
  parameters?: Record<string, unknown>
62
57
 
63
- // Runtime client or lazy runtime factory
64
- runtime?: GeoSpecRuntimeClient | GeoSpecRuntimeClientFactory
65
-
66
- // Source-specific runtime adapters, e.g
67
- sourceAdapters?: readonly GeoSpecRuntimeSourceAdapter[]
68
-
69
- // Project root used by runtime integrations
58
+ // Absolute project root passed to the exporter
70
59
  projectPath?: string
71
60
 
72
61
  // STEP reader strategy used for STEP exports
@@ -84,7 +73,7 @@ LoadModelCodeOptions: {
84
73
  // Default work-unit budget for every claim on this subject
85
74
  workUnitLimit?: number
86
75
 
87
- // Axis-aligned millimetre box the kernel crops the model to before export, so a large mesh model can be checked region by region
76
+ // Axis-aligned millimetre box the exporter crops the model to before export, so a large mesh model can be checked region by region
88
77
  region?: GeoSpecLoadRegion
89
78
 
90
79
  // Filesystem-backed model load options
@@ -100,16 +89,12 @@ LoadModelFileOptions: {
100
89
  * evidence.
101
90
  */
102
91
  rootDir?: string;
103
- /** Project root used by runtime integrations. */
92
+ /** Absolute project root passed to the exporter. */
104
93
  projectPath?: string;
105
94
  /** Geometry format to export. Defaults to `glb`. */
106
95
  format?: GeoSpecModelFormat;
107
- /** Explicit parameters passed to the runtime. */
96
+ /** Explicit parameters passed to the exporter. */
108
97
  parameters?: Record<string, unknown>;
109
- /** Runtime client or lazy runtime factory. */
110
- runtime?: GeoSpecRuntimeClient | GeoSpecRuntimeClientFactory;
111
- /** Source-specific runtime adapters, e.g. host-provided GPL-isolated kernels. */
112
- sourceAdapters?: readonly GeoSpecRuntimeSourceAdapter[];
113
98
  /** STEP reader strategy used for STEP exports. */
114
99
  stepStreaming?: StepStreamingMode;
115
100
  /** Whether STEP loading should also produce mesh evidence. Defaults to true. */
@@ -125,12 +110,11 @@ LoadModelFileOptions: {
125
110
  */
126
111
  workUnitLimit?: number;
127
112
  /**
128
- * Axis-aligned millimetre box the kernel crops the model to before export, so a large mesh model
129
- * can be checked region by region. Only kernels whose direct GLB export declares a `region` option
130
- * honor it; any other kernel, a STEP load or a crop the kernel does not confirm refuses with a typed
131
- * diagnostic instead of loading the whole model. The cropped subject is a different subject: its
132
- * admission carries the kernel's crop notice and its load evidence records `region`, so a claim on
133
- * it never stands for the whole model.
113
+ * Axis-aligned millimetre box the exporter crops the model to before export, so a large mesh model
114
+ * can be checked region by region. Only an exporter that declares `region` honours it; any other
115
+ * exporter, or a crop the exporter cannot make, refuses with a typed diagnostic instead of loading
116
+ * the whole model. The cropped subject is a different subject: its load evidence records `region`,
117
+ * so a claim on it never stands for the whole model.
134
118
  */
135
119
  region?: GeoSpecLoadRegion;
136
120
  }
@@ -141,21 +125,15 @@ LoadModelFileOptions: {
141
125
  // Project-relative folder `file` resolves in, for a suite that loads from somewhere other than the project root
142
126
  rootDir?: string
143
127
 
144
- // Project root used by runtime integrations
128
+ // Absolute project root passed to the exporter
145
129
  projectPath?: string
146
130
 
147
131
  // Geometry format to export
148
132
  format?: GeoSpecModelFormat
149
133
 
150
- // Explicit parameters passed to the runtime
134
+ // Explicit parameters passed to the exporter
151
135
  parameters?: Record<string, unknown>
152
136
 
153
- // Runtime client or lazy runtime factory
154
- runtime?: GeoSpecRuntimeClient | GeoSpecRuntimeClientFactory
155
-
156
- // Source-specific runtime adapters, e.g
157
- sourceAdapters?: readonly GeoSpecRuntimeSourceAdapter[]
158
-
159
137
  // STEP reader strategy used for STEP exports
160
138
  stepStreaming?: StepStreamingMode
161
139
 
@@ -171,7 +149,7 @@ LoadModelFileOptions: {
171
149
  // Default work-unit budget for every claim on this subject
172
150
  workUnitLimit?: number
173
151
 
174
- // Axis-aligned millimetre box the kernel crops the model to before export, so a large mesh model can be checked region by region
152
+ // Axis-aligned millimetre box the exporter crops the model to before export, so a large mesh model can be checked region by region
175
153
  region?: GeoSpecLoadRegion
176
154
 
177
155
  // Options accepted by {@link import ('./load-model.js').loadModel}
@@ -183,7 +161,7 @@ LoadModelOptions: LoadModelSourceOptions | LoadModelCodeOptions<Code> | LoadMode
183
161
  // Geometry format to export
184
162
  format?: GeoSpecModelFormat
185
163
 
186
- // Explicit parameters passed to the runtime
164
+ // Explicit parameters passed to the exporter
187
165
  parameters?: Record<string, unknown>
188
166
 
189
167
  // STEP reader strategy used for STEP exports
@@ -283,6 +261,38 @@ LoadModelSourceOptions: {
283
261
  // Default work-unit budget for every claim on this subject
284
262
  workUnitLimit?: number
285
263
 
264
+ // Options for {@link commandExporter}
265
+ CommandExporterOptions: {
266
+ readonly id: string;
267
+ /** File extensions without the dot, or `'*'`. */
268
+ readonly extensions: readonly string[];
269
+ /** Executable and leading arguments, such as `['python', 'export.py']`. */
270
+ readonly command: readonly string[];
271
+ /** What the command can do. Protocol 1 carries no inline sources, so `inlineSources` must not be set. */
272
+ readonly capabilities: GeoSpecExporterCapabilities;
273
+ /** Working directory of the command; defaults to the request's project root. */
274
+ readonly cwd?: string;
275
+ /** Extra environment variables, merged over this process's. */
276
+ readonly env?: Readonly<Record<string, string>>;
277
+ }
278
+
279
+ readonly id: string
280
+
281
+ // File extensions without the dot, or `'*'`
282
+ readonly extensions: readonly string[]
283
+
284
+ // Executable and leading arguments, such as `['python', 'export.py']`
285
+ readonly command: readonly string[]
286
+
287
+ // What the command can do
288
+ readonly capabilities: GeoSpecExporterCapabilities
289
+
290
+ // Working directory of the command
291
+ readonly cwd?: string
292
+
293
+ // Extra environment variables, merged over this process's
294
+ readonly env?: Readonly<Record<string, string>>
295
+
286
296
  // Collects suites, tests, assertions, and async completion state for one GeoSpec module execution
287
297
  GeoSpecCollector: {
288
298
  tests: GeoSpecTestCase[];
@@ -316,17 +326,11 @@ GeoSpecCollector: {
316
326
 
317
327
  // Per-module collector configuration
318
328
  GeoSpecCollectorOptions: {
319
- matcherWallBackstop?: number;
320
- forensic?: boolean;
321
329
  nativeAssertions: GeoSpecAssertionClientOptions;
322
330
  /** Observes each selected test as it starts and settles, for host progress reporting. */
323
331
  onTestEvent?: (event: GeoSpecTestEvent) => void;
324
332
  }
325
333
 
326
- matcherWallBackstop?: number
327
-
328
- forensic?: boolean
329
-
330
334
  nativeAssertions: GeoSpecAssertionClientOptions
331
335
 
332
336
  // Observes each selected test as it starts and settles, for host progress reporting
@@ -538,10 +542,6 @@ RunGeoSpecModuleOptions: {
538
542
  testNamePattern?: string | RegExp;
539
543
  /** Timeout for async test callbacks, in milliseconds. */
540
544
  testTimeout?: number;
541
- /** Milliseconds. Non-verdict matcher infrastructure backstop. */
542
- matcherWallBackstop?: number;
543
- /** Emit structured forensic events for this run. */
544
- forensic?: boolean;
545
545
  /** Observes each selected test as it starts and settles, for host progress reporting. */
546
546
  onTestEvent?: (event: GeoSpecTestEvent) => void;
547
547
  /**
@@ -579,12 +579,6 @@ RunGeoSpecModuleOptions: {
579
579
  // Timeout for async test callbacks, in milliseconds
580
580
  testTimeout?: number
581
581
 
582
- // Milliseconds
583
- matcherWallBackstop?: number
584
-
585
- // Emit structured forensic events for this run
586
- forensic?: boolean
587
-
588
582
  // Observes each selected test as it starts and settles, for host progress reporting
589
583
  onTestEvent?: (event: GeoSpecTestEvent) => void
590
584
 
@@ -655,8 +649,8 @@ CreateGeoSpecNativeModelLoaderOptions: {
655
649
  readonly format?: Extract<GeoSpecModelFormat, 'glb' | 'step' | 'stp'>;
656
650
  readonly projectPath?: string;
657
651
  readonly readSource?: GeoSpecNativeSourceReader;
658
- readonly runtime?: GeoSpecRuntimeClient | GeoSpecRuntimeClientFactory;
659
- readonly sourceAdapters?: readonly GeoSpecRuntimeSourceAdapter[];
652
+ /** Model exporters for source-kind files; the first whose `extensions` claim the file exports it. */
653
+ readonly exporters?: readonly GeoSpecModelExporter[];
660
654
  /**
661
655
  * Subject handles carried between the release scopes of loaders that share one engine, keyed by
662
656
  * subjectHash. With a carrier, `releaseAll` keeps this scope's subjects for the next scope and
@@ -680,9 +674,8 @@ CreateGeoSpecNativeModelLoaderOptions: {
680
674
 
681
675
  readonly readSource?: GeoSpecNativeSourceReader
682
676
 
683
- readonly runtime?: GeoSpecRuntimeClient | GeoSpecRuntimeClientFactory
684
-
685
- readonly sourceAdapters?: readonly GeoSpecRuntimeSourceAdapter[]
677
+ // Model exporters for source-kind files
678
+ readonly exporters?: readonly GeoSpecModelExporter[]
686
679
 
687
680
  // Subject handles carried between the release scopes of loaders that share one engine, keyed by subjectHash
688
681
  readonly carried?: Map<string, unknown>
@@ -704,7 +697,7 @@ GeoSpecNativeLoadModelOptions: LoadModelOptions<Code> & {
704
697
  // Geometry format to export
705
698
  format?: GeoSpecModelFormat
706
699
 
707
- // Explicit parameters passed to the runtime
700
+ // Explicit parameters passed to the exporter
708
701
  parameters?: Record<string, unknown>
709
702
 
710
703
  // STEP reader strategy used for STEP exports
@@ -751,7 +744,7 @@ GeoSpecNativeModelEngine: GeoSpecNativeEngine & {
751
744
  releaseSubject(request: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;
752
745
 
753
746
  // Model loader injected into native VM runs
754
- // Remarks: Direct `source` loads read their source again on every call and the engine digests those exact bytes; bytes equal to an admitted subject's reuse that subject by digest, length and descriptor, and edited bytes admit a new subject. Runtime loads are coalesced per release scope (one run): a load whose file, inline code, project path, parameters, format, tolerances, region and ingest options equal an earlier successful load's reuses that admission without exporting or ingesting again. A file load is reused only while a Runtime source snapshot still matches the earlier load's complete source revision; otherwise, or when every owner of the earlier admission has released it, the load exports afresh. Failures are never reused.
747
+ // Remarks: Direct `source` loads read their source again on every call and the engine digests those exact bytes; bytes equal to an admitted subject's reuse that subject by digest, length and descriptor, and edited bytes admit a new subject. Exported loads are coalesced per release scope (one run): a load whose file, inline code, project path, parameters, format, tolerances, region and ingest options equal an earlier successful load's reuses that admission without exporting or ingesting again. A file load is reused only while the exporter's `revision` still matches the earlier load's complete source revision; otherwise, or when every owner of the earlier admission has released it, the load exports afresh. Failures are never reused.
755
748
  GeoSpecNativeModelLoader: <Code extends Record<string, string> = Record<string, string>>(options: GeoSpecNativeLoadModelOptions<Code>) => Promise<GeoSpecNativeModelSubject>
756
749
 
757
750
  // Subject identity returned by native STEP/GLB admission
@@ -787,7 +780,7 @@ ManagedGeoSpecNativeModelLoader: GeoSpecNativeModelLoader & {
787
780
  /**
788
781
  * Drain registered admissions, including additions while drainage awaits,
789
782
  * then release this scope's subjects (with a carrier: the previous scope's
790
- * subjects this scope did not load again) and owned Runtime clients.
783
+ * subjects this scope did not load again), then close every exporter it exported through.
791
784
  *
792
785
  * Await the intended complete load chain before final release, and await
793
786
  * this method before closing the caller-owned engine. Calls after it returns
@@ -811,16 +804,12 @@ GeoSpecPoolHostMessage: {
811
804
  shard: GeoSpecPoolShard;
812
805
  testNamePattern?: string;
813
806
  testTimeout?: number;
814
- matcherWallBackstop?: number;
815
- forensic?: boolean;
816
807
  } | {
817
808
  /** List-only collection pass: register tests, run no bodies (R3 splitting). */
818
809
  type: 'list-tests';
819
810
  shardId: number;
820
811
  file: string;
821
812
  testTimeout?: number;
822
- matcherWallBackstop?: number;
823
- forensic?: boolean;
824
813
  } | {
825
814
  type: 'shutdown';
826
815
  }
@@ -884,12 +873,6 @@ GeoSpecPoolWorkerMessage: {
884
873
  type: 'file-start';
885
874
  shardId: number;
886
875
  file: string;
887
- } | {
888
- type: 'forensic';
889
- shardId: number;
890
- name: string;
891
- value: number;
892
- unit: 'milliseconds' | 'count';
893
876
  } | {
894
877
  type: 'tests-listed';
895
878
  shardId: number;
@@ -918,25 +901,6 @@ GeoSpecPoolWorkerMessage: {
918
901
 
919
902
  type: 'ready'
920
903
 
921
- // One structured forensic measurement emitted by a runner
922
- GeoSpecForensicEvent: {
923
- type: 'forensic';
924
- name: string;
925
- value: number;
926
- unit: 'milliseconds' | 'count';
927
- shardId?: number;
928
- }
929
-
930
- type: 'forensic'
931
-
932
- name: string
933
-
934
- value: number
935
-
936
- unit: 'milliseconds' | 'count'
937
-
938
- shardId?: number
939
-
940
904
  // Public GeoSpec runner lifecycle surface
941
905
  GeoSpecRunner: {
942
906
  /** Execute GeoSpec files and return a compact aggregate result. */
@@ -994,14 +958,14 @@ GeoSpecRunnerEvent: {
994
958
  } | {
995
959
  type: 'run-complete';
996
960
  result: GeoSpecRunnerResult;
997
- } | GeoSpecForensicEvent | {
961
+ } | {
998
962
  type: 'abort';
999
963
  reason?: string;
1000
964
  } | {
1001
965
  type: 'close';
1002
966
  }
1003
967
 
1004
- type: 'forensic'
968
+ type: 'run-start'
1005
969
 
1006
970
  // One GeoSpec test file executed by a worker-style runner
1007
971
  GeoSpecRunnerFileResult: {
@@ -1113,16 +1077,12 @@ GeoSpecRunnerRunOptions: {
1113
1077
  testNamePattern?: string | RegExp;
1114
1078
  /** Timeout for each async test callback, in milliseconds. */
1115
1079
  testTimeout?: number;
1116
- /** Non-verdict matcher wall backstop. Milliseconds. */
1117
- matcherWallBackstop?: number;
1118
1080
  /**
1119
1081
  * Engine work-unit budget for this run's claims, replacing the runner's
1120
1082
  * `nativeAssertions.workUnitLimit`. A `loadModel` or `expectGeo` budget still
1121
1083
  * wins for its own claims.
1122
1084
  */
1123
1085
  workUnitLimit?: number;
1124
- /** Emit structured forensic measurements for this run. */
1125
- forensic?: boolean;
1126
1086
  /**
1127
1087
  * Stop after the first failing file (R1). Interactive fail-fast only —
1128
1088
  * never the default for reward runs, which want the complete red set.
@@ -1139,18 +1099,137 @@ GeoSpecRunnerRunOptions: {
1139
1099
  // Timeout for each async test callback, in milliseconds
1140
1100
  testTimeout?: number
1141
1101
 
1142
- // Non-verdict matcher wall backstop
1143
- matcherWallBackstop?: number
1144
-
1145
1102
  // Engine work-unit budget for this run's claims, replacing the runner's `nativeAssertions.workUnitLimit`
1146
1103
  workUnitLimit?: number
1147
1104
 
1148
- // Emit structured forensic measurements for this run
1149
- forensic?: boolean
1150
-
1151
1105
  // Stop after the first failing file (R1)
1152
1106
  bail?: boolean
1153
1107
 
1108
+ // Everything the pool needs that differs between Node and the browser
1109
+ GeoSpecPoolOptions: {
1110
+ /** Spawn one worker running `startGeoSpecPoolWorkerHost`. */
1111
+ createWorker: () => GeoSpecPoolWorkerHandle | Promise<GeoSpecPoolWorkerHandle>;
1112
+ /** Optional one-time worker initialization performed after its ready signal. */
1113
+ initializeWorker?: (worker: GeoSpecPoolWorkerHandle) => Promise<void> | void;
1114
+ /** Wait for each native worker's cleanup acknowledgement before terminating it. */
1115
+ gracefulShutdown?: boolean;
1116
+ /** Worker count. Omit to let the caller's host auto-size before calling. */
1117
+ workers: number;
1118
+ /** Optional scheduling telemetry. Absent = declared order, no memory class. */
1119
+ timings?: ShardTimings;
1120
+ /** Per-shard non-verdict watchdog, milliseconds (R11). */
1121
+ shardTimeout?: number;
1122
+ /** Split files whose recorded duration exceeds this. Milliseconds. */
1123
+ splitThreshold?: number;
1124
+ }
1125
+
1126
+ // Spawn one worker running `startGeoSpecPoolWorkerHost`
1127
+ createWorker: () => GeoSpecPoolWorkerHandle | Promise<GeoSpecPoolWorkerHandle>
1128
+
1129
+ // Optional one-time worker initialization performed after its ready signal
1130
+ initializeWorker?: (worker: GeoSpecPoolWorkerHandle) => Promise<void> | void
1131
+
1132
+ // Wait for each native worker's cleanup acknowledgement before terminating it
1133
+ gracefulShutdown?: boolean
1134
+
1135
+ // Worker count
1136
+ workers: number
1137
+
1138
+ // Optional scheduling telemetry
1139
+ timings?: ShardTimings
1140
+
1141
+ // Per-shard non-verdict watchdog, milliseconds (R11)
1142
+ shardTimeout?: number
1143
+
1144
+ // Split files whose recorded duration exceeds this
1145
+ splitThreshold?: number
1146
+
1147
+ // One shard's recorded cost
1148
+ ShardTiming: {
1149
+ /** Wall duration of the last recorded run, in milliseconds. */
1150
+ durationMs: number;
1151
+ /** Highest RSS observed for this shard, in bytes. Monotonic. */
1152
+ peakRssBytes: number;
1153
+ }
1154
+
1155
+ // Wall duration of the last recorded run, in milliseconds
1156
+ durationMs: number
1157
+
1158
+ // Highest RSS observed for this shard, in bytes
1159
+ peakRssBytes: number
1160
+
1161
+ // A mutable timings table
1162
+ ShardTimings: {
1163
+ /** Merge one observation. Peak RSS only ever grows. */
1164
+ record(shard: string, timing: ShardTiming): void;
1165
+ /** The hint for one shard, or `undefined` when unknown. */
1166
+ read(shard: string): ShardTiming | undefined;
1167
+ /** Every recorded shard, sorted by descending duration (longest-first). */
1168
+ longestFirst(): string[];
1169
+ /** Persist the table. Failure is silent: telemetry never fails a run. */
1170
+ save(): void;
1171
+ }
1172
+
1173
+ // Merge one observation
1174
+ // ShardTimings.record (method)
1175
+ record(shard: string, timing: ShardTiming): void;
1176
+
1177
+ // The hint for one shard, or `undefined` when unknown
1178
+ // ShardTimings.read (method)
1179
+ read(shard: string): ShardTiming | undefined;
1180
+
1181
+ // Every recorded shard, sorted by descending duration (longest-first)
1182
+ // ShardTimings.longestFirst (method)
1183
+ longestFirst(): string[];
1184
+
1185
+ // Persist the table
1186
+ // ShardTimings.save (method)
1187
+ save(): void;
1188
+
1189
+ // Options accepted by {@link startGeoSpecPoolWorkerHost}
1190
+ GeoSpecPoolWorkerHostOptions: {
1191
+ /** Filesystem containing the project and test modules. */
1192
+ filesystem: GeoSpecRunnerOptions['filesystem'];
1193
+ /** Native assertion client shared with this worker's model admissions. */
1194
+ nativeAssertions: GeoSpecRunnerOptions['nativeAssertions'];
1195
+ /** Managed native admissions, released after every shard and collection pass and before shutdown. */
1196
+ nativeModelLoader: ManagedGeoSpecNativeModelLoader;
1197
+ /** Additional in-memory modules made available to the VM. */
1198
+ builtinModules?: GeoSpecRunnerOptions['builtinModules'];
1199
+ /** Post a message to the pool host. */
1200
+ postMessage: (message: GeoSpecPoolWorkerMessage) => void;
1201
+ /** Subscribe to pool-host messages. */
1202
+ onHostMessage: (listener: (message: GeoSpecPoolHostMessage) => void) => void;
1203
+ /** Sample this worker's resident memory in bytes (R15 telemetry); optional. */
1204
+ measureMemoryBytes?: () => number | undefined;
1205
+ /** Release platform resources on shutdown, after the native subjects are released. */
1206
+ onShutdown?: () => Promise<void> | void;
1207
+ }
1208
+
1209
+ // Filesystem containing the project and test modules
1210
+ filesystem: GeoSpecRunnerOptions['filesystem']
1211
+
1212
+ // Native assertion client shared with this worker's model admissions
1213
+ nativeAssertions: GeoSpecRunnerOptions['nativeAssertions']
1214
+
1215
+ // Managed native admissions, released after every shard and collection pass and before shutdown
1216
+ nativeModelLoader: ManagedGeoSpecNativeModelLoader
1217
+
1218
+ // Additional in-memory modules made available to the VM
1219
+ builtinModules?: GeoSpecRunnerOptions['builtinModules']
1220
+
1221
+ // Post a message to the pool host
1222
+ postMessage: (message: GeoSpecPoolWorkerMessage) => void
1223
+
1224
+ // Subscribe to pool-host messages
1225
+ onHostMessage: (listener: (message: GeoSpecPoolHostMessage) => void) => void
1226
+
1227
+ // Sample this worker's resident memory in bytes (R15 telemetry)
1228
+ measureMemoryBytes?: () => number | undefined
1229
+
1230
+ // Release platform resources on shutdown, after the native subjects are released
1231
+ onShutdown?: () => Promise<void> | void
1232
+
1154
1233
  // Runner-independent native assertion client
1155
1234
  GeoSpecAssertionClient: {
1156
1235
  /**
@@ -1414,114 +1493,3 @@ GeoSpecPmiFaceAssociation: {
1414
1493
  readonly occurrence: number | null
1415
1494
 
1416
1495
  readonly publicFaceOrdinal: number
1417
-
1418
- // One ordered role reference, including incomplete source/transfer evidence
1419
- GeoSpecPmiShapeReference: {
1420
- readonly sourceAspectId: number | null;
1421
- readonly sourceUsageIds: readonly number[];
1422
- readonly sourceItemIds: readonly number[];
1423
- readonly requestedRoute: GeoSpecPmiField<readonly number[]>;
1424
- readonly associations: GeoSpecPmiField<readonly GeoSpecPmiFaceAssociation[]>;
1425
- }
1426
-
1427
- readonly sourceAspectId: number | null
1428
-
1429
- readonly sourceUsageIds: readonly number[]
1430
-
1431
- readonly sourceItemIds: readonly number[]
1432
-
1433
- readonly requestedRoute: GeoSpecPmiField<readonly number[]>
1434
-
1435
- readonly associations: GeoSpecPmiField<readonly GeoSpecPmiFaceAssociation[]>
1436
-
1437
- // Normalized authored limits
1438
- GeoSpecPmiLimits: {
1439
- readonly lowerMillimetres: string;
1440
- readonly upperMillimetres: string;
1441
- readonly basis: 'authored-limits' | 'nominal-plus-minus';
1442
- }
1443
-
1444
- readonly lowerMillimetres: string
1445
-
1446
- readonly upperMillimetres: string
1447
-
1448
- readonly basis: 'authored-limits' | 'nominal-plus-minus'
1449
-
1450
- // Source record preserving semantic/presentation separation and ordered roles
1451
- GeoSpecPmiRecord: {
1452
- readonly sourceId: number;
1453
- readonly family: 'dimension' | 'datum' | 'tolerance' | 'presentation';
1454
- readonly channel: 'semantic' | 'presentation';
1455
- readonly kind: string;
1456
- readonly name: GeoSpecPmiField<string>;
1457
- readonly first: readonly GeoSpecPmiShapeReference[];
1458
- readonly second: readonly GeoSpecPmiShapeReference[];
1459
- readonly numbers: GeoSpecPmiField<readonly GeoSpecPmiNumber[]>;
1460
- readonly limits: GeoSpecPmiField<GeoSpecPmiLimits>;
1461
- readonly interpretation: GeoSpecPmiField<string>;
1462
- readonly raw: readonly GeoSpecPmiRawEntity[];
1463
- }
1464
-
1465
- readonly sourceId: number
1466
-
1467
- readonly family: 'dimension' | 'datum' | 'tolerance' | 'presentation'
1468
-
1469
- readonly channel: 'semantic' | 'presentation'
1470
-
1471
- readonly kind: string
1472
-
1473
- readonly name: GeoSpecPmiField<string>
1474
-
1475
- readonly first: readonly GeoSpecPmiShapeReference[]
1476
-
1477
- readonly second: readonly GeoSpecPmiShapeReference[]
1478
-
1479
- readonly numbers: GeoSpecPmiField<readonly GeoSpecPmiNumber[]>
1480
-
1481
- readonly limits: GeoSpecPmiField<GeoSpecPmiLimits>
1482
-
1483
- readonly interpretation: GeoSpecPmiField<string>
1484
-
1485
- readonly raw: readonly GeoSpecPmiRawEntity[]
1486
-
1487
- // Positive-only inventory value inside the ordinary canonical query report
1488
- GeoSpecPmiInventory: {
1489
- readonly contract: 'geospec.pmi.inventory/v1';
1490
- readonly status: 'semantic' | 'graphical-only' | 'empty';
1491
- readonly fileSchema: string;
1492
- readonly editionValidation: 'not-validated';
1493
- readonly records: readonly GeoSpecPmiRecord[];
1494
- }
1495
-
1496
- readonly contract: 'geospec.pmi.inventory/v1'
1497
-
1498
- readonly status: 'semantic' | 'graphical-only' | 'empty'
1499
-
1500
- readonly fileSchema: string
1501
-
1502
- readonly editionValidation: 'not-validated'
1503
-
1504
- readonly records: readonly GeoSpecPmiRecord[]
1505
-
1506
- // Strict inventory output limits
1507
- GeoSpecPmiQueryPayload: {
1508
- readonly maxRecords?: number;
1509
- readonly maxOutputBytes?: number;
1510
- }
1511
-
1512
- readonly maxRecords?: number
1513
-
1514
- readonly maxOutputBytes?: number
1515
-
1516
- // Complete inventory value
1517
- GeoSpecPmiQueryValue: {
1518
- readonly inventory: GeoSpecPmiInventory;
1519
- readonly subjectHash: string;
1520
- readonly provenance: Readonly<Record<string, unknown>>;
1521
- }
1522
-
1523
- readonly inventory: GeoSpecPmiInventory
1524
-
1525
- readonly subjectHash: string
1526
-
1527
- readonly provenance: Readonly<Record<string, unknown>>