Commit Graph

10979 Commits

Author SHA1 Message Date
Brett Lawson 00a19b33be fix: satisfy clippy in the WR-644 gap branch and its test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
2026-10-31 07:22:10 +01:00
Brett Lawson a31424e16f fix: opt in to filling the gap past a mitre whose rails meet the corner edge apart (WR-644)
Ports tangency-labs/smlib@2223108 behind
Kernel::fixes.fillet_mitre_gap_patch: SmFilletNx2Corner::AdjustTopology
builds the concave corner's topology (AdjustConcaveCornerTopology) for a
bevel at a face's concave corner whose rails meet the side edge at two
places, and CreateCornerPatch fills only that gap (m_bBevelGapPatch).
Tested on the fork's sloped basin and SolidCraft's 1080 basin cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
2026-10-31 06:45:49 +01:00
Brett Lawson d4c873fbe9 Merge remote-tracking branch 'origin/main' into fix/wr642-mitred-concave-corner 2026-10-31 05:56:48 +01:00
Brett Lawson 77abdd3d1a Merge remote-tracking branch 'fork/fix/960-p4-cliff-closing' into fix/wr642-mitred-concave-corner 2026-10-31 05:56:42 +01:00
bherbruck 181711148d Merge pull request #1924 from tdamsma/claude/flag-tests-from-fork
test: six opt-in flags pinned by the fork's own regression tests (WR-536, 537, 547, 410, 453, 543) with a fork-build recipe; addenda for six more
2026-10-31 00:53:22 -04:00
Brett Lawson e296b6e2fe fix: opt in to mitring blends at a face's concave corner (WR-642)
Ports tangency-labs/smlib@4f06e72 (the owner's ruling of 2026-10-30)
behind Kernel::fixes.fillet_mitre_concave_face_corners: the Nx2
corner's mixed-convexity 3-sided face is skipped, so a pocket's rim or
a boss's root is mitred at its sharp corners as at a corner of uniform
convexity. Tests against the fork's closed forms, including the pocket
rim chamfer past the floor (d 5.5, a cliff overflow closed by WR-636).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
2026-10-31 05:52:09 +01:00
Brett Lawson 71951ea658 Merge origin/main into fix/wr642-mitred-concave-corner 2026-10-31 05:46:24 +01:00
bherbruck 0ed8d8220f Merge pull request #1561 from PapaEcho13/fix/calculate-tight-bounding-box-interval-only
test(curve): retain interval tight-box regression with opt-in fix
2026-10-31 00:45:28 -04:00
Thijs Damsma ce1699614f plan: WR-503 addendum: there is no fork test
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:38:08 +01:00
Thijs Damsma 202c60506f plan: WR-527 addendum: the fork's own test measures time
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:38:08 +01:00
Thijs Damsma 58aeab658d plan: WR-464 addendum: the fork's test needs a test-only surface subclass
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:38:08 +01:00
Thijs Damsma b3ba5da172 plan: WR-490 addendum: the fork's replay/1.0.1 dropped the change
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:38:08 +01:00
Thijs Damsma b68fe95649 plan: WR-455 addendum: the fork's tests do not diverge on the contact fix alone
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:38:08 +01:00
Thijs Damsma e6c17045bf plan: WR-541 addendum: the fork's own tray test does not diverge either
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:38:08 +01:00
Thijs Damsma 0c5de7eaf8 test: WR-543 the fork's boundary-row sheet trims lift onto their edges with uv_trim_joins_drop_pieces
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:38:08 +01:00
Thijs Damsma 091e61d924 test: WR-453 the grazing join's edges reach their vertices with imprint_extends_edge_to_proto_vertex
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:38:08 +01:00
Thijs Damsma 5cf88f9ee8 test: WR-410 the fork's grazing edge crossing join is sound with boolean_vertex_by_best_crossing
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:38:08 +01:00
Thijs Damsma c8454499fe test: WR-547 the fork's L-box corner patch is tangent with corner_blend_coons_patch_tangent_to_sides
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:37:58 +01:00
Thijs Damsma 885c10c02a test: WR-537 the fork's hair-off pin at a 0.6131 rad seam shares nothing with seam_point_solutions_are_one
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:37:58 +01:00
Thijs Damsma b3646ba118 test: WR-536 the fork's four far disks join with boolean2d_plane_covers_far_faces
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 05:37:58 +01:00
Brett Lawson eb88b6c474 Merge remote-tracking branch 'origin/main' into fix/960-p4-cliff-closing 2026-10-31 05:36:01 +01:00
bherbruck 157c0f32b3 Merge pull request #1916 from brett19/fix/960-p2b-overflow-open-result
fix: refuse a cliff overflow whose subtraction leaves no solid (WR-631 addendum; #960)
2026-10-31 00:35:39 -04:00
bherbruck 32a4a22614 Merge pull request #1915 from tdamsma/claude/issue-1818-shell-zero-volume-wall
fix(offset): offset_extended_edges_mated refuses a shell whose result is not a manifold solid (#1818; fork has the same defect, WR-344 addendum)
2026-10-31 00:25:45 -04:00
PapaEcho13 2a208327df Merge main into #1561 and retain opt-in bounding-box regression
Preserve main's default-compatible interval-knot fix and WR-474 record.
Retain the original unit regression for default and opted-in behavior,
and remove obsolete mismatch waivers by matching main.

Co-Authored-By: OpenAI Codex <noreply@openai.com>
2026-10-31 00:22:51 -04:00
bherbruck 1b5dca40b0 Merge pull request #1908 from brett19/fix/feature-executive-attributes
fix: blend.feature_executive — carry attributes through PartitionFeature/RestoreFeature copies
2026-10-31 00:17:46 -04:00
Brett Lawson a1254d3981 fix: refuse a cliff overflow whose subtraction leaves no solid (WR-631; #960, #1467)
An accepted cliff overflow on #1467's box at r10.01/r10.02 subtracted a
closed removal region, and the Boolean returned success with an open or
empty body. SubtractRemovalRegion now requires the result of a subtraction
from a manifold solid to be a manifold solid with faces; otherwise the
target is put back and the blend is refused as no room
(NoRoomReason::CliffSubtractionLeavesNoSolid). The fork has no such check
(it tests only the Boolean's status); recorded in a WR-631 addendum.

Test: wr631_cliff_overflow_construction.rs,
an_overflow_whose_subtraction_leaves_no_solid_is_refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
2026-10-31 05:12:37 +01:00
Brett Lawson 0fab9b8dec fix: cliff overflow closes past corner end faces and round blended loops (WR-635, WR-636; #960)
Ports the SolidCraft fork's tangency-labs/smlib@eddf0ed and @bba9914 (branch
replay/1.0.1) into CloseRemovalRegion, under fixes.fillet_cliff_overflow:

- WR-635 (eddf0ed): a lamina edge's host is never the surface its own sheet
  face lies on (sm_LiesOnSurface), a chain ending at a filleted edges' vertex
  of its host closes there, and a planar surface of any kind continues as its
  plane (sm_PlaneOf) for the distance and the covering surface. A sloped
  basin's rim chamfer past the slab's front builds instead of "lies on the
  surfaces of two faces".
- WR-636 (bba9914): a closed chain on a planar host closes with the face
  between it and the host's fully blended loop (sm_CloseRoundLoop). A pocket
  rim chamfer past the floor builds instead of "closes on one face".

Tests: tests/wr635_636_cliff_overflow_closing.rs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
2026-10-31 05:08:18 +01:00
bherbruck 33b3e06cd9 Merge pull request #1910 from aapolipponen/fix/3369-enable-wr457
difftest: SolidCraft #3369 case turns on the WR-457 fix
2026-10-31 00:06:14 -04:00
bherbruck 9441664ace Merge pull request #1912 from tangency-labs/plan/edge-tolerance-audit-not-changed
finding: edge-tolerance reads in curve trims and STEPInversion, audited and not changed
2026-10-30 23:56:16 -04:00
bherbruck 87797c2e92 finding: edge-tolerance reads in curve trims and STEPInversion, audited and not changed
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-30 23:54:13 -04:00
Brett Lawson 095bd7db68 plan: blend.feature_executive case counts with the attribute cases
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
2026-10-31 04:50:47 +01:00
bherbruck 3cc008ca8e Merge pull request #1905 from brett19/fix/960-p2-cliff-construction
fix: a cliff overflow is built and subtracted from the body (#960, WR-631, WR-638)
2026-10-30 23:48:09 -04:00
bherbruck 4bfe5232dc Merge pull request #1906 from tdamsma/claude/hang-guards-loopuse-api-surfaces
fix: topology.loopuse, sweep.api_surfaces — HANG-29 / HANG-5 guards on both sides (follows #1873; fuzz00839, curved paths above 1e8)
2026-10-30 23:40:55 -04:00
aapolipponen a25e1e99a6 difftest: SolidCraft #3369 case turns on the WR-457 fix 2026-10-31 05:38:49 +02:00
Brett Lawson 850e6e5264 blend.feature_executive: rustfmt the attribute carry and its test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
2026-10-31 04:36:32 +01:00
Brett Lawson 26599be593 blend.feature_executive: trace the patch mismatches to SmMerge on extended-surface faces
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
2026-10-31 04:34:31 +01:00
Brett Lawson 4db1ba7b2f blend.feature_executive: carry attributes through PartitionFeature and RestoreFeature copies
Upstream's CopyFaces notifies SM_NO_COPY on each copied face, edge and vertex
(SmMerge::MakeFaceuse), so attributes reach the copies as their behaviours say.
The port's copies ran with an empty attribute store.

- topology::brep::p2::CopyNotifyState: notification state for a copy between
  two B-reps, holding both B-reps' own attributes (source objects under tagged
  copy_source_ref identities) and giving each B-rep its own back.
- topology::brep::p7::copy_faces_from: copy_faces with distinct source
  identities (copy_faces delegates to it unchanged).
- SmFeatureExecutive: PartitionFeature and RestoreFeature copy with the
  attributes. The patch path does not yet: its merges still differ from SMLib
  (finding addendum).
- Shim, FFI and runner: optional SmLongAttribute inputs, plus per-id face and
  edge counts of every B-rep in the record; 4 attribute cases (3 pass; the
  extrusion case fails until the patch path carries).
- Unit test: copy and reference attributes reach the feature B-rep, temporary
  ones do not.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
2026-10-31 04:34:25 +01:00
bherbruck 0c68be37fa Merge pull request #1881 from altvnk/fix/1852-good-drop-distances
difftest: exercise the final GoodDrop distance comparison against C++
2026-10-30 23:30:57 -04:00
bherbruck ad1640e602 Merge pull request #1883 from altvnk/difftest/copy-edges-geometry
difftest: compare CopyEdges destination geometry in topology.brep_p6
2026-10-30 23:30:48 -04:00
bherbruck df64e82814 Merge pull request #1904 from tangency-labs/fix/wr619-union-solid-leak
fix: WR-619 opt-in refusal of a union that merges a solid into the outside; WR-614/619 records + strip fixture (supersedes #1868, refs #1794)
2026-10-30 23:24:46 -04:00
bherbruck bf3e29c07a Merge pull request #1903 from tangency-labs/difftest/dead-generated-cases
difftest: redraw generated cases until their setup builds (9 dead cases now compare)
2026-10-30 23:22:40 -04:00
Thijs Damsma 809c6cf331 fix: sweep.api_surfaces refuses curved sweep paths above 1e8 on both sides (HANG-5)
SmApiCreateSweep polygonizes the path to dTol / 2 in N_CreateSweepScale before
it relaxes the tolerance; on a quarter-arc path the C++ takes 0.44 s at radius
1e5, 4.8 s at 1e6, 26 s at 3e6 and gives no result in 30 s at 1e7, 1e8, 1e9,
all admitted by the old 1e12 control-polygon bound. Straight paths return at
once at any length. check_path_extent (public) keeps the 1e12 bound for every
path and refuses a curved path (any but a degree-1 NURB) above
MAX_PATH_EXTENT = 1e8, the sweep.api_brep bound of #1873; the runner's Rust
side, which had no guard, applies it too. Corpus fuzz00746 now runs both
sides; new constructed corpus case; runner and FFI tests; HANG-5 addendum,
finding, unit notes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 04:20:20 +01:00
Thijs Damsma 954452f375 fix: topology.loopuse refuses B-rep values above 1e150 before the graph export, on both sides (HANG-29, fuzz00839)
A surface control point of -1e300 (and already -1e155) makes the C++ graph
export never return (SmFace::CreateUVTrimCurves -> CreateUVTrimCurve ->
SmCurve::GlobalCoincidenceChecker, reached through GetVertexFaceGap). The
2026-10-20 guard in topology_loopuse::eval came after the runner's own
topology_edgeuse_p1 export and was dropped. The FFI gains export() (block
parse, check_block_magnitudes, then the native export), which the runner's
graph_of now uses, and eval checks the block before its export; the runner's
Rust side applies the same check. Corpus case, runner and FFI tests, HANG-29
addendum, finding, unit notes. Follows #1873 (topology.edgeuse_p3).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PqrY3KqUA9vpCbwBCMF1av
2026-10-31 04:20:20 +01:00
Brett Lawson f41909d786 Merge remote-tracking branch 'origin/main' into fix/960-p2-cliff-construction 2026-10-31 04:19:58 +01:00
Brett Lawson c017a8d97d blend: a cliff overflow is built and subtracted from the body (#960, WR-631, WR-638)
With fixes.fillet_cliff_overflow, an accepted cliff overflow builds instead of
being refused (the rest of tangency-labs/smlib@8ba4667, ae2a6de at rev 68fb9162,
and the Nx1 miss test of 3f22e97):

- FilletCorner::drop_end_rib (SmFilletNx1Corner::CalcCornerEdgeGeom): in an
  overflow a rail end off the fillet surface, or on its side edge's line past
  the edge's end, is a miss; both rails may miss; a miss that does not run on
  deletes the end rib and notes the open end instead of the global merge.
- blend/fillet_cliff_overflow.rs: CutFilletAtOpenEnd and CloseRemovalRegion,
  its host test, chain walk and closing face kept as separate functions.
- session/cliff_overflow.rs: SubtractRemovalRegion and sm_HoldsItsLaw; the
  session's DoFilleting runs it instead of the merge and passes its own error
  on (ae2a6de, WR-638).

Flag off, every path is unchanged. Regression tests with closed-form volumes:
tests/wr631_cliff_overflow_construction.rs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MNXLXj2sJf943y2dDF36Vy
2026-10-31 04:19:58 +01:00
bherbruck 8e8beac0b0 fix: WR-619 opt-in refusal of a union that merges a solid into the outside; WR-614/619 records + strip fixture (supersedes #1868)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-30 23:15:05 -04:00
bherbruck c6aac20227 difftest: redraw generated merge_p4 and brep_local_operation cases until their setup builds
Nine generated cases drew operands the constructors refuse, so they compared
nothing. The first draw is unchanged; only a refused setup redraws (up to 16).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-30 23:14:28 -04:00
bherbruck 957f476fea Merge pull request #1902 from tdamsma/claude/wr468-flag-regresses-boss
plan+test: WR-641 — the fork's WR-468 extended rail end fails an oblique-wall boss (fork-confirmed); parity test, hold the flag back
2026-10-30 23:13:18 -04:00
Alex Lytvynenko 34f57d148e Merge authoritative upstream/main d662ecd43 before regression publication
Co-Authored-By: GPT-6.1 Sol Fast <noreply@openai.com>
2026-10-31 04:07:23 +01:00
bherbruck 91b8008077 Merge pull request #1621 from ChrisNourse/port/curve-bounded-assert-valid
wire: surface.surface_assert_valid — CurveBoundedSurface checks (WP3b)
2026-10-30 23:03:19 -04:00