geospec 0.1.0-beta.2 → 0.1.0-beta.4

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 (46) hide show
  1. package/agent/doctrine.md +8 -0
  2. package/agent/geospec-authoring/SKILL.md +19 -20
  3. package/agent/geospec-authoring/api-constants.md +11 -1
  4. package/agent/geospec-authoring/api-functions.md +9 -1
  5. package/agent/geospec-authoring/api-index.md +22 -7
  6. package/agent/geospec-authoring/api-types.md +91 -3
  7. package/agent/geospec-authoring/public-api-constants.md +33 -1
  8. package/agent/geospec-authoring/public-api-functions.md +21 -2
  9. package/agent/geospec-authoring/public-api-index.md +57 -20
  10. package/agent/geospec-authoring/public-api-types-2.md +267 -220
  11. package/agent/geospec-authoring/public-api-types-3.md +217 -0
  12. package/agent/geospec-authoring/public-api-types.md +37 -137
  13. package/agent/resources.js +14 -13
  14. package/agent/skills.json +3 -2
  15. package/dist/assertion-client/client.d.mts +12 -2
  16. package/dist/assertion-client/client.mjs +2 -2
  17. package/dist/assertion-client/index.d.mts +2 -2
  18. package/dist/assertion-client/index.mjs +1 -1
  19. package/dist/config/tau-project-artifact.mjs +1 -1
  20. package/dist/create-geospec.d.mts +3 -2
  21. package/dist/create-geospec.mjs +1 -1
  22. package/dist/engine/client.d.mts +21 -1
  23. package/dist/engine/client.mjs +1 -1
  24. package/dist/index.d.mts +2 -2
  25. package/dist/model/export-intent.d.mts +17 -1
  26. package/dist/model/export-intent.mjs +1 -1
  27. package/dist/model/index.d.mts +4 -3
  28. package/dist/model/index.mjs +1 -1
  29. package/dist/model/native-model-loader.d.mts +30 -7
  30. package/dist/model/native-model-loader.mjs +1 -1
  31. package/dist/model/region-scope.d.mts +23 -0
  32. package/dist/model/region-scope.mjs +1 -0
  33. package/dist/model/subject-assertions.mjs +1 -1
  34. package/dist/model/types.d.mts +50 -3
  35. package/dist/runner/collector.d.mts +4 -2
  36. package/dist/runner/collector.mjs +2 -2
  37. package/dist/runner/index.d.mts +3 -2
  38. package/dist/runner/index.mjs +1 -1
  39. package/dist/runner/native/native-serial-runner.mjs +1 -1
  40. package/dist/runner/run-geospec-module.mjs +2 -2
  41. package/dist/runner/timeout-codes.d.mts +45 -0
  42. package/dist/runner/timeout-codes.mjs +1 -0
  43. package/dist/runner/types.d.mts +34 -1
  44. package/dist/runner/worker/runner-types.d.mts +24 -3
  45. package/dist/runner/worker/serial-runner.mjs +1 -1
  46. package/package.json +4 -4
@@ -0,0 +1,217 @@
1
+ # geospec — Types (3)
2
+
3
+ 10 top-level symbols. Signatures are verbatim typescript.
4
+
5
+ // Content-addressed subject accepted by a protocol-3 assertion plan
6
+ GeoSpecNativeSubject: {
7
+ readonly contentHash?: string;
8
+ readonly subjectHash?: string;
9
+ }
10
+
11
+ readonly contentHash?: string
12
+
13
+ readonly subjectHash?: string
14
+
15
+ // A canonical fixed-contract matcher
16
+ GeoSpecFixedMatcherDescriptor: {
17
+ readonly contract: 'geospec.plate-two-windows/v1' | 'geospec.pmi.parallel-plane-distance/v1';
18
+ readonly expected: 'true';
19
+ readonly mode: 'sync';
20
+ }
21
+
22
+ readonly contract: 'geospec.plate-two-windows/v1' | 'geospec.pmi.parallel-plane-distance/v1'
23
+
24
+ readonly expected: 'true'
25
+
26
+ readonly mode: 'sync'
27
+
28
+ // Installed Vitest matcher map and lifecycle settlement hook
29
+ GeoSpecVitestAdapter: {
30
+ readonly matchers: GeoSpecVitestMatcherMap;
31
+ flush(): Promise<void>;
32
+ }
33
+
34
+ readonly matchers: GeoSpecVitestMatcherMap
35
+
36
+ // GeoSpecVitestAdapter.flush (method)
37
+ flush(): Promise<void>;
38
+
39
+ // Input for exporting one validated Tau project descriptor
40
+ ExportTauProjectArtifactOptions: {
41
+ readonly descriptor: GeoSpecTauProjectDescriptor;
42
+ /** Called twice so source discovery and export use separate runtime lifetimes. */
43
+ readonly createRuntime: () => GeoSpecTauProjectRuntime | Promise<GeoSpecTauProjectRuntime>;
44
+ readonly signal?: AbortSignal;
45
+ }
46
+
47
+ readonly descriptor: GeoSpecTauProjectDescriptor
48
+
49
+ // Called twice so source discovery and export use separate runtime lifetimes
50
+ readonly createRuntime: () => GeoSpecTauProjectRuntime | Promise<GeoSpecTauProjectRuntime>
51
+
52
+ readonly signal?: AbortSignal
53
+
54
+ // Finalized geometry bytes and the exact source/export metadata that produced them
55
+ GeoSpecTauProjectArtifact: {
56
+ readonly format: 'step' | 'glb';
57
+ readonly name: string;
58
+ readonly mimeType: string;
59
+ readonly bytes: Uint8Array<ArrayBuffer>;
60
+ readonly frame: {
61
+ readonly coordinateSystem: 'z-up';
62
+ readonly lengthUnit: 'millimeter';
63
+ readonly sourceUnit: 'mm';
64
+ };
65
+ readonly source: {
66
+ readonly manifestPath: string;
67
+ readonly manifestBytes: Uint8Array<ArrayBuffer>;
68
+ readonly manifest: ProjectManifest;
69
+ readonly projectEntryPath: string;
70
+ readonly entryPath: string;
71
+ readonly kernelId: string;
72
+ readonly files: readonly RuntimeSourceSnapshotFile[];
73
+ };
74
+ readonly export: {
75
+ readonly options: Readonly<Record<string, unknown>>;
76
+ readonly route: NonNullable<GeometryExportIntent['route']>;
77
+ };
78
+ }
79
+
80
+ readonly format: 'step' | 'glb'
81
+
82
+ readonly name: string
83
+
84
+ readonly mimeType: string
85
+
86
+ readonly bytes: Uint8Array<ArrayBuffer>
87
+
88
+ readonly frame: {
89
+ readonly coordinateSystem: 'z-up';
90
+ readonly lengthUnit: 'millimeter';
91
+ readonly sourceUnit: 'mm';
92
+ }
93
+
94
+ readonly source: {
95
+ readonly manifestPath: string;
96
+ readonly manifestBytes: Uint8Array<ArrayBuffer>;
97
+ readonly manifest: ProjectManifest;
98
+ readonly projectEntryPath: string;
99
+ readonly entryPath: string;
100
+ readonly kernelId: string;
101
+ readonly files: readonly RuntimeSourceSnapshotFile[];
102
+ }
103
+
104
+ readonly export: {
105
+ readonly options: Readonly<Record<string, unknown>>;
106
+ readonly route: NonNullable<GeometryExportIntent['route']>;
107
+ }
108
+
109
+ // Runtime surface required to snapshot and export one Tau project
110
+ GeoSpecTauProjectRuntime: RuntimeClientWithRoutes & Pick<RuntimeClient, 'shutdown' | 'snapshotSource'>
111
+
112
+ open: (input: Pick<Parameters<RuntimeClient['open']>[0], 'source' | 'parameters' | 'stage' | 'watch' | 'signal'>) => Pick<ReturnType<RuntimeClient['open']>, 'export' | 'close'>
113
+
114
+ // GeoSpecTauProjectRuntime.on (method)
115
+ on?(event: 'telemetry', handler: (batch: {
116
+ readonly entries: ReadonlyArray<{
117
+ name: string;
118
+ duration: number;
119
+ startTime: number;
120
+ workerTimeOrigin: number;
121
+ }>;
122
+ }) => void): () => void;
123
+
124
+ // GeoSpecTauProjectRuntime.bestRouteFor (method)
125
+ bestRouteFor(format: string, options?: {
126
+ readonly kernelId?: string;
127
+ }): GeoSpecExportRoute | undefined;
128
+
129
+ // Trusted project configuration using existing discovery and runner options
130
+ // Remarks: Omitted values keep their existing owner's defaults. Defined overrides replace whole fields, including empty arrays, false and the subjects map. Existing discovery currently treats an absent or empty include array as its default pattern. Preserving [] here does not change that consumer behavior. This is configuration data, not a canonical engine plan or a geometry result.
131
+ GeoSpecConfig: {
132
+ include?: readonly string[];
133
+ exclude?: readonly string[];
134
+ testNamePattern?: string;
135
+ /** Positive finite milliseconds; the runner owns its default. */
136
+ testTimeout?: number;
137
+ /** Positive finite milliseconds; does not define a geometry verdict. */
138
+ matcherWallBackstop?: number;
139
+ bail?: boolean;
140
+ forensic?: boolean;
141
+ cache?: boolean;
142
+ /** Requested cache location only; loading configuration creates no store. */
143
+ cacheDirectory?: string;
144
+ subjects?: Readonly<Record<string, GeoSpecTauProjectDescriptor>>;
145
+ }
146
+
147
+ include?: readonly string[]
148
+
149
+ exclude?: readonly string[]
150
+
151
+ testNamePattern?: string
152
+
153
+ // Positive finite milliseconds
154
+ testTimeout?: number
155
+
156
+ // Positive finite milliseconds
157
+ matcherWallBackstop?: number
158
+
159
+ bail?: boolean
160
+
161
+ forensic?: boolean
162
+
163
+ cache?: boolean
164
+
165
+ // Requested cache location only
166
+ cacheDirectory?: string
167
+
168
+ subjects?: Readonly<Record<string, GeoSpecTauProjectDescriptor>>
169
+
170
+ // Imported Tau project data for later host resolution
171
+ // Remarks: This descriptor does not validate the original manifest bytes or its schema, admit an asset, export geometry, or establish finalized-artifact provenance.
172
+ GeoSpecTauProjectDescriptor: {
173
+ readonly kind: 'tau-project';
174
+ /** Normalized project-relative POSIX path identifying the imported manifest. */
175
+ readonly manifestPath: string;
176
+ readonly manifest: Readonly<Record<string, JSONValue>>;
177
+ readonly format: 'step' | 'glb';
178
+ readonly parameters?: Readonly<Record<string, JSONValue>>;
179
+ }
180
+
181
+ readonly kind: 'tau-project'
182
+
183
+ // Normalized project-relative POSIX path identifying the imported manifest
184
+ readonly manifestPath: string
185
+
186
+ readonly manifest: Readonly<Record<string, JSONValue>>
187
+
188
+ readonly format: 'step' | 'glb'
189
+
190
+ readonly parameters?: Readonly<Record<string, JSONValue>>
191
+
192
+ // Resolved file identity and validated configuration data
193
+ LoadedGeoSpecConfig: {
194
+ readonly configPath?: string;
195
+ readonly options: GeoSpecConfig;
196
+ }
197
+
198
+ readonly configPath?: string
199
+
200
+ readonly options: GeoSpecConfig
201
+
202
+ // Options for one trusted Node configuration load
203
+ LoadGeoSpecConfigOptions: {
204
+ readonly projectPath: string;
205
+ /** Explicit file, resolved relative to the project unless absolute. */
206
+ readonly configPath?: string;
207
+ /** Own defined fields override configuration without deep merging. */
208
+ readonly overrides?: GeoSpecConfig;
209
+ }
210
+
211
+ readonly projectPath: string
212
+
213
+ // Explicit file, resolved relative to the project unless absolute
214
+ readonly configPath?: string
215
+
216
+ // Own defined fields override configuration without deep merging
217
+ readonly overrides?: GeoSpecConfig
@@ -1,6 +1,6 @@
1
1
  # geospec — Types
