forgecad 0.9.16 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist/assets/{AdminPage-CXvls4-J.js → AdminPage-DwYHz72L.js} +1 -1
  2. package/dist/assets/{BenchmarkPage-B27zk8xL.js → BenchmarkPage-a9_f-1US.js} +1 -1
  3. package/dist/assets/{BlogPage-CMAVvgQL.js → BlogPage-DodHpvmf.js} +1 -1
  4. package/dist/assets/{DocsPage-knf4I4h7.js → DocsPage-B5LePEuj.js} +8 -858
  5. package/dist/assets/EditorApp-QXsAISLR.js +16307 -0
  6. package/dist/assets/{EmbedViewer-D7ZGlFjx.js → EmbedViewer-DdEHGUMU.js} +2 -2
  7. package/dist/assets/{LandingPageProofDriven-CnevhTE8.js → LandingPageProofDriven-yhhOodbf.js} +1 -1
  8. package/dist/assets/{LegalPage-BPTUmqeg.js → LegalPage-5RbKRGYK.js} +1 -1
  9. package/dist/assets/{PricingPage-B0D4goG_.js → PricingPage-E3Rma7aV.js} +1 -1
  10. package/dist/assets/{SettingsPage-CFF-UgjI.js → SettingsPage-BJZcM97j.js} +1 -1
  11. package/dist/assets/{app-T0pDcSX4.js → app-DSYrDg0V.js} +733 -205
  12. package/dist/assets/cli/{render-C5pcIISc.js → render-ZMHR9HkV.js} +19 -46
  13. package/dist/assets/{constructionHistoryWorker-Ba2Hm58b.js → constructionHistoryWorker-AwMMWSxg.js} +1103 -349
  14. package/dist/assets/{evalWorker-vkx310U2.js → evalWorker-DbNs7Dkp.js} +3798 -1622
  15. package/dist/assets/{inspectWorker-BuTJDVX6.js → inspectWorker-CZsCFtQT.js} +1163 -409
  16. package/dist/assets/{jointPose-B_Cgedn9.js → jointPose-DO6mnXn_.js} +1 -1
  17. package/dist/assets/{manifold-BWgsjmAM.js → manifold-BGlQBBH9.js} +1 -1
  18. package/dist/assets/{manifold-rZexZI0G.js → manifold-BU-tJwQh.js} +1 -1
  19. package/dist/assets/{manifold-D6IFSkhH.js → manifold-fy2MV7K1.js} +2 -2
  20. package/dist/assets/{reportWorker-0AGij1Ru.js → reportWorker-DO6hcQbh.js} +7155 -2437
  21. package/dist/assets/{scalar-sampling-budget-J5cuzxT1.js → scalar-sampling-budget-o90NSNmF.js} +3940 -1742
  22. package/dist/assets/{scanProxyWorker-Vl4Wxa1y.js → scanProxyWorker-2GtDLk-R.js} +1 -1
  23. package/dist/assets/{javascript-1kQXfVaz.js → typescript-DBQ6RN5l.js} +874 -22
  24. package/dist/cli/render.html +1 -1
  25. package/dist/docs/index.html +3 -3
  26. package/dist/docs-raw/AI/usage.md +1 -1
  27. package/dist/docs-raw/CLI.md +63 -241
  28. package/dist/docs-raw/README.md +6 -0
  29. package/dist/docs-raw/component-model.md +17 -150
  30. package/dist/docs-raw/generated/assembly.md +139 -598
  31. package/dist/docs-raw/generated/concepts.md +245 -3501
  32. package/dist/docs-raw/generated/core.md +277 -1251
  33. package/dist/docs-raw/generated/curves.md +387 -1608
  34. package/dist/docs-raw/generated/legacy.md +162 -0
  35. package/dist/docs-raw/generated/lib.md +227 -85
  36. package/dist/docs-raw/generated/output.md +38 -73
  37. package/dist/docs-raw/generated/runtime-names.md +23 -23
  38. package/dist/docs-raw/generated/sdf.md +68 -284
  39. package/dist/docs-raw/generated/sheet-metal.md +68 -335
  40. package/dist/docs-raw/generated/sketch.md +240 -1161
  41. package/dist/docs-raw/generated/viewport.md +75 -316
  42. package/dist/docs-raw/generated/wood.md +21 -49
  43. package/dist/docs-raw/guides/coordinate-system.md +4 -42
  44. package/dist/docs-raw/guides/inspection-bundles.md +44 -442
  45. package/dist/docs-raw/guides/joint-design.md +18 -79
  46. package/dist/docs-raw/guides/positioning.md +21 -143
  47. package/dist/docs-raw/guides/scene-presentation.md +89 -0
  48. package/dist/docs-raw/skills/forgecad-3d-reconstruction.md +25 -111
  49. package/dist/docs-raw/skills/forgecad-blockout-model.md +20 -117
  50. package/dist/docs-raw/skills/forgecad-component-model.md +23 -107
  51. package/dist/docs-raw/skills/forgecad-high-level-spec.md +47 -155
  52. package/dist/docs-raw/skills/forgecad-image-replicator.md +26 -143
  53. package/dist/docs-raw/skills/forgecad-lld.md +19 -113
  54. package/dist/docs-raw/skills/forgecad-make-a-model.md +112 -532
  55. package/dist/docs-raw/skills/forgecad-model-grader.md +38 -108
  56. package/dist/docs-raw/skills/forgecad-prepare-prompt.md +24 -211
  57. package/dist/docs-raw/skills/forgecad-project.md +13 -131
  58. package/dist/docs-raw/skills/forgecad-reconstruction-benchmark.md +42 -134
  59. package/dist/docs-raw/skills/forgecad-render-inspect.md +27 -174
  60. package/dist/docs-raw/skills/forgecad-visual-spec.md +32 -112
  61. package/dist/docs-raw/skills/forgecad.md +19 -18
  62. package/dist/docs-raw/skills/index.md +2 -0
  63. package/dist/docs-raw/welcome.md +2 -2
  64. package/dist/index.html +1 -1
  65. package/dist/llms.txt +1 -2
  66. package/dist/sitemap.xml +13 -13
  67. package/dist-cli/{check-compiler-SYQ2PWOB.js → check-compiler-JTVBITCR.js} +1 -1
  68. package/dist-cli/{check-query-propagation-HIAGV62W.js → check-query-propagation-3FFLSMVN.js} +1 -1
  69. package/dist-cli/{chunk-SPZE3DUY.js → chunk-OAN5T4XD.js} +4412 -2212
  70. package/dist-cli/forgecad.js +507 -179
  71. package/dist-skill/CONTEXT.md +2172 -8377
  72. package/dist-skill/SKILL.md +15 -15
  73. package/dist-skill/docs/API/core/concepts.md +27 -157
  74. package/dist-skill/docs/CLI.md +63 -241
  75. package/dist-skill/docs/generated/assembly.md +138 -549
  76. package/dist-skill/docs/generated/core.md +277 -1251
  77. package/dist-skill/docs/generated/curves.md +387 -1609
  78. package/dist-skill/docs/generated/lib.md +227 -85
  79. package/dist-skill/docs/generated/output.md +38 -73
  80. package/dist-skill/docs/generated/runtime-names.md +16 -21
  81. package/dist-skill/docs/generated/sdf.md +68 -284
  82. package/dist-skill/docs/generated/sheet-metal.md +68 -335
  83. package/dist-skill/docs/generated/sketch.md +240 -1160
  84. package/dist-skill/docs/generated/viewport.md +75 -223
  85. package/dist-skill/docs/generated/wood.md +21 -49
  86. package/dist-skill/docs/guides/coordinate-system.md +4 -42
  87. package/dist-skill/docs/guides/inspection-bundles.md +44 -442
  88. package/dist-skill/docs/guides/joint-design.md +18 -79
  89. package/dist-skill/docs/guides/positioning.md +21 -143
  90. package/dist-skill/docs/guides/scene-presentation.md +89 -0
  91. package/dist-skill/docs/guides/surface-members.md +26 -0
  92. package/dist-skill/library/forgecad-3d-reconstruction/SKILL.md +23 -111
  93. package/dist-skill/library/forgecad-blockout-model/SKILL.md +18 -117
  94. package/dist-skill/library/forgecad-component-model/SKILL.md +21 -107
  95. package/dist-skill/library/forgecad-high-level-spec/SKILL.md +45 -155
  96. package/dist-skill/library/forgecad-image-replicator/SKILL.md +24 -143
  97. package/dist-skill/library/forgecad-lld/SKILL.md +17 -113
  98. package/dist-skill/library/forgecad-make-a-model/SKILL.md +110 -532
  99. package/dist-skill/library/forgecad-model-grader/SKILL.md +36 -108
  100. package/dist-skill/library/forgecad-prepare-prompt/SKILL.md +35 -224
  101. package/dist-skill/library/forgecad-prepare-prompt/references/default-profiles.md +43 -271
  102. package/dist-skill/library/forgecad-prepare-prompt/references/master-prompt.md +30 -99
  103. package/dist-skill/library/forgecad-project/SKILL.md +13 -133
  104. package/dist-skill/library/forgecad-reconstruction-benchmark/SKILL.md +29 -123
  105. package/dist-skill/library/forgecad-render-inspect/SKILL.md +25 -174
  106. package/dist-skill/library/forgecad-visual-spec/SKILL.md +30 -111
  107. package/dist-skill/website/skills/forgecad-3d-reconstruction.md +58 -0
  108. package/dist-skill/website/skills/forgecad-blockout-model.md +49 -0
  109. package/dist-skill/website/skills/forgecad-component-model.md +53 -0
  110. package/dist-skill/website/skills/forgecad-high-level-spec.md +101 -0
  111. package/dist-skill/website/skills/forgecad-image-replicator.md +63 -0
  112. package/dist-skill/website/skills/forgecad-lld.md +41 -0
  113. package/dist-skill/website/skills/forgecad-make-a-model.md +186 -0
  114. package/dist-skill/website/skills/forgecad-model-grader.md +82 -0
  115. package/dist-skill/website/skills/forgecad-prepare-prompt.md +63 -0
  116. package/dist-skill/website/skills/forgecad-project.md +26 -0
  117. package/dist-skill/website/skills/forgecad-reconstruction-benchmark.md +60 -0
  118. package/dist-skill/website/skills/forgecad-render-inspect.md +80 -0
  119. package/dist-skill/website/skills/forgecad-visual-spec.md +71 -0
  120. package/dist-skill/website/skills/forgecad.md +122 -0
  121. package/dist-skill/website/skills/index.md +26 -0
  122. package/examples/api/comparison-imported-sphere-candidate.forge.js +1 -1
  123. package/examples/api/conformal-product-ribbon.forge.js +1 -1
  124. package/examples/api/exact-sheet-shell-assembly.forge.js +1 -1
  125. package/examples/api/extrude-options.forge.js +4 -2
  126. package/examples/api/field-loft-drive-tip.forge.js +40 -0
  127. package/examples/api/guided-loft-olive-oil-bottle.forge.js +1 -1
  128. package/examples/api/highlight-debug.forge.js +10 -10
  129. package/examples/api/mesh-import-slats.forge.js +1 -1
  130. package/examples/api/real-product-curves.forge.js +1 -1
  131. package/examples/api/sculpt-box-circle-booleans.forge.js +1 -1
  132. package/examples/api/sdf-shapes.forge.js +2 -5
  133. package/examples/api/sketch-rounding-strategies.forge.js +6 -6
  134. package/examples/api/surface-member-bottle-cage.forge.js +3 -3
  135. package/examples/api/surface-member-conformal-product-ribbon.forge.js +3 -3
  136. package/examples/api/surface-member-razor-inlay.forge.js +1 -1
  137. package/examples/api/variable-sweep-test.forge.js +3 -3
  138. package/examples/mechanical/airplane-propeller.forge.js +74 -39
  139. package/examples/nurbs-surface.forge.js +1 -1
  140. package/examples/products/iphone.forge.js +1 -1
  141. package/package.json +1 -1
  142. package/dist/assets/EditorApp-BHMQlJ-D.js +0 -14686
  143. package/dist/docs-raw/guides/geometry-conventions.md +0 -52
  144. package/dist/docs-raw/guides/modeling-recipes.md +0 -78
  145. package/dist-skill/docs/guides/geometry-conventions.md +0 -52
  146. package/dist-skill/docs/guides/modeling-recipes.md +0 -78
  147. package/dist-skill/library/forgecad-visual-spec/references/prompt-template.md +0 -79
