forgecad 0.9.7 → 0.9.9

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 (47) hide show
  1. package/README.md +1 -0
  2. package/dist/assets/{AdminPage-DX0mpSZT.js → AdminPage-CNEvQM7c.js} +1 -1
  3. package/dist/assets/{BlogPage-CI_P0_Pf.js → BlogPage-Cc41PP4d.js} +1 -1
  4. package/dist/assets/{DocsPage-DLhIIZyJ.js → DocsPage-9U1hGjrg.js} +2 -2
  5. package/dist/assets/{EditorApp-DfFT2Dn8.css → EditorApp-D11wL4Qn.css} +51 -0
  6. package/dist/assets/{EditorApp-BujZvuwX.js → EditorApp-DnddQvBt.js} +151 -9
  7. package/dist/assets/{EmbedViewer-0S0qXKog.js → EmbedViewer-B2lhWTcd.js} +2 -2
  8. package/dist/assets/{LandingPageProofDriven-O_yMtAri.js → LandingPageProofDriven-CFet-l3o.js} +1 -1
  9. package/dist/assets/{PricingPage-DGkX3Ahr.js → PricingPage-CPm8mQx3.js} +1 -1
  10. package/dist/assets/{SettingsPage-DBsqTB_y.js → SettingsPage-BarZonVZ.js} +1 -1
  11. package/dist/assets/__vite-browser-external-Dhvy_jtL.js +4 -0
  12. package/dist/assets/{app-BE2nD6Yz.js → app-BjSEB4sY.js} +1006 -526
  13. package/dist/assets/cli/{render-iP9qh475.js → render-CXVrHY8q.js} +647 -481
  14. package/dist/assets/constructionHistoryWorker-z9_LGiRd.js +42984 -0
  15. package/dist/assets/{evalWorker-Ds5U4xtN.js → evalWorker-CtO7GsJR.js} +42 -9
  16. package/dist/assets/{inspectWorker-Dll4eVyD.js → inspectWorker-BZ2CkQZr.js} +785 -111
  17. package/dist/assets/{manifold-DjYsd7A_.js → manifold-BRdhoQy5.js} +2 -2
  18. package/dist/assets/{manifold-sJ-axdXM.js → manifold-BVi4_OeB.js} +1 -1
  19. package/dist/assets/manifold-Cp_dCC7i.js +3018 -0
  20. package/dist/assets/{manifold-Bk26ViCr.js → manifold-DAzn2Fsa.js} +1 -1
  21. package/dist/assets/{renderSceneState-Bngp5MrQ.js → renderSceneState-CWO8rHlt.js} +1 -1
  22. package/dist/assets/{reportWorker-CU8RZ4O0.js → reportWorker-Bz9tGiHb.js} +42 -9
  23. package/dist/assets/{sectionPlaneMath-BdTjyVfs.js → scalar-sampling-budget-Bmewod18.js} +1339 -215
  24. package/dist/cli/render.html +1 -1
  25. package/dist/docs/index.html +1 -1
  26. package/dist/docs-raw/CLI.md +10 -10
  27. package/dist/docs-raw/coding-best-practices.md +1 -1
  28. package/dist/docs-raw/guides/inspection-bundles.md +77 -19
  29. package/dist/docs-raw/guides/skill-maintenance.md +1 -1
  30. package/dist/docs-raw/runbook.md +2 -2
  31. package/dist/docs-raw/skills/forgecad-make-a-model.md +11 -0
  32. package/dist/docs-raw/skills/forgecad-render-inspect.md +12 -6
  33. package/dist/docs-raw/skills/index.md +1 -1
  34. package/dist/index.html +1 -1
  35. package/dist/sitemap.xml +6 -6
  36. package/dist-cli/forgecad.js +596 -354
  37. package/dist-cli/forgecad.js.map +1 -1
  38. package/dist-skill/CONTEXT.md +77 -19
  39. package/dist-skill/docs/CLI.md +10 -10
  40. package/dist-skill/docs/guides/inspection-bundles.md +77 -19
  41. package/dist-skill/docs-dev/CLI.md +10 -10
  42. package/dist-skill/docs-dev/coding-best-practices.md +1 -1
  43. package/dist-skill/docs-dev/guides/inspection-bundles.md +77 -19
  44. package/dist-skill/docs-dev/guides/skill-maintenance.md +1 -1
  45. package/dist-skill/library/forgecad-make-a-model/SKILL.md +11 -0
  46. package/dist-skill/library/forgecad-render-inspect/SKILL.md +12 -6
  47. package/package.json +6 -3
