The shim no longer refuses a corner edge without a 3D curve: upstream
CreateCornerBlend returns SM_ERR below four curves and otherwise
SM_ERR_NULL_POINTER, without crashing. create_corner_patch now checks the
count before dereferencing curves, matching that order.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
Follows #1077: a result-changing fix of an upstream defect is an opt-in
`Kernel::fixes` field and the default is pinned SMLib behaviour.
- WR-214 (#480): the Boolean's topology intersector sets
`split_self_loops_on_vertices` from `proto_edge_self_loop_on_vertex_degenerate`
instead of forcing it off.
- WR-254 (#528): the slice side rule for coincident faces needs
`slice_coincident_faces_sheet_side`; by default the slice takes upstream's
difference rule.
- WR-265 (#388): `put_outer_shells_first` (shell order and the nested-solid
void-flag rewrite) needs `boolean_outer_shell_first`.
The boolean.api_brep runner can now build sheets (SmApiCreatePlane) and operands
that are an SmApiBoolean result, and it gains the C++-confirmed WR-254 and WR-265
repros as fixture cases that pass at the default. Each fix has an issue test with
the field on and a test that pins the default.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
Both CheckLoop fixes stay independent opt-ins: check_loop_vertex_tolerance
(WR-381) widens the junction gap limit, check_loop_projected_seam_ends
(WR-440) lifts projected ends across periodic seams. BCheckLoop inputs keep
both PRs' pre-steps (gap, tolerances, then project) in the Rust runner, FFI
guard and C++ shim; the fixture keeps both PRs' cases. A new test runs a
mixed-seam gap that needs both fields to close.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
Main split the frozen archives and the known-mismatch list into one file
per entry. #709's records move accordingly:
- plan/findings.md section -> plan/findings/topology.trimming_tools--projected-loop-endpoints-periodic-seams.md
- plan/upstream-issues.md WR-264 -> plan/upstream-issues/WR-440--checkloop-projected-periodic-ends-as-exact-sheets.md
(renumbered: #700 also uses WR-264)
- crates/difftest/known_mismatches.toml entries -> crates/difftest/known_mismatches/topology.trimming_tools.toml
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
Resolved by #358's intent:
- heal.gap topo and heal.heal_data_p2 block guards (>= 1e154) dropped: main's
topology.vertexuse export, which both units build on both sides, already
refuses B-rep blocks above 1e150 (HANG-29, d725baf2c). The PR's regression
tests still run its triggers and now expect that refusal.
- boolean.topology_intersector_p1 coordinate bound, UB-166 knot read-back and
blend.fillet_geom_p2 RailRail original-face bound kept unchanged.
- plan/findings.md and plan/upstream-issues.md edits moved to per-entry files
(HANG-29 and UB-166 addenda, three findings files), as main split those
archives.
- Both sides of the conflicting test modules kept.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
Resolved by #811's intent: run_cpp rejects, the Rust side is not run, same cases
rejected. The decision is made by the shim from the built model (label plus back
pointers) and returned as STATUS_UNDEFINED_INPUT, instead of difftest inspecting a -9
sentinel in the results.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
The indexed InsertIntersectionTopology read m_pAttributeE->GetUsers through an
UNPORTED(blend.fillet_executive_p1) stub. SmFilletExecutive's constructor always
creates m_pAttributeE (no users until CreateFilletBrep), so the shim's guard that
skipped corners with fillet-B-rep edges on the assumption of a NULL attribute was
unneeded. FilletExecutiveData now carries attribute_e_users and the indexed adapter
reads it; the shim runs those corners. corner_insert_22 now compares 389 values;
blend.fillet_corner_p1 is green (284/284, --seeds 2000: 2268/2268).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
SmFillet3x2MixedConvexityCorner::CreateCornerPatch deletes the on-edge
fillet edge and the corner vertex before projecting onto the original
face. Without an original face (NER) or when DropCurve fails or yields
other than one curve (SER), it returns after those deletions. The shim
refused these inputs as if upstream dereferenced null, but upstream's
state there is the same as on success: ~SmTopology unlinks the edge from
the pseudo B-rep's edge list and ~SmFilletVertex clears its mates. Only
the harness Model's own vertex list kept the freed vertex. Drop it from
that list as the success path already does and run the op, so the
status, the corner members and the model export are compared.
64 cases move from rejected to pass; no other outcome changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gJAwcLRBPQXYLmvXd3pWf
Add the canonical Ellipse to the generic p7 curve protocol and compare
complete positive-arc solutions and geometric comb records. Preserve old
guards, fixtures, generator inputs, numerical formulas and tolerances.
Co-Authored-By: GPT-6.1 Sol Fast <noreply@openai.com>
Add genuine Ellipse ordinary-curve input and complete point-distance equation
and Jacobian comparisons. Preserve old curve kinds, fixtures, generators,
guards, numerical formulas and tolerances.
Co-Authored-By: GPT-6.1 Sol Fast <noreply@openai.com>
Add the fixed canonical Sphere to the generic p6 surface protocol and compare
complete spatial/UV trim records without changing production geometry, old
guards, fixtures, generator inputs or numerical tolerances.
Co-Authored-By: GPT-6.1 Sol Fast <noreply@openai.com>
- Co-port `SmFilletExecutive::CreateSmoothEdgeSequence` in
`blend::fillet_executive::p1` via `SmoothSequenceAccess<O>` and wire
`process_smooth_edge_sequences` / `collect_tangent_edge_sequence` in
`blend::fillet_executive::p2` and `SessionObjects`.
- Add borrow-free `DirectTemporaryRadiusChange` (`new` + `revert`) in
`blend::fillet_executive::p2` and wire all 3 `calc_rail_int_edgeuse_impl`
sites in `blend::fillet_geom::p2` and both solvers in
`blend::fillet_solver::p2::FilletSolver::rail_rail_intersect_with_ops`
(removing all remaining `UNPORTED(blend.fillet_executive_p2)` stubs).
- Wire `ConstantDistanceFs`, `VariableRadiusFs`, `SurfaceSurfaceFs`, and
`FilletCorner` in the `blend.fillet_executive_p2` difftest runner, compare
all 5 `temp_radius` values for variable-radius laws, and add 3 split-edge G1
smooth-sequence cases (`exec_collect_smooth_split`,
`exec_process_smooth_split_const`, `exec_process_smooth_split_vr`).
- Promote `blend.fillet_executive_p2` to `green` (278/278 pass, 0 failed,
0 deferred, max_rel_err 0e0).
Co-Authored-By: Gemini 3.1 Pro <noreply@google.com>
Retain polygon-edge endpoints, tolerance and original surface for child implantation. Preserve native parent lists and child ordering, including handle remapping. Add 130 differential cases and regression coverage for geometry updates.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Keep all inherited surface conversions and each fixture family alongside current transform sequences.
Co-Authored-By: OpenAI Codex <noreply@openai.com>
Preserve transform-sequence support and migrate the extrusion finding without recreating shared archives.
Co-Authored-By: OpenAI Codex <noreply@openai.com>