@@ -3,48 +3,10 @@ skill-group: geometry
3
3
  skill-order: 1
4
4
  ---
5
5
 
6
- # Coordinate System Convention
6
+ # Coordinate System
7
7
 
8
- ForgeCAD uses a **Z-up** right-handed coordinate system.
8
+ Z-up right-handed: +X right, +Y back, +Z up. Ground plane is XY at Z = 0; extrusion goes along +Z. Units are millimeters; angles are degrees.
9
9
 
10
- For objects with a clear facing direction, model the front/face/nose/camera side toward **-Y**. The rear/back side is **+Y**. In code, a forward/fore direction vector is `[0, -1, 0]`.
10
+ Model fronts (face/nose/camera side) point toward **-Y**; rear is +Y; the forward vector is `[0, -1, 0]`. Anchors follow: `front` resolves to the minimum-Y side, `back` to the maximum-Y side.
11
11
 
12
- ## Axes
13
-
14
- | Axis | Direction | Positive |
15
- |------|-----------------|----------|
16
- | X | Left / Right | Right |
17
- | Y | Front / Back | Back |
18
- | Z | Up / Down | Up |
19
-
20
- ## Standard Views
21
-
22
- The camera position direction says where the camera sits relative to the model. A front view camera sits at `-Y` and looks toward `+Y`, so it sees the model's `-Y` front face.
23
-
24
- | View | Camera position direction | Sees plane |
25
- |--------|---------------------------|------------|
26
- | Front | -Y | XZ |
27
- | Back | +Y | XZ |
28
- | Right | +X | YZ |
29
- | Left | -X | YZ |
30
- | Top | +Z | XY |
31
- | Bottom | -Z | XY |
32
-
33
- ## GizmoViewcube Face Mapping
34
-
35
- Renderer/view-cube internals may have their own material ordering. Map any view-cube labels to the ForgeCAD directions below:
36
-
37
- | Direction | ForgeCAD label |
38
- |-----------|----------------|
39
- | +X | Right |
40
- | -X | Left |
41
- | +Y | Back |
42
- | -Y | Front |
43
- | +Z | Top |
44
- | -Z | Bottom |
45
-
46
- The face/anchor API is the source of truth: `front` resolves to the minimum-Y side and `back` resolves to the maximum-Y side.
47
-
48
- ## Grid
49
-
50
- The ground plane is XY (Z = 0). Extrusion goes along +Z. Manifold is Y-up internally — if a kernel-facing operation behaves as if axes are swapped, check for Manifold Y-up semantics leaking through.
12
+ A `front` view camera sits on the -Y side looking toward +Y, so it sees the model's front face. The other views follow: back +Y, right +X, left -X, top +Z, bottom -Z.
@@ -3,484 +3,86 @@ skill-group: cli
3
3
  skill-order: 2