@@ -191,7 +191,7 @@ forgecad render views model.forge.js --json
191
191
 
192
192
  Render a machine-readable inspection bundle with geometry channels and a manifest.
193
193
 
194
- Launches the headless viewport renderer and writes a directory bundle for agent and automation workflows. Every channel is opt-in with `--channels`; there is no default bundle. Selected channels emit canonical `front`, `right`, `top`, and `iso` views for RGB, depth, normals, surface roughness, object masks, physical connectivity, rooted component distance, collisions, and wall thickness, or a principal-plane section atlas, plus a root `manifest.json` with scene metadata, filters, object visibility, and relative file paths.
194
+ Launches the headless viewport renderer and writes a directory bundle for agent and automation workflows. Every channel is opt-in with `--channels`; there is no default bundle. Selected channels emit canonical `front`, `right`, `top`, and `iso` views for RGB, depth, normals, Zebra surface-continuity stripes, surface roughness, object masks, physical connectivity, floating body highlights, rooted component distance, collisions, and wall thickness, or a principal-plane section atlas, plus a root `manifest.json` with scene metadata, filters, object visibility, and relative file paths.
195
195
 
196
196
  Use `--focus` to isolate specific parts or hide mocks, and `--hide` to remove named clutter. Output defaults to `<script-name>-inspect/` next to the input file.
197
197
 