2
2
 
3
- 91 top-level symbols. Signatures are verbatim typescript.
3
+ 90 top-level symbols. Signatures are verbatim typescript.
4
4
 
5
5
  // A model admitted by one live GeoSpec host scope
6
6
  GeoSpecSubject: {
@@ -29,6 +29,11 @@ GeoSpecAssertion: {
29
29
  report?: GeoSpecCanonicalClaimReport;
30
30
  /** The host load which admitted this assertion's subject; independent of equal geometry hashes. */
31
31
  loadId?: string;
32
+ /**
33
+ * The crop this assertion's subject was loaded with. Present only for a region load: the verdict
34
+ * holds for this millimetre box, never for the whole model.
35
+ */
36
+ region?: GeoSpecLoadRegion;
32
37
  /** Wall-clock cost of matcher evaluation in milliseconds (R1: budgeted matchers only). */
33
38
  durationMs?: number;
34
39
  }
@@ -54,6 +59,9 @@ GeoSpecAssertion: {
54
59
  // The host load which admitted this assertion's subject
55
60
  loadId?: string
56
61
 
62
+ // The crop this assertion's subject was loaded with
63
+ region?: GeoSpecLoadRegion
64
+
57
65
  // Wall-clock cost of matcher evaluation in milliseconds (R1
58
66
  durationMs?: number
59
67
 
@@ -126,10 +134,12 @@ GeoSpecBoundingBoxExpectation: {
126
134
 
127
135
  // Center-of-mass expectation accepted by `expectGeo(...).toHaveCenterOfMass(...)`
128
136
  GeoSpecCenterOfMassExpectation: {
137
+ /** Exact expected point in millimetres; per-axis ranges such as `{ greaterThan }` are not supported. */
129
138
  point: GeoSpecPointExpectation;
130
139
  tolerance?: number;
131
140
  }
132
141
 
142
+ // Exact expected point in millimetres
133
143
  point: GeoSpecPointExpectation
134
144
 
135
145
  tolerance?: number
@@ -179,6 +189,20 @@ GeoSpecCylindricalFaceExpectation: {
179
189
 
180
190
  tolerance?: number
181
191
 
192
+ // Per-chain options accepted by `expectGeo(subject, options)`
193
+ GeoSpecExpectOptions: {
194
+ /**
195
+ * Deterministic work-unit budget for every claim in this chain: a positive integer no
196
+ * greater than the host's maximum (default `geoSpecMaximumWorkUnitLimit`, 512 000 000). Omitted uses the subject's
197
+ * `loadModel` budget, then the host's, then the engine default. Raise it to retry a
198
+ * `MATCHER_TIMEOUT` refusal whose `details.used` exceeded `details.limit`.
199
+ */
200
+ readonly workUnitLimit?: number;
201
+ }
202
+
203
+ // Deterministic work-unit budget for every claim in this chain
204
+ readonly workUnitLimit?: number
205
+
182
206
  // Intentional component interference allowance accepted by `expectGeo(...).toHaveNoComponentInterference(...)`
183
207
  GeoSpecComponentInterferenceAllowance: {
184
208
  kind?: 'intentionalInterference';
@@ -1850,6 +1874,16 @@ CreateModelLoaderOptions: {
1850
1874
  // Angular tolerance in degrees used while meshing exact BRep evidence
1851
1875
  meshAngularToleranceDegrees?: number
1852
1876
 
1877
+ // Axis-aligned crop box in canonical Z-up millimetres
1878
+ GeoSpecLoadRegion: {
1879
+ readonly min: readonly [number, number, number];
1880
+ readonly max: readonly [number, number, number];
1881
+ }
1882
+
1883
+ readonly min: readonly [number, number, number]
1884
+
1885
+ readonly max: readonly [number, number, number]
1886
+
1853
1887
  // Geometry formats accepted by {@link import ('./load-model.js').loadModel}
1854
1888
  GeoSpecModelFormat: MeshFileFormat | 'step' | 'stp'
1855
1889
 
@@ -1865,8 +1899,8 @@ ManagedGeoSpecModelLoader: GeoSpecModelLoader & {
1865
1899
  dispose(): Promise<void>;
1866
1900
 
1867
1901
  // Runtime client surface consumed by `geospec/model`
1868
- // Remarks: GeoSpec accepts concrete Tau runtime clients from multiple call sites but only needs connection lifecycle and request-scoped documents. Keep this shape small so typed runtime clients do not have to widen their full generic method surface to GeoSpec's testing DSL. A client with `shutdown` is awaited through it when GeoSpec releases an owned runtime, so its host resources are closed before the caller (for example a worker thread) exits.
1869
- GeoSpecRuntimeClient: Pick<RuntimeClient, 'connect' | 'terminate'> & Partial<Pick<RuntimeClient, 'shutdown'>> & {
1902
+ // Remarks: GeoSpec accepts concrete Tau runtime clients from multiple call sites but only needs connection lifecycle and request-scoped documents. Keep this shape small so typed runtime clients do not have to widen their full generic method surface to GeoSpec's testing DSL. A client with `shutdown` is awaited through it when GeoSpec releases an owned runtime, so its host resources are closed before the caller (for example a worker thread) exits. A client with `snapshotSource` lets one run reuse an identical file load after confirming that the source closure it exported is unchanged.
1903
+ GeoSpecRuntimeClient: Pick<RuntimeClient, 'connect' | 'terminate'> & Partial<Pick<RuntimeClient, 'shutdown' | 'snapshotSource' | 'describe'>> & {
1870
1904
  open: (input: Pick<Parameters<RuntimeClient['open']>[0], 'source' | 'parameters' | 'stage' | 'watch' | 'signal'>) => Pick<ReturnType<RuntimeClient['open']>, 'export' | 'close'>;
1871
1905
  on?(event: 'telemetry', handler: (batch: {
1872
1906
  readonly entries: ReadonlyArray<{
@@ -1912,137 +1946,3 @@ GeoSpecRuntimeSourceAdapter: {
1912
1946
  projectPath?: string;
1913
1947
  file?: string;
1914
1948
  }): Promise<GeoSpecRuntimeClient>;
1915
-
1916
- // Inline code-CAD model load options
1917
- LoadModelCodeOptions: {
1918
- /** Source files keyed by project-relative path. */
1919
- code: Code;
1920
- /** Entry path to render from {@link code}. */
1921
- file: keyof Code & string;
1922
- /** Geometry format to export. Defaults to `glb`. */
1923
- format?: GeoSpecModelFormat;
1924
- /** Explicit parameters passed to the runtime. */
1925
- parameters?: Record<string, unknown>;
1926
- /** Runtime client or lazy runtime factory. */
1927
- runtime?: GeoSpecRuntimeClient | GeoSpecRuntimeClientFactory;
1928
- /** Source-specific runtime adapters, e.g. host-provided GPL-isolated kernels. */
1929
- sourceAdapters?: readonly GeoSpecRuntimeSourceAdapter[];
1930
- /** Project root used by runtime integrations. */
1931
- projectPath?: string;
1932
- /** STEP reader strategy used for STEP exports. */
1933
- stepStreaming?: StepStreamingMode;
1934
- /** Whether STEP loading should also produce mesh evidence. Defaults to true. */
1935
- mesh?: boolean;
1936
- /** Linear tolerance used while meshing exact BRep evidence. */
1937
- meshLinearTolerance?: number;
1938
- /** Angular tolerance in degrees used while meshing exact BRep evidence. */
1939
- meshAngularToleranceDegrees?: number;
1940
- }
1941
-
1942
- // Source files keyed by project-relative path
1943
- code: Code
1944
-
1945
- // Entry path to render from {@link code }
1946
- file: keyof Code & string
1947
-
1948
- // Geometry format to export
1949
- format?: GeoSpecModelFormat
1950
-
1951
- // Explicit parameters passed to the runtime
1952
- parameters?: Record<string, unknown>
1953
-
1954
- // Runtime client or lazy runtime factory
1955
- runtime?: GeoSpecRuntimeClient | GeoSpecRuntimeClientFactory
1956
-
1957
- // Source-specific runtime adapters, e.g
1958
- sourceAdapters?: readonly GeoSpecRuntimeSourceAdapter[]
1959
-
1960
- // Project root used by runtime integrations
1961
- projectPath?: string
1962
-
1963
- // STEP reader strategy used for STEP exports
1964
- stepStreaming?: StepStreamingMode
1965
-
1966
- // Whether STEP loading should also produce mesh evidence
1967
- mesh?: boolean
1968
-
1969
- // Linear tolerance used while meshing exact BRep evidence
1970
- meshLinearTolerance?: number
1971
-
1972
- // Angular tolerance in degrees used while meshing exact BRep evidence
1973
- meshAngularToleranceDegrees?: number
1974
-
1975
- // Filesystem-backed model load options
1976
- LoadModelFileOptions: {
1977
- /** Project-relative model file to render. */
1978
- file: string;
1979
- /** Project root used by runtime integrations. */
1980
- projectPath?: string;
1981
- /** Geometry format to export. Defaults to `glb`. */
1982
- format?: GeoSpecModelFormat;
1983
- /** Explicit parameters passed to the runtime. */
1984
- parameters?: Record<string, unknown>;
1985
- /** Runtime client or lazy runtime factory. */
1986
- runtime?: GeoSpecRuntimeClient | GeoSpecRuntimeClientFactory;
1987
- /** Source-specific runtime adapters, e.g. host-provided GPL-isolated kernels. */
1988
- sourceAdapters?: readonly GeoSpecRuntimeSourceAdapter[];
1989
- /** STEP reader strategy used for STEP exports. */
1990
- stepStreaming?: StepStreamingMode;
1991
- /** Whether STEP loading should also produce mesh evidence. Defaults to true. */
1992
- mesh?: boolean;
1993
- /** Linear tolerance used while meshing exact BRep evidence. */
1994
- meshLinearTolerance?: number;
1995
- /** Angular tolerance in degrees used while meshing exact BRep evidence. */
1996
- meshAngularToleranceDegrees?: number;
1997
- }
1998
-
1999
- // Project-relative model file to render
2000
- file: string
2001
-
2002
- // Project root used by runtime integrations
2003
- projectPath?: string
2004
-
2005
- // Geometry format to export
2006
- format?: GeoSpecModelFormat
2007
-
2008
- // Explicit parameters passed to the runtime
2009
- parameters?: Record<string, unknown>
2010
-
2011
- // Runtime client or lazy runtime factory
2012
- runtime?: GeoSpecRuntimeClient | GeoSpecRuntimeClientFactory
2013
-
2014
- // Source-specific runtime adapters, e.g
2015
- sourceAdapters?: readonly GeoSpecRuntimeSourceAdapter[]
2016
-
2017
- // STEP reader strategy used for STEP exports
2018
- stepStreaming?: StepStreamingMode
2019
-
2020
- // Whether STEP loading should also produce mesh evidence
2021
- mesh?: boolean
2022
-
2023
- // Linear tolerance used while meshing exact BRep evidence
2024
- meshLinearTolerance?: number
2025
-
2026
- // Angular tolerance in degrees used while meshing exact BRep evidence
2027
- meshAngularToleranceDegrees?: number
2028
-
2029
- // Options accepted by {@link import ('./load-model.js').loadModel}
2030
- LoadModelOptions: LoadModelSourceOptions | LoadModelCodeOptions<Code> | LoadModelFileOptions
2031
-
2032
- // Geometry format to export
2033
- format?: GeoSpecModelFormat
2034
-
2035
- // Explicit parameters passed to the runtime
2036
- parameters?: Record<string, unknown>
2037
-
2038
- // STEP reader strategy used for STEP exports
2039
- stepStreaming?: StepStreamingMode
2040
-
2041
- // Whether STEP loading should also produce mesh evidence
2042
- mesh?: boolean
2043
-
2044
- // Linear tolerance used while meshing exact BRep evidence
2045
- meshLinearTolerance?: number
2046
-
2047
- // Angular tolerance in degrees used while meshing exact BRep evidence
2048
- meshAngularToleranceDegrees?: number
@@ -4,22 +4,23 @@ export default Object.freeze([
4
4
  slug: "geospec-authoring",
5
5
  name: "GeoSpec authoring",
6
6
  description: "Guides canonical GeoSpec geometry tests in TypeScript or JavaScript for every Tau kernel. Use for *.geospec.ts and *.geospec.js tests.",
7
- version: "0.1.0-beta.2",
7
+ version: "0.1.0-beta.4",
8
8
  whenToUse: "Use before creating or editing *.geospec.ts or *.geospec.js tests, for a model in any kernel.",
9
- body: "---\nname: geospec-authoring\ndescription: Guides canonical GeoSpec geometry tests in TypeScript or JavaScript for every Tau kernel. Use for *.geospec.ts and *.geospec.js tests.\n---\n\n# GeoSpec authoring\n\nWrite tests before implementation; assert deterministic, measurable properties.\n\n## Test shape\n\n- Use `*.geospec.ts` or `*.geospec.js`. Import `describe`, `it` and `expectGeo` from `geospec`, and `loadModel` from `geospec/model`.\n- Await `loadModel`, then assert synchronously with `expectGeo(model)`. The host supplies the compiled binding; authoring does not select an engine.\n- Await or return the complete model-load chain from the test callback; detached future loads are not part of a completed test.\n- Omit `parameters` for model-code defaults; use `{ file, parameters }` for variants. Loaded subjects are opaque.\n\nCanonical TypeScript authoring:\n\n```ts\nimport { describe, expectGeo, it } from 'geospec';\nimport { loadModel } from 'geospec/model';\n\ndescribe('main geometry', () => {\n it('has the intended envelope', async () => {\n const model = await loadModel({ file: 'main.ts', parameters: { width: 120 } });\n expectGeo(model).toHaveBoundingBox({ size: { x: 120 }, tolerance: 1 });\n });\n});\n```\n\nSpecs are always TypeScript or JavaScript, whatever the model's kernel: `loadModel({ file })` evaluates `main.ts`, `main.tsx`, `main.py`, `main.scad`, `main.kcl` or `main.cs` through Tau's runtime. `test_model` discovers `*.geospec.ts` and `*.geospec.js` only.\n\nEvery matcher takes one expectation object:\n\n- Wrong: `expectGeo(model).toHaveVolume(5000, { tolerance: 5 })`. Correct: `expectGeo(model).toHaveVolume({ value: 5000, tolerance: 5 })`.\n- Wrong: `await expectGeo(model)…`. Correct: await `loadModel`, then assert synchronously.\n- Wrong: exact-feature matchers on a mesh kernel (Manifold, JSCAD, OpenSCAD, PicoGK, PicoVoxel). Correct: `toBeValidBrep`, `toHaveTopologyCounts`, the face, hole, pattern, chamfer, fillet and wall-thickness matchers, `toHaveStepUnits`, `toHaveProductStructure` and `toHaveVoidContinuity` need STEP BRep evidence and report unsupported on meshes; assert meshes with bounds, volume, surface area, connected components and `toBeWatertight`.\n\n## Coverage\n\nBounds and physical properties are insufficient. Cover major components, named features, variants, dimensions/positions, disjoint counts, closure, interference and supported exact features. Explicitly report unsupported requirements; proxies cannot fulfill them.\n\n- `toHaveBoundingBox`: size/position.\n- `toHaveConnectedComponents`: qualified material connectivity; visual touching cannot justify tolerance changes.\n- `toBeWatertight`: closed edge incidence, not manifold validity, fusion or material connectivity. Bounds prove none of these. Missing evidence is unsupported.\n- `toHaveSurfaceArea`, `toHaveVolume`, `toHaveCenterOfMass`, `toHaveMass`: physical measurements.\n- `toHaveNoComponentInterference`: overlap; allow deliberate press fits.\n- `loadModel({ file, format: 'step' })`: use BRep evidence for supported topology and feature assertions. Missing occurrence, interference, clearance, containment, lumen, wall, section or motion evidence is unsupported, not a pass or an envelope substitute.\n\nTest assemblies and independent units; preserve sibling coverage when adding files. Non-top-level geometry needs kernel export/invocation, not test removal.\n\nFix geometry at its root; never weaken tolerances, delete assertions, or reduce detail to pass.\n\n`public-api-index.md` covers the host and framework API; authoring needs only the Core API below and `api-*` files.\n\n## Core API\n\nThe symbols real Tau models use most, as verbatim declarations. Anything not shown is in the API reference below.\n\n### Functions\n\n```ts\n// Start a geometry assertion chain\nexport declare function expectGeo(subject: GeoSpecSubject): GeoSpecMatcher;\n\n// A model admitted by one live GeoSpec host scope\nGeoSpecSubject: {\n readonly [subjectBrand]: true\n}\n\n// Load a CAD model into GeoSpec evidence\nexport declare function loadModel<Code extends Record<string, string> = Record<string, string>>(_options: LoadModelOptions<Code>): Promise<GeoSpecSubject>;\n\n// Options accepted by {@link import ('./load-model.js').loadModel}\nLoadModelOptions: LoadModelSourceOptions | LoadModelCodeOptions<Code> | LoadModelFileOptions\n // Geometry format to export\n format?: GeoSpecModelFormat\n // Explicit parameters passed to the runtime\n parameters?: Record<string, unknown>\n // STEP reader strategy used for STEP exports\n stepStreaming?: StepStreamingMode\n // Whether STEP loading should also produce mesh evidence\n mesh?: boolean\n // Linear tolerance used while meshing exact BRep evidence\n meshLinearTolerance?: number\n // Angular tolerance in degrees used while meshing exact BRep evidence\n meshAngularToleranceDegrees?: number\n\n// Geometry formats accepted by {@link import ('./load-model.js').loadModel}\nGeoSpecModelFormat: MeshFileFormat | 'step' | 'stp'\n```\n\n### Types\n\n```ts\n// Assertion chain returned by `expectGeo(subject)`\nGeoSpecMatcher: {\n // Core-owned negation\n readonly not: Omit<GeoSpecMatcher, 'not'>\n // Assert the fixed rational plate contract\n toSatisfyRationalPlate(): GeoSpecAssertion;\n // Assert the fixed parallel-plane distance contract\n toSatisfyParallelPlaneDistance(): GeoSpecAssertion;\n // Assert axis-aligned bounds, size, or center for a loaded geometry subject\n toHaveBoundingBox(first: Vec3 | GeoSpecBoundingBoxExpectation, second?: Vec3): GeoSpecAssertion;\n // Assert how many spatially disjoint chunks the mesh contains\n toHaveConnectedComponents(expected: GeoSpecConnectedComponentsExpectation): GeoSpecAssertion;\n // Assert closed mesh edge incidence\n toBeWatertight(): GeoSpecAssertion;\n // Assert that separate assembly components do not occupy the same solid volume\n toHaveNoComponentInterference(expected?: GeoSpecComponentInterferenceExpectation): GeoSpecAssertion;\n // Assert that named assembly occurrences exist with expected counts and bounds\n toHaveAssemblyOccurrences(expected: GeoSpecAssemblyOccurrencesExpectation): GeoSpecAssertion;\n // Assert that selected entities satisfy declared spatial relationships\n toHaveSpatialRelationships(expected: GeoSpecSpatialRelationshipsExpectation): GeoSpecAssertion;\n // Assert rendered mesh evidence is internally trustworthy for downstream checks\n toHaveMeshIntegrity(expected: GeoSpecMeshIntegrityExpectation): GeoSpecAssertion;\n // Assert that the subject carries no diagnostics at the rejected severities\n toHaveNoDiagnostics(expected?: GeoSpecNoDiagnosticsExpectation): GeoSpecAssertion;\n // Assert total surface area, preferring exact BRep mass properties when available\n toHaveSurfaceArea(expected: GeoSpecSurfaceAreaExpectation): GeoSpecAssertion;\n // Assert enclosed volume, preferring exact BRep mass properties when available\n toHaveVolume(expected: GeoSpecVolumeExpectation): GeoSpecAssertion;\n // Assert mass derived from exact mass properties or volume times density\n toHaveMass(expected: GeoSpecMassExpectation): GeoSpecAssertion;\n // Assert the center of mass or mesh-derived centroid for a closed subject\n toHaveCenterOfMass(expected: GeoSpecCenterOfMassExpectation): GeoSpecAssertion;\n // Assert that exact BRep evidence reports a valid shape\n toBeValidBrep(expected?: GeoSpecValidBrepExpectation): GeoSpecAssertion;\n // Assert exact BRep topology counts\n toHaveTopologyCounts(expected: GeoSpecTopologyCountsExpectation): GeoSpecAssertion;\n // Assert the STEP unit evidence\n toHaveStepUnits(expected: GeoSpecStepUnitsExpectation): GeoSpecAssertion;\n // Assert STEP product-structure evidence\n toHaveProductStructure(expected: GeoSpecProductStructureExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a planar face matching the requested constraints\n toHavePlanarFace(expected: GeoSpecPlanarFaceExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a cylindrical face with the requested radius and axis\n toHaveCylindricalFace(expected: GeoSpecCylindricalFaceExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a circular hole matching diameter, center, and axis\n toHaveCircularHole(expected: GeoSpecCircularHoleExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a repeated circular-hole pattern\n toHaveCircularHolePattern(expected: GeoSpecCircularHolePatternExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a chamfer feature with the requested distance\n toHaveChamferFeature(expected: GeoSpecChamferFeatureExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a fillet feature with the requested radius\n toHaveFilletFeature(expected: GeoSpecFilletFeatureExpectation): GeoSpecAssertion;\n // Assert that BRep evidence reports a minimum wall thickness satisfying the expectation\n toHaveMinimumWallThickness(expected: GeoSpecMinimumWallThicknessExpectation): GeoSpecAssertion;\n // Assert that the declared waypoints share one connected void, stay isolated from the declared…\n toHaveVoidContinuity(expected: GeoSpecVoidContinuityExpectation): GeoSpecAssertion;\n}\n\n// Numeric 3D vector\nVec3: readonly [number, number, number]\n\n// Bounding-box expectation accepted by `expectGeo(...).toHaveBoundingBox(...)`\nGeoSpecBoundingBoxExpectation: {\n min?: Vec3 | Partial<Record<keyof GeoSpecAxisExpectation, GeoSpecNumericExpectation>>\n max?: Vec3 | Partial<Record<keyof GeoSpecAxisExpectation, GeoSpecNumericExpectation>>\n size?: Vec3 | Partial<Record<keyof GeoSpecAxisExpectation, GeoSpecNumericExpectation>>\n center?: Vec3 | Partial<Record<keyof GeoSpecAxisExpectation, GeoSpecNumericExpectation>>\n tolerance?: number\n}\n\n// Connected-components expectation accepted by `expectGeo(...).toHaveConnectedComponents(...)`\nGeoSpecConnectedComponentsExpectation: {\n count: number\n tolerance?: number\n toleranceMm?: number\n}\n\n// Component-interference expectation accepted by `expectGeo(...).toHaveNoComponentInterference(...)`\nGeoSpecComponentInterferenceExpectation: {\n tolerance?: number\n pairs?: GeoSpecComponentInterferencePairExpectation[]\n allowances?: GeoSpecComponentInterferenceAllowance[]\n}\n\n// Assembly occurrence expectation accepted by `expectGeo(...).toHaveAssemblyOccurrences(...)`\nGeoSpecAssemblyOccurrencesExpectation: {\n occurrences: GeoSpecAssemblyOccurrenceExpectation[]\n uniqueNames?: boolean\n}\n\n// Spatial relationship expectation accepted by `expectGeo(...).toHaveSpatialRelationships(...)`\nGeoSpecSpatialRelationshipsExpectation: {\n relationships: GeoSpecSpatialRelationshipExpectation[]\n}\n\n// Mesh integrity expectation accepted by `expectGeo(...).toHaveMeshIntegrity(...)`\nGeoSpecMeshIntegrityExpectation: {\n finitePositions?: boolean\n degenerateTriangles?: {\n count?: number;\n maxCount?: number;\n areaTolerance?: number;\n }\n duplicateFaces?: {\n count?: number;\n maxCount?: number;\n }\n watertight?: boolean\n triangleCount?: GeoSpecNumericExpectation\n}\n\n// Diagnostic severities rejected by `expectGeo(...).toHaveNoDiagnostics(...)`\nGeoSpecNoDiagnosticsExpectation: {\n severities?: Array<GeometryDiagnostic['severity']>\n}\n\n// Surface-area expectation accepted by `expectGeo(...).toHaveSurfaceArea(...)`\nGeoSpecSurfaceAreaExpectation: {\n value: number | GeoSpecNumericExpectation\n tolerance?: number\n}\n\n// Volume expectation accepted by `expectGeo(...).toHaveVolume(...)`\nGeoSpecVolumeExpectation: {\n value: number | GeoSpecNumericExpectation\n tolerance?: number\n}\n\n// Mass expectation accepted by `expectGeo(...).toHaveMass(...)`\nGeoSpecMassExpectation: {\n value: number | GeoSpecNumericExpectation\n density?: number\n tolerance?: number\n}\n\n// Center-of-mass expectation accepted by `expectGeo(...).toHaveCenterOfMass(...)`\nGeoSpecCenterOfMassExpectation: {\n point: GeoSpecPointExpectation\n tolerance?: number\n}\n\n// Exact BRep validity expectation accepted by `expectGeo(...).toBeValidBrep(...)`\nGeoSpecValidBrepExpectation: {\n maxTolerance?: number\n freeBounds?: {\n count?: GeoSpecNumericExpectation;\n }\n minEdgeLength?: number\n sameParameter?: boolean\n closedShells?: boolean\n closedWires?: boolean\n}\n\n// Topology-count expectation accepted by `expectGeo(...).toHaveTopologyCounts(...)`\nGeoSpecTopologyCountsExpectation: {\n vertices?: GeoSpecNumericExpectation\n edges?: GeoSpecNumericExpectation\n wires?: GeoSpecNumericExpectation\n faces?: GeoSpecNumericExpectation\n shells?: GeoSpecNumericExpectation\n solids?: GeoSpecNumericExpectation\n compounds?: GeoSpecNumericExpectation\n tolerance?: number\n}\n\n// STEP unit expectation accepted by `expectGeo(...).toHaveStepUnits(...)`\nGeoSpecStepUnitsExpectation: {\n unit: string\n}\n\n// Product-structure expectation accepted by `expectGeo(...).toHaveProductStructure(...)`\nGeoSpecProductStructureExpectation: {\n names?: string[]\n count?: GeoSpecNumericExpectation\n}\n\n// Planar-face expectation accepted by `expectGeo(...).toHavePlanarFace(...)`\nGeoSpecPlanarFaceExpectation: {\n normal: GeoSpecPointExpectation\n offset: number\n area?: GeoSpecNumericExpectation\n tolerance?: number\n}\n\n// Cylindrical-face expectation accepted by `expectGeo(...).toHaveCylindricalFace(...)`\nGeoSpecCylindricalFaceExpectation: {\n radius: number\n axis: 'x' | 'y' | 'z'\n tolerance?: number\n}\n\n// Circular-hole expectation accepted by `expectGeo(...).toHaveCircularHole(...)`\nGeoSpecCircularHoleExpectation: {\n diameter: number\n through?: boolean\n axis?: 'x' | 'y' | 'z'\n center?: GeoSpecPointExpectation\n tolerance?: number\n}\n\n// Circular-hole-pattern expectation accepted by `expectGeo(...).toHaveCircularHolePattern(...)`\nGeoSpecCircularHolePatternExpectation: {\n count: number\n holeDiameter: number\n boltCircleDiameter?: number\n axis?: 'x' | 'y' | 'z'\n center?: GeoSpecPointExpectation\n tolerance?: number\n}\n\n// Chamfer-feature expectation accepted by `expectGeo(...).toHaveChamferFeature(...)`\nGeoSpecChamferFeatureExpectation: {\n distance: number\n selection?: string\n tolerance?: number\n}\n\n// Fillet-feature expectation accepted by `expectGeo(...).toHaveFilletFeature(...)`\nGeoSpecFilletFeatureExpectation: {\n radius: number\n selection?: string\n tolerance?: number\n}\n\n// Minimum-wall-thickness expectation accepted by `expectGeo(...).toHaveMinimumWallThickness(...)`\nGeoSpecMinimumWallThicknessExpectation: {\n value: GeoSpecNumericExpectation\n tolerance?: number\n}\n\n// Void-continuity expectation accepted by `expectGeo(...).toHaveVoidContinuity(...)`\nGeoSpecVoidContinuityExpectation: {\n // Ordered waypoints (>= 1) known to lie in the void being proven\n path: GeoSpecVoidWaypoint[]\n // Occurrence names whose solids bound the void\n material?: string[]\n // Minimum required bottleneck cross-section (mm²), sampled\n minCrossSection?: number\n // Points that must NOT be reachable from the path void (isolation claim)\n isolatedFrom?: Vec3[]\n // Region bounded for the proof (subject frame)\n bounds?: {\n min: Vec3;\n max: Vec3;\n }\n}\n\n// Axis-keyed numeric expectation used by high-level geometry matchers\nGeoSpecAxisExpectation: {\n x?: number\n y?: number\n z?: number\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// A pair-specific component-interference check accepted by `expectGeo(...).toHaveNoComponentInterference(...)`\nGeoSpecComponentInterferencePairExpectation: {\n left: GeoSpecComponentSelector\n right: GeoSpecComponentSelector\n}\n\n// Intentional component interference allowance accepted by `expectGeo(...).toHaveNoComponentInterference(...)`\nGeoSpecComponentInterferenceAllowance: {\n kind?: 'intentionalInterference'\n left: GeoSpecComponentSelector\n right: GeoSpecComponentSelector\n maxVolume?: number\n reason: string\n}\n\n// Assembly occurrence rule accepted by `expectGeo(...).toHaveAssemblyOccurrences(...)`\nGeoSpecAssemblyOccurrenceExpectation: {\n name: GeoSpecComponentSelector\n count?: GeoSpecNumericExpectation\n bounds?: {\n within?: GeoSpecComponentSelector;\n min?: Vec3 | GeoSpecAxisExpectation;\n max?: Vec3 | GeoSpecAxisExpectation;\n center?: GeoSpecPointExpectation;\n tolerance?: number;\n }\n}\n\n// One spatial relationship accepted by `expectGeo(...).toHaveSpatialRelationships(...)`\nGeoSpecSpatialRelationshipExpectation: {\n id?: string\n kind: 'contact' | 'clearance' | 'coaxial' | 'concentric' | 'coplanar' | 'parallel' | 'perpendicular' | 'angle' | 'containment' | 'insertion' | 'interference'\n subject: GeoSpecGeometrySelector\n target: GeoSpecGeometrySelector\n tolerance?: number\n angularToleranceDegrees?: number\n // Expected angle in degrees for `kind\n angleDegrees?: number\n // Declared insertion axis (subject-frame direction) for `kind\n axis?: Vec3\n min?: number\n max?: number\n minVolume?: number\n maxVolume?: number\n reason?: string\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// Diagnostic emitted by GeoSpec loaders, analyzers, and matchers\nGeometryDiagnostic: {\n code: KernelIssueCode | (string & {})\n severity: 'error' | 'warning' | 'info'\n message: string\n suggestion?: string\n spatial?: {\n min?: Vec3;\n max?: Vec3;\n center?: Vec3;\n }\n details?: unknown\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// Point expectation accepted by center and feature matchers\nGeoSpecPointExpectation: Vec3 | GeoSpecAxisExpectation\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n```\n\n## API reference\n\nTo read any other signature, grep the skill directory for the name followed by `(` (or the bare type name): each hit is the declaration line and names its file; read a few lines around it for overloads and parameter notes. `api-index.md` lists all 345 symbols by file.\n\n- `api-functions.md` — Functions\n- `api-constants.md` — Constants\n- `api-types.md` — Types\n- `api-classes.md` — Classes\n\nRead ranges, not whole files. Never copy a reference into a source file.\n",
10
- fingerprint: "10aa6c64b966031d8ceee32a96d89e73119987cadaf52e134052018bdfe42d4c",
9
+ body: "---\nname: geospec-authoring\ndescription: Guides canonical GeoSpec geometry tests in TypeScript or JavaScript for every Tau kernel. Use for *.geospec.ts and *.geospec.js tests.\n---\n\n# GeoSpec authoring\n\nWrite tests before implementation; assert deterministic, measurable properties.\n\n## Test shape\n\n- Use `*.geospec.ts` or `*.geospec.js`. Import `describe`, `it` and `expectGeo` from `geospec`, and `loadModel` from `geospec/model`.\n- Await `loadModel`, then assert synchronously with `expectGeo(model)`. The host supplies the compiled binding; authoring does not select an engine.\n- Await or return the complete model-load chain from the test callback; detached future loads are not part of a completed test.\n- Omit `parameters` for model-code defaults; use `{ file, parameters }` for variants. Loaded subjects are opaque.\n\nCanonical TypeScript authoring:\n\n```ts\nimport { describe, expectGeo, it } from 'geospec';\nimport { loadModel } from 'geospec/model';\n\ndescribe('main geometry', () => {\n it('has the intended envelope', async () => {\n const model = await loadModel({ file: 'main.ts', parameters: { width: 120 } });\n expectGeo(model).toHaveBoundingBox({ size: { x: 120 }, tolerance: 1 });\n });\n});\n```\n\nSpecs are always TypeScript or JavaScript, whatever the model's kernel: `loadModel({ file })` evaluates `main.ts`, `main.tsx`, `main.py`, `main.scad`, `main.kcl` or `main.cs` through Tau's runtime. `test_model` discovers `*.geospec.ts` and `*.geospec.js` only.\n\nEvery matcher takes one expectation object:\n\n- Wrong: `expectGeo(model).toHaveVolume(5000, { tolerance: 5 })`. Correct: `expectGeo(model).toHaveVolume({ value: 5000, tolerance: 5 })`.\n- Wrong: `await expectGeo(model)…`. Correct: await `loadModel`, then assert synchronously.\n- Wrong: exact-feature matchers on a mesh kernel (Manifold, JSCAD, OpenSCAD, PicoGK, PicoVoxel). Correct: `toBeValidBrep`, `toHaveTopologyCounts`, the face, hole, pattern, chamfer, fillet and wall-thickness matchers, `toHaveStepUnits`, `toHaveProductStructure` and `toHaveVoidContinuity` need STEP BRep evidence and report unsupported on meshes; assert meshes with bounds, volume, surface area, connected components and `toBeWatertight`.\n\n## Loads and budgets\n\n- GeoSpec has no `beforeAll`. Write each `loadModel` inside its own `it`: within one run, identical loads (same file or code, parameters, format, tolerances and region) share one export and one admission. Each load keeps its own `loadId` and records `reused: true`, and a file is reused only while its source closure is unchanged.\n- `loadModel({ file, workUnitLimit })` sets the default claim budget for that subject, and `expectGeo(model, { workUnitLimit })` overrides it for one chain. The budget is a positive integer no greater than 512000000. A `MATCHER_TIMEOUT` refusal reports `details.limit` and, when measured, `details.used`; raise the budget within the bound or simplify the model, and never treat the refusal as a pass.\n- `loadModel({ file, region: { min: [x, y, z], max: [x, y, z] } })` makes a separate claim about one millimetre box, never a stand-in for a whole-model claim. The kernel crops before export (PicoVoxel trims Voxels parts), and other kernels, STEP loads and unconfirmed crops refuse with a typed diagnostic. A cropped subject answers only bounding box, volume, surface area, mass and center of mass of its region, and its assertions record the region. Every other matcher on it refuses with `GEOSPEC_REGION_WHOLE_MODEL_CLAIM`. Name the region in the test, and keep whole-model claims on whole-model loads.\n- A host or engine limit leaves a claim undecided, never false. Keep the model as designed: never coarsen, shrink or crop it to fit. Raise `workUnitLimit` or `testTimeout` within the host's maximum, which the host can raise, or report the claim as not decided at this capacity.\n- `toHaveCenterOfMass({ point, tolerance })` takes an exact point. Per-axis ranges such as `{ y: { greaterThan: 1 } }` are refused.\n\n## Coverage\n\nBounds and physical properties are insufficient. Cover major components, named features, variants, dimensions/positions, disjoint counts, closure, interference and supported exact features. Explicitly report unsupported requirements; proxies cannot fulfill them.\n\n- `toHaveBoundingBox`: size/position.\n- `toHaveConnectedComponents`: qualified material connectivity; visual touching cannot justify tolerance changes.\n- `toBeWatertight`: closed edge incidence, not manifold validity, fusion or material connectivity. Bounds prove none of these. Missing evidence is unsupported.\n- `toHaveSurfaceArea`, `toHaveVolume`, `toHaveCenterOfMass`, `toHaveMass`: physical measurements.\n- `toHaveNoComponentInterference`: overlap; allow deliberate press fits.\n- `loadModel({ file, format: 'step' })`: use BRep evidence for supported topology and feature assertions. Missing occurrence, interference, clearance, containment, lumen, wall, section or motion evidence is unsupported, not a pass or an envelope substitute.\n\nTest assemblies and independent units; preserve sibling coverage when adding files. Non-top-level geometry needs kernel export/invocation, not test removal.\n\nFix geometry at its root; never weaken tolerances, delete assertions, or reduce detail to pass.\n\n`public-api-index.md` covers the host and framework API; authoring needs only the Core API below and `api-*` files.\n\n## Core API\n\nThe symbols real Tau models use most, as verbatim declarations. Anything not shown is in the API reference below.\n\n### Functions\n\n```ts\n// Start a geometry assertion chain\nexport declare function expectGeo(subject: GeoSpecSubject, options?: GeoSpecExpectOptions): GeoSpecMatcher;\n\n// A model admitted by one live GeoSpec host scope\nGeoSpecSubject: {\n readonly [subjectBrand]: true\n}\n\n// Per-chain options accepted by `expectGeo(subject, options)`\nGeoSpecExpectOptions: {\n // Deterministic work-unit budget for every claim in this chain\n readonly workUnitLimit?: number\n}\n\n// Load a CAD model into GeoSpec evidence\nexport declare function loadModel<Code extends Record<string, string> = Record<string, string>>(_options: LoadModelOptions<Code>): Promise<GeoSpecSubject>;\n\n// Options accepted by {@link import ('./load-model.js').loadModel}\nLoadModelOptions: LoadModelSourceOptions | LoadModelCodeOptions<Code> | LoadModelFileOptions\n // Geometry format to export\n format?: GeoSpecModelFormat\n // Explicit parameters passed to the runtime\n parameters?: Record<string, unknown>\n // STEP reader strategy used for STEP exports\n stepStreaming?: StepStreamingMode\n // Whether STEP loading should also produce mesh evidence\n mesh?: boolean\n // Linear tolerance used while meshing exact BRep evidence\n meshLinearTolerance?: number\n // Angular tolerance in degrees used while meshing exact BRep evidence\n meshAngularToleranceDegrees?: number\n // Default work-unit budget for every claim on this subject\n workUnitLimit?: number\n\n// Geometry formats accepted by {@link import ('./load-model.js').loadModel}\nGeoSpecModelFormat: MeshFileFormat | 'step' | 'stp'\n```\n\n### Types\n\n```ts\n// Assertion chain returned by `expectGeo(subject)`\nGeoSpecMatcher: {\n // Core-owned negation\n readonly not: Omit<GeoSpecMatcher, 'not'>\n // Assert the fixed rational plate contract\n toSatisfyRationalPlate(): GeoSpecAssertion;\n // Assert the fixed parallel-plane distance contract\n toSatisfyParallelPlaneDistance(): GeoSpecAssertion;\n // Assert axis-aligned bounds, size, or center for a loaded geometry subject\n toHaveBoundingBox(first: Vec3 | GeoSpecBoundingBoxExpectation, second?: Vec3): GeoSpecAssertion;\n // Assert how many spatially disjoint chunks the mesh contains\n toHaveConnectedComponents(expected: GeoSpecConnectedComponentsExpectation): GeoSpecAssertion;\n // Assert closed mesh edge incidence\n toBeWatertight(): GeoSpecAssertion;\n // Assert that separate assembly components do not occupy the same solid volume\n toHaveNoComponentInterference(expected?: GeoSpecComponentInterferenceExpectation): GeoSpecAssertion;\n // Assert that named assembly occurrences exist with expected counts and bounds\n toHaveAssemblyOccurrences(expected: GeoSpecAssemblyOccurrencesExpectation): GeoSpecAssertion;\n // Assert that selected entities satisfy declared spatial relationships\n toHaveSpatialRelationships(expected: GeoSpecSpatialRelationshipsExpectation): GeoSpecAssertion;\n // Assert rendered mesh evidence is internally trustworthy for downstream checks\n toHaveMeshIntegrity(expected: GeoSpecMeshIntegrityExpectation): GeoSpecAssertion;\n // Assert that the subject carries no diagnostics at the rejected severities\n toHaveNoDiagnostics(expected?: GeoSpecNoDiagnosticsExpectation): GeoSpecAssertion;\n // Assert total surface area, preferring exact BRep mass properties when available\n toHaveSurfaceArea(expected: GeoSpecSurfaceAreaExpectation): GeoSpecAssertion;\n // Assert enclosed volume, preferring exact BRep mass properties when available\n toHaveVolume(expected: GeoSpecVolumeExpectation): GeoSpecAssertion;\n // Assert mass derived from exact mass properties or volume times density\n toHaveMass(expected: GeoSpecMassExpectation): GeoSpecAssertion;\n // Assert the center of mass or mesh-derived centroid for a closed subject\n toHaveCenterOfMass(expected: GeoSpecCenterOfMassExpectation): GeoSpecAssertion;\n // Assert that exact BRep evidence reports a valid shape\n toBeValidBrep(expected?: GeoSpecValidBrepExpectation): GeoSpecAssertion;\n // Assert exact BRep topology counts\n toHaveTopologyCounts(expected: GeoSpecTopologyCountsExpectation): GeoSpecAssertion;\n // Assert the STEP unit evidence\n toHaveStepUnits(expected: GeoSpecStepUnitsExpectation): GeoSpecAssertion;\n // Assert STEP product-structure evidence\n toHaveProductStructure(expected: GeoSpecProductStructureExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a planar face matching the requested constraints\n toHavePlanarFace(expected: GeoSpecPlanarFaceExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a cylindrical face with the requested radius and axis\n toHaveCylindricalFace(expected: GeoSpecCylindricalFaceExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a circular hole matching diameter, center, and axis\n toHaveCircularHole(expected: GeoSpecCircularHoleExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a repeated circular-hole pattern\n toHaveCircularHolePattern(expected: GeoSpecCircularHolePatternExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a chamfer feature with the requested distance\n toHaveChamferFeature(expected: GeoSpecChamferFeatureExpectation): GeoSpecAssertion;\n // Assert that BRep evidence contains a fillet feature with the requested radius\n toHaveFilletFeature(expected: GeoSpecFilletFeatureExpectation): GeoSpecAssertion;\n // Assert that BRep evidence reports a minimum wall thickness satisfying the expectation\n toHaveMinimumWallThickness(expected: GeoSpecMinimumWallThicknessExpectation): GeoSpecAssertion;\n // Assert that the declared waypoints share one connected void, stay isolated from the declared…\n toHaveVoidContinuity(expected: GeoSpecVoidContinuityExpectation): GeoSpecAssertion;\n}\n\n// Numeric 3D vector\nVec3: readonly [number, number, number]\n\n// Bounding-box expectation accepted by `expectGeo(...).toHaveBoundingBox(...)`\nGeoSpecBoundingBoxExpectation: {\n min?: Vec3 | Partial<Record<keyof GeoSpecAxisExpectation, GeoSpecNumericExpectation>>\n max?: Vec3 | Partial<Record<keyof GeoSpecAxisExpectation, GeoSpecNumericExpectation>>\n size?: Vec3 | Partial<Record<keyof GeoSpecAxisExpectation, GeoSpecNumericExpectation>>\n center?: Vec3 | Partial<Record<keyof GeoSpecAxisExpectation, GeoSpecNumericExpectation>>\n tolerance?: number\n}\n\n// Connected-components expectation accepted by `expectGeo(...).toHaveConnectedComponents(...)`\nGeoSpecConnectedComponentsExpectation: {\n count: number\n tolerance?: number\n toleranceMm?: number\n}\n\n// Component-interference expectation accepted by `expectGeo(...).toHaveNoComponentInterference(...)`\nGeoSpecComponentInterferenceExpectation: {\n tolerance?: number\n pairs?: GeoSpecComponentInterferencePairExpectation[]\n allowances?: GeoSpecComponentInterferenceAllowance[]\n}\n\n// Assembly occurrence expectation accepted by `expectGeo(...).toHaveAssemblyOccurrences(...)`\nGeoSpecAssemblyOccurrencesExpectation: {\n occurrences: GeoSpecAssemblyOccurrenceExpectation[]\n uniqueNames?: boolean\n}\n\n// Spatial relationship expectation accepted by `expectGeo(...).toHaveSpatialRelationships(...)`\nGeoSpecSpatialRelationshipsExpectation: {\n relationships: GeoSpecSpatialRelationshipExpectation[]\n}\n\n// Mesh integrity expectation accepted by `expectGeo(...).toHaveMeshIntegrity(...)`\nGeoSpecMeshIntegrityExpectation: {\n finitePositions?: boolean\n degenerateTriangles?: {\n count?: number;\n maxCount?: number;\n areaTolerance?: number;\n }\n duplicateFaces?: {\n count?: number;\n maxCount?: number;\n }\n watertight?: boolean\n triangleCount?: GeoSpecNumericExpectation\n}\n\n// Diagnostic severities rejected by `expectGeo(...).toHaveNoDiagnostics(...)`\nGeoSpecNoDiagnosticsExpectation: {\n severities?: Array<GeometryDiagnostic['severity']>\n}\n\n// Surface-area expectation accepted by `expectGeo(...).toHaveSurfaceArea(...)`\nGeoSpecSurfaceAreaExpectation: {\n value: number | GeoSpecNumericExpectation\n tolerance?: number\n}\n\n// Volume expectation accepted by `expectGeo(...).toHaveVolume(...)`\nGeoSpecVolumeExpectation: {\n value: number | GeoSpecNumericExpectation\n tolerance?: number\n}\n\n// Mass expectation accepted by `expectGeo(...).toHaveMass(...)`\nGeoSpecMassExpectation: {\n value: number | GeoSpecNumericExpectation\n density?: number\n tolerance?: number\n}\n\n// Center-of-mass expectation accepted by `expectGeo(...).toHaveCenterOfMass(...)`\nGeoSpecCenterOfMassExpectation: {\n // Exact expected point in millimetres\n point: GeoSpecPointExpectation\n tolerance?: number\n}\n\n// Exact BRep validity expectation accepted by `expectGeo(...).toBeValidBrep(...)`\nGeoSpecValidBrepExpectation: {\n maxTolerance?: number\n freeBounds?: {\n count?: GeoSpecNumericExpectation;\n }\n minEdgeLength?: number\n sameParameter?: boolean\n closedShells?: boolean\n closedWires?: boolean\n}\n\n// Topology-count expectation accepted by `expectGeo(...).toHaveTopologyCounts(...)`\nGeoSpecTopologyCountsExpectation: {\n vertices?: GeoSpecNumericExpectation\n edges?: GeoSpecNumericExpectation\n wires?: GeoSpecNumericExpectation\n faces?: GeoSpecNumericExpectation\n shells?: GeoSpecNumericExpectation\n solids?: GeoSpecNumericExpectation\n compounds?: GeoSpecNumericExpectation\n tolerance?: number\n}\n\n// STEP unit expectation accepted by `expectGeo(...).toHaveStepUnits(...)`\nGeoSpecStepUnitsExpectation: {\n unit: string\n}\n\n// Product-structure expectation accepted by `expectGeo(...).toHaveProductStructure(...)`\nGeoSpecProductStructureExpectation: {\n names?: string[]\n count?: GeoSpecNumericExpectation\n}\n\n// Planar-face expectation accepted by `expectGeo(...).toHavePlanarFace(...)`\nGeoSpecPlanarFaceExpectation: {\n normal: GeoSpecPointExpectation\n offset: number\n area?: GeoSpecNumericExpectation\n tolerance?: number\n}\n\n// Cylindrical-face expectation accepted by `expectGeo(...).toHaveCylindricalFace(...)`\nGeoSpecCylindricalFaceExpectation: {\n radius: number\n axis: 'x' | 'y' | 'z'\n tolerance?: number\n}\n\n// Circular-hole expectation accepted by `expectGeo(...).toHaveCircularHole(...)`\nGeoSpecCircularHoleExpectation: {\n diameter: number\n through?: boolean\n axis?: 'x' | 'y' | 'z'\n center?: GeoSpecPointExpectation\n tolerance?: number\n}\n\n// Circular-hole-pattern expectation accepted by `expectGeo(...).toHaveCircularHolePattern(...)`\nGeoSpecCircularHolePatternExpectation: {\n count: number\n holeDiameter: number\n boltCircleDiameter?: number\n axis?: 'x' | 'y' | 'z'\n center?: GeoSpecPointExpectation\n tolerance?: number\n}\n\n// Chamfer-feature expectation accepted by `expectGeo(...).toHaveChamferFeature(...)`\nGeoSpecChamferFeatureExpectation: {\n distance: number\n selection?: string\n tolerance?: number\n}\n\n// Fillet-feature expectation accepted by `expectGeo(...).toHaveFilletFeature(...)`\nGeoSpecFilletFeatureExpectation: {\n radius: number\n selection?: string\n tolerance?: number\n}\n\n// Minimum-wall-thickness expectation accepted by `expectGeo(...).toHaveMinimumWallThickness(...)`\nGeoSpecMinimumWallThicknessExpectation: {\n value: GeoSpecNumericExpectation\n tolerance?: number\n}\n\n// Void-continuity expectation accepted by `expectGeo(...).toHaveVoidContinuity(...)`\nGeoSpecVoidContinuityExpectation: {\n // Ordered waypoints (>= 1) known to lie in the void being proven\n path: GeoSpecVoidWaypoint[]\n // Occurrence names whose solids bound the void\n material?: string[]\n // Minimum required bottleneck cross-section (mm²), sampled\n minCrossSection?: number\n // Points that must NOT be reachable from the path void (isolation claim)\n isolatedFrom?: Vec3[]\n // Region bounded for the proof (subject frame)\n bounds?: {\n min: Vec3;\n max: Vec3;\n }\n}\n\n// Axis-keyed numeric expectation used by high-level geometry matchers\nGeoSpecAxisExpectation: {\n x?: number\n y?: number\n z?: number\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// A pair-specific component-interference check accepted by `expectGeo(...).toHaveNoComponentInterference(...)`\nGeoSpecComponentInterferencePairExpectation: {\n left: GeoSpecComponentSelector\n right: GeoSpecComponentSelector\n}\n\n// Intentional component interference allowance accepted by `expectGeo(...).toHaveNoComponentInterference(...)`\nGeoSpecComponentInterferenceAllowance: {\n kind?: 'intentionalInterference'\n left: GeoSpecComponentSelector\n right: GeoSpecComponentSelector\n maxVolume?: number\n reason: string\n}\n\n// Assembly occurrence rule accepted by `expectGeo(...).toHaveAssemblyOccurrences(...)`\nGeoSpecAssemblyOccurrenceExpectation: {\n name: GeoSpecComponentSelector\n count?: GeoSpecNumericExpectation\n bounds?: {\n within?: GeoSpecComponentSelector;\n min?: Vec3 | GeoSpecAxisExpectation;\n max?: Vec3 | GeoSpecAxisExpectation;\n center?: GeoSpecPointExpectation;\n tolerance?: number;\n }\n}\n\n// One spatial relationship accepted by `expectGeo(...).toHaveSpatialRelationships(...)`\nGeoSpecSpatialRelationshipExpectation: {\n id?: string\n kind: 'contact' | 'clearance' | 'coaxial' | 'concentric' | 'coplanar' | 'parallel' | 'perpendicular' | 'angle' | 'containment' | 'insertion' | 'interference'\n subject: GeoSpecGeometrySelector\n target: GeoSpecGeometrySelector\n tolerance?: number\n angularToleranceDegrees?: number\n // Expected angle in degrees for `kind\n angleDegrees?: number\n // Declared insertion axis (subject-frame direction) for `kind\n axis?: Vec3\n min?: number\n max?: number\n minVolume?: number\n maxVolume?: number\n reason?: string\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// Diagnostic emitted by GeoSpec loaders, analyzers, and matchers\nGeometryDiagnostic: {\n code: KernelIssueCode | (string & {})\n severity: 'error' | 'warning' | 'info'\n message: string\n suggestion?: string\n spatial?: {\n min?: Vec3;\n max?: Vec3;\n center?: Vec3;\n }\n details?: unknown\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n\n// Point expectation accepted by center and feature matchers\nGeoSpecPointExpectation: Vec3 | GeoSpecAxisExpectation\n\n// Shared scalar expectation used by geometry measurements\nGeoSpecNumericExpectation: number | {\n value?: number;\n greaterThan?: number;\n greaterThanOrEqual?: number;\n lessThan?: number;\n lessThanOrEqual?: number;\n}\n```\n\n## API reference\n\nTo read any other signature, grep the skill directory for the name followed by `(` (or the bare type name): each hit is the declaration line and names its file; read a few lines around it for overloads and parameter notes. `api-index.md` lists all 360 symbols by file.\n\n- `api-functions.md` — Functions\n- `api-constants.md` — Constants\n- `api-types.md` — Types\n- `api-classes.md` — Classes\n\nRead ranges, not whole files. Never copy a reference into a source file.\n",
10
+ fingerprint: "3a3a6d4c418ddabaf3f17bf34e608b5a4662666c631c43f9c3004f7a52630ade",
11
11
  files: Object.freeze([
12
- Object.freeze({ path: "SKILL.md", url: new URL("./geospec-authoring/SKILL.md", import.meta.url).href, byteLength: 19557, lineCount: 497, contentKind: 'text', mediaType: 'text/markdown', sha256: "3629db0e425baa16580ac06a585d75c60bb1f0ce3c84a6e998dea0c885a9e339" }),
13
- Object.freeze({ path: "api-index.md", url: new URL("./geospec-authoring/api-index.md", import.meta.url).href, byteLength: 26637, lineCount: 363, contentKind: 'text', mediaType: 'text/markdown', sha256: "af8a4e3de45341da5f7d7f027a8c3c5b12c590f31bfc444f11c6516c9ef43e6a" }),
14
- Object.freeze({ path: "api-functions.md", url: new URL("./geospec-authoring/api-functions.md", import.meta.url).href, byteLength: 2102, lineCount: 50, contentKind: 'text', mediaType: 'text/markdown', sha256: "ab1388501a1bc433d54677749e0605d0aabde50b9237fdf84f50b31bd21a520d" }),
15
- Object.freeze({ path: "api-constants.md", url: new URL("./geospec-authoring/api-constants.md", import.meta.url).href, byteLength: 263, lineCount: 7, contentKind: 'text', mediaType: 'text/markdown', sha256: "3d59d19ff3e21072f567f5291047db0cbceed21f5e81bbad395f7c6dd56e393f" }),
16
- Object.freeze({ path: "api-types.md", url: new URL("./geospec-authoring/api-types.md", import.meta.url).href, byteLength: 55337, lineCount: 1701, contentKind: 'text', mediaType: 'text/markdown', sha256: "26199c8caca04fe0ba77c9837f362909275a0c450420bb871a73d27b6d5ce8c2" }),
12
+ Object.freeze({ path: "SKILL.md", url: new URL("./geospec-authoring/SKILL.md", import.meta.url).href, byteLength: 21212, lineCount: 496, contentKind: 'text', mediaType: 'text/markdown', sha256: "d4197494f74a117493090401e3e4c082781f480d7d82637eaf5de1e816b52eb1" }),
13
+ Object.freeze({ path: "api-index.md", url: new URL("./geospec-authoring/api-index.md", import.meta.url).href, byteLength: 28120, lineCount: 378, contentKind: 'text', mediaType: 'text/markdown', sha256: "8d788c51fbf6962558f143486c9fe5495bb73ba9f5b8f7121449016d6e136d3a" }),
14
+ Object.freeze({ path: "api-functions.md", url: new URL("./geospec-authoring/api-functions.md", import.meta.url).href, byteLength: 2549, lineCount: 58, contentKind: 'text', mediaType: 'text/markdown', sha256: "733e9de321d6d1cc3db03a20af5ac211747dfc421f6091f461ed6629e8501d71" }),
15
+ Object.freeze({ path: "api-constants.md", url: new URL("./geospec-authoring/api-constants.md", import.meta.url).href, byteLength: 1057, lineCount: 17, contentKind: 'text', mediaType: 'text/markdown', sha256: "42c29ab127efb592c0cd7c4d2024d6e2aea8315bec78e476f972166c1b8c1c6b" }),
16
+ Object.freeze({ path: "api-types.md", url: new URL("./geospec-authoring/api-types.md", import.meta.url).href, byteLength: 59891, lineCount: 1789, contentKind: 'text', mediaType: 'text/markdown', sha256: "a7d3131badff9986d7e2e11f1f590e0f0e894d20e14076212f6544ef3371b230" }),
17
17
  Object.freeze({ path: "api-classes.md", url: new URL("./geospec-authoring/api-classes.md", import.meta.url).href, byteLength: 550, lineCount: 14, contentKind: 'text', mediaType: 'text/markdown', sha256: "d34a48498cfd33aca05e2c5c1059ca3e2d1bec86046fbc75928d16b375fcae30" }),
18
- Object.freeze({ path: "public-api-index.md", url: new URL("./geospec-authoring/public-api-index.md", import.meta.url).href, byteLength: 60396, lineCount: 857, contentKind: 'text', mediaType: 'text/markdown', sha256: "17e1d9acfaf1cc409dd08409bc235c48a1149408c1f457c34b8185097f3db211" }),
19
- Object.freeze({ path: "public-api-functions.md", url: new URL("./geospec-authoring/public-api-functions.md", import.meta.url).href, byteLength: 10547, lineCount: 197, contentKind: 'text', mediaType: 'text/markdown', sha256: "6ede58ae4448d38d137bac1f3e3e3f6c5314cccc795355d175aae305807d165e" }),
20
- Object.freeze({ path: "public-api-constants.md", url: new URL("./geospec-authoring/public-api-constants.md", import.meta.url).href, byteLength: 870, lineCount: 20, contentKind: 'text', mediaType: 'text/markdown', sha256: "5f9fba8f8507b344365bb5d38d2c86c0b6843bb63f889913bb0377a8bd885d0c" }),
21
- Object.freeze({ path: "public-api-types.md", url: new URL("./geospec-authoring/public-api-types.md", import.meta.url).href, byteLength: 62656, lineCount: 2049, contentKind: 'text', mediaType: 'text/markdown', sha256: "00b8891757f1746300e95ca94884449c330c0e1c8c93c7bc8217668d34762c1d" }),
22
- Object.freeze({ path: "public-api-types-2.md", url: new URL("./geospec-authoring/public-api-types-2.md", import.meta.url).href, byteLength: 51421, lineCount: 1514, contentKind: 'text', mediaType: 'text/markdown', sha256: "3a71caac412596cdf5a5856bbed3c26f97e3fcaf6c9c337e4bcfaa3702b13ed3" }),
18
+ Object.freeze({ path: "public-api-index.md", url: new URL("./geospec-authoring/public-api-index.md", import.meta.url).href, byteLength: 63924, lineCount: 894, contentKind: 'text', mediaType: 'text/markdown', sha256: "2cedf2e5474be1b5dfb2773ba3ea4f9ad9c2787b46394ed94b3386ff826c6264" }),
19
+ Object.freeze({ path: "public-api-functions.md", url: new URL("./geospec-authoring/public-api-functions.md", import.meta.url).href, byteLength: 11567, lineCount: 216, contentKind: 'text', mediaType: 'text/markdown', sha256: "a1a4e17ba9b9f2f2b997702f6b203da880efe65e7bf8d69c6bfab0b6e41d525d" }),
20
+ Object.freeze({ path: "public-api-constants.md", url: new URL("./geospec-authoring/public-api-constants.md", import.meta.url).href, byteLength: 2521, lineCount: 52, contentKind: 'text', mediaType: 'text/markdown', sha256: "8d7ecd06cd47616d81d6b5ad0315eee3cb1ed980d6527d6e2edf40c44231d871" }),
21
+ Object.freeze({ path: "public-api-types.md", url: new URL("./geospec-authoring/public-api-types.md", import.meta.url).href, byteLength: 59455, lineCount: 1949, contentKind: 'text', mediaType: 'text/markdown', sha256: "783ae4f4526780306cd63a87d52e7e108997d38b1892e73bd5587937c0da552b" }),
22
+ Object.freeze({ path: "public-api-types-2.md", url: new URL("./geospec-authoring/public-api-types-2.md", import.meta.url).href, byteLength: 55415, lineCount: 1561, contentKind: 'text', mediaType: 'text/markdown', sha256: "ab10b858d556e0fcffe52cebf8476c8053401d2a28f4066a649a19357da0a62f" }),
23
+ Object.freeze({ path: "public-api-types-3.md", url: new URL("./geospec-authoring/public-api-types-3.md", import.meta.url).href, byteLength: 7267, lineCount: 218, contentKind: 'text', mediaType: 'text/markdown', sha256: "cec1cdc42e06dbab4f7263198ec303ab5bc24e09d2ec8d95870caba070ee7507" }),
23
24
  Object.freeze({ path: "public-api-classes.md", url: new URL("./geospec-authoring/public-api-classes.md", import.meta.url).href, byteLength: 1024, lineCount: 23, contentKind: 'text', mediaType: 'text/markdown', sha256: "569639b75b3a3fae86e3bcbe3dc61a746ddd67cb4dec7ccb6374556d419d02a9" })
24
25
  ]),
25
26
  }),