4
4
  ---
5
5
 
6
- # Inspection Bundles
7
-
8
- `forgecad inspect <family> <mode>` writes a deterministic directory bundle for
9
- agents, tests, and automation. Use it when a single shaded PNG is too ambiguous
10
- and the consumer needs geometry-aware evidence such as depth, normals, Zebra
11
- stripes, surface roughness, part identity, physical connected components,
12
- interference, local thickness, or cross-sections.
13
-
14
- ## When To Use It
15
-
16
- - Use `forgecad inspect <family> <mode>` for local agent repair loops, model
17
- debugging, and targeted visual evidence.
18
- - Use `forgecad render 3d` for a quick human viewport PNG.
19
- - Use `forgecad render section` when you only need one specific cut plane.
20
- - Use `forgecad render hq` for presentation-quality output, docs, and marketing
21
- renders.
22
-
23
- ## Command
24
-
25
- ```bash
26
- forgecad inspect fit interference model.forge.js --camera iso
27
- forgecad inspect visual cutaway model.forge.js --plane yz
28
- forgecad inspect visual objects model.forge.js --camera front --camera right
29
- forgecad inspect manufacture thickness model.forge.js --min 1.2 --warn 2.0
30
- forgecad inspect sections at model.forge.js --plane yz --offset 12.5
31
- forgecad inspect sections stack model.forge.js --plane yz --every 1
32
- forgecad inspect sections sample model.forge.js --count 5
33
- forgecad inspect compare overlay model.forge.js --with reference.3mf
34
- forgecad inspect evidence
35
- ```
36
-
37
- The default output directory is a unique, non-colliding run directory under
38
- `outputs/inspect`, relative to the current working directory:
39
-
40
- ```text
41
- outputs/inspect/2026-05-28T23-19-14.412Z__visual-objects__ball-bearing__43d0ee/
42
- ```
43
-
44
- Pass a positional `output-dir` or `--output`/`--out` for a preferred directory.
45
- If that directory already exists, ForgeCAD writes to a numbered sibling unless
46
- `--force` is passed. `--force` is the explicit replace path.
47
-
48
- Non-section inspection commands emit one `iso` view by default, except
49
- `inspect visual cutaway`, which emits one automatic orthographic cut-side view.
50
- Pass `--camera` repeatedly, `--view`, `--camera-json`, or `--scene` to use the
51
- same view strategy as `render 3d`.
52
-
53
- Inspection visual evidence defaults to the `inspection` render style: a light
54
- technical background, matte neutral lighting, and thin dark edges for shaded
55
- image/cutaway evidence. Pass `--background`, `--render-style`, or `--edges` when
56
- you need a different presentation. Model-authored `scene()` background, lights,
57
- fog, and exposure are ignored for inspection bundle captures so evidence remains
58
- stable; named scene views are still available through `--view`.
59
-
60
- The command tree is intentionally job-shaped:
61
-
62
- ```text
63
- inspect visual image|cutaway|depth|normals|rig|objects
64
- inspect surface zebra|roughness
65
- inspect physical components|floating|gaps
66
- inspect fit interference
67
- inspect manufacture thickness
68
- inspect compare overlay
69
- inspect sections at|stack|sample
70
- ```
6
+ # Inspection Bundles — Evidence Contract
71
7
 