@@ -199,6 +199,7 @@ For bundle layout, channel encodings, and manifest semantics, see [Inspection Bu
199
199
 
200
200
  ```bash
201
201
  forgecad render inspect examples/api/static-assembly-connectors.forge.js --channels rgb,mask
202
+ forgecad render inspect examples/api/static-assembly-connectors.forge.js --channels rgb,zebra,normals
202
203
  forgecad render inspect examples/api/static-assembly-connectors.forge.js out/bench-inspect --channels collisions --focus "Bench.*"
203
204
  forgecad render inspect examples/api/static-assembly-connectors.forge.js --channels rgb,mask,collisions --hide "Bench.Slat0" --force
204
205
  ```
@@ -299,21 +300,21 @@ forgecad render section examples/furniture/01-table.forge.js out/bold.svg --edge
299
300
  | `--background <color>` | Canvas background override |
300
301
  | `--render-mode <solid\|wireframe>` | Shaded solid (default) or wireframe only |
301
302
  | `--edges <off\|thin\|bold>` | Edge overlay preset in solid mode (default: off) |
302
- | `--render-style <classic\|studio\|fast\|glass>` | Visual render style (default: classic) |
303
+ | `--render-style <classic\|studio\|fast\|glass\|precision\|hybrid>` | Visual render style (default: classic) |
303
304
  | `--port <n>` | Vite dev server port |
304
305
  | `--fresh-server` | Start a fresh renderer instead of reusing an existing one |
305
306
  | `--chrome-path <path>` | Chrome or Chromium executable path |
306
307
  | `--output <path>` | Output file path |
307
308
  | `--json` | Print machine-readable JSON |
308
309
  | `--quality <default\|live\|high>` | Mesh quality preset |
309
- | `--backend <manifold\|occt\|truck>` | Geometry backend |
310
- | `--channels <rgb,depth,normals,roughness,mask,connectivity,distance,collisions,thickness,section>` | Required inspection channels to emit; no default |
310
+ | `--backend <manifold\|occt\|truck>` | Geometry backend (default: manifold) |
311
+ | `--channels <rgb,depth,normals,zebra,roughness,mask,connectivity,floating,distance,collisions,thickness,section>` | Required inspection channels to emit; no default |
311
312
  | `--force` | Replace an existing bundle directory |
312
313
  | `--min-thickness <mm>` | Critical thickness threshold in model units |
313
314
  | `--warn-thickness <mm>` | Warning thickness threshold in model units |
314
315
  | `--max-thickness <mm>` | Thick/blue heatmap threshold in model units |
315
- | `--thickness-samples <n>` | Maximum thickness point samples per object |
316
- | `--roughness-samples <n>` | Maximum roughness point samples per object |
316
+ | `--thickness-samples <n>` | Override default scene budget with max thickness point samples per object |
317
+ | `--roughness-samples <n>` | Override default scene budget with max roughness point samples per object |
317
318
  | `--preset <name>` | Material/lighting preset |
318
319
  | `--width <px>` | Output width in pixels |
319
320
  | `--height <px>` | Output height in pixels |
@@ -400,7 +401,7 @@ forgecad export sdf rover.forge.js --output out/forge_scout
400
401
  |--------|-------------|
401
402
  | `--output <path>` | Output STEP path |
402
403
  | `--quality <default\|live\|high>` | Forge quality preset |
403
- | `--backend <manifold\|occt\|truck>` | Geometry backend |
404
+ | `--backend <manifold\|occt\|truck>` | Geometry backend (default: manifold) |
404
405
  | `-o <path>` | Output file path |
405
406
  | `--dim-angle-tol <deg>` | Dimension routing tolerance in degrees |
406
407
  | `--sheet-width <mm>` | Stock sheet width in mm |
@@ -548,7 +549,7 @@ forgecad skill flattened-files ~/Desktop/forgecad-skills
548
549
 
549
550
  ## Validation
550
551
 
551
- Check printability, test parameter ranges, and run invariant suites.
552
+ Check printability, test parameter ranges, and run focused model invariants.
552
553
 
553
554
  ### `forgecad check print`
554
555
 
@@ -601,7 +602,6 @@ forgecad check params path/to/model.forge.js --samples 12
601
602
 
602
603
  | Command | Description |
603
604
  |---------|-------------|
604
- | `check suite` | Run the repo invariant suite, with smoke and full profiles for the fast merge lane vs the broader regression sweep. |
605
605
  | `inspect mechanical-integrity` | Inspect generated ForgeCAD models for mechanical integrity failures. |
606
606
  | `check runtime-globals` | Ensure the script sandbox does not add new lowercase injected globals. |
607
607
  | `check transforms` | Run transform and assembly invariants. |
@@ -646,7 +646,7 @@ The CLI is free for core workflows and exports. Production outputs are free to r
646
646
 
647
647
  | Free | Production outputs | Pro |
648
648
  |------|--------------------|-----|
649
- | `run`, `dev`, `studio`, `render 3d`, `export stl`, `export 3mf`, `export svg`, `check print`, `check params`, `inspect mechanical-integrity`, `check suite` | `cut-list`, `export sketch-pdf`, `export step`, `export brep`, `export gcode`, `export sdf`, `export urdf`, `export report`, `export cutting-layout` are free to run; Pro covers commercial use. | `render hq`, `capture gif`, `capture mp4` |
649
+ | `run`, `dev`, `studio`, `render 3d`, `export stl`, `export 3mf`, `export svg`, `check print`, `check params`, `inspect mechanical-integrity` | `cut-list`, `export sketch-pdf`, `export step`, `export brep`, `export gcode`, `export sdf`, `export urdf`, `export report`, `export cutting-layout` are free to run; Pro covers commercial use. | `render hq`, `capture gif`, `capture mp4` |
650
650
 
651
651
  ```bash
652
652
  forgecad license # Check signed-in account status
@@ -65,7 +65,7 @@ npm run lint:fix # auto-fix lint issues
65
65
  npm run format # auto-format all files
66
66
  ```
67
67
 
68
- Biome runs as part of `forgecad check suite`. Configuration lives in `biome.json` at the repo root.
68
+ Biome runs as part of `npm run check:suite`. Configuration lives in `biome.json` at the repo root.
69
69
 
70
70
  ## Self-Review Before Commit
71
71
 
@@ -7,9 +7,9 @@ skill-order: 2
7
7
 
8
8
  `forgecad render inspect` writes a deterministic directory bundle for agents,
9
9
  tests, and automation. Use it when a single shaded PNG is too ambiguous and the
10
- consumer needs geometry-aware signals such as depth, normals, surface roughness,
11
- part identity, physical connected components, collisions, local thickness, or
12
- cross-sections.
10
+ consumer needs geometry-aware signals such as depth, normals, Zebra stripes,
11
+ surface roughness, part identity, physical connected components, collisions,
12
+ local thickness, or cross-sections.
13
13
 
14
14
  ## When To Use It
15
15
 
@@ -49,7 +49,7 @@ with patterns such as `Bench.*`.
49
49
 
50
50
  ## Bundle Layout
51
51
 
52
- A bundle that asks for `--channels rgb,depth,normals,mask,section` has this
52
+ A bundle that asks for `--channels rgb,depth,normals,zebra,mask,section` has this
53
53
  layout:
54
54
 
55
55
  ```text
@@ -71,6 +71,11 @@ model-inspect/
71
71
  right.png
72
72
  top.png
73
73
  iso.png
74
+ zebra/
75
+ front.png
76
+ right.png
77
+ top.png
78
+ iso.png
74
79
  mask/
75
80
  front.png
76
81
  right.png
@@ -96,13 +101,15 @@ implemented channel in one bundle:
96
101
 
97
102
  ```bash
98
103
  forgecad render inspect model.forge.js --channels depth,normals
104
+ forgecad render inspect model.forge.js --channels rgb,zebra,normals
99
105
  forgecad render inspect model.forge.js --channels rgb,roughness
100
106
  forgecad render inspect model.forge.js --channels rgb,mask,collisions
101
107
  forgecad render inspect model.forge.js --channels rgb,section,thickness
102
108
  ```
103
109
 
104
- Supported channels are `rgb`, `depth`, `normals`, `roughness`, `mask`,
105
- `connectivity`, `distance`, `collisions`, `thickness`, and `section`.
110
+ Supported channels are `rgb`, `depth`, `normals`, `zebra`, `roughness`, `mask`,
111
+ `connectivity`, `floating`, `distance`, `collisions`, `thickness`, and
112
+ `section`.
106
113
 
107
114
  ## Channel Semantics
108
115
 
@@ -129,6 +136,17 @@ normal = normalize((rgb / 255) * 2 - 1)
129
136
 
130
137
  Background pixels are black and should be treated as `null`.
131
138
 
139
+ `zebra` emits reflective black-and-white stripe renders for visual
140
+ surface-continuity inspection. Stripes are generated from the visible
141
+ camera-view normal and simulated reflection direction, so smooth surfaces show
142
+ smooth flowing bands while normal discontinuities, faceting, and unexpected
143
+ creases kink or break the bands.
144
+
145
+ Use Zebra with `rgb` and `normals` when judging lofts, fillets, swept surfaces,
146
+ and skin-like forms. It is a human-readable shader diagnostic, not an exact
147
+ curvature-continuity proof; mesh tessellation quality and available smooth
148
+ normals determine how faithfully it represents the underlying surface.
149
+
132
150
  `roughness` emits a mesh-dihedral surface-quality heatmap. Smooth and gently
133
151
  curved triangles render as a faint translucent shadow over black, while
134
152
  triangles adjacent to sharp, harsh, boundary, or non-manifold mesh edges render
@@ -170,21 +188,58 @@ Connectivity is computed from visible scene objects:
170
188
 
171
189
  ```text
172
190
  bbox candidate = bbox interiors overlap or bbox contact gap <= 0.05 model units
173
- overlap edge = exact boolean intersection volume > 0.1 model units^3
174
- component = transitive closure over exact overlap edges
191
+ mesh contact edge = minimum mesh-surface distance <= contactTolerance
192
+ overlap edge = exact boolean intersection volume > 0.1 model units^3 for positive-volume overlap
193
+ component = transitive closure over mesh contact and exact overlap edges
175
194
  ```
176
195
 
177
196
  The manifest stores the edge list, component list, per-object body counts, and
178
- warnings. Component colors group scene objects; if one scene object contains
179
- multiple disconnected kernel bodies and the caller supplied a body count, the
180
- manifest reports `bodyCount > 1` but the PNG cannot color those internal bodies
181
- separately yet.
197
+ warnings. Component colors group scene objects and mesh body entries. If one
198
+ scene object contains multiple disconnected mesh islands, those islands are
199
+ reported and colored separately as entries such as `Part body 1` and
200
+ `Part body 2`.
201
+
202
+ Connectivity uses bbox only as a broadphase. Bbox contact alone is not enough to
203
+ merge separate scene objects by default, but mesh surfaces within contact
204
+ tolerance count as physically connected. This keeps concave assemblies such as
205
+ cages and captive balls from being falsely colored as one component while still
206
+ allowing stacked or nearly touching parts to share a component. Use the
207
+ `collisions` channel when you need positive-volume overlap evidence as a defect
208
+ report rather than a component grouping.
209
+
210
+ `floating` emits one disconnected-body highlight image per view. Black is
211
+ background or ground-reachable geometry. The highlight color marks physical
212
+ components that have no contact path to the ground plane.
213
+
214
+ Floating body detection splits visible meshes into disconnected body islands,
215
+ links bodies only when their minimum mesh-surface distance is within contact
216
+ tolerance (or exact positive-volume overlap when only shape evidence is
217
+ available), treats any connected component whose lower Z reaches the viewport
218
+ ground plane plus bed tolerance as grounded, then highlights every ungrounded
219
+ component. The default ground plane is the visible model's minimum Z;
220
+ `scene({ ground: { offset } })` moves it below that by the configured offset.
182
221
 
183
- Connectivity uses bbox only as a broadphase. Bbox contact is not enough to merge
184
- separate scene objects, which keeps concave assemblies such as cages and captive
185
- balls from being falsely colored as one component. Use the `collisions` channel
186
- when you need positive-volume overlap evidence as a defect report rather than a
187
- component grouping.
222
+ ```text
223
+ grounded = component bbox minZ <= groundZ + bedTolerance
224
+ floating body = !grounded
225
+ ```
226
+
227
+ This means a `union()` result with two disconnected mesh islands is inspected as
228
+ two separate bodies instead of being treated as one safe object. Bbox overlap or
229
+ bbox face contact alone is not support evidence. Use `connectivity`, `distance`,
230
+ or `collisions` when you need the full physical graph, rooted gap distances, or
231
+ collision defects.
232
+
233
+ `thickness` emits one local wall-thickness heatmap per view. Black is
234
+ background. Red/orange pixels are below the configured critical/warning
235
+ thresholds, green-to-blue pixels are acceptable/thick, and gray means the local
236
+ raycast could not resolve an opposite surface.
237
+
238
+ Thickness uses the same physical-contact edges as `connectivity` and `floating`.
239
+ When a ray crosses from one object to a direct physical-contact neighbor, hits
240
+ within `contactTolerance` are treated as contact seams and the ray continues to
241
+ the next surface. This prevents a tiny modeled gap between touching parts from
242
+ being reported as a paper-thin wall.
188
243
 
189
244
  `distance` emits one rooted physical-component-distance heatmap per view. Black
190
245
  is background. Non-black pixels resolve through
@@ -233,6 +288,10 @@ with the ghosted source geometry. If `--focus PartA,PartB` is used, everything
233
288
  except those objects is hidden, `PartA` and `PartB` are ghosted, and their
234
289
  overlap volume is highlighted if present.
235
290
 
291
+ Collision broadphase prunes exact boolean checks when the bbox intersection
292
+ volume is already below the overlap threshold. This does not change findings:
293
+ the real intersection volume cannot exceed the bbox intersection volume.
294
+
236
295
  `thickness` emits one local wall-thickness heatmap per view. The renderer places
237
296
  deterministic area-weighted point samples across visible mesh surfaces, casts
238
297
  through the object along each sample normal, and colors each point by the first
@@ -316,5 +375,4 @@ per-view depth ranges, and object-mask mappings live.
316
375
  guarantee. Open meshes, concave geometry, very coarse tessellation, or low
317
376
  `--thickness-samples` values can leave gray/unresolved or approximate regions.
318
377
  - Section atlases use five default interior slices today.
319
- - Zebra/reflection-line inspection is a follow-up channel, not part of the v1
320
- bundle.
378
+ - Zebra is a shader-based visual continuity aid, not exact curvature analysis.
@@ -132,7 +132,7 @@ Use a `skill-group` with a `dev-` prefix (e.g. `dev-compiler`, `dev-solver`, `de
132
132
  | Does a model author need this to build `.forge.js` files? | Standard |
133
133
  | Does it describe internal architecture (compiler, solver, pipeline)? | Dev only |
134
134
  | Does it cover team process (coding standards, releases, CI)? | Dev only |
135
- | Is it a CLI command only developers run (`check suite`, `sdf`, debug flags)? | Dev only |
135
+ | Is it repo-only developer tooling (`npm run check:suite`, `sdf`, debug flags)? | Dev only |
136
136
 
137
137
  ## Orphan files
138
138
 
@@ -239,6 +239,8 @@ npm run test:unit # vitest
239
239
  npm test # smoke invariant suite
240
240
  npm run test:smoke # same as npm test
241
241
  npm run test:full # broader regression sweep
242
+ npm run check:suite # repo invariant suite
243
+ npm run check:suite -- --profile smoke
242
244
  npm run test:examples # maintained fast example smoke lane
243
245
  npm run test:examples:full # full example catalog sweep
244
246
  ```
@@ -246,8 +248,6 @@ npm run test:examples:full # full example catalog sweep
246
248
  ### Invariant checks (CLI)
247
249
 
248
250
  ```bash
249
- node dist-cli/forgecad.js check suite
250
- node dist-cli/forgecad.js check suite --profile smoke
251
251
  node dist-cli/forgecad.js check examples
252
252
  node dist-cli/forgecad.js check examples --profile smoke
253
253
  node dist-cli/forgecad.js check examples --profile full
@@ -266,6 +266,17 @@ After the normal PNG render, run `forgecad render inspect` and read both the cha
266
266
  forgecad render inspect model.forge.js /tmp/model-inspect --channels rgb,mask,collisions --force --size 700
267
267
  ```
268
268
 
269
+ #### Keep CLI inspection scenes small
270
+
271
+ When using CLI inspection commands, make the scene as few returned/named objects as the requirement allows. The goal is not to hide required geometry; it is to keep the evidence small enough that the agent can reason about it properly.
272
+
273
+ - Return one selected configuration, not every variant, option bundle, or debug lineup.
274
+ - Include only the parts, ghosts, and fixtures needed to prove the current risk. If a collision, clearance, thickness, or section check concerns three objects, inspect those three objects instead of the whole shop floor.
275
+ - Prefer `--focus` / `--hide` and parameter-selected diagnostic modes over adding permanent extra objects to the default scene.
276
+ - Collapse decorative or already-proven subassemblies into fewer named objects when their internal boundaries are irrelevant to the inspection. Keep separate names only where object identity matters for collisions, masks, clearances, BOM roles, or mechanical contracts.
277
+
278
+ Small inspection scenes make `manifest.json`, mask colors, collision pairs, component counts, and section images cognitively tractable. If the agent cannot hold the scene in its head, it cannot debug the model honestly.
279
+
269
280
  For faster iteration, request the channels that match the current risk:
270
281
 
271
282
  - `collisions` — final multi-part assemblies, fixtures, enclosures, ghost fit checks, moving clearances, and any parts intended to touch without overlapping. Visually inspect this channel; do not rely only on the count.
@@ -1,6 +1,6 @@
1
1
  # forgecad-render-inspect
2
2
 
3
- Run and interpret ForgeCAD `render inspect` bundles for model verification. Use when asked to inspect a ForgeCAD model, analyze an inspection bundle, validate collisions, wall thickness, connectivity, sections, masks, depth, normals, or choose inspection channels.
3
+ Run and interpret ForgeCAD `render inspect` bundles for model verification. Use when asked to inspect a ForgeCAD model, analyze an inspection bundle, validate collisions, wall thickness, connectivity, floating bodies, sections, masks, depth, normals, Zebra stripes, or choose inspection channels.
4
4
 
5
5
  | Field | Value |
6
6
  | --- | --- |
@@ -23,7 +23,7 @@ Use this skill for:
23
23
 
24
24
  - inspecting an existing `.forge.js` model
25
25
  - analyzing a previously generated inspection bundle
26
- - validating collisions, wall thickness, section cuts, connectivity, distance, object masks, depth, or normals
26
+ - validating collisions, wall thickness, section cuts, connectivity, floating bodies, distance, object masks, depth, normals, or Zebra stripes
27
27
  - deciding which `render inspect` channels to run
28
28
  - producing evidence before calling a model complete
29
29
 
@@ -75,6 +75,7 @@ Routing:
75
75
  jq '.channels.collisions | {collisionCount, collisions, warnings}' /tmp/model-inspect/manifest.json
76
76
  jq '.channels.thickness.objects[] | {name, minThickness, p05Thickness, criticalAreaPercent, warningAreaPercent, unresolvedAreaPercent}' /tmp/model-inspect/manifest.json
77
77
  jq '.channels.connectivity | {componentCount, edges, warnings}' /tmp/model-inspect/manifest.json
78
+ jq '.channels.floating | {floatingBodyCount, floatingObjectCount, warnings}' /tmp/model-inspect/manifest.json
78
79
  ```
79
80
 
80
81
  6. Inspect the PNGs, not only the JSON.
@@ -95,9 +96,11 @@ Routing:
95
96
  | Multi-part interference, fit checks, ghost parts, moving clearances | `rgb,mask,collisions` |
96
97
  | Final multi-part mechanical or manufactured model | `rgb,mask,collisions` plus `section`, `thickness`, `connectivity`, or `distance` only when those risks apply |
97
98
  | Printability, shell walls, ribs, bosses, snaps, slots | `rgb,section,thickness` |
98
- | Floating parts, accidental fusion, connected solids | `rgb,mask,connectivity` |
99
+ | Parts without a mesh-contact path to the ground | `rgb,mask,floating` |
100
+ | Accidental fusion, connected solids | `rgb,mask,connectivity` |
99
101
  | Air gaps between physical components | `rgb,mask,distance` |
100
102
  | Surface orientation, occlusion, faceting, strange protrusions | `rgb,depth,normals` |
103
+ | Loft, fillet, skin, and sweep surface continuity | `rgb,zebra,normals` |
101
104
 
102
105
  ### Command Patterns
103
106
 
@@ -149,6 +152,7 @@ Manifest fields to check first:
149
152
  - `channels.collisions.collisionCount`: investigate every unexpected positive-volume overlap.
150
153
  - `channels.thickness.objects`: inspect `minThickness`, `p05Thickness`, critical/warning percentages, and unresolved area.
151
154
  - `channels.connectivity.componentCount`: compare to the expected number of physical components.
155
+ - `channels.floating.floatingBodyCount`: investigate every body without a mesh-contact path to the ground plane, especially body entries from one unioned object.
152
156
  - `channels.distance.maxRootDistance` and per-object `nearestGap`: check suspicious isolation or spacing.
153
157
  - `channels.section.planes`: look for missing slices, wrong path counts, or empty internal cuts. These are inspection views, not instructions to section the returned production geometry.
154
158
 
@@ -163,11 +167,13 @@ PNG review order:
163
167
  ### Interpretation Rules
164
168
 
165
169
  - Collision findings are positive-volume boolean overlaps. Face-touching is not a collision.
166
- - Connectivity uses bbox as a broadphase, then exact overlap evidence for component grouping. Bbox-only contact does not merge separate scene objects by default; use the collisions channel for positive-volume overlap evidence.
170
+ - Connectivity uses bbox as a broadphase, then shared physical-contact detection for component grouping: mesh surfaces within contact tolerance count as connected, exact positive-volume overlap is used when needed, and bbox-only contact does not merge separate scene objects by default. Use the collisions channel for positive-volume overlap evidence.
171
+ - Floating uses the same shared physical-contact detection plus scene-ground reachability. Mesh gaps within contact tolerance count as connected, bbox overlap or bbox face contact alone does not, and every component without a contact path to ground is reported. Disconnected mesh islands inside one object are inspected separately.
167
172
  - Distance is a bbox-gap metric between physical components, not exact closest surface distance.
168
- - Thickness is a mesh/raycast approximation. Gray or high unresolved area means the visual heatmap is incomplete, not that the model is safe.
173
+ - Thickness is a contact-aware mesh/raycast approximation. It uses the same physical-contact edges as connectivity/floating, so rays jump over direct-neighbor contact seams within contact tolerance before measuring the next surface. Gray or high unresolved area means the visual heatmap is incomplete, not that the model is safe.
169
174
  - Depth is a visual heatmap, not raw floating-point depth data.
170
175
  - Normals are camera-view normals, not world-space normals.
176
+ - Zebra is a reflective stripe shader for visual continuity inspection, not an exact curvature-continuity proof.
171
177
  - Mask colors are stable within a bundle and resolved through the manifest.
172
178
 
173
179
  ### Source Map
@@ -182,7 +188,7 @@ Read these only when needed:
182
188
  | Browser-side channel rendering | `cli/render.ts` |
183
189
  | Collision semantics | `cli/collision-inspection.ts` |
184
190
  | Thickness semantics | `cli/thickness-inspection.ts` |
185
- | Connectivity and distance semantics | `cli/physical-connectivity.ts` and `cli/distance-inspection.ts` |
191
+ | Connectivity, floating, and distance semantics | `cli/physical-connectivity.ts`, `cli/floating-inspection.ts`, and `cli/distance-inspection.ts` |
186
192
 
187
193
 
188
194
  ## Bundled Files
@@ -17,5 +17,5 @@ forgecad skill install
17
17
  | [forgecad-make-a-model](/docs/skills/forgecad-make-a-model) | `forgecad skill install` | Create manufacture-realistic prototype ForgeCAD (.forge.js) models in the active CAD project. Handles file placement, invokes the forgecad skill for API guidance, and validates the result. |
18
18
  | [forgecad-prepare-prompt](/docs/skills/forgecad-prepare-prompt) | `forgecad skill install` | Turn a fuzzy physical product, mechanism, or CAD artifact request into a concrete manufacture-realistic prototype ForgeCAD build brief and a single master prompt for the modeling pass. Use when the engineering brief is incomplete, manufacturing/process choice is underspecified, or the work needs a specific operating story to avoid generic toy solutions. |
19
19
  | [forgecad-project](/docs/skills/forgecad-project) | `forgecad skill install` | ForgeCAD project CLI workflow — creating, managing, syncing projects and files on forgecad.io. Covers init, push, pull, file operations, member management, publishing, and sharing. |
20
- | [forgecad-render-inspect](/docs/skills/forgecad-render-inspect) | `forgecad skill install` | Run and interpret ForgeCAD `render inspect` bundles for model verification. Use when asked to inspect a ForgeCAD model, analyze an inspection bundle, validate collisions, wall thickness, connectivity, sections, masks, depth, normals, or choose inspection channels. |
20
+ | [forgecad-render-inspect](/docs/skills/forgecad-render-inspect) | `forgecad skill install` | Run and interpret ForgeCAD `render inspect` bundles for model verification. Use when asked to inspect a ForgeCAD model, analyze an inspection bundle, validate collisions, wall thickness, connectivity, floating bodies, sections, masks, depth, normals, Zebra stripes, or choose inspection channels. |
21
21
  | [forgecad-visual-spec](/docs/skills/forgecad-visual-spec) | `forgecad skill install` | Turn a concrete ForgeCAD artifact, build brief, HLD, or existing model into builder-honest image prompts for AI image models. Use when the user wants visual-spec renders that show the final product while keeping mechanisms, seams, hardware, and build cues visible instead of drifting into concept art. |
package/dist/index.html CHANGED
@@ -55,7 +55,7 @@
55
55
  * { margin: 0; padding: 0; box-sizing: border-box; }
56
56
  html, body, #root { width: 100%; min-height: 100%; background: var(--fc-bg); color: var(--fc-text); font-family: system-ui, -apple-system, sans-serif; }
57
57
  </style>
58
- <script type="module" crossorigin src="/assets/app-BE2nD6Yz.js"></script>
58
+ <script type="module" crossorigin src="/assets/app-BjSEB4sY.js"></script>
59
59
  <link rel="stylesheet" crossorigin href="/assets/app-CsHnaBWt.css">
60
60
  </head>
61
61
  <body>
package/dist/sitemap.xml CHANGED
@@ -2,37 +2,37 @@
2
2
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
3
  <url>
4
4
  <loc>https://forgecad.io/</loc>
5
- <lastmod>2026-05-19</lastmod>
5
+ <lastmod>2026-05-22</lastmod>
6
6
  <changefreq>weekly</changefreq>
7
7
  <priority>1.0</priority>
8
8
  </url>
9
9
  <url>
10
10
  <loc>https://forgecad.io/docs</loc>
11
- <lastmod>2026-05-19</lastmod>
11
+ <lastmod>2026-05-22</lastmod>
12
12
  <changefreq>weekly</changefreq>
13
13
  <priority>0.8</priority>
14
14
  </url>
15
15
  <url>
16
16
  <loc>https://forgecad.io/blog</loc>
17
- <lastmod>2026-05-19</lastmod>
17
+ <lastmod>2026-05-22</lastmod>
18
18
  <changefreq>weekly</changefreq>
19
19
  <priority>0.7</priority>
20
20
  </url>
21
21
  <url>
22
22
  <loc>https://forgecad.io/pricing</loc>
23
- <lastmod>2026-05-19</lastmod>
23
+ <lastmod>2026-05-22</lastmod>
24
24
  <changefreq>monthly</changefreq>
25
25
  <priority>0.6</priority>
26
26
  </url>
27
27
  <url>
28
28
  <loc>https://forgecad.io/examples</loc>
29
- <lastmod>2026-05-19</lastmod>
29
+ <lastmod>2026-05-22</lastmod>
30
30
  <changefreq>weekly</changefreq>
31
31
  <priority>0.6</priority>
32
32
  </url>
33
33
  <url>
34
34
  <loc>https://forgecad.io/blog/hello-forgecad-io</loc>
35
- <lastmod>2026-05-19</lastmod>
35
+ <lastmod>2026-05-22</lastmod>
36
36
  <changefreq>monthly</changefreq>
37
37
  <priority>0.5</priority>
38
38
  </url>