72
- Manifest keys stay evidence-oriented for stable bundle readers. For example,
73
- `forgecad inspect fit interference` writes `manifest.evidence.collisions`, and
74
- `forgecad inspect physical components` writes `manifest.evidence.connectivity`.
8
+ `forgecad inspect <family> <mode>` writes a deterministic bundle: evidence PNGs under `evidence/<type>/` plus a root `manifest.json`. **The manifest is the authoritative contract** — take file paths, encodings, per-view ranges, thresholds, tolerances, and identity maps from it; never hard-code bundle layout or infer object identity from object order. The PNGs are a visual index for locating findings, not standalone artifacts. Command tree, flags, and `--focus`/`--hide` filtering live in `docs/permanent/CLI.md` and `forgecad inspect evidence`; the inspection workflow lives in the `forgecad-render-inspect` skill. Model-authored `scene()` background, lights, fog, and exposure are ignored for inspection captures so evidence stays stable; named scene views remain available via `--view`.
75
9
 
76
- `--focus` and `--hide` use the same object-name filtering semantics as
77
- `forgecad run` and `forgecad render 3d`. A bare `--focus` hides mock objects;
78
- `--focus name1,name2` emits only matching objects; `--hide name1,name2` removes
79
- matching objects from an otherwise visible scene. Matching is case-insensitive
80
- and supports `*` / `?` globs, so grouped child objects are usually best matched
81
- with patterns such as `Bench.*`.
10
+ Manifest evidence keys are evidence-oriented and stable for bundle readers: e.g. `fit interference` writes `manifest.evidence.collisions`, `physical components` writes `manifest.evidence.connectivity`.
82
11
 
83
- ## Bundle Layout
12
+ ## Reading Rules
84
13
 
85
- Bundles store image evidence under an `evidence/` directory. An
86
- `inspect visual objects` bundle with `front`, `right`, and `iso` cameras has this
87
- layout:
14
+ - **Identity evidence** (`objects`, `connectivity`, `distance`, `collisions`): colors are bundle-local labels. Resolve every color through the manifest; the same color never carries universal meaning across bundles. Edge pixels may be antialiased blends — match solid interior colors.
15
+ - **Metric evidence** (`depth`, `thickness`, `roughness`, `distance`, `comparison`): read manifest thresholds, ranges, object summaries, and warnings before judging a PNG by eye.
16
+ - Black pixels are background = `null` (in `floating`, black also means ground-reachable geometry).
17
+ - Treat unexpected collisions, critical thin regions, high unresolved thickness, wrong component counts, floating bodies, or surprising gaps as **model bugs to fix and reinspect** — not rendering noise.
18
+ - Use section evidence to inspect hidden internals; never turn the production model into a permanent cutaway.
88
19
 
89
- ```text
90
- outputs/inspect/2026-05-28T23-19-14.412Z__visual-objects__model__43d0ee/
91
- manifest.json
92
- evidence/
93
- objects/
94
- front.png
95
- right.png
96
- iso.png
97
- ```
20
+ ## The Physical-Contact Model
98
21
 
99
- Use targeted evidence commands for expensive analyses:
100
-
101
- ```bash
102
- forgecad inspect visual depth model.forge.js --camera iso
103
- forgecad inspect visual normals model.forge.js --camera iso
104
- forgecad inspect visual rig model.forge.js --camera iso
105
- forgecad inspect surface zebra model.forge.js --camera iso
106
- forgecad inspect surface roughness model.forge.js --camera iso
107
- forgecad inspect visual objects model.forge.js --camera iso
108
- forgecad inspect fit interference model.forge.js --camera iso
109
- forgecad inspect sections at model.forge.js --plane yz --offset 12.5
110
- forgecad inspect sections stack model.forge.js --plane yz --every 1
111
- forgecad inspect sections sample model.forge.js --count 5
112
- forgecad inspect manufacture thickness model.forge.js --min 1.2 --warn 2.0 --camera iso
113
- forgecad inspect compare overlay model.forge.js --with reference.3mf
114
- ```
22
+ Connectivity, floating, distance, and thickness all share one contact model:
115
23
 
116
- Run `forgecad inspect evidence` for the canonical command list and the matching
117
- manifest evidence keys.
118
-
119
- ## How To Read A Bundle
120
-
121
- Read inspection bundles as feedback about the model, not as standalone images.
122
- Start with `manifest.json`, then use the evidence PNGs to locate and understand
123
- the finding in the rendered geometry.
124
-
125
- 1. Confirm `bundle.evidenceRequested`, `bundle.evidenceEmitted`, and
126
- `bundle.filters` so you know what was inspected and what was hidden.
127
- 2. Check `scene.bbox`, `scene.volume`, and `scene.objects` for missing geometry,
128
- absurd scale, unexpected mocks, or wrong object names.
129
- 3. For identity evidence such as `objects`, `connectivity`, `distance`, and
130
- `collisions`, resolve colors through the evidence manifest. The same visual
131
- color does not carry a universal meaning across bundles.
132
- 4. For metric evidence such as `depth`, `roughness`, `thickness`, `distance`, and `comparison`,
133
- read the thresholds, ranges, object summaries, and warnings before judging a
134
- PNG by eye.
135
- 5. Inspect image and object evidence first when you need visual context, then
136
- the risk evidence and any orthographic view that exposes the issue. Use
137
- section slices only to inspect hidden internals; do not turn the production
138
- model into a permanent cutaway.
139
- 6. Treat unexpected collisions, critical thin regions, unresolved thickness,
140
- missing section detail, wrong component counts, floating bodies, or surprising
141
- distance gaps as model bugs to fix and reinspect.
142
-
143
- Common color reading rules:
144
-
145
- - Black is usually background; in `floating`, black also means ground-reachable
146
- geometry.
147
- - `objects` and `connectivity` colors are labels. Use the manifest to map colors to
148
- objects, groups, components, or body entries.
149
- - `collisions` colors mark solid overlap findings; match them to
150
- `manifest.evidence.collisions.collisions[].color`.
151
- - `thickness` uses red/orange for critical or warning-thin regions, green/blue
152
- for acceptable or thick regions, and gray for unresolved samples.
153
- - `distance` grades rooted component gaps from green near the root through
154
- yellow to red farther away.
155
- - `comparison` uses the same Difference Only overlay as the viewport: faint
156
- model context, amber candidate mismatch evidence, and cyan reference mismatch
157
- evidence.
158
- - `depth` grades visible camera distance from blue near the camera through green
159
- to red farther away.
160
- - `roughness` uses orange and magenta for sharp, harsh, boundary, or
161
- non-manifold edge neighborhoods.
162
- - `zebra` is read by stripe continuity: smooth flowing bands are healthy, while
163
- kinks, breaks, and faceting deserve investigation.
164
- - `normals` is an encoded camera-view normal map. Use it with `image` and `zebra`
165
- to debug orientation and faceting rather than as a fixed semantic palette.
24
+ - **Bbox is broadphase only.** Bbox overlap or bbox face contact never merges separate scene objects and is never support evidence.
25
+ - Mesh surfaces within the contact tolerance (see manifest) count as **physically connected**.
26
+ - **Positive-volume boolean overlap** above the overlap threshold is a *collision defect* (`collisions` evidence), distinct from connectivity grouping. Face-touching parts are not collisions.
27
+ - A `union()` result with disconnected mesh islands is inspected as **separate bodies** (`Part body 1`, `Part body 2`, …).
28
+ - **Grounded** = a connected component reaches the ground plane (visible model minZ, or lowered by `scene({ ground: { offset } })`) within bed tolerance. Everything else is floating.
166
29
 
167
30
  ## Evidence Semantics
168
31
 
169
- `image` emits the standard solid viewport render with a thin edge overlay. Views
170
- are canonical `front`, `right`, `top`, and `iso`.
32
+ **image** standard solid render with thin edge overlay, `inspection` render style.
171
33
 
172
- `depth` emits visible ray-distance heatmaps. Each shaded pixel is colored by the
173
- distance from the camera position to the visible surface point, normalized per
174
- view between `minDistance` and `maxDistance` from the manifest:
34
+ **depth** visible ray-distance heatmap, normalized per view between manifest `minDistance`/`maxDistance`; blue near → green → red far. A visual heatmap, not raw float depth.
175
35
 
176
36
  ```text
177
37
  rayDistance = distance(cameraPosition, surfacePoint)
178
38
  normalized = (rayDistance - minDistance) / (maxDistance - minDistance)
179
39
  ```
180
40
 
181
- The ramp is blue near the camera, green in the middle, and red far from the
182
- camera. Background pixels are black and should be treated as `null`.
183
-
184
- `normals` emits camera-view normals packed into RGB:
41
+ **normals** camera-view normals (not world-space) packed into RGB:
185
42
 
186
43
  ```text
187
44
  normal = normalize((rgb / 255) * 2 - 1)
188
45
  ```
189
46
 
190
- Background pixels are black and should be treated as `null`.
47
+ **zebra** reflective stripe render read by **stripe continuity**: smooth flowing bands are healthy; kinks, breaks, and faceting deserve investigation. A shader diagnostic, not a curvature-continuity proof — tessellation quality and available smooth normals limit its fidelity.
191
48
 
192
- `zebra` emits reflective black-and-white stripe renders for visual
193
- surface-continuity inspection. Stripes are generated from the visible
194
- camera-view normal and simulated reflection direction, so smooth surfaces show
195
- smooth flowing bands while normal discontinuities, faceting, and unexpected
196
- creases kink or break the bands.
49
+ **roughness** mesh-dihedral heatmap: smooth/moderate triangles render as a faint shadow; triangles adjacent to sharp edges render orange; harsh, boundary, or non-manifold edges render magenta (angle thresholds in the manifest). Point colors are local to physical feature edges — smooth tessellation diagonals do not light up, and moderate angles stay in the shadow layer so intentionally curved surfaces don't read as defects. Also writes `evidence/roughness/point-cloud.json` with per-sample object identity, local position, normal, angle, class, color, and represented area.
197
50
 
198
- Use Zebra with `image` and `normals` when judging lofts, fillets, swept surfaces,
199
- and skin-like forms. It is a human-readable shader diagnostic, not an exact
200
- curvature-continuity proof; mesh tessellation quality and available smooth
201
- normals determine how faithfully it represents the underlying surface.
51
+ **objects** one object-color image per view; resolve non-black pixels through `manifest.evidence.objects.objects` (index, color, id, name, group, tree path, mock flag).
202
52
 
203
- `roughness` emits a mesh-dihedral surface-quality heatmap. Smooth and gently
204
- curved triangles render as a faint translucent shadow over black, while
205
- triangles adjacent to sharp, harsh, boundary, or non-manifold mesh edges render
206
- in orange or magenta:
53
+ **connectivity** — one physical-component-color image per view; resolve through `manifest.evidence.connectivity.components`; every visible object has a `componentIndex`. Components are the transitive closure over mesh-contact and exact-overlap edges (see contact model). Object-level in the PNG: disconnected kernel bodies are reported in the manifest but not split into per-body colors.
207
54
 
208
- ```text
209
- shadow = max adjacent angle < sharpAngleDeg
210
- orange = sharpAngleDeg <= angle < harshAngleDeg
211
- magenta = angle >= harshAngleDeg, boundary, or non-manifold
212
- ```
55
+ **floating** — highlights components with no contact path to the ground plane (see contact model for grounding). Use `connectivity`/`distance`/`collisions` for the full graph, rooted gaps, or overlap defects.
213
56
 
214
- The default thresholds are `smoothAngleDeg=5`, `sharpAngleDeg=30`, and
215
- `harshAngleDeg=90`. The manifest stores the method, thresholds, palette, object
216
- list, per-object triangle and edge counts, area percentages by smooth,
217
- moderate, sharp, and harsh classes, angle percentiles, maximum angle, quality
218
- score, and warnings. Moderate angles are reported in the manifest but stay in
219
- the shadow layer by default so intentionally curved surfaces do not light up as
220
- defects. Use this evidence to spot spiky tessellation, accidental faceting,
221
- jagged boolean residue, and dense sharp-corner regions without losing the
222
- silhouette of otherwise smooth surfaces.
223
-
224
- The evidence also writes `evidence/roughness/point-cloud.json`. Each point sample
225
- stores object identity, object-local position, normal, dihedral angle, class,
226
- RGB color, and represented surface area. The PNG renders those samples over
227
- muted source geometry so the visual evidence stays point-level instead of
228
- painting a whole object.
229
-
230
- `objects` emits one object-color image per view. Black is background. Non-black
231
- pixels resolve through `manifest.evidence.objects.objects`, which includes object
232
- index, RGB color, object id, name, group, tree path, and mock flag. Edge pixels
233
- may be antialiased blends; use solid interior colors for exact object lookup.
234
-
235
- `connectivity` emits one physical-component-color image per view. Black is
236
- background. Non-black pixels resolve through
237
- `manifest.evidence.connectivity.components`, and every visible object also has a
238
- `componentIndex` in `manifest.evidence.connectivity.objects`.
239
-
240
- Connectivity is computed from visible scene objects:
57
+ **distance** rooted component-distance heatmap, green at the root through yellow to red. Root = largest component; `rootDistance` = shortest accumulated gap from root. **v1 metric is bbox-gap**, not closest mesh-surface distance — concave components can make reported gaps smaller than reality. The complete gap graph is quadratic, so the manifest stores a compact nearest-gap / root-parent edge subset (`gapEdges`); `gapEdgeCount` reports the logical complete-graph count.
241
58
 
242
- ```text
243
- bbox candidate = bbox interiors overlap or bbox contact gap <= 0.05 model units
244
- mesh contact edge = minimum mesh-surface distance <= contactTolerance
245
- overlap edge = exact boolean intersection volume > 0.1 model units^3 for positive-volume overlap
246
- component = transitive closure over mesh contact and exact overlap edges
247
- ```
59
+ **comparison** — reference-vs-candidate overlay (`--compare-with <ref>` or `compareWith('./reference.3mf')` in model code). **Amber = extra candidate surface; cyan = reference surface missing from the candidate.** PNG coverage is screen-space only — hidden/internal mismatches require `evidence/comparison/mismatch-points.json` and the geometric `compare 3d` score in the manifest, which are the source of truth; the PNG is the visual index.
248
60
 
249
- The manifest stores the edge list, component list, per-object body counts, and
250
- warnings. Component colors group scene objects and mesh body entries. If one
251
- scene object contains multiple disconnected mesh islands, those islands are
252
- reported and colored separately as entries such as `Part body 1` and
253
- `Part body 2`.
254
-
255
- Connectivity uses bbox only as a broadphase. Bbox contact alone is not enough to
256
- merge separate scene objects by default, but mesh surfaces within contact
257
- tolerance count as physically connected. This keeps concave assemblies such as
258
- cages and captive balls from being falsely colored as one component while still
259
- allowing stacked or nearly touching parts to share a component. Use the
260
- `collisions` evidence when you need positive-volume overlap evidence as a defect
261
- report rather than a component grouping.
262
-
263
- `floating` emits one disconnected-body highlight image per view. Black is
264
- background or ground-reachable geometry. The highlight color marks physical
265
- components that have no contact path to the ground plane.
266
-
267
- Floating body detection splits visible meshes into disconnected body islands,
268
- links bodies only when their minimum mesh-surface distance is within contact
269
- tolerance (or exact positive-volume overlap when only shape evidence is
270
- available), treats any connected component whose lower Z reaches the viewport
271
- ground plane plus bed tolerance as grounded, then highlights every ungrounded
272
- component. The default ground plane is the visible model's minimum Z;
273
- `scene({ ground: { offset } })` moves it below that by the configured offset.
61
+ **collisions** — ghosted source objects with solid per-finding palette colors on actual boolean intersection volumes; match interiors against `manifest.evidence.collisions.collisions[].color`. Broadphase pruning never changes findings (real intersection volume cannot exceed bbox intersection volume). Respects the same `--focus`/`--hide` visibility set as all evidence.
274
62
 
275
- ```text
276
- grounded = component bbox minZ <= groundZ + bedTolerance
277
- floating body = !grounded
278
- ```
63
+ **thickness** — area-weighted surface point samples cast through the object along their normals; red = below min, orange = below warn, green = acceptable, blue = above max (thresholds in manifest; override via CLI flags). Contact-seam rule: rays crossing into a direct physical-contact neighbor skip hits within contact tolerance and continue to the next surface, so a modeled micro-gap between touching parts doesn't read as a paper-thin wall. **Gray/unresolved area means the heatmap is incomplete, NOT that the model is safe** — open meshes, concave geometry, coarse tessellation, or low sample counts leave unresolved regions. A mesh/raycast approximation, not FEA. Also writes `evidence/thickness/point-cloud.json` with per-sample object identity, local position, normal, thickness, class, color, and represented area.
279
64
 
280
- This means a `union()` result with two disconnected mesh islands is inspected as
281
- two separate bodies instead of being treated as one safe object. Bbox overlap or
282
- bbox face contact alone is not support evidence. Use `connectivity`, `distance`,
283
- or `collisions` when you need the full physical graph, rooted gap distances, or
284
- collision defects.
65
+ **sections** exact 2D contour slices, three explicit modes:
285
66
 
286
- `distance` emits one rooted physical-component-distance heatmap per view. Black
287
- is background. Non-black pixels resolve through
288
- `manifest.evidence.distance.components`, and every visible object also has
289
- `componentIndex`, `rootDistance`, `nearestGap`, and parent-tree metadata in
290
- `manifest.evidence.distance.objects`.
67
+ - `sections at` one exact cut through a localized feature (`--plane yz --offset 12.5`).
68
+ - `sections stack` — periodic physical slices for reconstruction scans (`--every <spacing>`, plus a final max-bound slice when the span isn't an exact multiple).
69
+ - `sections sample` sparse representative slices (`--count N`; defaults to the principal `xy`/`xz`/`yz` families when no plane is given).
291
70
 
292
- Distance is computed from visible scene objects:
71
+ `--angle` rotates a vertical plane family around Z without manual normal math: `0` ≈ YZ, `90` ≈ XZ. The renderer refuses bundles above `--max-slices`. Per-slice and per-family metadata (offsets, areas, ranges, spacing) comes from the manifest.
293
72
 
294
- ```text
295
- component = physical connectivity component
296
- gap edge = Euclidean distance between component bounding boxes
297
- root = largest component by body count, object count, then bbox volume
298
- rootDistance = shortest accumulated gap distance from root component
299
- ```
300
-
301
- For large scenes the manifest does not materialize the complete component gap
302
- graph, because that graph is quadratic in the number of components. The
303
- `gapEdgeCount` field reports the logical complete-graph edge count used by the
304
- analysis. `gapEdges` stores a compact evidence subset containing nearest-gap
305
- and root-parent edges.
306
-
307
- The PNG colors components from green at the root/near distances through yellow to
308
- red at the farthest rooted component. The manifest stores the root component,
309
- maximum rooted distance, compact gap edge evidence, nearest-gap data, and
310
- shortest-path parent fields. The current v1 metric is bbox-based: it measures air
311
- gaps between component bounding boxes, not exact closest mesh-surface distance.
312
-
313
- `comparison` emits one reference-vs-candidate overlay per view. Pass
314
- `--compare-with <reference>` or declare the target in model code with
315
- `compareWith('./reference.3mf')`. The PNG uses the same Difference Only
316
- comparison overlay as the viewport. Amber marks candidate mismatch evidence,
317
- cyan marks reference mismatch evidence, and faint candidate/reference context
318
- keeps the overlay readable while rotating or comparing against the standard RGB
319
- render.
320
-
321
- Colored mismatch evidence comes from sampled nearest-surface distances: cyan
322
- means reference surface missing from the candidate, and amber means extra
323
- candidate surface. Run `forgecad inspect sections at`, `stack`, or `sample` when
324
- you also want exact cross-section evidence next to the comparison context views.
325
-
326
- The manifest stores visual screen-space mismatch counts, the geometric
327
- `compare 3d` score when the CLI can resolve both inputs, and a
328
- `evidence/comparison/mismatch-points.json` point cloud with world-space sample
329
- positions. Use the geometric score and point-cloud summary as the source of
330
- truth; the PNG is the fast visual index for where to look.
331
-
332
- `collisions` emits one ghosted-overlap image per view. It uses the same
333
- `--focus` / `--hide` visibility set as every other inspect evidence: focused
334
- objects are the only inspected objects. Source objects render as translucent
335
- ghosts, while actual boolean intersection volumes render as solid per-finding
336
- palette colors.
337
-
338
- Collision findings are computed from visible scene objects:
339
-
340
- ```text
341
- collision = boolean intersection volume > 0.1mm^3
342
- ```
73
+ ## `inspect section` Probe Contract
343
74
 
344
- The manifest stores the inspected objects, collision pair names/ids, overlap
345
- volume, broadphase counters, warnings, render style, and each collision finding's
346
- `groupIndex`, `color`, and `hex`. Exact interior pixels can be matched against
347
- `manifest.evidence.collisions.collisions[].color`; antialiased edges may blend
348
- with the ghosted source geometry. If `--focus PartA,PartB` is used, everything
349
- except those objects is hidden, `PartA` and `PartB` are ghosted, and their
350
- overlap volume is highlighted if present.
75
+ `inspect section` writes a one-off probe directory `result.json`, `section.svg`, `section.png` — instead of a bundle. `result.json` fields:
351
76
 
352
- Collision broadphase prunes exact boolean checks when the bbox intersection
353
- volume is already below the overlap threshold. This does not change findings:
354
- the real intersection volume cannot exceed the bbox intersection volume.
77
+ - `section.frame` `u`/`v` define the section-local coordinate system for rulers.
78
+ - `section.objects` per-object areas, bounds, and loop counts; `section.svg` holds the actual outlines.
79
+ - `rulers[].insideSegments` exact intervals where the ray is inside any sectioned object.
80
+ - `rulers[].gaps` — exact intervals between solid spans along the ray, including end gaps.
81
+ - `replaySpec` — the recipe to rerun the probe against a candidate via `inspect replay`.
82
+ - `comparison.rulers` — replay deltas against the original probe (present in replay results).
355
83
 
356
- `thickness` emits one local wall-thickness heatmap per view. The renderer places
357
- deterministic area-weighted point samples across visible mesh surfaces, casts
358
- through the object along each sample normal, and colors each point by the first
359
- opposite-surface distance:
360
-
361
- ```text
362
- red = thickness <= minThickness
363
- orange = thickness <= warnThickness
364
- green = acceptable thickness
365
- blue = thickness >= maxThickness
366
- gray = unresolved sample
367
- ```
368
-
369
- Thickness uses the same physical-contact edges as `connectivity` and `floating`.
370
- When a ray crosses from one object to a direct physical-contact neighbor, hits
371
- within `contactTolerance` are treated as contact seams and the ray continues to
372
- the next surface. This prevents a tiny modeled gap between touching parts from
373
- being reported as a paper-thin wall.
374
-
375
- The default thresholds are `minThickness=1.2`, `warnThickness=2.0`, and
376
- `maxThickness=6.0` model units. Override them with `--min-thickness`,
377
- `--warn-thickness`, and `--max-thickness`. Use `--thickness-samples` to raise or
378
- lower the maximum thickness point samples per object.
379
-
380
- The manifest stores the method, thresholds, palette, object list, per-object
381
- triangle counts, sampled-triangle counts, minimum, p05, median, mean, maximum,
382
- critical-area percentage, warning-area percentage, below-warning percentage, and
383
- unresolved-area percentage. This makes the PNG useful for visual debugging while
384
- the manifest remains the machine-readable source of truth.
385
-
386
- The evidence also writes `evidence/thickness/point-cloud.json`. Each point sample
387
- stores object identity, object-local position, normal, measured thickness,
388
- class, RGB color, and represented surface area. The PNG renders those samples
389
- over muted source geometry, so local evidence survives even when neighboring
390
- triangles have very different values.
391
-
392
- `roughness` uses the same area-weighted point placement. Point colors are local
393
- to nearby physical feature edges: smooth tessellation diagonals do not become
394
- visible roughness lines. Use `--roughness-samples` to raise or lower the maximum
395
- roughness point samples per object.
396
-
397
- `sections` is split into three explicit modes:
398
-
399
- - `sections at`: one precise section at an exact plane offset.
400
- - `sections stack`: periodic physical slices for reconstruction scans.
401
- - `sections sample`: a fixed number of sparse representative slices.
402
-
403
- Use `at` when an agent has localized a feature and needs the exact cross-section
404
- through it:
405
-
406
- ```bash
407
- forgecad inspect sections at model.forge.js --plane yz --offset 12.5
408
- forgecad inspect sections at model.forge.js --angle 45 --offset 20
409
- ```
84
+ ## `inspect sketch` JSON Contract
410
85
 
411
- For reconstruction-grade evidence, request a physical stack:
412
-
413
- ```bash
414
- forgecad inspect sections stack model.forge.js --plane yz --every 1
415
- ```
416
-
417
- This emits a slice from the selected plane-family minimum to maximum at the
418
- requested spacing, plus a final max-bound slice when the span is not an exact
419
- multiple. Use `--plane xy|xz|yz` repeatedly or comma-separated to choose
420
- principal planes.
421
-
422
- Vertical angled families are available without manual normal math:
423
-
424
- ```bash
425
- forgecad inspect sections stack model.forge.js --angle 45 --every 1
426
- ```
427
-
428
- `--angle 0` is equivalent to a YZ-style vertical stack, `90` is
429
- equivalent to XZ, and other angles rotate the vertical plane family around Z.
430
-
431
- Use `sample` when you want sparse evidence without choosing exact offsets:
432
-
433
- ```bash
434
- forgecad inspect sections sample model.forge.js --count 5
435
- forgecad inspect sections sample model.forge.js --plane yz --count 9
436
- ```
86
+ `inspect sketch` is external inspection: it runs the script, then reads returned scene objects and shape compile plans (model code never calls an inspection API). It reports selectable 2D regions from returned `Sketch`/`ConstraintSketch` objects and profile-bearing returned shapes (`extrude.profile`, `cut.profile`, `revolve.profile`).
437
87
 
438
- If no `--plane` or `--angle` is passed, `sample` emits the principal `xy`, `xz`,
439
- and `yz` families. The renderer refuses accidental giant bundles above
440
- `--max-slices` (default `1000`); raise that limit intentionally for large
441
- reconstruction scans.
442
-
443
- Each section slice records its exact offset, fraction when applicable, area,
444
- path count, size, and contributing object count in the manifest. Each plane
445
- family records its kind, normal, range, spacing, and slice count.
446
-
447
- ## Manifest
448
-
449
- `manifest.json` is the authoritative contract for consuming a bundle. It
450
- contains:
451
-
452
- - `schemaVersion` and generator metadata.
453
- - Source entry file and project root paths.
454
- - Requested evidence, emitted evidence, filters, image size, and quality.
455
- - Canonical views.
456
- - Scene metadata: bbox, volume, params, cut planes, animations, verifications,
457
- and objects.
458
- - Evidence metadata and relative file paths.
459
-
460
- A consumer should prefer paths from the manifest over hard-coding bundle layout.
461
- The layout is intentionally simple, but the manifest is where encoding details,
462
- per-view depth ranges, and object identity mappings live.
463
-
464
- ## Current Limits
465
-
466
- - Depth is a visual heatmap, not an EXR or raw float array.
467
- - Normals are camera-view normals, not world-space normals.
468
- - Object evidence colors are stable within a bundle and resolved through the manifest; do
469
- not infer identity from object order alone.
470
- - Connectivity is object-level. It reports disconnected kernel bodies in the
471
- manifest, but the PNG does not split a single scene object into per-body colors.
472
- - Bbox contact is only broadphase evidence and does not merge separate scene
473
- objects by default. Boolean-overlap edges are exact.
474
- - Distance is a physical-component bbox-gap metric in v1, not exact nearest
475
- mesh-surface distance. Concave components and loose bounding boxes can make the
476
- reported gap smaller than the real closest-surface distance.
477
- - Comparison PNG coverage is screen-space evidence. Hidden or internal
478
- mismatches need the sampled point cloud and geometric score in the manifest.
479
- - Collisions are only positive-volume boolean overlaps. Face-touching parts are
480
- not collision findings.
481
- - Thickness is a mesh/raycast approximation, not FEA or a manufacturability
482
- guarantee. Open meshes, concave geometry, very coarse tessellation, or low
483
- `--thickness-samples` values can leave gray/unresolved or approximate regions.
484
- - Section evidence is exact 2D contour slicing. Use `sections at`, `sections
485
- stack`, or `sections sample`; bare `inspect sections` only explains the modes.
486
- - Zebra is a shader-based visual continuity aid, not exact curvature analysis.
88
+ JSON contract: `targets[]` are inspectable sketches/profile uses; `regions[]` are filled selectable areas sorted largest-first with run-local ids like `R0`; `holes[]` are excluded interiors; `selection` is present only with `--seed`; `profileTree` is compile-plan provenance, not JavaScript variable names. **Stable selection v1 is `--seed x,y`, not region id.** Seed failures are explicit and exit nonzero: outside every region, on a boundary, inside a hole, ambiguous, no regions, or incompatible operation. `--operation extrude` only checks whether the selected filled region can be consumed by extrusion; open path/rail selection is intentionally unsupported in v1.